{"version":3,"file":"vendor2.153001db.js","sources":["../../node_modules/ace-builds/src-noconflict/ace.js","../../node_modules/react-ace/lib/editorOptions.js","../../node_modules/react-ace/lib/ace.js","../../node_modules/ace-builds/src-noconflict/ext-split.js","../../node_modules/lodash.get/index.js","../../node_modules/react-ace/lib/split.js","../../node_modules/diff-match-patch/index.js","../../node_modules/react-ace/lib/diff.js","../../node_modules/react-ace/lib/index.js"],"sourcesContent":["/* ***** 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() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\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(this, arguments);\n else {\n console.error(\"dropping module because define wasn\\'t a string.\");\n console.trace();\n }\n return;\n }\n if (arguments.length == 2)\n payload = deps;\n if (!define.modules[module]) {\n define.payloads[module] = payload;\n define.modules[module] = null;\n }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _require = function(parentId, module, callback) {\n if (typeof module === \"string\") {\n var payload = lookup(parentId, module);\n if (payload != undefined) {\n callback && callback();\n return payload;\n }\n } else 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 == undefined && require.original)\n return;\n params.push(dep);\n }\n return callback && callback.apply(null, params) || true;\n }\n};\n\nvar require = function(module, callback) {\n var packagedModule = _require(\"\", module, callback);\n if (packagedModule == undefined && require.original)\n return require.original.apply(this, arguments);\n return packagedModule;\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 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 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 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/fixoldbrowsers\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nif (typeof Element != \"undefined\" && !Element.prototype.remove) {\n Object.defineProperty(Element.prototype, \"remove\", {\n enumerable: false,\n writable: true,\n configurable: true,\n value: function() { this.parentNode && this.parentNode.removeChild(this); }\n });\n}\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};\nvar _navigator = typeof navigator == \"object\" ? navigator : {};\n\nvar os = (/mac|win|linux/i.exec(_navigator.platform) || [\"other\"])[0].toLowerCase();\nvar ua = _navigator.userAgent || \"\";\nvar appName = _navigator.appName || \"\";\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (appName == \"Microsoft Internet Explorer\" || 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 = ua.match(/ Gecko\\/\\d+/);\nexports.isOpera = typeof opera == \"object\" && 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.isEdge = parseFloat(ua.split(\" Edge/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isAndroid = ua.indexOf(\"Android\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\nexports.isMobile = exports.isIOS || exports.isAndroid;\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"./useragent\"); \nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.buildDom = function buildDom(arr, parent, refs) {\n if (typeof arr == \"string\" && arr) {\n var txt = document.createTextNode(arr);\n if (parent)\n parent.appendChild(txt);\n return txt;\n }\n \n if (!Array.isArray(arr)) {\n if (arr && arr.appendChild && parent)\n parent.appendChild(arr);\n return arr;\n }\n if (typeof arr[0] != \"string\" || !arr[0]) {\n var els = [];\n for (var i = 0; i < arr.length; i++) {\n var ch = buildDom(arr[i], parent, refs);\n ch && els.push(ch);\n }\n return els;\n }\n \n var el = document.createElement(arr[0]);\n var options = arr[1];\n var childIndex = 1;\n if (options && typeof options == \"object\" && !Array.isArray(options))\n childIndex = 2;\n for (var i = childIndex; i < arr.length; i++)\n buildDom(arr[i], el, refs);\n if (childIndex == 2) {\n Object.keys(options).forEach(function(n) {\n var val = options[n];\n if (n === \"class\") {\n el.className = Array.isArray(val) ? val.join(\" \") : val;\n } else if (typeof val == \"function\" || n == \"value\" || n[0] == \"$\") {\n el[n] = val;\n } else if (n === \"ref\") {\n if (refs) refs[val] = el;\n } else if (n === \"style\") {\n if (typeof val == \"string\") el.style.cssText = val;\n } else if (val != null) {\n el.setAttribute(n, val);\n }\n });\n }\n if (parent)\n parent.appendChild(el);\n return el;\n};\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.removeChildren = function(element) {\n element.innerHTML = \"\";\n};\n\nexports.createTextNode = function(textContent, element) {\n var doc = element ? element.ownerDocument : document;\n return doc.createTextNode(textContent);\n};\n\nexports.createFragment = function(element) {\n var doc = element ? element.ownerDocument : document;\n return doc.createDocumentFragment();\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 if ((sheets = doc.querySelectorAll(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id)\n return true;\n }\n};\n\nvar strictCSP;\nvar cssCache = [];\nexports.useStrictCSP = function(value) {\n strictCSP = value;\n if (value == false) insertPendingStyles();\n else if (!cssCache) cssCache = [];\n};\n\nfunction insertPendingStyles() {\n var cache = cssCache;\n cssCache = null;\n cache && cache.forEach(function(item) {\n importCssString(item[0], item[1]);\n });\n}\n\nfunction importCssString(cssText, id, target) {\n if (typeof document == \"undefined\")\n return;\n if (cssCache) {\n if (target) {\n insertPendingStyles();\n } else if (target === false) {\n return cssCache.push([cssText, id]);\n }\n }\n if (strictCSP) return;\n\n var container = target;\n if (!target || !target.getRootNode) {\n container = document;\n } else {\n container = target.getRootNode();\n if (!container || container == target)\n container = document;\n }\n \n var doc = container.ownerDocument || container;\n if (id && exports.hasCssString(id, container))\n return null;\n \n if (id)\n cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n \n var style = exports.createElement(\"style\");\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n if (container == doc)\n container = exports.getDocumentHead(doc);\n container.insertBefore(style, container.firstChild);\n}\nexports.importCssString = importCssString;\n\nexports.importCssStylsheet = function(uri, doc) {\n exports.buildDom([\"link\", {rel: \"stylesheet\", href: uri}], exports.getDocumentHead(doc));\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};\n\nexports.computedStyle = function(element, style) {\n return window.getComputedStyle(element, \"\") || {};\n};\n\nexports.setStyle = function(styles, property, value) {\n if (styles[property] !== value) {\n styles[property] = value;\n }\n};\n\nexports.HAS_CSS_ANIMATION = false;\nexports.HAS_CSS_TRANSFORMS = false;\nexports.HI_DPI = useragent.isWin\n ? typeof window !== \"undefined\" && window.devicePixelRatio >= 1.5\n : true;\n\nif (useragent.isChromeOS) exports.HI_DPI = false;\n\nif (typeof document !== \"undefined\") {\n var div = document.createElement(\"div\");\n if (exports.HI_DPI && div.style.transform !== undefined)\n exports.HAS_CSS_TRANSFORMS = true;\n if (!useragent.isEdge && typeof div.style.animationName !== \"undefined\")\n exports.HAS_CSS_ANIMATION = true;\n div = null;\n}\n\nif (exports.HAS_CSS_TRANSFORMS) {\n exports.translate = function(element, tx, ty) {\n element.style.transform = \"translate(\" + Math.round(tx) + \"px, \" + Math.round(ty) +\"px)\";\n };\n} else {\n exports.translate = function(element, tx, ty) {\n element.style.top = Math.round(ty) + \"px\";\n element.style.left = Math.round(tx) + \"px\";\n };\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/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta',\n 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8, \n \"control\": 1\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 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\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/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\nvar pressedKeys = null;\nvar ts = 0;\n\nvar activeListenerOptions;\nfunction detectListenerOptionsSupport() {\n activeListenerOptions = false;\n try {\n document.createComment(\"\").addEventListener(\"test\", function() {}, { \n get passive() { \n activeListenerOptions = {passive: false};\n }\n });\n } catch(e) {}\n}\n\nfunction getListenerOptions() {\n if (activeListenerOptions == undefined)\n detectListenerOptionsSupport();\n return activeListenerOptions;\n}\n\nfunction EventListener(elem, type, callback) {\n this.elem = elem;\n this.type = type;\n this.callback = callback;\n}\nEventListener.prototype.destroy = function() {\n removeListener(this.elem, this.type, this.callback);\n this.elem = this.type = this.callback = undefined;\n};\n\nvar addListener = exports.addListener = function(elem, type, callback, destroyer) {\n elem.addEventListener(type, callback, getListenerOptions());\n if (destroyer)\n destroyer.$toDestroy.push(new EventListener(elem, type, callback));\n};\n\nvar removeListener = exports.removeListener = function(elem, type, callback) {\n elem.removeEventListener(type, callback, getListenerOptions());\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};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\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 return e.button;\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n var ownerDocument = el && el.ownerDocument || document;\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n removeListener(ownerDocument, \"mousemove\", eventHandler);\n removeListener(ownerDocument, \"mouseup\", onMouseUp);\n removeListener(ownerDocument, \"dragstart\", onMouseUp);\n }\n\n addListener(ownerDocument, \"mousemove\", eventHandler);\n addListener(ownerDocument, \"mouseup\", onMouseUp);\n addListener(ownerDocument, \"dragstart\", onMouseUp);\n \n return onMouseUp;\n};\n\nexports.addMouseWheelListener = function(el, callback, destroyer) {\n if (\"onmousewheel\" in el) {\n 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 }, destroyer);\n } else if (\"onwheel\" in el) {\n 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 }, destroyer);\n } else {\n 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 }, destroyer);\n }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) {\n var clicks = 0;\n var startX, startY, timer; \n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n function onMousedown(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 if (!Array.isArray(elements))\n elements = [elements];\n elements.forEach(function(el) {\n addListener(el, \"mousedown\", onMousedown, destroyer);\n });\n};\n\nvar getModifierHash = 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 (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\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 if (pressedKeys[keyCode] == 1)\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = e.timeStamp - ts;\n if (dt < 50)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\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\n\nexports.addCommandKeyListener = function(el, callback, destroyer) {\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n }, destroyer);\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n }, destroyer);\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n }, destroyer);\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 }, destroyer);\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n }, destroyer);\n\n if (!pressedKeys) {\n resetPressedKeys();\n addListener(window, \"focus\", resetPressedKeys);\n }\n }\n};\nfunction resetPressedKeys() {\n pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && 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 \n var listener = function(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n removeListener(win, \"message\", listener);\n callback();\n }\n };\n \n addListener(win, \"message\", listener);\n win.postMessage(messageName, \"*\");\n };\n}\n\nexports.$idleBlocked = false;\nexports.onIdle = function(cb, timeout) {\n return setTimeout(function handler() {\n if (!exports.$idleBlocked) {\n cb();\n } else {\n setTimeout(handler, 100);\n }\n }, timeout);\n};\n\nexports.$idleBlockId = null;\nexports.blockIdle = function(delay) {\n if (exports.$idleBlockId)\n clearTimeout(exports.$idleBlockId);\n \n exports.$idleBlocked = true;\n exports.$idleBlockId = setTimeout(function() {\n exports.$idleBlocked = false;\n }, delay || 100);\n};\n\nexports.nextFrame = typeof window == \"object\" && (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/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/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 Date.now() - 50)\n return true;\n return $cancelT = false;\n },\n cancel: function() {\n $cancelT = Date.now();\n }\n};\n\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/clipboard\",\"ace/lib/keys\"], 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 clipboard = require(\"../clipboard\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE = useragent.isIE;\nvar HAS_FOCUS_ARGS = useragent.isChrome > 63;\nvar MAX_LINE_LENGTH = 400;\n\nvar KEYS = require(\"../lib/keys\");\nvar MODS = KEYS.KEY_MODS;\nvar isIOS = useragent.isIOS;\nvar valueResetRegex = isIOS ? /\\s/ : /\\n/;\nvar isMobile = useragent.isMobile;\n\nvar TextInput = function(parentNode, host) {\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\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 parentNode.insertBefore(text, parentNode.firstChild);\n\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var sendingText = false;\n var tempStyle = '';\n \n if (!isMobile)\n text.style.fontSize = \"1px\";\n\n var commandMode = false;\n var ignoreFocusEvents = false;\n \n var lastValue = \"\";\n var lastSelectionStart = 0;\n var lastSelectionEnd = 0;\n var lastRestoreEnd = 0;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function(e) {\n if (ignoreFocusEvents) return;\n host.onBlur(e);\n isFocused = false;\n }, host);\n event.addListener(text, \"focus\", function(e) {\n if (ignoreFocusEvents) return;\n isFocused = true;\n if (useragent.isEdge) {\n try {\n if (!document.hasFocus())\n return;\n } catch(e) {}\n }\n host.onFocus(e);\n if (useragent.isEdge)\n setTimeout(resetSelection);\n else\n resetSelection();\n }, host);\n this.$focusScroll = false;\n this.focus = function() {\n if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == \"browser\")\n return text.focus({ preventScroll: true });\n\n var top = text.style.top;\n text.style.position = \"fixed\";\n text.style.top = \"0px\";\n try {\n var isTransformed = text.getBoundingClientRect().top != 0;\n } catch(e) {\n return;\n }\n var ancestors = [];\n if (isTransformed) {\n var t = text.parentElement;\n while (t && t.nodeType == 1) {\n ancestors.push(t);\n t.setAttribute(\"ace_nocontext\", true);\n if (!t.parentElement && t.getRootNode)\n t = t.getRootNode().host;\n else\n t = t.parentElement;\n }\n }\n text.focus({ preventScroll: true });\n if (isTransformed) {\n ancestors.forEach(function(p) {\n p.removeAttribute(\"ace_nocontext\");\n });\n }\n setTimeout(function() {\n text.style.position = \"\";\n if (text.style.top == \"0px\")\n text.style.top = top;\n }, 0);\n };\n this.blur = function() {\n text.blur();\n };\n this.isFocused = function() {\n return isFocused;\n };\n \n host.on(\"beforeEndOperation\", function() {\n var curOp = host.curOp;\n var commandName = curOp && curOp.command && curOp.command.name;\n if (commandName == \"insertstring\")\n return;\n var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged);\n if (inComposition && isUserAction) {\n lastValue = text.value = \"\";\n onCompositionEnd();\n }\n resetSelection();\n });\n \n var resetSelection = isIOS\n ? function(value) {\n if (!isFocused || (copied && !value) || sendingText) return;\n if (!value) \n value = \"\";\n var newValue = \"\\n ab\" + value + \"cde fg\\n\";\n if (newValue != text.value)\n text.value = lastValue = newValue;\n \n var selectionStart = 4;\n var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1));\n\n if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) {\n text.setSelectionRange(selectionStart, selectionEnd);\n }\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n }\n : function() {\n if (inComposition || sendingText)\n return;\n if (!isFocused && !afterContextMenu)\n return;\n inComposition = true;\n \n var selectionStart = 0;\n var selectionEnd = 0;\n var line = \"\";\n\n if (host.session) {\n var selection = host.selection;\n var range = selection.getRange();\n var row = selection.cursor.row;\n selectionStart = range.start.column;\n selectionEnd = range.end.column;\n line = host.session.getLine(row);\n\n if (range.start.row != row) {\n var prevLine = host.session.getLine(row - 1);\n selectionStart = range.start.row < row - 1 ? 0 : selectionStart;\n selectionEnd += prevLine.length + 1;\n line = prevLine + \"\\n\" + line;\n }\n else if (range.end.row != row) {\n var nextLine = host.session.getLine(row + 1);\n selectionEnd = range.end.row > row + 1 ? nextLine.length : selectionEnd;\n selectionEnd += line.length + 1;\n line = line + \"\\n\" + nextLine;\n }\n else if (isMobile && row > 0) {\n line = \"\\n\" + line;\n selectionEnd += 1;\n selectionStart += 1;\n }\n\n if (line.length > MAX_LINE_LENGTH) {\n if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) {\n line = line.slice(0, MAX_LINE_LENGTH);\n } else {\n line = \"\\n\";\n if (selectionStart == selectionEnd) {\n selectionStart = selectionEnd = 0;\n }\n else {\n selectionStart = 0;\n selectionEnd = 1;\n }\n }\n }\n }\n\n var newValue = line + \"\\n\\n\";\n if (newValue != lastValue) {\n text.value = lastValue = newValue;\n lastSelectionStart = lastSelectionEnd = newValue.length;\n }\n if (afterContextMenu) {\n lastSelectionStart = text.selectionStart;\n lastSelectionEnd = text.selectionEnd;\n }\n if (\n lastSelectionEnd != selectionEnd \n || lastSelectionStart != selectionStart \n || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization\n ) {\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n } catch(e){}\n }\n inComposition = false;\n };\n this.resetSelection = resetSelection;\n\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd >= lastValue.length\n && text.value === lastValue && lastValue\n && text.selectionEnd !== lastSelectionEnd;\n };\n\n var onSelect = function(e) {\n if (inComposition)\n return;\n if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (isMobile && text.selectionStart != lastSelectionStart) {\n resetSelection();\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(value, fromInput) {\n if (afterContextMenu)\n afterContextMenu = false;\n if (pasted) {\n resetSelection();\n if (value)\n host.onPaste(value);\n pasted = false;\n return \"\";\n } else {\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n \n var extendLeft = lastSelectionStart;\n var extendRight = lastValue.length - lastSelectionEnd;\n \n var inserted = value;\n var restoreStart = value.length - selectionStart;\n var restoreEnd = value.length - selectionEnd;\n \n var i = 0;\n while (extendLeft > 0 && lastValue[i] == value[i]) {\n i++;\n extendLeft--;\n }\n inserted = inserted.slice(i);\n i = 1;\n while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) {\n i++;\n extendRight--;\n }\n restoreStart -= i-1;\n restoreEnd -= i-1;\n var endIndex = inserted.length - i + 1;\n if (endIndex < 0) {\n extendLeft = -endIndex;\n endIndex = 0;\n } \n inserted = inserted.slice(0, endIndex);\n if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd)\n return \"\";\n sendingText = true;\n var shouldReset = false;\n if (useragent.isAndroid && inserted == \". \") {\n inserted = \" \";\n shouldReset = true;\n }\n \n if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) {\n host.onTextInput(inserted);\n } else {\n host.onTextInput(inserted, {\n extendLeft: extendLeft,\n extendRight: extendRight,\n restoreStart: restoreStart,\n restoreEnd: restoreEnd\n });\n }\n sendingText = false;\n \n lastValue = value;\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n lastRestoreEnd = restoreEnd;\n return shouldReset ? \"\\n\" : inserted;\n }\n };\n var onInput = function(e) {\n if (inComposition)\n return onCompositionUpdate();\n if (e && e.inputType) {\n if (e.inputType == \"historyUndo\") return host.execCommand(\"undo\");\n if (e.inputType == \"historyRedo\") return host.execCommand(\"redo\");\n }\n var data = text.value;\n var inserted = sendText(data, true);\n if (\n data.length > MAX_LINE_LENGTH + 100 \n || valueResetRegex.test(inserted)\n || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd\n ) {\n resetSelection();\n }\n };\n \n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\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 if (isIOS) {\n resetSelection(data);\n copied = data;\n setTimeout(function () {\n copied = false;\n }, 10);\n }\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 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 (clipboard.pasteCancelled())\n return;\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\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), host);\n\n event.addListener(text, \"select\", onSelect, host);\n event.addListener(text, \"input\", onInput, host);\n\n event.addListener(text, \"cut\", onCut, host);\n event.addListener(text, \"copy\", onCopy, host);\n event.addListener(text, \"paste\", onPaste, host);\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 }, host);\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly) \n return;\n \n inComposition = {};\n\n if (commandMode)\n return;\n \n if (e.data)\n inComposition.useTextareaForIME = false;\n \n setTimeout(onCompositionUpdate, 0);\n host._signal(\"compositionStart\");\n host.on(\"mousedown\", cancelComposition);\n \n var range = host.getSelectionRange();\n range.end.row = range.start.row;\n range.end.column = range.start.column;\n inComposition.markerRange = range;\n inComposition.selectionStart = lastSelectionStart;\n host.onCompositionStart(inComposition);\n \n if (inComposition.useTextareaForIME) {\n lastValue = text.value = \"\";\n lastSelectionStart = 0;\n lastSelectionEnd = 0;\n }\n else {\n if (text.msGetInputContext)\n inComposition.context = text.msGetInputContext();\n if (text.getInputContext)\n inComposition.context = text.getInputContext();\n }\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n if (commandMode)\n return cancelComposition();\n \n if (inComposition.useTextareaForIME) {\n host.onCompositionUpdate(text.value);\n }\n else {\n var data = text.value;\n sendText(data);\n if (inComposition.markerRange) {\n if (inComposition.context) {\n inComposition.markerRange.start.column = inComposition.selectionStart\n = inComposition.context.compositionStartOffset;\n }\n inComposition.markerRange.end.column = inComposition.markerRange.start.column\n + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd;\n }\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n inComposition = false;\n host.onCompositionEnd();\n host.off(\"mousedown\", cancelComposition);\n if (e) onInput();\n };\n \n\n function cancelComposition() {\n ignoreFocusEvents = true;\n text.blur();\n text.focus();\n ignoreFocusEvents = false;\n }\n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null);\n \n function onKeyup(e) {\n if (e.keyCode == 27 && text.value.length < text.selectionStart) {\n if (!inComposition)\n lastValue = text.value;\n lastSelectionStart = lastSelectionEnd = -1;\n resetSelection();\n }\n syncComposition();\n }\n\n event.addListener(text, \"compositionstart\", onCompositionStart, host);\n event.addListener(text, \"compositionupdate\", onCompositionUpdate, host);\n event.addListener(text, \"keyup\", onKeyup, host);\n event.addListener(text, \"keydown\", syncComposition, host);\n event.addListener(text, \"compositionend\", onCompositionEnd, host);\n\n this.getElement = function() {\n return text;\n };\n this.setCommandMode = function(value) {\n commandMode = value;\n text.readOnly = false;\n };\n \n this.setReadOnly = function(readOnly) {\n if (!commandMode)\n text.readOnly = readOnly;\n };\n\n this.setCopyWithEmptySelection = function(value) {\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection();\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n \n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + (useragent.isIE ? \"opacity:0.1;\" : \"\")\n + \"text-indent: -\" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + \"px;\";\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 dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop));\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n host.renderer.$isMousePressed = true;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\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 host.renderer.$isMousePressed = false;\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$moveTextAreaToCursor();\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu, host);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n }, host);\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu, host);\n event.addListener(text, \"contextmenu\", onContextMenu, host);\n \n if (isIOS)\n addIosSelectionHandler(parentNode, host, text);\n\n function addIosSelectionHandler(parentNode, host, text) {\n var typingResetTimeout = null;\n var typing = false;\n \n text.addEventListener(\"keydown\", function (e) {\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\n typing = true;\n }, true);\n\n text.addEventListener(\"keyup\", function (e) {\n typingResetTimeout = setTimeout(function () {\n typing = false;\n }, 100);\n }, true);\n var detectArrowKeys = function(e) {\n if (document.activeElement !== text) return;\n if (typing || inComposition || host.$mouseHandler.isMousePressed) return;\n\n if (copied) {\n return;\n }\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n \n var key = null;\n var modifier = 0;\n if (selectionStart == 0) {\n key = KEYS.up;\n } else if (selectionStart == 1) {\n key = KEYS.home;\n } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == \"\\n\") {\n key = KEYS.end;\n } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == \" \") {\n key = KEYS.left;\n modifier = MODS.option;\n } else if (\n selectionStart < lastSelectionStart\n || (\n selectionStart == lastSelectionStart \n && lastSelectionEnd != lastSelectionStart\n && selectionStart == selectionEnd\n )\n ) {\n key = KEYS.left;\n } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split(\"\\n\").length > 2) {\n key = KEYS.down;\n } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == \" \") {\n key = KEYS.right;\n modifier = MODS.option;\n } else if (\n selectionEnd > lastSelectionEnd\n || (\n selectionEnd == lastSelectionEnd \n && lastSelectionEnd != lastSelectionStart\n && selectionStart == selectionEnd\n )\n ) {\n key = KEYS.right;\n }\n \n if (selectionStart !== selectionEnd)\n modifier |= MODS.shift;\n\n if (key) {\n var result = host.onCommandKey({}, modifier, key);\n if (!result && host.commands) {\n key = KEYS.keyCodeToString(key);\n var command = host.commands.findKeyCommand(modifier, key);\n if (command)\n host.execCommand(command);\n }\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n resetSelection(\"\");\n }\n };\n document.addEventListener(\"selectionchange\", detectArrowKeys);\n host.on(\"destroy\", function() {\n document.removeEventListener(\"selectionchange\", detectArrowKeys);\n });\n }\n};\n\nexports.TextInput = TextInput;\nexports.$setUserAgentForTests = function(_isMobile, _isIOS) {\n isMobile = _isMobile;\n isIOS = _isIOS;\n};\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 550; // milliseconds\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 if (selectionEmpty || button == 1)\n editor.selection.moveToPosition(pos);\n if (button == 2) {\n editor.textInput.onContextMenu(ev.domEvent);\n if (!useragent.isMozilla)\n ev.preventDefault();\n }\n return;\n }\n\n this.mousedownEvent.time = Date.now();\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimeout && !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 if (!this.mousedownEvent) return;\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 };\n\n this.select = function() {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\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.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 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.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.$focusTimeout)\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 editor = this.editor;\n \n if (!this.$lastScroll)\n this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n \n var prevScroll = this.$lastScroll;\n var t = ev.domEvent.timeStamp;\n var dt = t - prevScroll.t;\n var vx = dt ? ev.wheelX / dt : prevScroll.vx;\n var vy = dt ? ev.wheelY / dt : prevScroll.vy;\n if (dt < SCROLL_COOLDOWN_T) {\n vx = (vx + prevScroll.vx) / 2;\n vy = (vy + prevScroll.vy) / 2;\n }\n \n var direction = Math.abs(vx / vy);\n \n var canScroll = false;\n if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n canScroll = true;\n if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n canScroll = true;\n \n if (canScroll) {\n prevScroll.allowed = t;\n } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx)\n && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy);\n if (isSlower) {\n canScroll = true;\n prevScroll.allowed = t;\n }\n else {\n prevScroll.allowed = 0;\n }\n }\n \n prevScroll.t = t;\n prevScroll.vx = vx;\n prevScroll.vy = vy;\n\n if (canScroll) {\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 this.getElement().textContent = 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 this.destroy = function() {\n this.isOpen = false;\n if (this.$element && this.$element.parentNode) {\n this.$element.parentNode.removeChild(this.$element);\n }\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(\"
\");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\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._signal(\"hideGutterTooltip\", tooltip);\n editor.off(\"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 }, editor);\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 dragImage = dom.createElement(\"div\");\n dragImage.style.cssText = \"top:-100px;position:absolute;z-index:2147483647;opacity:0.5\";\n dragImage.textContent = \"\\xa0\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.on(\"mousedown\", this.onMouseDown.bind(mouseHandler));\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 editor.container.appendChild(dragImage);\n\n dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0);\n setTimeout(function() {\n editor.container.removeChild(dragImage);\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.$resetCursorStyle();\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), editor);\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler), editor);\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.moveCursorToPosition(cursor);\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.selection.fromOrientedRange(range);\n if (editor.isFocused() && !isInternal)\n editor.$resetCursorStyle();\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.$resetCursorStyle();\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/mouse/touch_handler\",[\"require\",\"exports\",\"module\",\"ace/mouse/mouse_event\",\"ace/lib/event\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar event = require(\"../lib/event\");\nvar dom = require(\"../lib/dom\");\n\nexports.addTouchListeners = function(el, editor) {\n var mode = \"scroll\";\n var startX;\n var startY;\n var touchStartT;\n var lastT;\n var longTouchTimer;\n var animationTimer;\n var animationSteps = 0;\n var pos;\n var clickCount = 0;\n var vX = 0;\n var vY = 0;\n var pressed;\n var contextMenu;\n \n function createContextMenu() {\n var clipboard = window.navigator && window.navigator.clipboard;\n var isOpen = false;\n var updateMenu = function() {\n var selected = editor.getCopyText();\n var hasUndo = editor.session.getUndoManager().hasUndo();\n contextMenu.replaceChild(\n dom.buildDom(isOpen ? [\"span\",\n !selected && [\"span\", { class: \"ace_mobile-button\", action: \"selectall\" }, \"Select All\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"copy\" }, \"Copy\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"cut\" }, \"Cut\"],\n clipboard && [\"span\", { class: \"ace_mobile-button\", action: \"paste\" }, \"Paste\"],\n hasUndo && [\"span\", { class: \"ace_mobile-button\", action: \"undo\" }, \"Undo\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"find\" }, \"Find\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"openCommandPallete\" }, \"Pallete\"]\n ] : [\"span\"]),\n contextMenu.firstChild\n );\n };\n var handleClick = function(e) {\n var action = e.target.getAttribute(\"action\");\n\n if (action == \"more\" || !isOpen) {\n isOpen = !isOpen;\n return updateMenu();\n }\n if (action == \"paste\") {\n clipboard.readText().then(function (text) {\n editor.execCommand(action, text);\n });\n }\n else if (action) {\n if (action == \"cut\" || action == \"copy\") {\n if (clipboard)\n clipboard.writeText(editor.getCopyText());\n else\n document.execCommand(\"copy\");\n }\n editor.execCommand(action);\n }\n contextMenu.firstChild.style.display = \"none\";\n isOpen = false;\n if (action != \"openCommandPallete\")\n editor.focus();\n };\n contextMenu = dom.buildDom([\"div\",\n {\n class: \"ace_mobile-menu\",\n ontouchstart: function(e) {\n mode = \"menu\";\n e.stopPropagation();\n e.preventDefault();\n editor.textInput.focus();\n },\n ontouchend: function(e) {\n e.stopPropagation();\n e.preventDefault();\n handleClick(e);\n },\n onclick: handleClick\n },\n [\"span\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"more\" }, \"...\"]\n ], editor.container);\n }\n function showContextMenu() {\n if (!contextMenu) createContextMenu();\n var cursor = editor.selection.cursor;\n var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column);\n var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX;\n var scrollLeft = editor.renderer.scrollLeft;\n var rect = editor.container.getBoundingClientRect();\n contextMenu.style.top = pagePos.pageY - rect.top - 3 + \"px\";\n if (pagePos.pageX - rect.left < rect.width - 70) {\n contextMenu.style.left = \"\";\n contextMenu.style.right = \"10px\";\n } else {\n contextMenu.style.right = \"\";\n contextMenu.style.left = leftOffset + scrollLeft - rect.left + \"px\";\n }\n contextMenu.style.display = \"\";\n contextMenu.firstChild.style.display = \"none\";\n editor.on(\"input\", hideContextMenu);\n }\n function hideContextMenu(e) {\n if (contextMenu)\n contextMenu.style.display = \"none\";\n editor.off(\"input\", hideContextMenu);\n }\n\n function handleLongTap() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n var range = editor.selection.getRange();\n var inSelection = range.contains(pos.row, pos.column);\n if (range.isEmpty() || !inSelection) {\n editor.selection.moveToPosition(pos);\n editor.selection.selectWord();\n }\n mode = \"wait\";\n showContextMenu();\n }\n function switchToSelectionMode() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n editor.selection.moveToPosition(pos);\n var range = clickCount >= 2\n ? editor.selection.getLineRange(pos.row)\n : editor.session.getBracketRange(pos);\n if (range && !range.isEmpty()) {\n editor.selection.setRange(range);\n } else {\n editor.selection.selectWord();\n }\n mode = \"wait\";\n }\n event.addListener(el, \"contextmenu\", function(e) {\n if (!pressed) return;\n var textarea = editor.textInput.getElement();\n textarea.focus();\n }, editor);\n event.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n if (longTouchTimer || touches.length > 1) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n touchStartT = -1;\n mode = \"zoom\";\n return;\n }\n \n pressed = editor.$mouseHandler.isMousePressed = true;\n var h = editor.renderer.layerConfig.lineHeight;\n var w = editor.renderer.layerConfig.lineHeight;\n var t = e.timeStamp;\n lastT = t;\n var touchObj = touches[0];\n var x = touchObj.clientX;\n var y = touchObj.clientY;\n if (Math.abs(startX - x) + Math.abs(startY - y) > h)\n touchStartT = -1;\n \n startX = e.clientX = x;\n startY = e.clientY = y;\n vX = vY = 0;\n \n var ev = new MouseEvent(e, editor);\n pos = ev.getDocumentPosition();\n\n if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) {\n clickCount++;\n e.preventDefault();\n e.button = 0;\n switchToSelectionMode();\n } else {\n clickCount = 0;\n var cursor = editor.selection.cursor;\n var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor;\n \n var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true);\n var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true);\n var rect = editor.renderer.scroller.getBoundingClientRect();\n var offsetTop = editor.renderer.layerConfig.offset;\n var offsetLeft = editor.renderer.scrollLeft;\n var weightedDistance = function(x, y) {\n x = x / w;\n y = y / h - 0.75;\n return x * x + y * y;\n };\n \n if (e.clientX < rect.left) {\n mode = \"zoom\";\n return;\n }\n \n var diff1 = weightedDistance(\n e.clientX - rect.left - cursorPos.left + offsetLeft,\n e.clientY - rect.top - cursorPos.top + offsetTop\n );\n var diff2 = weightedDistance(\n e.clientX - rect.left - anchorPos.left + offsetLeft,\n e.clientY - rect.top - anchorPos.top + offsetTop\n );\n if (diff1 < 3.5 && diff2 < 3.5)\n mode = diff1 > diff2 ? \"cursor\" : \"anchor\";\n \n if (diff2 < 3.5)\n mode = \"anchor\";\n else if (diff1 < 3.5)\n mode = \"cursor\";\n else\n mode = \"scroll\";\n longTouchTimer = setTimeout(handleLongTap, 450);\n }\n touchStartT = t;\n }, editor);\n\n event.addListener(el, \"touchend\", function (e) {\n pressed = editor.$mouseHandler.isMousePressed = false;\n if (animationTimer) clearInterval(animationTimer);\n if (mode == \"zoom\") {\n mode = \"\";\n animationSteps = 0;\n } else if (longTouchTimer) {\n editor.selection.moveToPosition(pos);\n animationSteps = 0;\n showContextMenu();\n } else if (mode == \"scroll\") {\n animate();\n hideContextMenu();\n } else {\n showContextMenu();\n }\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }, editor);\n event.addListener(el, \"touchmove\", function (e) {\n if (longTouchTimer) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }\n var touches = e.touches;\n if (touches.length > 1 || mode == \"zoom\") return;\n\n var touchObj = touches[0];\n\n var wheelX = startX - touchObj.clientX;\n var wheelY = startY - touchObj.clientY;\n\n if (mode == \"wait\") {\n if (wheelX * wheelX + wheelY * wheelY > 4)\n mode = \"cursor\";\n else\n return e.preventDefault();\n }\n\n startX = touchObj.clientX;\n startY = touchObj.clientY;\n\n e.clientX = touchObj.clientX;\n e.clientY = touchObj.clientY;\n\n var t = e.timeStamp;\n var dt = t - lastT;\n lastT = t;\n if (mode == \"scroll\") {\n var mouseEvent = new MouseEvent(e, editor);\n mouseEvent.speed = 1;\n mouseEvent.wheelX = wheelX;\n mouseEvent.wheelY = wheelY;\n if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0;\n if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0;\n if (dt != 0) {\n vX = wheelX / dt;\n vY = wheelY / dt;\n }\n editor._emit(\"mousewheel\", mouseEvent);\n if (!mouseEvent.propagationStopped) {\n vX = vY = 0;\n }\n }\n else {\n var ev = new MouseEvent(e, editor);\n var pos = ev.getDocumentPosition();\n if (mode == \"cursor\")\n editor.selection.moveCursorToPosition(pos);\n else if (mode == \"anchor\")\n editor.selection.setSelectionAnchor(pos.row, pos.column);\n editor.renderer.scrollCursorIntoView(pos);\n e.preventDefault();\n }\n }, editor);\n\n function animate() {\n animationSteps += 60;\n animationTimer = setInterval(function() {\n if (animationSteps-- <= 0) {\n clearInterval(animationTimer);\n animationTimer = null;\n }\n if (Math.abs(vX) < 0.01) vX = 0;\n if (Math.abs(vY) < 0.01) vY = 0;\n if (animationSteps < 20) vX = 0.9 * vX;\n if (animationSteps < 20) vY = 0.9 * vY;\n var oldScrollTop = editor.session.getScrollTop();\n editor.renderer.scrollBy(10 * vX, 10 * vY);\n if (oldScrollTop == editor.session.getScrollTop())\n animationSteps = 0;\n }, 10);\n }\n};\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 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 \n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n reportErrorIfPathIsNotConfigured();\n};\n\nvar reportErrorIfPathIsNotConfigured = function() {\n if (\n !options.basePath && !options.workerPath \n && !options.modePath && !options.themePath\n && !Object.keys(options.$moduleUrls).length\n ) {\n console.error(\n \"Unable to infer path to ace from script src,\",\n \"use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes\",\n \"or with webpack use ace/webpack-resolver\"\n );\n reportErrorIfPathIsNotConfigured = function() {};\n }\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);\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 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\t\t\t\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\t\t\t\t\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\t\t\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\t\n\tif (hi == 0) {\t\t\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\t\t\t\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\t\t\n\treturn ON;\t\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\nexports.RLE = 7;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\t\t\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = []; \n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) \n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\t\t\t\t\n\tif (chars[0] === '\\u202B')\n\t\tlevels[0] = exports.RLE;\n\t\t\t\t\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\t\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar bidiUtil = require(\"./lib/bidiutil\");\nvar lang = require(\"./lib/lang\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\u202B]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.$isRtl = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.EOF = \"\\xB6\";\n this.RLE = \"\\u202B\";\n this.contentWidth = 0;\n this.fontMetrics = null;\n this.rtlLineOffset = 0;\n this.wrapOffset = 0;\n this.isMoveLeftOperation = false;\n this.seenBidi = bidiRE.test(session.getValue());\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n } \n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n } else {\n splitIndex = this.currentRow;\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n \n var isLastRow = (docRow === this.session.getLength() - 1),\n endOfLine = isLastRow ? this.EOF : this.EOL;\n\n this.wrapIndent = 0;\n this.line = this.session.getLine(docRow);\n this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE;\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L];\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splitIndex]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n if (splitIndex == splits.length)\n this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT;\n } else {\n this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT;\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n\n if (this.isRtlDir) {\n this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line;\n this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width;\n }\n };\n \n this.updateBidiMap = function() {\n var textCharTypes = [];\n if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) {\n this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n this.fontMetrics = fontMetrics;\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0;\n\n this.currentRow = null;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar; \n };\n\n this.setContentWidth = function(width) {\n this.contentWidth = width;\n };\n\n this.isRtlLine = function(row) {\n if (this.$isRtl) return true;\n if (row != undefined)\n return (this.session.getLine(row).charAt(0) == this.RLE);\n else\n return this.isRtlDir; \n };\n\n this.setRtlDirection = function(editor, isRtlDir) {\n var cursor = editor.getCursorPosition(); \n for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) {\n if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE)\n editor.session.doc.removeInLine(row, 0, 1);\n else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE)\n editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE);\n }\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0;\n var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n \n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0))\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n if (this.isRtlDir)\n left += this.rtlLineOffset;\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0,\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n \n if (this.wrapIndent)\n offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n if(this.isRtlDir) {\n for (var i = 0; i < selections.length; i++) {\n selections[i].left += this.rtlLineOffset;\n }\n }\n return selections;\n };\n this.offsetToCol = function(posX) {\n if(this.isRtlDir)\n posX -= this.rtlLineOffset;\n\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n \n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n \n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n if (logicalIdx === 0 && this.isRtlDir)\n logicalIdx++;\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\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.cursor = this.lead = this.doc.createAnchor(0, 0);\n this.anchor = this.doc.createAnchor(0, 0);\n this.$silent = false;\n\n var self = this;\n this.cursor.on(\"change\", function(e) {\n self.$cursorChanged = true;\n if (!self.$silent)\n self._emit(\"changeCursor\");\n if (!self.$isEmpty && !self.$silent)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.anchor.on(\"change\", function() {\n self.$anchorChanged = true;\n if (!self.$isEmpty && !self.$silent)\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 return !this.$isEmpty && this.anchor.row != this.cursor.row;\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.$isEmpty = false;\n this.anchor.setPosition(row, column);\n };\n this.getAnchor = \n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n \n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\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 return this.isBackwards()\n ? Range.fromPoints(lead, anchor)\n : Range.fromPoints(anchor, lead);\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n var start = reverse ? range.end : range.start;\n var end = reverse ? range.start : range.end;\n this.$setSelection(start.row, start.column, end.row, end.column);\n };\n\n this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) {\n if (this.$silent)\n return;\n var wasEmpty = this.$isEmpty;\n var wasMultiselect = this.inMultiSelectMode;\n this.$silent = true;\n this.$cursorChanged = this.$anchorChanged = false;\n this.anchor.setPosition(anchorRow, anchorColumn);\n this.cursor.setPosition(cursorRow, cursorColumn);\n this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor);\n this.$silent = false;\n if (this.$cursorChanged)\n this._emit(\"changeCursor\");\n if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect)\n this._emit(\"changeSelection\");\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.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\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.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\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.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\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 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 (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 (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 this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (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 (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 index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (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 var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n \n if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) {\n var widget = this.session.lineWidgets[this.lead.row];\n if (rows < 0)\n rows -= widget.rowsAbove || 0;\n else if (rows > 0)\n rows += widget.rowCount - (widget.rowsAbove || 0);\n }\n \n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n \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 var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\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 };\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(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 && data.length > 1) {\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[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else {\n data = data[0];\n }\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 if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\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, line);\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 if (rule.consumeLineEnd)\n lastIndex = index;\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 += 500),\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.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\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 var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\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 var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\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 }\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 this.$keywordList = [];\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; ) {\n var word = list[i];\n this.$keywordList.push(word);\n if (ignoreCase)\n word = word.toLowerCase(); \n keywords[word] = className;\n }\n }, this);\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/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\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 this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\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\", \"rparen\", \"paren\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\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 getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\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 getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\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 getWrapped(selection, selected, '(', ')');\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 getWrapped(selection, selected, '[', ']');\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 var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) \n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\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|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n \n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\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 var charBefore = line[cursor.column - 2];\n if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore)))\n return null;\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 quotes = session.$mode.$quotes || defaultQuotes;\n\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && quotes.hasOwnProperty(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 if (/[)}\\]]/.test(editor.session.getLine(cursor.row)[cursor.column]))\n return true;\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/unicode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar wordChars = [48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2];\n\nvar code = 0;\nvar str = [];\nfor (var i = 0; i < wordChars.length; i += 2) {\n str.push(code += wordChars[i]);\n if (wordChars[i + 1])\n str.push(45, code += wordChars[i + 1]);\n}\n\nexports.wordChars = String.fromCharCode.apply(null, str);\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar config = require(\"../config\");\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\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};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\" + unicode.wordChars + \"\\\\$_]+\", \"g\");\n\n this.nonTokenRe = new RegExp(\"^(?:[^\" + unicode.wordChars + \"\\\\$_]|\\\\s])+\", \"g\");\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\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 };\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 var Mode = mapping[i];\n var id = Mode.prototype.$id;\n var mode = config.$modes[id];\n if (!mode)\n config.$modes[id] = mode = new Mode();\n if (!config.$modes[i])\n config.$modes[i] = mode;\n this.$embeds.push(i);\n this.$modes[i] = mode;\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] || \"start\";\n if (typeof state != \"string\") {\n if (Array.isArray(state[2])) {\n var language = state[2][state[2].length - 1];\n var mode = this.$modes[language];\n if (mode)\n return mode[method].apply(mode, [state[1]].concat([].slice.call(args, 1)));\n }\n state = state[0] || \"start\";\n }\n \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/apply_delta\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\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(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\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.off(\"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/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar applyDelta = require(\"./apply_delta\").applyDelta;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).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\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 return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n 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 }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\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 {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\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 var end;\n if (text) {\n 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=0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000) {\n this.$splitAndapplyLargeDelta(delta, 20000);\n }\n else {\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n }\n };\n \n this.$safeApplyDelta = function(delta) {\n var docLength = this.$lines.length;\n if (\n delta.action == \"remove\" && delta.start.row < docLength && delta.end.row < docLength\n || delta.action == \"insert\" && delta.start.row <= docLength\n ) {\n this.applyDelta(delta);\n }\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length - MAX + 1;\n var row = delta.start.row; \n var column = delta.start.column;\n for (var from = 0, to = 0; from < l; from = to) {\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n }\n delta.lines = lines.slice(from);\n delta.start.row = row + from;\n delta.start.column = column;\n this.applyDelta(delta, true);\n };\n this.revertDelta = function(delta) {\n this.$safeApplyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\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: index + lines[l-1].length + newlineLength};\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 var startLine = currentLine;\n while (self.lines[currentLine])\n 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 (endLine == -1)\n endLine = 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 startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\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 this.$bias = 1;\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.apply(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(delta) {\n var start = delta.start;\n var end = delta.end;\n var startRow = start.row;\n var endRow = end.row;\n var ranges = this.ranges;\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row >= startRow)\n break;\n }\n \n if (delta.action == \"insert\") {\n var lineDif = endRow - startRow;\n var colDiff = -start.column + end.column;\n for (; i < n; i++) {\n var r = ranges[i];\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.$bias <= 0) {\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.$bias < 0) {\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 } else {\n var lineDif = startRow - endRow;\n var colDiff = start.column - end.column;\n for (; i < n; i++) {\n var r = ranges[i];\n \n if (r.start.row > endRow)\n break;\n \n if (r.end.row < endRow\n && (\n startRow < r.end.row \n || startRow == r.end.row && start.column < r.end.column\n )\n ) {\n r.end.row = startRow;\n r.end.column = start.column;\n }\n else if (r.end.row == endRow) {\n if (r.end.column <= end.column) {\n if (lineDif || r.end.column > start.column) {\n r.end.column = start.column;\n r.end.row = start.row;\n }\n }\n else {\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n else if (r.end.row > endRow) {\n r.end.row += lineDif;\n }\n \n if (r.start.row < endRow\n && (\n startRow < r.start.row \n || startRow == r.start.row && start.column < r.start.column\n )\n ) {\n r.start.row = startRow;\n r.start.column = start.column;\n }\n else if (r.start.row == endRow) {\n if (r.start.column <= end.column) {\n if (lineDif || r.start.column > start.column) {\n r.start.column = start.column;\n r.start.row = start.row;\n }\n }\n else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n else if (r.start.row > endRow) {\n r.start.row += lineDif;\n }\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_list\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\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 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 var firstConsumed = 0;\n\n if (cmp == 0) {\n if (afterStart.range.containsRange(fold))\n return afterStart.addSubFold(fold);\n else\n firstConsumed = 1;\n }\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 if (cmp == 0) j++;\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length;\n for (var k = firstConsumed; k < last; k++) {\n fold.addSubFold(consumedFolds[k]);\n }\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 range = folds[i].range;\n if (range.contains(row, column)) {\n if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) {\n continue;\n } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) {\n continue;\n }\n return folds[i];\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\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 if (!fold.collapseChildren) {\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\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._signal(\"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._signal(\"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 if (expandInner == null) 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 if (Array.isArray(location)) {\n folds = [];\n location.forEach(function(range) {\n folds = folds.concat(this.unfold(range));\n }, this);\n return folds;\n } else {\n range = location;\n }\n \n folds = this.getFoldsInRangeList(range);\n var outermostFolds = folds;\n while (\n folds.length == 1\n && Range.comparePoints(folds[0].start, range.start) < 0 \n && Range.comparePoints(folds[0].end, range.end) > 0\n ) {\n this.expandFolds(folds);\n folds = this.getFoldsInRangeList(range);\n }\n \n if (expandInner != false) {\n this.removeFolds(folds);\n } else {\n this.expandFolds(folds);\n }\n if (outermostFolds.length)\n return outermostFolds;\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 var type = token && token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\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 var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\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, test) {\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 if (test && !test(row)) 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 range.collapseChildren = depth;\n this.addFold(\"...\", range);\n }\n }\n };\n \n this.foldToLevel = function(level) {\n this.foldAll();\n while (level-- > 0)\n this.unfold(null, false);\n };\n \n this.foldAllComments = function() {\n var session = this;\n this.foldAll(null, null, null, function(row) {\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token.type == \"text\" && /^\\s+$/.test(token.value))\n continue;\n if (/comment/.test(token.type))\n return true;\n return false;\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._signal(\"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 fold;\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 fold;\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, endRow, 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(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\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 this.getMatchingBracketRanges = function(pos) {\n var line = this.getLine(pos.row);\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 }\n\n if (!match)\n return null;\n\n var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column);\n var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos)\n : this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return [startRange];\n var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1);\n\n return [startRange, endRange];\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\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)\\b/, \"(?:start|begin|end)\")\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(?:start|begin)\\b/, \"(?:start|begin|end)\")\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/bidihandler\",\"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 BidiHandler = require(\"./bidihandler\").BidiHandler;\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.id = \"session\" + (++EditSession.$uid);\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 this.$bidiHandler = new BidiHandler(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.off(\"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(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager) {\n if (removedFolds && removedFolds.length) {\n this.$undoManager.add({\n action: \"removeFolds\",\n folds: removedFolds\n }, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n }\n this.$undoManager.add(delta, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n \n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\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 var 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 \n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n \n if (undoManager) {\n var self = this;\n undoManager.addSession(this);\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n self.mergeUndoDeltas = false;\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n } else {\n this.$syncInformUndoManager = function() {};\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 hasUndo: function() {},\n hasRedo: function() {},\n reset: function() {},\n add: function() {},\n addSelection: function() {},\n startNewGroup: function() {},\n addSession: 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 this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\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 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 = config.$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 this.$onChangeMode(this.$modes[path]);\n } else 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 }\n cb && cb();\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 var oldMode = this.$mode;\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.on !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.on(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.on(\"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\", {oldMode: oldMode, mode: mode});\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.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.revertDelta(delta);\n } else if (delta.folds) {\n this.addFolds(delta.folds);\n }\n }\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionBefore)\n this.selection.fromJSON(deltas.selectionBefore);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, true));\n }\n this.$fromUndo = false;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.$safeApplyDelta(delta);\n }\n }\n\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionAfter)\n this.selection.fromJSON(deltas.selectionAfter);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, false));\n }\n this.$fromUndo = false;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var range, point;\n\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (!delta.start) continue; // skip folds\n if (!range) {\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n }\n continue;\n }\n \n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\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.doc.insertInLine({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.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(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 = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\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(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\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(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\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, tabSize) {\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 var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var len = screenPos - lastSplit;\n for (var i = lastSplit; i < screenPos; i++) {\n var ch = tokens[i];\n if (ch === 12 || ch === 2) len -= 1;\n }\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\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 - (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 - indent);\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 var h = 1;\n if (this.lineWidgets)\n h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n \n if (!this.$useWrapMode || !this.$wrapData[row])\n return h;\n else\n return this.$wrapData[row].length + h;\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\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\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 | 0);\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, offsetX) {\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 var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[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 var wrapIndent = 0;\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 wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n \n if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove)\n screenRow += this.lineWidgets[row].rowsAbove;\n\n return {\n row: screenRow,\n column: wrapIndent + 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 if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n this.removeAllListeners();\n if (this.doc) {\n this.doc.off(\"change\", this.$onChange);\n }\n this.selection.detach();\n };\n\n this.isFullWidth = isFullWidth;\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 this.$wrap = value;\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 },\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.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: {\n set: function() {\n if (this.$useWrapMode) {\n this.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n },\n initialValue: true \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 tabSize = parseInt(tabSize);\n if (tabSize > 0 && this.$tabSize !== tabSize) {\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n }\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n foldStyle: {\n set: function(val) {this.setFoldStyle(val);},\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 handlesSet: true\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(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n \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.$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 = addWordBoundary(needle, options);\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 return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\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 if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0 || startRow + len > session.getLength()) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var last;\n var m;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\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, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\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, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position \n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\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 (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, 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 if (keyCode < 0) return;\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) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\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 if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor))\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.off(\"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 description: \"Show settings menu\",\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 description: \"Go to next error\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n description: \"Go to previous error\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n description: \"Select all\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n description: \"Center selection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n description: \"Go to line...\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor, line) {\n if (typeof line === \"number\" && !isNaN(line))\n editor.gotoLine(line);\n editor.prompt({ $type: \"gotoLine\" });\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 multiSelectAction: \"forEach\",\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 multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n description: \"Toggle fold widget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n description: \"Toggle parent fold widget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n description: \"Fold all\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldAllComments\",\n description: \"Fold all comments\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAllComments(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n description: \"Fold other\",\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 description: \"Unfold all\",\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 description: \"Find next\",\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 description: \"Find previous\",\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 description: \"Select or find next\",\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 description: \"Select or find previous\",\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 description: \"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 description: \"Overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n description: \"Select to start\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-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 description: \"Go to start\",\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 description: \"Select up\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n description: \"Go line up\",\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 description: \"Select to end\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-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 description: \"Go to end\",\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 description: \"Select down\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n description: \"Go line down\",\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 description: \"Select word left\",\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 description: \"Go to word left\",\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 description: \"Select to line start\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n description: \"Go to line start\",\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 description: \"Select left\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n description: \"Go to left\",\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 description: \"Select word right\",\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 description: \"Go to word right\",\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 description: \"Select to line end\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n description: \"Go to line end\",\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 description: \"Select right\",\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 description: \"Go to right\",\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 description: \"Select page down\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n description: \"Page down\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n description: \"Go to page down\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n description: \"Select page up\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n description: \"Page up\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n description: \"Go to page up\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n description: \"Scroll up\",\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 description: \"Scroll down\",\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 description: \"Select line start\",\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 description: \"Select line end\",\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 description: \"Toggle recording\",\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 description: \"Replay macro\",\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 description: \"Jump to matching\",\n bindKey: bindKey(\"Ctrl-\\\\|Ctrl-P\", \"Command-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n description: \"Select to matching\",\n bindKey: bindKey(\"Ctrl-Shift-\\\\|Ctrl-Shift-P\", \"Command-Shift-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n description: \"Expand to matching\",\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 description: \"Pass keys to browser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n description: \"Copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n description: \"Cut\",\n exec: function(editor) {\n var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty();\n var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange();\n editor._emit(\"cut\", range);\n\n if (!range.isEmpty())\n editor.session.remove(range);\n editor.clearSelection();\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n description: \"Paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n description: \"Remove line\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n description: \"Duplicate selection\",\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 description: \"Sort lines\",\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 description: \"Toggle comment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n description: \"Toggle block comment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n description: \"Modify number up\",\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 description: \"Modify number down\",\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 description: \"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 description: \"Undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n description: \"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 description: \"Copy lines up\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n description: \"Move lines up\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n description: \"Copy lines down\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n description: \"Move lines down\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n description: \"Delete\",\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 description: \"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 description: \"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 description: \"Remove to line start\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n description: \"Remove to line end\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n description: \"Remove to line start hard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n description: \"Remove to line end hard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n description: \"Remove word left\",\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 description: \"Remove word right\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n description: \"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 description: \"Indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n description: \"Block outdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n description: \"Block indent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n description: \"Insert string\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n description: \"Insert text\",\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 description: \"Split line\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n description: \"Transpose letters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n description: \"To uppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n description: \"To lowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"autoindent\",\n description: \"Auto Indent\",\n bindKey: bindKey(null, null),\n exec: function(editor) { editor.autoIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"animate\"\n}, {\n name: \"expandtoline\",\n description: \"Expand to line\",\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 description: \"Join lines\",\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 description: \"Invert selection\",\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 name: \"addLineAfter\",\n description: \"Add new line after the current line\",\n exec: function(editor) {\n editor.selection.clearSelection();\n editor.navigateLineEnd();\n editor.insert(\"\\n\");\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"addLineBefore\",\n description: \"Add new line before the current line\",\n exec: function(editor) {\n editor.selection.clearSelection();\n var cursor = editor.getCursorPosition();\n editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE);\n editor.insert(\"\\n\");\n if (cursor.row === 0) editor.navigateUp();\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"openCommandPallete\",\n description: \"Open command pallete\",\n bindKey: bindKey(\"F1\", \"F1\"),\n exec: function(editor) {\n editor.prompt({ $type: \"commands\" });\n },\n readOnly: true\n}, {\n name: \"modeSelect\",\n description: \"Change language mode...\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n editor.prompt({ $type: \"modes\" });\n },\n readOnly: true\n}];\n\nfor (var i = 1; i < 9; i++) {\n exports.commands.push({\n name: \"foldToLevel\" + i,\n description: \"Fold To Level \" + i,\n level: i,\n exec: function(editor) { editor.session.foldToLevel(this.level); },\n scrollIntoView: \"center\",\n readOnly: true\n });\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\",\"ace/clipboard\"], 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;\n\nvar clipboard = require(\"./clipboard\");\nvar Editor = function(renderer, session, options) {\n this.$toDestroy = [];\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\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 || options && options.session || new EditSession(\"\"));\n config.resetOptions(this);\n if (options)\n this.setOptions(options);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\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, true));\n this.on(\"change\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.docChanged = true;\n }.bind(this), true);\n \n this.on(\"changeSelection\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commandEvent) {\n if (this.curOp) {\n if (!commandEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commandEvent) {\n this.previousCommand = null;\n commandEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = this.session.curOp = {\n command: commandEvent.command || {},\n args: commandEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n this.curOp.selectionBefore = this.selection.toJSON();\n };\n\n this.endOperation = function(e) {\n if (this.curOp && this.session) {\n if (e && e.returnValue === false || !this.session)\n return (this.curOp = null);\n if (e == true && this.curOp.command && this.curOp.command.name == \"mouse\")\n return;\n this._signal(\"beforeEndOperation\");\n if (!this.curOp) return;\n var command = this.curOp.command;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\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 (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n var sel = this.selection.toJSON();\n this.curOp.selectionAfter = sel;\n this.$lastSel = this.selection.toJSON();\n this.session.getUndoManager().addSelection(sel);\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\" && keyboardHandler != \"ace\") {\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 if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.onCursorChange();\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 this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n \n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\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.$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 if (session.$bracketHighlight) {\n session.$bracketHighlight.markerIds.forEach(function(id) {\n session.removeMarker(id);\n });\n session.$bracketHighlight = null;\n }\n var ranges = session.getMatchingBracketRanges(self.getCursorPosition());\n if (!ranges && session.$mode.getMatching) \n ranges = session.$mode.getMatching(self.session);\n if (!ranges)\n return;\n\n var markerType = \"ace_bracket\";\n if (!Array.isArray(ranges)) {\n ranges = [ranges];\n } else if (ranges.length == 1) {\n markerType = \"ace_error_bracket\";\n }\n if (ranges.length == 2) {\n if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0)\n ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)];\n else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0)\n ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)];\n }\n\n session.$bracketHighlight = {\n ranges: ranges,\n markerIds: ranges.map(function(range) {\n return session.addMarker(range, markerType, \"text\");\n })\n };\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 if (!token)\n return;\n }\n \n var tag = token.value;\n var currentTag = 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) {\n if (token.type.indexOf('tag-name') !== -1) {\n currentTag = token.value;\n if (tag === currentTag) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\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) {\n if (token.type.indexOf('tag-name') !== -1) {\n if (tag === token.value) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n var stepCount = 0;\n var tmpToken = prevToken;\n while (tmpToken) {\n if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) {\n depth--;\n break;\n } else if (tmpToken.value === '<') {\n break;\n }\n tmpToken = iterator.stepBackward();\n stepCount++;\n }\n for (var i = 0; i < stepCount; i++) {\n iterator.stepForward();\n }\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 var sbm = session.$backMarkers[session.$tagHighlight];\n if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n }\n \n if (!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 if (!_self.isFocused())\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 this.$highlightBrackets();\n this.$highlightTags();\n this.$updateHighlightActiveLine();\n };\n this.onDocumentChange = function(delta) {\n var wrap = this.session.$useWrapMode;\n var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);\n this.renderer.updateLines(delta.start.row, lastRow, wrap);\n\n this._signal(\"change\", delta);\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 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.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty())\n highlight = false;\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 startColumn = selection.start.column;\n var endColumn = selection.end.column;\n var line = session.getLine(selection.start.row);\n \n var needle = line.substring(startColumn, endColumn);\n if (needle.length > 5000 || !/[\\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 var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1);\n if (!re.test(wordWithBoundary))\n return;\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 var nl = this.session.doc.getNewLineCharacter();\n var copyLine= false;\n if (!text && this.$copyWithEmptySelection) {\n copyLine = true;\n var ranges = this.selection.getAllRanges();\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (i && ranges[i - 1].start.row == range.start.row)\n continue;\n text += this.session.getLine(range.start.row) + nl;\n }\n }\n var e = {text: text};\n this._signal(\"copy\", e);\n clipboard.lineMode = copyLine ? e.text : false;\n return e.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, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n\n var lineMode = text === clipboard.lineMode;\n var session = this.session;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n if (lineMode)\n session.insert({ row: this.selection.lead.row, column: 0 }, text);\n else\n this.insert(text);\n } else if (lineMode) {\n this.selection.rangeList.ranges.forEach(function(range) {\n session.insert({ row: range.start.row, column: 0 }, text);\n });\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]);\n if (lines.length != ranges.length || isFullLine)\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 session.remove(range);\n \n session.insert(range.start, lines[i]);\n }\n }\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 if (!this.inVirtualSelectionMode) {\n this.session.mergeUndoDeltas = false;\n this.mergeNextCommand = false;\n }\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() && text.indexOf(\"\\n\") == -1) {\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 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 if (this.$enableAutoIndent) {\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\n this.autoIndent = function () {\n var session = this.session;\n var mode = session.getMode();\n\n var startRow, endRow;\n if (this.selection.isEmpty()) {\n startRow = 0;\n endRow = session.doc.getLength() - 1;\n } else {\n var selectedRange = this.getSelectionRange();\n\n startRow = selectedRange.start.row;\n endRow = selectedRange.end.row;\n }\n\n var prevLineState = \"\";\n var prevLine = \"\";\n var lineIndent = \"\";\n var line, currIndent, range;\n var tab = session.getTabString();\n\n for (var row = startRow; row <= endRow; row++) {\n if (row > 0) {\n prevLineState = session.getState(row - 1);\n prevLine = session.getLine(row - 1);\n lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab);\n }\n\n line = session.getLine(row);\n currIndent = mode.$getIndent(line);\n if (lineIndent !== currIndent) {\n if (currIndent.length > 0) {\n range = new Range(row, 0, row, currIndent.length);\n session.remove(range);\n }\n if (lineIndent.length > 0) {\n session.insert({row: row, column: 0}, lineIndent);\n }\n }\n\n mode.autoOutdent(prevLineState, session, row);\n }\n };\n\n\n this.onTextInput = function(text, composition) {\n if (!composition)\n return this.keyBinding.onTextInput(text);\n \n this.startOperation({command: { name: \"insertstring\" }});\n var applyComposition = this.applyComposition.bind(this, text, composition);\n if (this.selection.rangeCount)\n this.forEachSelection(applyComposition);\n else\n applyComposition();\n this.endOperation();\n };\n \n this.applyComposition = function(text, composition) {\n if (composition.extendLeft || composition.extendRight) {\n var r = this.selection.getRange();\n r.start.column -= composition.extendLeft;\n r.end.column += composition.extendRight;\n if (r.start.column < 0) {\n r.start.row--;\n r.start.column += this.session.getLine(r.start.row).length + 1;\n }\n this.selection.setRange(r);\n if (!text && !r.isEmpty())\n this.remove();\n }\n if (text || !this.selection.isEmpty())\n this.insert(text, true);\n if (composition.restoreStart || composition.restoreEnd) {\n var r = this.selection.getRange();\n r.start.column -= composition.restoreStart;\n r.end.column -= composition.restoreEnd;\n this.selection.setRange(r);\n }\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n return 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 if (this.selection.isEmpty())\n this.selection.selectLeft();\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 this.session.selection.moveToPosition(range.end);\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 - 1] == \" \" && 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 (var 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 } else {\n this.toggleWord();\n }\n };\n\n this.$toggleWordPairs = [\n [\"first\", \"last\"],\n [\"true\", \"false\"],\n [\"yes\", \"no\"],\n [\"width\", \"height\"],\n [\"top\", \"bottom\"],\n [\"right\", \"left\"],\n [\"on\", \"off\"],\n [\"x\", \"y\"],\n [\"get\", \"set\"],\n [\"max\", \"min\"],\n [\"horizontal\", \"vertical\"],\n [\"show\", \"hide\"],\n [\"add\", \"remove\"],\n [\"up\", \"down\"],\n [\"before\", \"after\"],\n [\"even\", \"odd\"],\n [\"in\", \"out\"],\n [\"inside\", \"outside\"],\n [\"next\", \"previous\"],\n [\"increase\", \"decrease\"],\n [\"attach\", \"detach\"],\n [\"&&\", \"||\"],\n [\"==\", \"!=\"]\n ];\n\n this.toggleWord = function () {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n this.selection.selectWord();\n var currentState = this.getSelectedText();\n var currWordStart = this.selection.getWordRange().start.column;\n var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\\s/);\n var delta = column - currWordStart - 1;\n if (delta < 0) delta = 0;\n var curLength = 0, itLength = 0;\n var that = this;\n if (currentState.match(/[A-Za-z0-9_]+/)) {\n wordParts.forEach(function (item, i) {\n itLength = curLength + item.length;\n if (delta >= curLength && delta <= itLength) {\n currentState = item;\n that.selection.clearSelection();\n that.moveCursorTo(row, curLength + currWordStart);\n that.selection.selectTo(row, itLength + currWordStart);\n }\n curLength = itLength;\n });\n }\n\n var wordPairs = this.$toggleWordPairs;\n var reg;\n for (var i = 0; i < wordPairs.length; i++) {\n var item = wordPairs[i];\n for (var j = 0; j <= 1; j++) {\n var negate = +!j;\n var firstCondition = currentState.match(new RegExp('^\\\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\\\s?$', 'i'));\n if (firstCondition) {\n var secondCondition = currentState.match(new RegExp('([_]|^|\\\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\\\s)', 'g'));\n if (secondCondition) {\n reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) {\n var res = item[negate];\n if (result.toUpperCase() == result) {\n res = res.toUpperCase();\n } else if (result.charAt(0).toUpperCase() == result.charAt(0)) {\n res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1);\n }\n return res;\n });\n this.insert(reg);\n reg = \"\";\n }\n }\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\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(compositionState) {\n this.renderer.showComposition(compositionState);\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 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\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.selection.selectAll();\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.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 === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\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.session.unfold(range);\n this.selection.setSelectionRange(range);\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.session.getUndoManager().undo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.session.getUndoManager().redo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n if (this.$toDestroy) {\n this.$toDestroy.forEach(function(el) {\n el.destroy();\n });\n this.$toDestroy = null;\n }\n if (this.$mouseHandler)\n this.$mouseHandler.destroy();\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session)\n this.session.destroy();\n if (this._$emitInputEvent)\n this._$emitInputEvent.cancel();\n this.removeAllListeners();\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.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"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 this.prompt = function(message, options, callback) {\n var editor = this;\n config.loadModule(\"./ext/prompt\", function (module) {\n module.prompt(editor, message, options, callback);\n });\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.textInput.setReadOnly(readOnly);\n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n copyWithEmptySelection: {\n set: function(value) {\n this.textInput.setCopyWithEmptySelection(value);\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 enableAutoIndent: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.$keybindingId; },\n handlesSet: true\n },\n value: {\n set: function(val) { this.session.setValue(val); },\n get: function() { return this.getValue(); },\n handlesSet: true,\n hidden: true\n },\n session: {\n set: function(val) { this.setSession(val); },\n get: function() { return this.session; },\n handlesSet: true,\n hidden: true\n },\n \n showLineNumbers: {\n set: function(show) {\n this.renderer.$gutterLayer.setShowLineNumbers(show);\n this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER);\n if (show && this.$relativeLineNumbers)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n },\n initialValue: true\n },\n relativeLineNumbers: {\n set: function(value) {\n if (this.$showLineNumbers && value)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n }\n },\n placeholder: {\n set: function(message) {\n if (!this.$updatePlaceholder) {\n this.$updatePlaceholder = function() {\n var value = this.session && (this.renderer.$composition || this.getValue());\n if (value && this.renderer.placeholderNode) {\n this.renderer.off(\"afterRender\", this.$updatePlaceholder);\n dom.removeCssClass(this.container, \"ace_hasPlaceholder\");\n this.renderer.placeholderNode.remove();\n this.renderer.placeholderNode = null;\n } else if (!value && !this.renderer.placeholderNode) {\n this.renderer.on(\"afterRender\", this.$updatePlaceholder);\n dom.addCssClass(this.container, \"ace_hasPlaceholder\");\n var el = dom.createElement(\"div\");\n el.className = \"ace_placeholder\";\n el.textContent = this.$placeholder || \"\";\n this.renderer.placeholderNode = el;\n this.renderer.content.appendChild(this.renderer.placeholderNode);\n } else if (!value && this.renderer.placeholderNode) {\n this.renderer.placeholderNode.textContent = this.$placeholder || \"\";\n }\n }.bind(this);\n this.on(\"input\", this.$updatePlaceholder);\n }\n this.$updatePlaceholder();\n }\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 displayIndentGuides: \"renderer\",\n showGutter: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n hasCssTransforms: \"renderer\",\n maxPixelHeight: \"renderer\",\n useTextareaForIME: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimeout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n navigateWithinSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\n\nvar relativeNumberRenderer = {\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 Math.max(\n lastLineNumber.toString().length,\n (config.lastRow + 1).toString().length,\n 2\n ) * 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 this.update(null, editor);\n },\n detach: function(editor) {\n if (editor.renderer.$gutterLayer.$renderer == this)\n editor.renderer.$gutterLayer.$renderer = null;\n editor.off(\"changeSelection\", this.update);\n this.update(null, editor);\n }\n};\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.$maxRev = 0;\n this.$fromUndo = false;\n this.reset();\n};\n\n(function() {\n \n this.addSession = function(session) {\n this.$session = session;\n };\n this.add = function(delta, allowMerge, session) {\n if (this.$fromUndo) return;\n if (delta == this.$lastDelta) return;\n if (!this.$keepRedoStack) this.$redoStack.length = 0;\n if (allowMerge === false || !this.lastDeltas) {\n this.lastDeltas = [];\n this.$undoStack.push(this.lastDeltas);\n delta.id = this.$rev = ++this.$maxRev;\n }\n if (delta.action == \"remove\" || delta.action == \"insert\")\n this.$lastDelta = delta;\n this.lastDeltas.push(delta);\n };\n \n this.addSelection = function(selection, rev) {\n this.selections.push({\n value: selection,\n rev: rev || this.$rev\n });\n };\n \n this.startNewGroup = function() {\n this.lastDeltas = null;\n return this.$rev;\n };\n \n this.markIgnored = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id <= from)\n break;\n if (delta.id < to)\n delta.ignore = true;\n }\n this.lastDeltas = null;\n };\n \n this.getSelection = function(rev, after) {\n var stack = this.selections;\n for (var i = stack.length; i--;) {\n var selection = stack[i];\n if (selection.rev < rev) {\n if (after)\n selection = stack[i + 1];\n return selection;\n }\n }\n };\n \n this.getRevision = function() {\n return this.$rev;\n };\n \n this.getDeltas = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n var end = null, start = 0;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id < to && !end)\n end = i+1;\n if (delta.id <= from) {\n start = i + 1;\n break;\n }\n }\n return stack.slice(start, end);\n };\n \n this.getChangedRanges = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n \n this.getChangedLines = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n this.undo = function(session, dontSelect) {\n this.lastDeltas = null;\n var stack = this.$undoStack;\n \n if (!rearrangeUndoStack(stack, stack.length))\n return;\n \n if (!session)\n session = this.$session;\n \n if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length)\n this.$redoStack = [];\n \n this.$fromUndo = true;\n \n var deltaSet = stack.pop();\n var undoSelectionRange = null;\n if (deltaSet) {\n undoSelectionRange = session.undoChanges(deltaSet, dontSelect);\n this.$redoStack.push(deltaSet);\n this.$syncRev();\n }\n \n this.$fromUndo = false;\n\n return undoSelectionRange;\n };\n this.redo = function(session, dontSelect) {\n this.lastDeltas = null;\n \n if (!session)\n session = this.$session;\n \n this.$fromUndo = true;\n if (this.$redoStackBaseRev != this.$rev) {\n var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1);\n rebaseRedoStack(this.$redoStack, diff);\n this.$redoStackBaseRev = this.$rev;\n this.$redoStack.forEach(function(x) {\n x[0].id = ++this.$maxRev;\n }, this);\n }\n var deltaSet = this.$redoStack.pop();\n var redoSelectionRange = null;\n \n if (deltaSet) {\n redoSelectionRange = session.redoChanges(deltaSet, dontSelect);\n this.$undoStack.push(deltaSet);\n this.$syncRev();\n }\n this.$fromUndo = false;\n \n return redoSelectionRange;\n };\n \n this.$syncRev = function() {\n var stack = this.$undoStack;\n var nextDelta = stack[stack.length - 1];\n var id = nextDelta && nextDelta[0].id || 0;\n this.$redoStackBaseRev = id;\n this.$rev = id;\n };\n this.reset = function() {\n this.lastDeltas = null;\n this.$lastDelta = null;\n this.$undoStack = [];\n this.$redoStack = [];\n this.$rev = 0;\n this.mark = 0;\n this.$redoStackBaseRev = this.$rev;\n this.selections = [];\n };\n this.canUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.canRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.bookmark = function(rev) {\n if (rev == undefined)\n rev = this.$rev;\n this.mark = rev;\n };\n this.isAtBookmark = function() {\n return this.$rev === this.mark;\n };\n \n this.toJSON = function() {\n \n };\n \n this.fromJSON = function() {\n \n };\n \n this.hasUndo = this.canUndo;\n this.hasRedo = this.canRedo;\n this.isClean = this.isAtBookmark;\n this.markClean = this.bookmark;\n \n this.$prettyPrint = function(delta) {\n if (delta) return stringifyDelta(delta);\n return stringifyDelta(this.$undoStack) + \"\\n---\\n\" + stringifyDelta(this.$redoStack);\n };\n}).call(UndoManager.prototype);\n\nfunction rearrangeUndoStack(stack, pos) {\n for (var i = pos; i--; ) {\n var deltaSet = stack[i];\n if (deltaSet && !deltaSet[0].ignore) {\n while(i < pos - 1) {\n var swapped = swapGroups(stack[i], stack[i + 1]);\n stack[i] = swapped[0];\n stack[i + 1] = swapped[1];\n i++;\n }\n return true;\n }\n }\n}\n\nvar Range = require(\"./range\").Range;\nvar cmp = Range.comparePoints;\nvar comparePoints = Range.comparePoints;\n\nfunction $updateMarkers(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 = 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 }\n else {\n point.bias == -1;\n continue;\n }\n }\n }\n var cmp2 = isInsert ? cmp : 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\n\n\nfunction clonePos(pos) {\n return {row: pos.row,column: pos.column};\n}\nfunction cloneDelta(d) {\n return {\n start: clonePos(d.start),\n end: clonePos(d.end),\n action: d.action,\n lines: d.lines.slice()\n };\n}\nfunction stringifyDelta(d) {\n d = d || this;\n if (Array.isArray(d)) {\n return d.map(stringifyDelta).join(\"\\n\");\n }\n var type = \"\";\n if (d.action) {\n type = d.action == \"insert\" ? \"+\" : \"-\";\n type += \"[\" + d.lines + \"]\";\n } else if (d.value) {\n if (Array.isArray(d.value)) {\n type = d.value.map(stringifyRange).join(\"\\n\");\n } else {\n type = stringifyRange(d.value);\n }\n }\n if (d.start) {\n type += stringifyRange(d);\n }\n if (d.id || d.rev) {\n type += \"\\t(\" + (d.id || d.rev) + \")\";\n }\n return type;\n}\nfunction stringifyRange(r) {\n return r.start.row + \":\" + r.start.column \n + \"=>\" + r.end.row + \":\" + r.end.column;\n}\n\nfunction swap(d1, d2) {\n var i1 = d1.action == \"insert\";\n var i2 = d2.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (i1 && !i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n } else if (!i1 && i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (!i1 && !i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n }\n return [d2, d1];\n}\nfunction swapGroups(ds1, ds2) {\n for (var i = ds1.length; i--; ) {\n for (var j = 0; j < ds2.length; j++) {\n if (!swap(ds1[i], ds2[j])) {\n while (i < ds1.length) {\n while (j--) {\n swap(ds2[j], ds1[i]);\n }\n j = ds2.length;\n i++;\n } \n return [ds1, ds2];\n }\n }\n }\n ds1.selectionBefore = ds2.selectionBefore = \n ds1.selectionAfter = ds2.selectionAfter = null;\n return [ds2, ds1];\n}\nfunction xform(d1, c1) {\n var i1 = d1.action == \"insert\";\n var i2 = c1.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d1.start, c1.start) < 0) {\n shift(c1, d1, 1);\n } else {\n shift(d1, c1, 1);\n }\n } else if (i1 && !i2) {\n if (cmp(d1.start, c1.end) >= 0) {\n shift(d1, c1, -1);\n } else if (cmp(d1.start, c1.start) <= 0) {\n shift(c1, d1, +1);\n } else {\n shift(d1, Range.fromPoints(c1.start, d1.start), -1);\n shift(c1, d1, +1);\n }\n } else if (!i1 && i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.start, d1.start) <= 0) {\n shift(d1, c1, +1);\n } else {\n shift(c1, Range.fromPoints(d1.start, c1.start), -1);\n shift(d1, c1, +1);\n }\n } else if (!i1 && !i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.end, d1.start) <= 0) {\n shift(d1, c1, -1);\n } else {\n var before, after;\n if (cmp(d1.start, c1.start) < 0) {\n before = d1;\n d1 = splitDelta(d1, c1.start);\n }\n if (cmp(d1.end, c1.end) > 0) {\n after = splitDelta(d1, c1.end);\n }\n\n shiftPos(c1.end, d1.start, d1.end, -1);\n if (after && !before) {\n d1.lines = after.lines;\n d1.start = after.start;\n d1.end = after.end;\n after = d1;\n }\n\n return [c1, before, after].filter(Boolean);\n }\n }\n return [c1, d1];\n}\n \nfunction shift(d1, d2, dir) {\n shiftPos(d1.start, d2.start, d2.end, dir);\n shiftPos(d1.end, d2.start, d2.end, dir);\n}\nfunction shiftPos(pos, start, end, dir) {\n if (pos.row == (dir == 1 ? start : end).row) {\n pos.column += dir * (end.column - start.column);\n }\n pos.row += dir * (end.row - start.row);\n}\nfunction splitDelta(c, pos) {\n var lines = c.lines;\n var end = c.end;\n c.end = clonePos(pos); \n var rowsBefore = c.end.row - c.start.row;\n var otherLines = lines.splice(rowsBefore, lines.length);\n \n var col = rowsBefore ? pos.column : pos.column - c.start.column;\n lines.push(otherLines[0].substring(0, col));\n otherLines[0] = otherLines[0].substr(col) ; \n var rest = {\n start: clonePos(pos),\n end: end,\n lines: otherLines,\n action: c.action\n };\n return rest;\n}\n\nfunction moveDeltasByOne(redoStack, d) {\n d = cloneDelta(d);\n for (var j = redoStack.length; j--;) {\n var deltaSet = redoStack[j];\n for (var i = 0; i < deltaSet.length; i++) {\n var x = deltaSet[i];\n var xformed = xform(x, d);\n d = xformed[0];\n if (xformed.length != 2) {\n if (xformed[2]) {\n deltaSet.splice(i + 1, 1, xformed[1], xformed[2]);\n i++;\n } else if (!xformed[1]) {\n deltaSet.splice(i, 1);\n i--;\n }\n }\n }\n if (!deltaSet.length) {\n redoStack.splice(j, 1); \n }\n }\n return redoStack;\n}\nfunction rebaseRedoStack(redoStack, deltaSets) {\n for (var i = 0; i < deltaSets.length; i++) {\n var deltas = deltaSets[i];\n for (var j = 0; j < deltas.length; j++) {\n moveDeltasByOne(redoStack, deltas[j]);\n }\n }\n}\n\nexports.UndoManager = UndoManager;\n\n});\n\nace.define(\"ace/layer/lines\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\n\nvar Lines = function(element, canvasHeight) {\n this.element = element;\n this.canvasHeight = canvasHeight || 500000;\n this.element.style.height = (this.canvasHeight * 2) + \"px\";\n \n this.cells = [];\n this.cellCache = [];\n this.$offsetCoefficient = 0;\n};\n\n(function() {\n \n this.moveContainer = function(config) {\n dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient);\n }; \n \n this.pageChanged = function(oldConfig, newConfig) {\n return (\n Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !==\n Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)\n );\n };\n \n this.computeLineTop = function(row, config, session) {\n var screenTop = config.firstRowScreen * config.lineHeight;\n var screenPage = Math.floor(screenTop / this.canvasHeight);\n var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight;\n return lineTop - (screenPage * this.canvasHeight);\n };\n \n this.computeLineHeight = function(row, config, session) {\n return config.lineHeight * session.getRowLineCount(row);\n };\n \n this.getLength = function() {\n return this.cells.length;\n };\n \n this.get = function(index) {\n return this.cells[index];\n };\n \n this.shift = function() {\n this.$cacheCell(this.cells.shift());\n };\n \n this.pop = function() {\n this.$cacheCell(this.cells.pop());\n };\n \n this.push = function(cell) {\n if (Array.isArray(cell)) {\n this.cells.push.apply(this.cells, cell);\n var fragment = dom.createFragment(this.element);\n for (var i=0; i 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.$lines.getLength() > index + 1)\n this.$lines.pop();\n \n break;\n }\n\n cell = this.$lines.get(++index);\n if (cell) {\n cell.row = row;\n } else {\n cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$lines.push(cell);\n }\n\n this.$renderCell(cell, config, fold, row);\n row++;\n }\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$updateGutterWidth = function(config) {\n var session = this.session;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n \n var firstLineNumber = session.$firstLineNumber;\n var lastLineText = this.$lines.last() ? this.$lines.last().text : \"\";\n \n if (this.$fixedWidth || session.$useWrapMode)\n lastLineText = session.getLength() + firstLineNumber - 1;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineText, config)\n : lastLineText.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.parentNode.style.width = \n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._signal(\"changeGutterWidth\", gutterWidth);\n }\n };\n \n this.$updateCursorRow = function() {\n if (!this.$highlightGutterLine)\n return;\n \n var position = this.session.selection.getCursor();\n if (this.$cursorRow === position.row)\n return;\n \n this.$cursorRow = position.row;\n };\n \n this.updateLineHighlight = function() {\n if (!this.$highlightGutterLine)\n return;\n var row = this.session.selection.cursor.row;\n this.$cursorRow = row;\n\n if (this.$cursorCell && this.$cursorCell.row == row)\n return;\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n var cells = this.$lines.cells;\n this.$cursorCell = null;\n for (var i = 0; i < cells.length; i++) {\n var cell = cells[i];\n if (cell.row >= this.$cursorRow) {\n if (cell.row > this.$cursorRow) {\n var fold = this.session.getFoldLine(this.$cursorRow);\n if (i > 0 && fold && fold.start.row == cells[i - 1].row)\n cell = cells[i - 1];\n else\n break;\n }\n cell.element.className = \"ace_gutter-active-line \" + cell.element.className;\n this.$cursorCell = cell;\n break;\n }\n }\n };\n \n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n \n this.$updateCursorRow();\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n this.session.getLength() - 1);\n var oldLastRow = this.oldLastRow;\n this.oldLastRow = lastRow;\n \n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldLastRow > lastRow)\n for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (lastRow > oldLastRow) {\n this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow));\n }\n \n this.updateLineHighlight();\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$renderLines = function(config, firstRow, lastRow) {\n var fragment = [];\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 cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$renderCell(cell, config, foldLine, row);\n fragment.push(cell);\n\n row++;\n }\n return fragment;\n };\n \n this.$renderCell = function(cell, config, fold, row) {\n var element = cell.element;\n \n var session = this.session;\n \n var textNode = element.childNodes[0];\n var foldWidget = element.childNodes[1];\n\n var firstLineNumber = session.$firstLineNumber;\n \n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var gutterRenderer = session.gutterRenderer || this.$renderer;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var foldStart = fold ? fold.start.row : Number.MAX_VALUE;\n \n var className = \"ace_gutter-cell \";\n if (this.$highlightGutterLine) {\n if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) {\n className += \"ace_gutter-active-line \";\n if (this.$cursorCell != cell) {\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n this.$cursorCell = cell;\n }\n }\n }\n \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 (element.className != className)\n element.className = className;\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 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 (foldWidget.className != className)\n foldWidget.className = className;\n\n var foldHeight = config.lineHeight + \"px\";\n dom.setStyle(foldWidget.style, \"height\", foldHeight);\n dom.setStyle(foldWidget.style, \"display\", \"inline-block\");\n } else {\n if (foldWidget) {\n dom.setStyle(foldWidget.style, \"display\", \"none\");\n }\n }\n \n var text = (gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber).toString();\n \n if (text !== textNode.data) {\n textNode.data = text;\n }\n \n dom.setStyle(cell.element.style, \"height\", this.$lines.computeLineHeight(row, config, session) + \"px\");\n dom.setStyle(cell.element.style, \"top\", this.$lines.computeLineTop(row, config, session) + \"px\");\n \n cell.text = text;\n return cell;\n };\n\n this.$fixedWidth = false;\n \n this.$highlightGutterLine = true;\n this.$renderer = \"\";\n this.setHighlightGutterLine = function(highlightGutterLine) {\n this.$highlightGutterLine = highlightGutterLine;\n };\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return 0;},\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.borderLeftWidth) || 0)\n + (parseInt(style.paddingLeft) || 0) + 1;\n this.$padding.right = (parseInt(style.borderRightWidth) || 0)\n + (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\nfunction onCreateCell(element) {\n var textNode = document.createTextNode('');\n element.appendChild(textNode);\n \n var foldWidget = dom.createElement(\"span\");\n element.appendChild(foldWidget);\n \n return element;\n}\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.elt = function(className, css) {\n var x = this.i != -1 && this.element.childNodes[this.i];\n if (!x) {\n x = document.createElement(\"div\");\n this.element.appendChild(x);\n this.i = -1;\n } else {\n this.i++;\n }\n x.style.cssText = css;\n x.className = className;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n this.i = 0;\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\" + \" ace_br15\", config);\n }\n }\n if (this.i !=-1) {\n while (this.i < this.element.childElementCount)\n this.element.removeChild(this.element.lastChild);\n }\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n this.drawSingleLineMarker(stringBuilder, lineRange, \n clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),\n layerConfig, row == end ? 0 : 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 if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n this.elt(\n clazz + \" ace_br1 ace_start\",\n \"height:\"+ height+ \"px;\"+ \"right:0;\"+ \"top:\"+top+ \"px;left:\"+ left+ \"px;\" + (extraStyle || \"\")\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n top = this.$getTop(range.end.row, config);\n var width = range.end.column * config.characterWidth;\n\n this.elt(\n clazz + \" ace_br12\",\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\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 var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n this.elt(\n clazz + (radiusClass ? \" ace_br\" + radiusClass : \"\"),\n \"height:\"+ height+ \"px;\"+\n \"right:0;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n if (this.session.$bidiHandler.isBidiRow(range.start.row))\n return this.drawBidiSingleLineMarker(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 this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ left+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n this.elt(\n clazz,\n \"height:\" + height + \"px;\" +\n \"width:\" + selection.width + (extraLength || 0) + \"px;\" +\n \"top:\" + top + \"px;\" +\n \"left:\" + (padding + selection.left) + \"px;\" + (extraStyle || \"\")\n );\n }, this);\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 this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\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 this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\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/layer/lines\",\"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 Lines = require(\"./lines\").Lines;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.dom = dom; \n this.element = this.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 this.$lines = new Lines(this.element);\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 = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n this.MAX_LINE_LENGTH = 10000;\n\n this.$updateEolChar = function() {\n var doc = this.session.doc;\n var unixMode = doc.getNewLineCharacter() == \"\\n\" && doc.getNewLineMode() != \"windows\";\n var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : 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.margin = \"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.showSpaces = false;\n this.showTabs = false;\n this.showEOL = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n if (typeof showInvisibles == \"string\") {\n this.showSpaces = /tab/i.test(showInvisibles);\n this.showTabs = /space/i.test(showInvisibles);\n this.showEOL = /eol/i.test(showInvisibles);\n } else {\n this.showSpaces = this.showTabs = this.showEOL = showInvisibles;\n }\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.showTabs) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_tab\";\n span.textContent = lang.stringRepeat(this.TAB_CHAR, i);\n tabStr.push(span);\n } else {\n tabStr.push(this.dom.createTextNode(lang.stringRepeat(\" \", i), this.element));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = this.showSpaces ? \" ace_invisible ace_invisible_space\" : \"\";\n var spaceContent = this.showSpaces\n ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize)\n : lang.stringRepeat(\" \", this.tabSize);\n\n var tabClass = this.showTabs ? \" ace_invisible ace_invisible_tab\" : \"\";\n var tabContent = this.showTabs \n ? lang.stringRepeat(this.TAB_CHAR, this.tabSize)\n : spaceContent;\n\n var span = this.dom.createElement(\"span\");\n span.className = className + spaceClass;\n span.textContent = spaceContent;\n this.$tabStrings[\" \"] = span;\n \n var span = this.dom.createElement(\"span\");\n span.className = className + tabClass;\n span.textContent = tabContent;\n this.$tabStrings[\"\\t\"] = 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 return this.update(config);\n }\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 heightChanged = false;\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 this.dom.removeChildren(lineElement);\n this.$renderLine(\n lineElement, row, row == foldStart ? foldLine : false\n );\n\n if (heightChanged)\n lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + \"px\";\n\n var height = (config.lineHeight * this.session.getRowLength(row)) + \"px\";\n if (lineElement.style.height != height) {\n heightChanged = true;\n lineElement.style.height = height;\n }\n }\n row++;\n }\n if (heightChanged) {\n while (lineElementsIdx < this.$lines.cells.length) {\n var cell = this.$lines.cells[lineElementsIdx++];\n cell.element.style.top = this.$lines.computeLineTop(cell.row, config, this.session) + \"px\";\n }\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n \n var lastRow = config.lastRow;\n var oldLastRow = oldConfig ? oldConfig.lastRow : -1;\n\n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(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 if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow));\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = [];\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 line = this.$lines.createCell(row, config, this.session);\n \n var lineEl = line.element;\n this.dom.removeChildren(lineEl);\n dom.setStyle(lineEl.style, \"height\", this.$lines.computeLineHeight(row, config, this.session) + \"px\");\n dom.setStyle(lineEl.style, \"top\", this.$lines.computeLineTop(row, config, this.session) + \"px\");\n this.$renderLine(lineEl, row, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups()) {\n lineEl.className = \"ace_line_group\";\n } else {\n lineEl.className = \"ace_line\";\n }\n fragment.push(line);\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.$lines.moveContainer(config);\n \n this.config = config;\n\n var firstRow = config.firstRow;\n var lastRow = config.lastRow;\n\n var lines = this.$lines;\n while (lines.getLength())\n lines.pop();\n \n lines.push(this.$renderLinesFragment(config, firstRow, lastRow));\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(parent, screenColumn, token, value) {\n var self = this;\n var re = /(\\t)|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\uFEFF\\uFFF9-\\uFFFC]+)|(\\u3000)|([\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3001-\\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]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/g;\n \n var valueFragment = this.dom.createFragment(this.element);\n\n var m;\n var i = 0;\n while (m = re.exec(value)) {\n var tab = m[1];\n var simpleSpace = m[2];\n var controlCharacter = m[3];\n var cjkSpace = m[4];\n var cjk = m[5];\n \n if (!self.showSpaces && simpleSpace)\n continue;\n\n var before = i != m.index ? value.slice(i, m.index) : \"\";\n\n i = m.index + m[0].length;\n \n if (before) {\n valueFragment.appendChild(this.dom.createTextNode(before, this.element));\n }\n \n if (tab) {\n var tabSize = self.session.getScreenTabSize(screenColumn + m.index);\n valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true));\n screenColumn += tabSize - 1;\n } else if (simpleSpace) {\n if (self.showSpaces) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length);\n valueFragment.appendChild(span);\n } else {\n valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element));\n }\n } else if (controlCharacter) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space ace_invalid\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length);\n valueFragment.appendChild(span);\n } else if (cjkSpace) {\n screenColumn += 1;\n \n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = self.showSpaces ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace;\n valueFragment.appendChild(span);\n } else if (cjk) {\n screenColumn += 1;\n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = \"ace_cjk\";\n span.textContent = cjk;\n valueFragment.appendChild(span);\n }\n }\n \n valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element));\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var span = this.dom.createElement(\"span\");\n if (token.type == \"fold\")\n span.style.width = (token.value.length * this.config.characterWidth) + \"px\";\n \n span.className = classes;\n span.appendChild(valueFragment);\n \n parent.appendChild(span);\n }\n else {\n parent.appendChild(valueFragment);\n }\n \n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(parent, 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 var count = cols/this.tabSize;\n for (var i=0; i= splitChars) {\n screenColumn = this.$renderToken(\n lineEl, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n lineEl = this.$createLineElement();\n parent.appendChild(lineEl);\n\n lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat(\"\\xa0\", splits.indent), this.element));\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 lineEl, screenColumn, token, value\n );\n }\n }\n }\n \n if (splits[splits.length - 1] > this.MAX_LINE_LENGTH)\n this.$renderOverflowMessage(lineEl, screenColumn, null, \"\", true);\n };\n\n this.$renderSimpleLine = function(parent, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(parent, value);\n if (value)\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n if (screenColumn + value.length > this.MAX_LINE_LENGTH)\n return this.$renderOverflowMessage(parent, screenColumn, token, value);\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n }\n };\n \n this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) {\n token && this.$renderToken(parent, screenColumn, token,\n value.slice(0, this.MAX_LINE_LENGTH - screenColumn));\n \n var overflowEl = this.dom.createElement(\"span\");\n overflowEl.className = \"ace_inline_button ace_keyword ace_toggle_wrap\";\n overflowEl.textContent = hide ? \"\" : \"\";\n \n parent.appendChild(overflowEl); \n };\n this.$renderLine = function(parent, row, 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 var lastLineEl = parent;\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length) {\n this.$renderWrappedLine(parent, tokens, splits);\n var lastLineEl = parent.lastChild;\n } else {\n var lastLineEl = parent;\n if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n this.$renderSimpleLine(lastLineEl, tokens);\n }\n } else if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n\n if (this.showEOL && lastLineEl) {\n if (foldLine)\n row = foldLine.end.row;\n\n var invisibleEl = this.dom.createElement(\"span\");\n invisibleEl.className = \"ace_invisible ace_invisible_eol\";\n invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR;\n \n lastLineEl.appendChild(invisibleEl);\n }\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}).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\");\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 this.$updateCursors = this.$updateOpacity.bind(this);\n};\n\n(function() {\n \n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n dom.setStyle(cursors[i].style, \"opacity\", val ? \"\" : \"0\");\n };\n\n this.$startCssAnimation = function() {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.animationDuration = this.blinkInterval + \"ms\";\n\n this.$isAnimating = true;\n setTimeout(function() {\n if (this.$isAnimating) {\n dom.addCssClass(this.element, \"ace_animate-blinking\");\n }\n }.bind(this));\n };\n \n this.$stopCssAnimation = function() {\n this.$isAnimating = false;\n dom.removeCssClass(this.element, \"ace_animate-blinking\");\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) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\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 this.$stopCssAnimation();\n\n if (this.smoothBlinking) {\n this.$isSmoothBlinking = false;\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible) {\n this.$stopCssAnimation();\n return;\n }\n\n if (this.smoothBlinking) {\n this.$isSmoothBlinking = true;\n setTimeout(function() {\n if (this.$isSmoothBlinking) {\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }\n }.bind(this));\n }\n \n if (dom.HAS_CSS_ANIMATION) {\n this.$startCssAnimation();\n } else {\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 blink();\n }\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 + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\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.isCursorInView = function(pixelPos, config) {\n return pixelPos.top >= 0 && pixelPos.top < config.maxHeight;\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 element = this.cursors[cursorIndex++] || this.addCursor();\n var style = element.style;\n \n if (!this.drawCursor) {\n if (!this.isCursorInView(pixelPos, config)) {\n dom.setStyle(style, \"display\", \"none\");\n } else {\n dom.setStyle(style, \"display\", \"block\");\n dom.translate(element, pixelPos.left, pixelPos.top);\n dom.setStyle(style, \"width\", Math.round(config.characterWidth) + \"px\");\n dom.setStyle(style, \"height\", config.lineHeight + \"px\");\n }\n } else {\n this.drawCursor(element, 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 MAX_SCROLL_H = 0x8000;\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.inner.textContent = \"\\xa0\";\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 this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 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 this.$minWidth = 0;\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 if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight = \n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\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 = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\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.$recursionLimit = 2;\n this.window = win || window;\n var _self = this;\n this._flush = function(ts) {\n _self.pending = false;\n var changes = _self.changes;\n\n if (changes) {\n event.blockIdle(100);\n _self.changes = 0;\n _self.onRender(changes);\n }\n \n if (_self.changes) {\n if (_self.$recursionLimit-- < 0) return;\n _self.schedule();\n } else {\n _self.$recursionLimit = 2;\n }\n };\n};\n\n(function() {\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (this.changes && !this.pending) {\n event.nextFrame(this._flush);\n this.pending = true;\n }\n };\n\n this.clear = function(change) {\n var changes = this.changes;\n this.changes = 0;\n return changes;\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/event\",\"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 event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 256;\nvar USE_OBSERVER = typeof ResizeObserver == \"function\";\nvar L = 200;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\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 this.$measureNode.textContent = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n \n \n if (USE_OBSERVER)\n this.$addObserver();\n else\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\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(size) {\n if (size === undefined)\n 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.$addObserver = function() {\n var self = this;\n this.$observer = new window.ResizeObserver(function(e) {\n self.checkForSizeChanges();\n });\n this.$observer.observe(this.$measureNode);\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer || this.$observer)\n return this.$pollSizeChangesTimer;\n var self = this;\n \n return this.$pollSizeChangesTimer = event.onIdle(function cb() {\n self.checkForSizeChanges();\n event.onIdle(cb, 500);\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function(node) {\n var size = {\n height: (node || this.$measureNode).clientHeight,\n width: (node || this.$measureNode).clientWidth / CHAR_COUNT\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.textContent = 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 w = 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.$observer)\n this.$observer.disconnect();\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n \n this.$getZoom = function getZoom(element) {\n if (!element || !element.parentElement) return 1;\n return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement);\n };\n this.$initTransformMeasureNodes = function() {\n var t = function(t, l) {\n return [\"div\", {\n style: \"position: absolute;top:\" + t + \"px;left:\" + l + \"px;\"\n }];\n };\n this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el);\n };\n this.transformCoordinates = function(clientPos, elPos) {\n if (clientPos) {\n var zoom = this.$getZoom(this.el);\n clientPos = mul(1 / zoom, clientPos);\n }\n function solve(l1, l2, r) {\n var det = l1[1] * l2[0] - l1[0] * l2[1];\n return [\n (-l2[1] * r[0] + l2[0] * r[1]) / det,\n (+l1[1] * r[0] - l1[0] * r[1]) / det\n ];\n }\n function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }\n function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; }\n function mul(a, b) { return [a * b[0], a * b[1]]; }\n\n if (!this.els)\n this.$initTransformMeasureNodes();\n \n function p(el) {\n var r = el.getBoundingClientRect();\n return [r.left, r.top];\n }\n\n var a = p(this.els[0]);\n var b = p(this.els[1]);\n var c = p(this.els[2]);\n var d = p(this.els[3]);\n\n var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a)));\n\n var m1 = mul(1 + h[0], sub(b, a));\n var m2 = mul(1 + h[1], sub(c, a));\n \n if (elPos) {\n var x = elPos;\n var k = h[0] * x[0] / L + h[1] * x[1] / L + 1;\n var ut = add(mul(x[0], m1), mul(x[1], m2));\n return add(mul(1 / k / L, ut), a);\n }\n var u = sub(clientPos, a);\n var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u);\n return mul(L, f);\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/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\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\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 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 = \"\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\npadding: 0;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\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;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\ncontain: style size layout;\\\nfont-variant-ligatures: no-common-ligatures;\\\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;\\\ncontain: style size layout;\\\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 {\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\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 {\\\ncontain: strict;\\\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;\\\ncontain: strict;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: transparent;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\n}\\\n.ace_composition_placeholder { color: transparent }\\\n.ace_composition_marker { \\\nborder-bottom: 1px solid;\\\nposition: absolute;\\\nborder-radius: 0;\\\nmargin-top: 1px;\\\n}\\\n[ace_nocontext=true] {\\\ntransform: none!important;\\\nfilter: none!important;\\\nclip-path: none!important;\\\nmask : none!important;\\\ncontain: none!important;\\\nperspective: none!important;\\\nmix-blend-mode: initial!important;\\\nz-index: auto;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\nheight: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\nposition: absolute;\\\nheight: 1000000px;\\\nwidth: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\\\ncontain: style size layout;\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_hidpi .ace_text-layer,\\\n.ace_hidpi .ace_gutter-layer,\\\n.ace_hidpi .ace_content,\\\n.ace_hidpi .ace_gutter {\\\ncontain: strict;\\\nwill-change: transform;\\\n}\\\n.ace_hidpi .ace_text-layer > .ace_line, \\\n.ace_hidpi .ace_text-layer > .ace_line_group {\\\ncontain: strict;\\\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;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\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_hasPlaceholder .ace_hidden-cursors .ace_cursor {\\\nopacity: 0;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_animate-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: step-end;\\\nanimation-name: blink-ace-animate;\\\nanimation-iteration-count: infinite;\\\n}\\\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: ease-in-out;\\\nanimation-name: blink-ace-animate-smooth;\\\n}\\\n@keyframes blink-ace-animate {\\\nfrom, to { opacity: 1; }\\\n60% { opacity: 0; }\\\n}\\\n@keyframes blink-ace-animate-smooth {\\\nfrom, to { opacity: 1; }\\\n45% { opacity: 1; }\\\n60% { opacity: 0; }\\\n85% { opacity: 0; }\\\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_error_bracket {\\\nposition: absolute;\\\nborder-bottom: 1px solid #DE5555;\\\nborder-radius: 0;\\\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;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\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: 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;\\\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 {\\\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_inline_button {\\\nborder: 1px solid lightgray;\\\ndisplay: inline-block;\\\nmargin: -1px 8px;\\\npadding: 0 5px;\\\npointer-events: auto;\\\ncursor: pointer;\\\n}\\\n.ace_inline_button:hover {\\\nborder-color: gray;\\\nbackground: rgba(200,200,200,0.2);\\\ndisplay: inline-block;\\\npointer-events: auto;\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\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.ace_mobile-menu {\\\nposition: absolute;\\\nline-height: 1.5;\\\nborder-radius: 4px;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\nbackground: white;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #dcdcdc;\\\ncolor: black;\\\n}\\\n.ace_dark > .ace_mobile-menu {\\\nbackground: #333;\\\ncolor: #ccc;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #444;\\\n}\\\n.ace_mobile-button {\\\npadding: 2px;\\\ncursor: pointer;\\\noverflow: hidden;\\\n}\\\n.ace_mobile-button:hover {\\\nbackground-color: #eee;\\\nopacity:1;\\\n}\\\n.ace_mobile-button:active {\\\nbackground-color: #ddd;\\\n}\\\n.ace_placeholder {\\\nfont-family: arial;\\\ntransform: scale(0.9);\\\ntransform-origin: left;\\\nwhite-space: pre;\\\nopacity: 0.7;\\\nmargin: 0 10px;\\\n}\";\n\nvar useragent = require(\"./lib/useragent\");\nvar HIDE_TEXTAREA = useragent.isIE;\n\ndom.importCssString(editorCss, \"ace_editor.css\", false);\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n\n dom.addCssClass(this.container, \"ace_editor\");\n if (dom.HI_DPI) dom.addCssClass(this.container, \"ace_hidpi\");\n\n this.setTheme(theme);\n if (config.get(\"useStrictCSP\") == null) \n config.set(\"useStrictCSP\", false);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n \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.on(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.on(\"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);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.on(\"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.margin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n \n this.$keepTextAreaAtCursor = !useragent.isIOS;\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._signal(\"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 dom.setStyle(this.scroller.style, \"line-height\", this.lineHeight + \"px\");\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 this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\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 this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\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.scrollBarH.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 dom.setStyle(this.scrollBarH.element.style, \"left\", gutterWidth + \"px\");\n dom.setStyle(this.scroller.style, \"left\", gutterWidth + this.margin.left + \"px\");\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h);\n dom.setStyle(this.$gutter.style, \"left\", this.margin.left + \"px\");\n \n var right = this.scrollBarV.getWidth() + \"px\";\n dom.setStyle(this.scrollBarH.element.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"bottom\", this.scrollBarH.getHeight());\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) {\n changes |= this.CHANGE_FULL;\n }\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(width) {\n var gutterWidth = this.$showGutter ? width : 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 }\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 this.session.$bidiHandler.setShowInvisibles(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.$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 = Math.round(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.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (this.$isMousePressed) return;\n var style = this.textarea.style;\n var composition = this.$composition;\n if (!this.$keepTextAreaAtCursor && !composition) {\n dom.translate(this.textarea, -100, 0);\n return;\n }\n var pixelPos = this.$cursorLayer.$pixelPos;\n if (!pixelPos)\n return;\n if (composition && composition.markerRange)\n pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true);\n \n var config = this.layerConfig;\n var posTop = pixelPos.top;\n var posLeft = pixelPos.left;\n posTop -= config.offset;\n\n var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1;\n if (posTop < 0 || posTop > config.height - h) {\n dom.translate(this.textarea, 0, 0);\n return;\n }\n\n var w = 1;\n var maxTop = this.$size.height - h;\n if (!composition) {\n posTop += this.lineHeight;\n }\n else {\n if (composition.useTextareaForIME) {\n var val = this.textarea.value;\n w = this.characterWidth * (this.session.$getStringScreenWidth(val)[0]);\n }\n else {\n posTop += this.lineHeight + 2;\n }\n }\n \n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth + this.margin.left;\n\n dom.setStyle(style, \"height\", h + \"px\");\n dom.setStyle(style, \"width\", w + \"px\");\n dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop));\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 config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\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 \n this.setMargin = function(top, bottom, left, right) {\n var sm = this.margin;\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 this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height);\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.$vScrollBarAlwaysVisible;\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\", changes);\n \n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\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() | this.$loop.clear();\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() | this.$loop.clear();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n \n dom.translate(this.content, -this.scrollLeft, -config.offset);\n \n var width = config.width + 2 * this.$padding + \"px\";\n var height = config.minHeight + \"px\";\n \n dom.setStyle(this.content.style, \"width\", width);\n dom.setStyle(this.content.style, \"height\", height);\n }\n if (changes & this.CHANGE_H_SCROLL) {\n dom.translate(this.content, -this.scrollLeft, -config.offset);\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$changedLines = null;\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._signal(\"afterRender\", changes);\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n this.$changedLines = null;\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 if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES)\n this.$gutterLayer.update(config);\n else\n this.$gutterLayer.scrollLines(config);\n }\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\", changes);\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$changedLines = null;\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 else if (changes & this.CHANGE_CURSOR) {\n if (this.$highlightGutterLine)\n this.$gutterLayer.updateLineHighlight(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\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\", changes);\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.min(maxHeight, \n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n \n var hideScrollbars = desiredHeight <= 2 * this.lineHeight;\n var vScroll = !hideScrollbars && 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 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 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 var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var offset = this.scrollTop % this.lineHeight;\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 || hScrollChanged) \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 : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n if (this.session.$bidiHandler)\n this.session.$bidiHandler.setContentWidth(longestLine - this.$padding);\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\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 if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH)\n charCount = this.$textLayer.MAX_LINE_LENGTH + 30;\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 && scrollTop + topMargin > top + this.lineHeight)\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 && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight + bottomMargin - 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 (!_self.session) \n return clearInterval(_self.$timer);\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(x);\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;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n \n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\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 + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n \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(composition) {\n this.$composition = composition;\n if (!composition.cssText) {\n composition.cssText = this.textarea.style.cssText;\n }\n if (composition.useTextareaForIME == undefined)\n composition.useTextareaForIME = this.$useTextareaForIME;\n \n if (this.$useTextareaForIME) {\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n this.$cursorLayer.element.style.display = \"none\";\n }\n else {\n composition.markerId = this.session.addMarker(composition.markerRange, \"ace_composition_marker\", \"text\");\n }\n };\n this.setCompositionText = function(text) {\n var cursor = this.session.selection.cursor;\n this.addToken(text, \"composition_placeholder\", cursor.row, cursor.column);\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n \n if (this.$composition.markerId)\n this.session.removeMarker(this.$composition.markerId);\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = this.$composition.cssText;\n var cursor = this.session.selection.cursor;\n this.removeExtraToken(cursor.row, cursor.column);\n this.$composition = null;\n this.$cursorLayer.element.style.display = \"\";\n };\n \n this.addToken = function(text, type, row, column) {\n var session = this.session;\n session.bgTokenizer.lines[row] = null;\n var newToken = {type: type, value: text};\n var tokens = session.getTokens(row);\n if (column == null) {\n tokens.push(newToken);\n } else {\n var l = 0;\n for (var i =0; i < tokens.length; i++) {\n var token = tokens[i];\n l += token.value.length;\n if (column <= l) {\n var diff = token.value.length - (l - column);\n var before = token.value.slice(0, diff);\n var after = token.value.slice(diff);\n \n tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after});\n break;\n }\n }\n }\n this.updateLines(row, row);\n };\n\n this.removeExtraToken = function(row, column) {\n this.updateLines(row, row);\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 || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n if (module.$id)\n _self.$themeId = module.$id;\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container\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 dom.setStyle(this.scroller.style, \"cursor\", style);\n };\n this.setMouseCursor = function(cursorStyle) {\n dom.setStyle(this.scroller.style, \"cursor\", cursorStyle);\n };\n \n this.attachToShadowRoot = function() {\n dom.importCssString(editorCss, \"ace_editor.css\", this.container);\n };\n this.destroy = function() {\n this.freeze();\n this.$fontMetrics.destroy();\n this.$cursorLayer.destroy();\n this.removeAllListeners();\n this.container.textContent = \"\";\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) {\n this.$gutterLayer.setShowFoldWidgets(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 this.$gutterLayer.setHighlightGutterLine(shouldHighlight);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: 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 if (!(this.$minLines < 0x1ffffffffffff))\n this.$minLines = 0;\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\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 hasCssTransforms: {\n },\n useTextareaForIME: {\n initialValue: !useragent.isMobile && !useragent.isIE\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\nfunction $workerBlob(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\nfunction createWorker(workerUrl) {\n if (typeof Worker == \"undefined\")\n return { postMessage: function() {}, terminate: function() {} };\n if (config.get(\"loadWorkerFromBlob\")) {\n var blob = $workerBlob(workerUrl);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n }\n return new Worker(workerUrl);\n}\n\nvar WorkerClient = function(worker) {\n if (!worker.postMessage)\n worker = this.$createWorkerFromOldConfig.apply(this, arguments);\n\n this.$worker = worker;\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\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.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\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 this.$worker = createWorker(workerUrl);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod,\n classname : classname\n });\n return this.$worker;\n };\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 if (data.data && data.data.err)\n data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code};\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(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && 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 var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n\n var messageBuffer = [];\n var workerClient = new WorkerClient({\n messageBuffer: messageBuffer,\n terminate: function() {},\n postMessage: function(e) {\n messageBuffer.push(e);\n if (!main) return;\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n });\n\n workerClient.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = 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 workerClient.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 (messageBuffer.length)\n processNext();\n });\n\n return workerClient;\n};\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\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 \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\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 });\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(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = 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 \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\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 this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\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 this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\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.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.off(\"change\", this.$onUpdate);\n this.session.selection.off(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\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(this.session, 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 = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\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 editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\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.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, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \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 };\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 \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n blockSelect();\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\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 };\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 description: \"Add cursor above\",\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 description: \"Add cursor below\",\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 description: \"Add cursor above (skip current)\",\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 description: \"Add cursor below (skip current)\",\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 description: \"Select more before\",\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 description: \"Select more after\",\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 description: \"Select next before\",\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 description: \"Select next after\",\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: \"toggleSplitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) {\n if (editor.multiSelect.rangeCount > 1)\n editor.multiSelect.joinSelections();\n else\n editor.multiSelect.splitIntoLines();\n },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"splitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n readOnly: true\n}, {\n name: \"alignCursors\",\n description: \"Align cursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n description: \"Find all\",\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 description: \"Single selection\",\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 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 };\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 this.splitIntoLines = function () {\n var ranges = this.ranges.length ? this.ranges : [this.getRange()];\n var newRanges = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n var row = range.start.row;\n var endRow = range.end.row;\n if (row === endRow) {\n newRanges.push(range.clone());\n } else {\n newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length));\n while (++row < endRow)\n newRanges.push(this.getLineRange(row, true));\n newRanges.push(new Range(endRow, 0, endRow, range.end.column));\n }\n if (i == 0 && !this.isBackwards())\n newRanges = newRanges.reverse();\n }\n this.toSingleRange();\n for (var i = newRanges.length; i--;)\n this.addRange(newRanges[i]);\n };\n \n this.joinSelections = function () {\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 };\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.cursor);\n var anchor = this.session.documentToScreenPosition(this.anchor);\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 var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\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 var docEnd;\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n 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 if (selection.ranges[0])\n selection.fromOrientedRange(selection.ranges[0]);\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 else\n this.multiSelect.mergeOverlappingRanges();\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 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 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 sel.fromOrientedRange(sel.ranges[0]);\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.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\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.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.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 if (!editor.textInput) return;\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n }, editor);\n\n event.addListener(el, \"keyup\", reset, editor);\n event.addListener(el, \"blur\", reset, editor);\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 enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\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 var token = session.getTokenAt(row, 0);\n if (!token || token.type !== \"string\")\n break;\n }\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;\\\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\";\nexports.$id = \"ace/theme/textmate\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass, false);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"./lib/dom\");\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(\"changeFold\", this.updateOnFold);\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 && !w.hidden)\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.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == \"remove\") {\n var removed = lineWidgets.splice(startRow + 1, len);\n if (!lineWidgets[startRow] && removed[removed.length - 1]) {\n lineWidgets[startRow] = removed.pop();\n }\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n if (lineWidgets[startRow] && lineWidgets[startRow].column != null) {\n if (delta.start.column > lineWidgets[startRow].column)\n startRow++;\n }\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 while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.$registerLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n return w;\n };\n \n this.addLineWidget = function(w) {\n this.$registerLineWidget(w);\n w.session = this.session;\n \n if (!this.editor) return 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 if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\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 var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\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 || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\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 if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n 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.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\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)\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.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\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 type: \"errorMarker\"\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(\"
\");\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\", \"error_marker.css\", false);\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/range\",\"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 Range = require(\"./range\").Range;\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;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el, options) {\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 if (el) {\n value = el.textContent;\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el), doc, options);\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.Range = Range;\nexports.Editor = Editor;\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.VirtualRenderer = Renderer;\nexports.version = exports.config.version;\n}); (function() {\n ace.require([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\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 window.ace[\"default\"] = window.ace;\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = window.ace;\n }\n });\n })();\n ","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions = [\n \"minLines\",\n \"maxLines\",\n \"readOnly\",\n \"highlightActiveLine\",\n \"tabSize\",\n \"enableBasicAutocompletion\",\n \"enableLiveAutocompletion\",\n \"enableSnippets\"\n];\nexports.editorOptions = editorOptions;\nvar editorEvents = [\n \"onChange\",\n \"onFocus\",\n \"onInput\",\n \"onBlur\",\n \"onCopy\",\n \"onPaste\",\n \"onSelectionChange\",\n \"onCursorChange\",\n \"onScroll\",\n \"handleOptions\",\n \"updateRef\"\n];\nexports.editorEvents = editorEvents;\nvar getAceInstance = function () {\n var ace;\n // Fallback for ace.require when vanilla ACE is hosted over a CDN\n if (window.ace) {\n ace = window.ace;\n ace.acequire = window.ace.require || window.ace.acequire;\n }\n else {\n ace = require(\"ace-builds\");\n }\n return ace;\n};\nexports.getAceInstance = getAceInstance;\nvar debounce = function (fn, delay) {\n var timer = null;\n return function () {\n var context = this;\n var args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n};\nexports.debounce = debounce;\n//# sourceMappingURL=editorOptions.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = editorOptions_1.getAceInstance();\nvar Range = ace.require(\"ace/range\").Range;\nvar ReactAce = /** @class */ (function (_super) {\n __extends(ReactAce, _super);\n function ReactAce(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n ReactAce.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, onValidate = _a.onValidate, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, cursorStart = _a.cursorStart, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, placeholder = _a.placeholder;\n this.editor = ace.edit(this.refEditor);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n for (var i = 0; i < editorProps.length; i++) {\n this.editor[editorProps[i]] = this.props.editorProps[editorProps[i]];\n }\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n this.editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n this.editor.getSession().setMode(\"ace/mode/\" + mode);\n this.editor.setTheme(\"ace/theme/\" + theme);\n this.editor.setFontSize(fontSize);\n this.editor\n .getSession()\n .setValue(!defaultValue ? value : defaultValue, cursorStart);\n if (this.props.navigateToFileEnd) {\n this.editor.navigateFileEnd();\n }\n this.editor.renderer.setShowGutter(showGutter);\n this.editor.getSession().setUseWrapMode(wrapEnabled);\n this.editor.setShowPrintMargin(showPrintMargin);\n this.editor.on(\"focus\", this.onFocus);\n this.editor.on(\"blur\", this.onBlur);\n this.editor.on(\"copy\", this.onCopy);\n this.editor.on(\"paste\", this.onPaste);\n this.editor.on(\"change\", this.onChange);\n this.editor.on(\"input\", this.onInput);\n if (placeholder) {\n this.updatePlaceholder();\n }\n this.editor\n .getSession()\n .selection.on(\"changeSelection\", this.onSelectionChange);\n this.editor.getSession().selection.on(\"changeCursor\", this.onCursorChange);\n if (onValidate) {\n this.editor.getSession().on(\"changeAnnotation\", function () {\n // tslint:disable-next-line:no-shadowed-variable\n var annotations = _this.editor.getSession().getAnnotations();\n _this.props.onValidate(annotations);\n });\n }\n this.editor.session.on(\"changeScrollTop\", this.onScroll);\n this.editor.getSession().setAnnotations(annotations || []);\n if (markers && markers.length > 0) {\n this.handleMarkers(markers);\n }\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.editor.$options;\n editorOptions_1.editorOptions.forEach(function (option) {\n if (availableOptions.hasOwnProperty(option)) {\n _this.editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReactAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n });\n this.handleOptions(this.props);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n _this.editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n _this.editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (onLoad) {\n onLoad(this.editor);\n }\n this.editor.resize();\n if (focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.componentDidUpdate = function (prevProps) {\n var oldProps = prevProps;\n var nextProps = this.props;\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n this.editor.setOption(option, nextProps[option]);\n }\n }\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n // First process editor value, as it may create a new session (see issue #300)\n if (this.editor && this.editor.getValue() !== nextProps.value) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n this.silent = true;\n var pos = this.editor.session.selection.toJSON();\n this.editor.setValue(nextProps.value, nextProps.cursorStart);\n this.editor.session.selection.fromJSON(pos);\n this.silent = false;\n }\n if (nextProps.placeholder !== oldProps.placeholder) {\n this.updatePlaceholder();\n }\n if (nextProps.mode !== oldProps.mode) {\n this.editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.theme !== oldProps.theme) {\n this.editor.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n this.editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n this.editor.setFontSize(nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n this.editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n this.editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n this.editor.renderer.setShowGutter(nextProps.showGutter);\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n this.handleOptions(nextProps);\n }\n if (!isEqual(nextProps.annotations, oldProps.annotations)) {\n this.editor.getSession().setAnnotations(nextProps.annotations || []);\n }\n if (!isEqual(nextProps.markers, oldProps.markers) &&\n Array.isArray(nextProps.markers)) {\n this.handleMarkers(nextProps.markers);\n }\n // this doesn't look like it works at all....\n if (!isEqual(nextProps.scrollMargin, oldProps.scrollMargin)) {\n this.handleScrollMargins(nextProps.scrollMargin);\n }\n if (prevProps.height !== this.props.height ||\n prevProps.width !== this.props.width) {\n this.editor.resize();\n }\n if (this.props.focus && !prevProps.focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.handleScrollMargins = function (margins) {\n if (margins === void 0) { margins = [0, 0, 0, 0]; }\n this.editor.renderer.setScrollMargins(margins[0], margins[1], margins[2], margins[3]);\n };\n ReactAce.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n ReactAce.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value = this.editor.getValue();\n this.props.onChange(value, event);\n }\n };\n ReactAce.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value = this.editor.getSelection();\n this.props.onSelectionChange(value, event);\n }\n };\n ReactAce.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value = this.editor.getSelection();\n this.props.onCursorChange(value, event);\n }\n };\n ReactAce.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n if (this.props.placeholder) {\n this.updatePlaceholder();\n }\n };\n ReactAce.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event, this.editor);\n }\n };\n ReactAce.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event, this.editor);\n }\n };\n ReactAce.prototype.onCopy = function (text) {\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n ReactAce.prototype.onPaste = function (text) {\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n ReactAce.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n ReactAce.prototype.handleOptions = function (props) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n this.editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n ReactAce.prototype.handleMarkers = function (markers) {\n var _this = this;\n // remove foreground markers\n var currentMarkers = this.editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers except active line marker and selected word marker\n currentMarkers = this.editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i) &&\n currentMarkers[i].clazz !== \"ace_active-line\" &&\n currentMarkers[i].clazz !== \"ace_selected-word\") {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new Range(startRow, startCol, endRow, endCol);\n _this.editor.getSession().addMarker(range, className, type, inFront);\n });\n };\n ReactAce.prototype.updatePlaceholder = function () {\n // Adapted from https://stackoverflow.com/questions/26695708/how-can-i-add-placeholder-text-when-the-editor-is-empty\n var editor = this.editor;\n var placeholder = this.props.placeholder;\n var showPlaceholder = !editor.session.getValue().length;\n var node = editor.renderer.placeholderNode;\n if (!showPlaceholder && node) {\n editor.renderer.scroller.removeChild(editor.renderer.placeholderNode);\n editor.renderer.placeholderNode = null;\n }\n else if (showPlaceholder && !node) {\n node = editor.renderer.placeholderNode = document.createElement(\"div\");\n node.textContent = placeholder || \"\";\n node.className = \"ace_comment ace_placeholder\";\n node.style.padding = \"0 9px\";\n node.style.position = \"absolute\";\n node.style.zIndex = \"3\";\n editor.renderer.scroller.appendChild(node);\n }\n else if (showPlaceholder && node) {\n node.textContent = placeholder;\n }\n };\n ReactAce.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n ReactAce.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n ReactAce.propTypes = {\n mode: PropTypes.string,\n focus: PropTypes.bool,\n theme: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n height: PropTypes.string,\n width: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n showGutter: PropTypes.bool,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onPaste: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onBlur: PropTypes.func,\n onScroll: PropTypes.func,\n value: PropTypes.string,\n defaultValue: PropTypes.string,\n onLoad: PropTypes.func,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n onValidate: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n debounceChangePeriod: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableSnippets: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n navigateToFileEnd: PropTypes.bool,\n commands: PropTypes.array,\n placeholder: PropTypes.string\n };\n ReactAce.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n value: \"\",\n fontSize: 12,\n enableSnippets: false,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n placeholder: null,\n navigateToFileEnd: true\n };\n return ReactAce;\n}(React.Component));\nexports.default = ReactAce;\n//# sourceMappingURL=ace.js.map","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 s.setUndoManager(undoManager);\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\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}); (function() {\n ace.require([\"ace/ext/split\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n symbolTag = '[object Symbol]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = editorOptions_1.getAceInstance();\nvar ace_builds_1 = require(\"ace-builds\");\nvar ext_split_1 = require(\"ace-builds/src-noconflict/ext-split\");\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar get = require(\"lodash.get\");\nvar SplitComponent = /** @class */ (function (_super) {\n __extends(SplitComponent, _super);\n function SplitComponent(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n SplitComponent.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, cursorStart = _a.cursorStart, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, splits = _a.splits;\n this.editor = ace.edit(this.refEditor);\n this.editor.setTheme(\"ace/theme/\" + theme);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n var split = new ext_split_1.Split(this.editor.container, \"ace/theme/\" + theme, splits);\n this.editor.env.split = split;\n this.splitEditor = split.getEditor(0);\n this.split = split;\n // in a split scenario we don't want a print margin for the entire application\n this.editor.setShowPrintMargin(false);\n this.editor.renderer.setShowGutter(false);\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.splitEditor.$options;\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n split.forEach(function (editor, index) {\n for (var i = 0; i < editorProps.length; i++) {\n editor[editorProps[i]] = _this.props.editorProps[editorProps[i]];\n }\n var defaultValueForEditor = get(defaultValue, index);\n var valueForEditor = get(value, index, \"\");\n editor.session.setUndoManager(new ace.UndoManager());\n editor.setTheme(\"ace/theme/\" + theme);\n editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n editor.getSession().setMode(\"ace/mode/\" + mode);\n editor.setFontSize(fontSize);\n editor.renderer.setShowGutter(showGutter);\n editor.getSession().setUseWrapMode(wrapEnabled);\n editor.setShowPrintMargin(showPrintMargin);\n editor.on(\"focus\", _this.onFocus);\n editor.on(\"blur\", _this.onBlur);\n editor.on(\"input\", _this.onInput);\n editor.on(\"copy\", _this.onCopy);\n editor.on(\"paste\", _this.onPaste);\n editor.on(\"change\", _this.onChange);\n editor\n .getSession()\n .selection.on(\"changeSelection\", _this.onSelectionChange);\n editor.getSession().selection.on(\"changeCursor\", _this.onCursorChange);\n editor.session.on(\"changeScrollTop\", _this.onScroll);\n editor.setValue(defaultValueForEditor === undefined\n ? valueForEditor\n : defaultValueForEditor, cursorStart);\n var newAnnotations = get(annotations, index, []);\n var newMarkers = get(markers, index, []);\n editor.getSession().setAnnotations(newAnnotations);\n if (newMarkers && newMarkers.length > 0) {\n _this.handleMarkers(newMarkers, editor);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (availableOptions.hasOwnProperty(option)) {\n editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReaceAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n }\n _this.handleOptions(_this.props, editor);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n });\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (focus) {\n this.splitEditor.focus();\n }\n var sp = this.editor.env.split;\n sp.setOrientation(this.props.orientation === \"below\" ? sp.BELOW : sp.BESIDE);\n sp.resize(true);\n if (onLoad) {\n onLoad(sp);\n }\n };\n SplitComponent.prototype.componentDidUpdate = function (prevProps) {\n var _this = this;\n var oldProps = prevProps;\n var nextProps = this.props;\n var split = this.editor.env.split;\n if (nextProps.splits !== oldProps.splits) {\n split.setSplits(nextProps.splits);\n }\n if (nextProps.orientation !== oldProps.orientation) {\n split.setOrientation(nextProps.orientation === \"below\" ? split.BELOW : split.BESIDE);\n }\n split.forEach(function (editor, index) {\n if (nextProps.mode !== oldProps.mode) {\n editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n editor.setFontSize(nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n editor.renderer.setShowGutter(nextProps.showGutter);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n editor.setOption(option, nextProps[option]);\n }\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n _this.handleOptions(nextProps, editor);\n }\n var nextValue = get(nextProps.value, index, \"\");\n if (editor.getValue() !== nextValue) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n _this.silent = true;\n var pos = editor.session.selection.toJSON();\n editor.setValue(nextValue, nextProps.cursorStart);\n editor.session.selection.fromJSON(pos);\n _this.silent = false;\n }\n var newAnnotations = get(nextProps.annotations, index, []);\n var oldAnnotations = get(oldProps.annotations, index, []);\n if (!isEqual(newAnnotations, oldAnnotations)) {\n editor.getSession().setAnnotations(newAnnotations);\n }\n var newMarkers = get(nextProps.markers, index, []);\n var oldMarkers = get(oldProps.markers, index, []);\n if (!isEqual(newMarkers, oldMarkers) && Array.isArray(newMarkers)) {\n _this.handleMarkers(newMarkers, editor);\n }\n });\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n if (nextProps.theme !== oldProps.theme) {\n split.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.focus && !oldProps.focus) {\n this.splitEditor.focus();\n }\n if (nextProps.height !== this.props.height ||\n nextProps.width !== this.props.width) {\n this.editor.resize();\n }\n };\n SplitComponent.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n SplitComponent.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value_1 = [];\n this.editor.env.split.forEach(function (editor) {\n value_1.push(editor.getValue());\n });\n this.props.onChange(value_1, event);\n }\n };\n SplitComponent.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value_2 = [];\n this.editor.env.split.forEach(function (editor) {\n value_2.push(editor.getSelection());\n });\n this.props.onSelectionChange(value_2, event);\n }\n };\n SplitComponent.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value_3 = [];\n this.editor.env.split.forEach(function (editor) {\n value_3.push(editor.getSelection());\n });\n this.props.onCursorChange(value_3, event);\n }\n };\n SplitComponent.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event);\n }\n };\n SplitComponent.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n };\n SplitComponent.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event);\n }\n };\n SplitComponent.prototype.onCopy = function (text) {\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n SplitComponent.prototype.onPaste = function (text) {\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n SplitComponent.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n SplitComponent.prototype.handleOptions = function (props, editor) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n SplitComponent.prototype.handleMarkers = function (markers, editor) {\n // remove foreground markers\n var currentMarkers = editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers\n currentMarkers = editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new ace_builds_1.Range(startRow, startCol, endRow, endCol);\n editor\n .getSession()\n .addMarker(range, className, type, inFront);\n });\n };\n SplitComponent.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n SplitComponent.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n SplitComponent.propTypes = {\n className: PropTypes.string,\n debounceChangePeriod: PropTypes.number,\n defaultValue: PropTypes.arrayOf(PropTypes.string),\n focus: PropTypes.bool,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n height: PropTypes.string,\n mode: PropTypes.string,\n name: PropTypes.string,\n onBlur: PropTypes.func,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n orientation: PropTypes.string,\n showGutter: PropTypes.bool,\n splits: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.arrayOf(PropTypes.string),\n width: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n commands: PropTypes.array\n };\n SplitComponent.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n orientation: \"beside\",\n splits: 2,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n value: [],\n fontSize: 12,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false\n };\n return SplitComponent;\n}(React.Component));\nexports.default = SplitComponent;\n//# sourceMappingURL=split.js.map","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.} diffs Array of diff tuples.\n * @param {!Array.} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: abcxxxxxxdef\n // -> abcxxxdef\n // e.g: xxxabcdefxxx\n // -> defxxxabc\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The cat came. -> The cat came.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * ABXYCD\n * AXCD\n * ABXC\n * AXCD\n * ABXC\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = //g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')\n .replace(pattern_gt, '>').replace(pattern_para, '¶
');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '' + text + '';\n break;\n case DIFF_DELETE:\n html[x] = '' + text + '';\n break;\n case DIFF_EQUAL:\n html[x] = '' + text + '';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.} patches Array of Patch objects.\n * @return {!Array.} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar split_1 = require(\"./split\");\nvar DiffMatchPatch = require(\"diff-match-patch\");\nvar DiffComponent = /** @class */ (function (_super) {\n __extends(DiffComponent, _super);\n function DiffComponent(props) {\n var _this = _super.call(this, props) || this;\n _this.state = {\n value: _this.props.value\n };\n _this.onChange = _this.onChange.bind(_this);\n _this.diff = _this.diff.bind(_this);\n return _this;\n }\n DiffComponent.prototype.componentDidUpdate = function () {\n var value = this.props.value;\n if (value !== this.state.value) {\n this.setState({ value: value });\n }\n };\n DiffComponent.prototype.onChange = function (value) {\n this.setState({\n value: value\n });\n if (this.props.onChange) {\n this.props.onChange(value);\n }\n };\n DiffComponent.prototype.diff = function () {\n var dmp = new DiffMatchPatch();\n var lhString = this.state.value[0];\n var rhString = this.state.value[1];\n if (lhString.length === 0 && rhString.length === 0) {\n return [];\n }\n var diff = dmp.diff_main(lhString, rhString);\n dmp.diff_cleanupSemantic(diff);\n var diffedLines = this.generateDiffedLines(diff);\n var codeEditorSettings = this.setCodeMarkers(diffedLines);\n return codeEditorSettings;\n };\n DiffComponent.prototype.generateDiffedLines = function (diff) {\n var C = {\n DIFF_EQUAL: 0,\n DIFF_DELETE: -1,\n DIFF_INSERT: 1\n };\n var diffedLines = {\n left: [],\n right: []\n };\n var cursor = {\n left: 1,\n right: 1\n };\n diff.forEach(function (chunk) {\n var chunkType = chunk[0];\n var text = chunk[1];\n var lines = text.split(\"\\n\").length - 1;\n // diff-match-patch sometimes returns empty strings at random\n if (text.length === 0) {\n return;\n }\n var firstChar = text[0];\n var lastChar = text[text.length - 1];\n var linesToHighlight = 0;\n switch (chunkType) {\n case C.DIFF_EQUAL:\n cursor.left += lines;\n cursor.right += lines;\n break;\n case C.DIFF_DELETE:\n // If the deletion starts with a newline, push the cursor down to that line\n if (firstChar === \"\\n\") {\n cursor.left++;\n lines--;\n }\n linesToHighlight = lines;\n // If the deletion does not include a newline, highlight the same line on the right\n if (linesToHighlight === 0) {\n diffedLines.right.push({\n startLine: cursor.right,\n endLine: cursor.right\n });\n }\n // If the last character is a newline, we don't want to highlight that line\n if (lastChar === \"\\n\") {\n linesToHighlight -= 1;\n }\n diffedLines.left.push({\n startLine: cursor.left,\n endLine: cursor.left + linesToHighlight\n });\n cursor.left += lines;\n break;\n case C.DIFF_INSERT:\n // If the insertion starts with a newline, push the cursor down to that line\n if (firstChar === \"\\n\") {\n cursor.right++;\n lines--;\n }\n linesToHighlight = lines;\n // If the insertion does not include a newline, highlight the same line on the left\n if (linesToHighlight === 0) {\n diffedLines.left.push({\n startLine: cursor.left,\n endLine: cursor.left\n });\n }\n // If the last character is a newline, we don't want to highlight that line\n if (lastChar === \"\\n\") {\n linesToHighlight -= 1;\n }\n diffedLines.right.push({\n startLine: cursor.right,\n endLine: cursor.right + linesToHighlight\n });\n cursor.right += lines;\n break;\n default:\n throw new Error(\"Diff type was not defined.\");\n }\n });\n return diffedLines;\n };\n // Receives a collection of line numbers and iterates through them to highlight appropriately\n // Returns an object that tells the render() method how to display the code editors\n DiffComponent.prototype.setCodeMarkers = function (diffedLines) {\n if (diffedLines === void 0) { diffedLines = { left: [], right: [] }; }\n var codeEditorSettings = [];\n var newMarkerSet = {\n left: [],\n right: []\n };\n for (var i = 0; i < diffedLines.left.length; i++) {\n var markerObj = {\n startRow: diffedLines.left[i].startLine - 1,\n endRow: diffedLines.left[i].endLine,\n type: \"text\",\n className: \"codeMarker\"\n };\n newMarkerSet.left.push(markerObj);\n }\n for (var i = 0; i < diffedLines.right.length; i++) {\n var markerObj = {\n startRow: diffedLines.right[i].startLine - 1,\n endRow: diffedLines.right[i].endLine,\n type: \"text\",\n className: \"codeMarker\"\n };\n newMarkerSet.right.push(markerObj);\n }\n codeEditorSettings[0] = newMarkerSet.left;\n codeEditorSettings[1] = newMarkerSet.right;\n return codeEditorSettings;\n };\n DiffComponent.prototype.render = function () {\n var markers = this.diff();\n return (React.createElement(split_1.default, { name: this.props.name, className: this.props.className, focus: this.props.focus, orientation: this.props.orientation, splits: this.props.splits, mode: this.props.mode, theme: this.props.theme, height: this.props.height, width: this.props.width, fontSize: this.props.fontSize, showGutter: this.props.showGutter, onChange: this.onChange, onPaste: this.props.onPaste, onLoad: this.props.onLoad, onScroll: this.props.onScroll, minLines: this.props.minLines, maxLines: this.props.maxLines, readOnly: this.props.readOnly, highlightActiveLine: this.props.highlightActiveLine, showPrintMargin: this.props.showPrintMargin, tabSize: this.props.tabSize, cursorStart: this.props.cursorStart, editorProps: this.props.editorProps, style: this.props.style, scrollMargin: this.props.scrollMargin, setOptions: this.props.setOptions, wrapEnabled: this.props.wrapEnabled, enableBasicAutocompletion: this.props.enableBasicAutocompletion, enableLiveAutocompletion: this.props.enableLiveAutocompletion, value: this.state.value, markers: markers }));\n };\n DiffComponent.propTypes = {\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n enableBasicAutocompletion: PropTypes.bool,\n enableLiveAutocompletion: PropTypes.bool,\n focus: PropTypes.bool,\n fontSize: PropTypes.number,\n height: PropTypes.string,\n highlightActiveLine: PropTypes.bool,\n maxLines: PropTypes.number,\n minLines: PropTypes.number,\n mode: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n onChange: PropTypes.func,\n orientation: PropTypes.string,\n readOnly: PropTypes.bool,\n scrollMargin: PropTypes.array,\n setOptions: PropTypes.object,\n showGutter: PropTypes.bool,\n showPrintMargin: PropTypes.bool,\n splits: PropTypes.number,\n style: PropTypes.object,\n tabSize: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.array,\n width: PropTypes.string,\n wrapEnabled: PropTypes.bool\n };\n DiffComponent.defaultProps = {\n cursorStart: 1,\n editorProps: {},\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n focus: false,\n fontSize: 12,\n height: \"500px\",\n highlightActiveLine: true,\n maxLines: null,\n minLines: null,\n mode: \"\",\n name: \"ace-editor\",\n onLoad: null,\n onScroll: null,\n onPaste: null,\n onChange: null,\n orientation: \"beside\",\n readOnly: false,\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n showGutter: true,\n showPrintMargin: true,\n splits: 2,\n style: {},\n tabSize: 4,\n theme: \"github\",\n value: [\"\", \"\"],\n width: \"500px\",\n wrapEnabled: true\n };\n return DiffComponent;\n}(React.Component));\nexports.default = DiffComponent;\n//# sourceMappingURL=diff.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ace_1 = require(\"./ace\");\nvar diff_1 = require(\"./diff\");\nexports.diff = diff_1.default;\nvar split_1 = require(\"./split\");\nexports.split = split_1.default;\nexports.default = ace_1.default;\n//# sourceMappingURL=index.js.map"],"names":["global","this","window","define","module2","deps","payload","arguments","length","modules","payloads","original","apply","error","trace","ns","root2","_require","parentId","callback","lookup","Object","prototype","toString","call","params","i","l","dep","require","push","packagedModule","normalizeModule","moduleName","indexOf","chunks","split","charAt","slice","join","previous","replace","exports2","mod","id","uri","exports","packaged","module3","Element","remove","defineProperty","enumerable","writable","configurable","value","parentNode","removeChild","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","_navigator","navigator","os","exec","platform","toLowerCase","ua","userAgent","appName","isWin","isIE","parseFloat","match","isOldIE","isGecko","isMozilla","isOpera","opera","isWebKit","isChrome","isEdge","isAIR","isAndroid","isChromeOS","isIOS","test","MSStream","isMobile","strictCSP","useragent","buildDom","arr","parent","refs","txt","document","createTextNode","appendChild","Array","isArray","els","ch","el","createElement","options","childIndex","keys","forEach","n","val","className","style","cssText","setAttribute","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","removeChildren","element","innerHTML","textContent","ownerDocument","createFragment","createDocumentFragment","hasCssClass","name","addCssClass","removeCssClass","classes","index","splice","toggleCssClass","add","setCssClass","node","include","hasCssString","sheets","querySelectorAll","cssCache","cache","item","target","container","getRootNode","insertBefore","firstChild","useStrictCSP","importCssString","importCssStylsheet","rel","href","scrollbarWidth","document2","inner","width","minWidth","height","display","outer","position","left","overflow","body","noScrollbar","offsetWidth","withScrollbar","clientWidth","computedStyle","getComputedStyle","setStyle","styles","property","HAS_CSS_ANIMATION","HAS_CSS_TRANSFORMS","HI_DPI","devicePixelRatio","div","transform","animationName","translate","tx","ty","Math","round","top","inherits","ctor","superCtor","super_","create","constructor","mixin","obj","key","implement","proto","oop","Keys","ret","MODIFIER_KEYS","16","17","18","224","91","92","93","KEY_MODS","ctrl","alt","option","shift","super","meta","command","cmd","control","FUNCTION_KEYS","8","9","13","19","27","32","33","34","35","36","37","38","39","40","44","45","46","96","97","98","99","100","101","102","103","104","105","-13","112","113","114","115","116","117","118","119","120","121","122","123","144","145","PRINTABLE_KEYS","48","49","50","51","52","53","54","55","56","57","59","61","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","107","109","110","186","187","188","189","190","191","192","219","220","221","222","111","106","parseInt","enter","escape","esc","del","mods","i2","pow","filter","x","keyCodeToString","keyCode","keyString","String","fromCharCode","activeListenerOptions","pressedKeys","ts","createComment","addEventListener","passive","e","elem","type","destroy","addListener","destroyer","getListenerOptions","$toDestroy","EventListener","removeListener","removeEventListener","stopEvent","stopPropagation","preventDefault","getButton","ctrlKey","altKey","shiftKey","button","capture","eventHandler","releaseCaptureHandler","onMouseUp","addMouseWheelListener","wheelDeltaX","wheelX","wheelY","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","elements","timeouts","callbackName","startX","startY","timer","clicks","eventNames","2","3","4","isNewClick","abs","clientX","clientY","setTimeout","_clicks","onMousedown","getModifierHash","metaKey","hashId","getModifierState","altGr","location","keyLocation","timeStamp","defaultPrevented","getModifierString","addCommandKeyListener","isOldGecko","lastKeyDownKeyCode","normalizeCommandKeys","lastDefaultPrevented","result","resetPressedKeys","postMessage","postMessageId","nextTick","win","messageName","listener","data","$idleBlocked","onIdle","cb","timeout","handler","$idleBlockId","blockIdle","delay","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","bind","Range2","startRow","startColumn","endRow","endColumn","start","row","column","end","isEqual","range","contains","compare","compareRange","cmp","comparePoint","p","containsRange","intersects","isEnd","isStart","setStart","setEnd","inside","insideStart","insideEnd","isMultiLine","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","extend","isEmpty","clone","collapseRows","max","toScreenRange","session","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","comparePoints","p1","p2","Range","last","a","stringReverse","string","reverse","stringRepeat","count","trimBeginRegexp","trimEndRegexp","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","array","deepCopy","arrayToMap","map","createMap","props","arrayRemove","escapeRegExp","str","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","clearTimeout","$cancelT","lineMode","pasteCancelled","Date","now","event","dom","lang","clipboard","BROKEN_SETDATA","USE_IE_MIME_TYPE","HAS_FOCUS_ARGS","MAX_LINE_LENGTH","KEYS","MODS","valueResetRegex","TextInput","host","text","opacity","copied","pasted","inComposition","sendingText","tempStyle","fontSize","commandMode","ignoreFocusEvents","lastValue","lastSelectionStart","lastSelectionEnd","lastRestoreEnd","isFocused","activeElement","onBlur","hasFocus","e2","onFocus","resetSelection","$focusScroll","focus","preventScroll","isTransformed","getBoundingClientRect","ancestors","t","parentElement","nodeType","removeAttribute","blur","on","curOp","commandName","isUserAction","docChanged","selectionChanged","newValue","selectionEnd","selection","setSelectionRange","afterContextMenu","selectionStart","line","getRange","cursor","getLine","prevLine","nextLine","inputHandler","setInputHandler","getInputHandler","sendText","fromInput","onPaste","extendLeft","extendRight","inserted","restoreStart","restoreEnd","endIndex","shouldReset","onTextInput","onInput","onCompositionUpdate","inputType","execCommand","handleClipboardData","forceIEMime","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","select","onCommandKey","text2","selectAll","$readOnly","cancelComposition","useTextareaForIME","markerRange","context","compositionStartOffset","onCompositionEnd","off","closeTimeout","syncComposition","renderer","$isMousePressed","$keepTextAreaAtCursor","$moveTextAreaToCursor","onCompositionStart","_signal","getSelectionRange","msGetInputContext","getInputContext","getElement","setCommandMode","readOnly","setReadOnly","setCopyWithEmptySelection","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","characterWidth","rect","borderTopWidth","borderLeftWidth","maxTop","bottom","clientHeight","move","min","onContextMenuClose","textInput","scroller","parentNode2","host2","typingResetTimeout","typing","detectArrowKeys","$mouseHandler","isMousePressed","modifier","up","home","down","right","commands","findKeyCommand","$setUserAgentForTests","_isMobile","_isIOS","mouseHandler","$clickSelection","editor","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","selectByLines","extendSelectionBy","selectByWords","anchor","ev","inSelection","pos","getDocumentPosition","mousedownEvent","moveToPosition","time","$focusTimeout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","orientedRange","calcRangeOrientation","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","ax","ay","bx","by","distance","sqrt","getBracketRange","getWordRange","getLineRange","getAccelKey","$lastScroll","vx","vy","allowed","prevScroll","dt","direction","canScroll","isScrollableBy","speed","scrollBy","stop","DefaultHandlers","isOpen","$element","$parentNode","$init","setText","setHtml","html","setPosition","setClassName","show","hide","getHeight","offsetHeight","getWidth","Tooltip","GutterTooltip","windowWidth","innerWidth","windowHeight","innerHeight","GutterHandler","tooltipTimeout","mouseEvent","tooltipAnnotation","gutter","$gutterLayer","tooltip","hideTooltip","getRegion","selectTo","srcElement","$tooltipFollowsMouse","annotation","$annotations","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","$gutter","MouseEvent","$inSelection","propagationStopped","selectionRange","dragImage","x2","dragSelectionMarker","timerId","dragCursor","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","mouseTarget","counter","prevCursor","vMovement","hMovement","moveCursorToPosition","calcDistance","lineHeight","layerConfig","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","toOrientedRange","addMarker","getSelectionStyle","clearSelection","$cursorLayer","setBlinking","setInterval","onDragInterval","onMouseMove","removeMarker","fromOrientedRange","$resetCursorStyle","onDragStart","cancelDrag","draggable","self2","dataTransfer","effectAllowed","getReadOnly","setDragImage","clearData","getTextRange","onDragEnd","dropEffect","setCursorStyle","onDragEnter","canAccept","getDropEffect","onDragOver","onMouseMoveTimer","onDragLeave","onDrop","moveText","dropData","insert","types","some","copyAllowed","copyModifierState","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","state","dragDrop","$dragEnabled","eventTarget","unselectable","DragdropHandler","addTouchListeners","touchStartT","lastT","longTouchTimer","animationTimer","pressed","contextMenu","mode","animationSteps","clickCount","vX","vY","handleClick","selected","hasUndo","action","getAttribute","getUndoManager","replaceChild","class","readText","then","writeText","ontouchstart","ontouchend","onclick","pagePos","textToScreenCoordinates","leftOffset","pageX","scrollLeft","pageY","hideContextMenu","selectWord","touches","h","w","touchObj","setRange","cursorPos","getPixelPosition","anchorPos","offsetTop","offsetLeft","weightedDistance","y2","diff1","diff2","handleLongTap","oldScrollTop","getScrollTop","pos2","get","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","path","s","src","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","once","newCallback","Promise","resolve","handlers","_disabled_","old","disabled","removeDefaultHandler","pop","capturing","removeAllListeners","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","hidden","getOption","opt","warn","forwardTo","handlesSet","set","message","console","msg","Error","AppConfig","$defaultOptions","defineOptions","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","reportError","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","loadWorkerFromBlob","sharedPopups","hasOwnProperty","all","$modes","moduleUrl","component","parts","sep","base","re","RegExp","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","module4","module","onLoad2","reportErrorIfPathIsNotConfigured","scriptOptions","scriptUrl","currentScript","_currentScript","scripts","script","attributes","j","attr","m","m1","toUpperCase","init","version","DefaultGutterHandler","config","MouseHandler","focusEditor","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","Boolean","gutterEl","$dragDelay","character","mousemove","$scrollSpeed","mouseMoveHandler","which","releaseMouse","$mouseMoved","onCaptureEnd","onOperationEnd","$onCaptureMouseMove","endOperation","onCaptureInterval","startOperation","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimeout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","getUseWrapMode","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","args","passEvent","dir","hiLevel","lastArabic","hasUBAT_B","hasUBAT_S","impTab_LTR","impTab_RTL","ET","BN","UnicodeTBL00","UnicodeTBL20","lev","levels","_array","lo","hi","tmp","len","chars","ix","wType","nType","cType","c","rtlCandidate","uc","charCodeAt","L","R","EN","ON_R","AN","R_H","B","RLE","DOT","doBidiReorder","textCharTypes","isRtl","logicalFromVisual","bidiLevels","charTypes","impTab","prevState","newClass","newLevel","newState","condPos","_getCharacterType","_getCharClass","hasBidiCharacters","getVisualFromLogicalIdx","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","bidiMap","currentRow","charWidths","EOL","showInvisibles","isRtlDir","$isRtl","wrapIndent","EOF","contentWidth","fontMetrics","rtlLineOffset","wrapOffset","isMoveLeftOperation","seenBidi","getValue","isBidiRow","docRow","splitIndex","updateRowLine","updateBidiMap","onChange","delta","lines","getDocumentRow","rowCache","$screenRowCache","$getRowCacheIndex","$docRowCache","getSplitIndex","currentIndex","prevIndex","endOfLine","$useWrapMode","splits","$wrapData","indent","substring","size","isFullWidth","getScreenTabSize","$main","substr","markAsDirty","updateCharacterWidths","$characterSize","bidiCharWidth","$measureCharWidth","setShowInvisibles","setEolChar","eolChar","setContentWidth","isRtlLine","setRtlDirection","getCursorPosition","getSelectionAnchor","$bidiHandler","removeInLine","getPosLeft","col","leftBoundary","logicalIdx","getOverwrite","visualIdx","getSelections","startCol","endCol","level","selections","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","offsetToCol","posX","charWidth","Selection","getDocument","lead","createAnchor","$silent","$cursorChanged","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","$anchorChanged","getCursor","getPosition","getAnchor","getSelectionLead","isBackwards","$setSelection","Number","MAX_VALUE","anchorRow","anchorColumn","cursorRow","cursorColumn","wasEmpty","wasMultiselect","$moveSelection","mover","moveCursorTo","moveTo","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","wouldMoveIntoSoftTab","tabSize","isTabStop","getTabSize","getNavigateWithinSoftTabs","firstColumnPosition","screenToDocumentPosition","leadingSpace","getDisplayLine","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","search","moveCursorLongWordRight","rightOfCursor","nonTokenRe","lastIndex","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","offsetX","screenPos","lineWidgets","widget","rowsAbove","rowCount","docPos","keepDesiredColumn","moveCursorToScreen","desiredColumn","r","getRangeOfMovements","func","toJSON","rangeCount","ranges","r1","fromJSON","rangeList","toSingleRange","addRange","MAX_TOKEN_COUNT","Tokenizer","rules","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","regex","adjustedregex","matchcount","token","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","rule2","createSplitterRegexp","$setMaxTokenCount","values","tokens","stack","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","next","consumeLineEnd","merge","unshift","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","append","$embeds","getEmbeds","pushState","popState","normalizeRules","processed","toInsert","stateName","includeName","concat","noEscape","keywordMap","createKeywordMapper","ignoreCase","splitChar","keywords","$keywordList","list","word","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","getBehaviours","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","getCurrentTokenPosition","getCurrentTokenRange","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","defaultQuotes","\"","'","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","opening","closing","rowDiff","CstyleBehaviour","getWrapBehavioursEnabled","isSaneInsertion","braces","recordAutoInsert","recordMaybeInsert","$findOpeningBracket","isAutoInsertedClosing","popAutoInsertedClosing","isMaybeInsertedClosing","clearMaybeInsertedClosing","openBracePos","findMatchingBracket","next_indent","$getIndent","getTabString","quotes","$mode","$quotes","lineCommentStart","quote","leftChar","rightChar","rightToken","pair","stringBefore","stringAfter","wordRe","isWordBefore","isWordAfter","charBefore","iterator","$matchTokenType","iterator2","bracket","wordChars","code","unicode","Mode","$defaultBehaviour","getTokenizer","$tokenizer","$highlightRules","$highlightRuleConfig","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","fun","minEmptyLength","floor","toggleBlockComment","colDiff","initialRange","startRange","endRange","getNextLineIndent","tab","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","Mode2","$id","delegations","scope","functionName","$delegator","method","language","split2","transformAction","param","$behaviour","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","score","applyDelta","docLines","doNotValidate","Anchor","$onChange","point1","point2","equalPointsInOrder","bColIsAfter","$clipPositionToDocument","$insertRight","point","moveIfEqual","deltaIsInsert","deltaRowShift","deltaColShift","deltaStart","deltaEnd","$pointsInOrder","$getTransformedPoint","noClip","Document","textOrLines","$lines","insertMergedLines","setValue","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","getLinesForRange","insertLines","insertFullLines","removeLines","removeFullLines","insertNewLine","clippedPos","clonePos","$clipPosition","deleteFirstNewLine","deleteLastNewLine","deletedLines","removeNewLine","applyDeltas","deltas","revertDeltas","revertDelta","isInsert","$splitAndapplyLargeDelta","$safeApplyDelta","docLength","MAX","from","to","chunk","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","endLine","startLine","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","first","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","update","markerLayer","drawSingleLineMarker","foldData","folds","setFoldLine","shiftRow","sameRow","sort","b","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","log","foldBefore","newFoldLine","FoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","$bias","pointIndex","excludeEdges","startIndex","addList","removed","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","lineDif","Fold","subFolds","subFold","collapseChildren","addSubFold","afterStart","firstConsumed","consumedFolds","k","restoreRange","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","trim","lastFold","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","range2","outermostFolds","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","getCommentFoldRange","depth","getFoldWidget","getFoldWidgetRange","foldToLevel","foldAllComments","$foldStyles","manual","markbegin","markbeginend","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","$tokenizerUpdateFoldWidgets","updateFoldWidgets","tokenizerUpdateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","getMatchingBracketRanges","$brackets",")","(","]","[","{","}","<",">","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","$uid","onChangeFold","setMode","bgTokenizer","resetCaches","$resetRowCache","cacheArray","low","mid","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","$undoManager","mergeUndoDeltas","$informUndoManager","setUndoManager","reset","getSelection","undoManager","addSession","$syncInformUndoManager","markUndoGroup","$defaultUndoManager","undo","redo","hasRedo","addSelection","startNewGroup","setUseSoftTabs","$useSoftTabs","$indentWithTabs","setTabSize","$tabSize","setNavigateWithinSoftTabs","navigateWithinSoftTabs","$navigateWithinSoftTabs","$overwrite","setOverwrite","overwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","oldMode","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","scrollTop","isNaN","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","selectionBefore","$getUndoSelection","redoChanges","selectionAfter","setUndoSelect","enable","isUndo","delta2","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","$moveLines","$clipRowToDocument","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","row2","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","displayLength","lastSplit","lastDocSplit","isCode","$wrapAsCode","indentedSoftWrap","$indentedSoftWrap","maxIndent","indentation","getWrapIndent","minSplit","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getRowWrapIndent","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","doCache","maxRow","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","$enableVarChar","getCharacterWidth","wrap","$wrap","firstLineNumber","useSoftTabs","foldStyle","Search","find","$matchIterator","sr","sc","er","ec","skipCurrent","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","$disableFakeMultiline","wholeWord","wordBoundary","addWordBoundary","caseSensitive","$assembleMultilineRegExp","backwards","forEachInLine","commandKeyBinding","addCommands","$singleCommand","HashHandler","bindKey","isDefault","addCommand","removeCommand","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","keyPart","chain","keyPart2","binding2","parseKeys","id2","_addCommandToBinding","binding","removeCommands","bindKeys","keyList","$keyChain","MultiHashHandler","CommandManager","byName","$checkCommandState","isAvailable","returnValue","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","description","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","gotoLine","prompt","$type","multiSelectAction","getAllRanges","findNext","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","$copyWithEmptySelection","$handlePaste","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","autoIndent","firstLineEndCol","selectedCount","insertLine","curLine","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","textarea","keyBinding","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","$opResetTimer","$lastSel","prevOp","commandEvent","previousCommand","config2","scrollSelectionIntoView","animateScrolling","sel","$mergeableCommands","$mergeUndoDeltas","prev","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","getSession","resize","onResize","setTheme","theme","getTheme","getFontSize","setFontSize","$highlightBrackets","$highlightPending","$bracketHighlight","markerIds","getMatching","markerType","$highlightTags","$highlightTagPending","$tagHighlight","currentTag","prevToken","stepCount","tmpToken","sbm","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","$updateHighlightActiveLine","updateLines","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$selectionColorConflict","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","wordWithBoundary","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","nl","copyLine","inVirtualSelectionMode","isFullLine","getBehavioursEnabled","d","lineState","shouldOutdent","$enableAutoIndent","lineIndent","selectedRange","currIndent","prevLineState","composition","applyComposition","forEachSelection","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","getShowInvisibles","setDisplayIndentGuides","getDisplayIndentGuides","setShowPrintMargin","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","toggleWord","$toggleWordPairs","currWordStart","wordParts","curLength","itLength","that","item2","reg","wordPairs","negate","firstCondition","res","endPoint","moved","totalDiff","rangeIndex","subRows","compositionState","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","animate","alignCursor","getCursorPositionScreen","expand","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","searchBox","$pixelPos","enable2","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","copyWithEmptySelection","behavioursEnabled","wrapBehavioursEnabled","enableAutoIndent","autoScrollEditorIntoView","showLineNumbers","setShowLineNumbers","$loop","CHANGE_GUTTER","$relativeLineNumbers","relativeLineNumbers","$showLineNumbers","$updatePlaceholder","$composition","placeholderNode","$placeholder","content","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","displayIndentGuides","showGutter","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","hasCssTransforms","maxPixelHeight","relativeNumberRenderer","getText","lastLineNumber","$renderer","UndoManager","$maxRev","allowMerge","$lastDelta","$keepRedoStack","$redoStack","lastDeltas","$undoStack","$rev","rev","markIgnored","ignore","getRevision","getDeltas","getChangedRanges","getChangedLines","deltaSet","swapped","swapGroups","rearrangeUndoStack","$redoStackBaseRev","undoSelectionRange","$syncRev","redoStack","deltaSets","redoSelectionRange","nextDelta","mark","canUndo","canRedo","bookmark","isAtBookmark","isClean","markClean","$prettyPrint","stringifyDelta","stringifyRange","d1","d2","i1","ds1","ds2","c1","splitDelta","rowsBefore","otherLines","cloneDelta","xformed","xform","Lines","canvasHeight","cells","cellCache","$offsetCoefficient","moveContainer","firstRowScreen","pageChanged","oldConfig","newConfig","computeLineTop","screenTop","screenPage","computeLineHeight","$cacheCell","cell","fragment","insertAdjacentElement","createCell","initElement","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","textNode","foldWidget","rowInfo","annoText","gutterOffset","oldLastRow","$updateCursorRow","onCreateCell","$renderCell","$updateGutterWidth","gutterRenderer","$firstLineNumber","lastLineText","$fixedWidth","padding","$padding","$computePadding","ceil","$highlightGutterLine","$cursorRow","updateLineHighlight","$cursorCell","scrollLines","$renderLines","childNodes","breakpoints","decorations","foldHeight","getShowLineNumbers","paddingLeft","borderRightWidth","paddingRight","Marker","setPadding","setMarkers","markers","elt","css","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","childElementCount","lastChild","stringBuilder","extraStyle","curr","lineRange","range1","drawBidiSingleLineMarker","radiusClass","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","margin","getLineHeight","$fontMetrics","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","showSpaces","showTabs","showEOL","$tabStrings","tabStr","span","$indentGuideRe","spaceClass","spaceContent","tabClass","tabContent","lineElements","lineElementsIdx","heightChanged","lineElement","$renderLine","$renderLinesFragment","lineEl","$useLineGroups","$textToken","rparen","lparen","$renderToken","valueFragment","simpleSpace","controlCharacter","cjkSpace","cjk","cloneNode","com","renderIndentGuide","cols","$createLineElement","$renderWrappedLine","splitChars","$renderOverflowMessage","$renderSimpleLine","overflowEl","$getFoldLineTokens","lastLineEl","invisibleEl","renderTokens","tokens2","Cursor","isVisible","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateOpacity","$startCssAnimation","animationDuration","$isAnimating","$stopCssAnimation","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","$isSmoothBlinking","blink","onScreen","isCursorInView","pixelPos","maxHeight","$selectionMarkers","cursorIndex","drawCursor","$setOverwrite","MAX_SCROLL_H","ScrollBar","classSuffix","setVisible","skipEvent","onScroll","coeff","VScrollBar","scrollHeight","$scrollbarWidth","$minWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","$recursionLimit","_flush","change","clear","CHAR_COUNT","USE_OBSERVER","ResizeObserver","FontMetrics","$setMeasureNodeStyles","$measureNode","$addObserver","isRoot","visibility","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","$observer","observe","setPolling","disconnect","$getZoom","zoom","getZoom","$initTransformMeasureNodes","t2","transformCoordinates","clientPos","elPos","l1","l2","det","a2","b2","mul","solve","sub","m2","ut","u","f","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","HIDE_TEXTAREA","VirtualRenderer","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","minHeight","v","$renderChanges","defaultView","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$printMarginEl","containerEl","posTop","posLeft","setScrollMargin","sm","setMargin","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","$vScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","freeze","unfreeze","st","$updateLines","$autosize","desiredHeight","$maxPixelHeight","$gutterWidth","hideScrollbars","longestLine","$getLongestLine","horizScroll","hScrollChanged","vScrollBefore","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","x_min","steps","initialScroll","oldSteps","$timer","clearInterval","scrollTo","canvasPos","$hasCssTransforms","$blockCursor","$useTextareaForIME","addToken","removeExtraToken","newToken","$themeId","cssClass","$theme","isDark","setMouseCursor","attachToShadowRoot","workerUrl","Worker","blob","Blob","blobBuilder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","getBlob","$workerBlob","blobURL","URL","webkitURL","createObjectURL","WorkerClient","worker","$createWorkerFromOldConfig","$sendDeltaQueue","changeListener","onMessage","callbackId","callbacks","onmessage","topLevelNamespaces","classname","importScripts","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","err","deltaQueue","$doc","emit","ex","attachToDocument","q","UIWorkerClient","main","emitSync","sender","messageBuffer","workerClient","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","other","showOtherMarkers","othersActive","hideOtherMarkers","updateAnchors","lengthDiff","inMainRange","distanceFromStart","newPos","otherPos","updateMarkers","updateMarker","undosRequired","accel","selectionMode","isMultiSelect","isSamePoint","mouseX","mouseY","screenAnchor","screenCursor","$enableJumpToDef","$blockSelectEnabled","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","blockSelect","newCursor","cursor2","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","onSelectionInterval","selectMoreLines","selectMore","joinSelections","splitIntoLines","alignCursors","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","docEnd","yBackwards","$multiselectOnSessionChange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","altCursor","altDown","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","keepOrder","$byLines","cmdResult","anim","buf","additive","skip","screenLead","toRemove","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","startW","textW","endW","isLeftAligned","isRightAligned","alignLeft","MultiSelect","enableMultiselect","enableBlockSelect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","updateOnFold","_inDocument","removeLineWidget","$updateRows","noWidgets","$oldWidget","$registerLineWidget","addLineWidget","zIndex","coverGutter","pixelHeight","$fold","onWidgetChanged","w1","getWidgetsAtRow","changedWidgets","fixedWidth","coverLine","fullWidth","LineWidgets","oldWidget","w2","gutterAnno","comparator","binarySearch","matched","findAnnotations","arrow","onmousedown","Renderer","edit","_id","getElementById","env","tagName","oldNode","createEditSession","ace","editorOptions_1","ace2","acequire","require$$0","fn","extendStatics","__extends","setPrototypeOf","__proto__","__","__assign","assign","ace_1","PropTypes","React","require$$1","require$$2","require$$3","getAceInstance","ReactAce","_super","_this","editorEvents","debounce","ReactAce2","componentDidMount","_a","onBeforeLoad","onValidate","defaultValue","cursorStart","wrapEnabled","_b","refEditor","editorProps","debounceChangePeriod","navigateToFileEnd","updatePlaceholder","annotations2","handleMarkers","availableOptions","editorOptions","handleOptions","componentDidUpdate","prevProps","oldProps","nextProps","appliedClassesArray_1","oldClass","silent","handleScrollMargins","margins","setScrollMargins","componentWillUnmount","currentMarkers","showPlaceholder","updateRef","render","divStyle","ref","propTypes","bool","oneOfType","number","object","enableSnippets","enableBasicAutocompletion","enableLiveAutocompletion","defaultProps","Component","Split","BELOW","BESIDE","$container","$splits","$editorCSS","$editors","$orientation","setSplits","$cEditor","$createEditor","$fontSize","getSplits","getEditor","getCurrentEditor","keybinding","$cloneSession","editor2","getOrientation","setOrientation","orientation","editorWidth","editorHeight","genTag","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","freeSelf","self","root","Function","uid","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","IE_PROTO","funcToString","objectToString","reIsNative","Symbol","Map","getNative","nativeCreate","symbolProto","symbolToString","entries","entry","isSymbol","isKey","stringToPath","toKey","isObject","isFunction","isHostObject","toSource","__data__","baseIsNative","Hash","has","ListCache","assocIndexOf","MapCache","hash","getMapData","memoize","baseToString","string2","resolver","TypeError","memoized","Cache","isObjectLike","lodash_get","baseGet","ace_builds_1","ext_split_1","require$$4","require$$5","require$$6","SplitComponent","SplitComponent2","splitEditor","defaultValueForEditor","valueForEditor","newAnnotations","newMarkers","sp","nextValue","oldAnnotations","oldMarkers","value_1","value_2","value_3","arrayOf","diff_match_patch","Diff_Timeout","Diff_EditCost","Match_Threshold","Match_Distance","Patch_DeleteThreshold","Patch_Margin","Match_MaxBits","DIFF_DELETE","Diff","op","diff_main","text1","opt_checklines","opt_deadline","getTime","deadline","checklines","commonlength","diff_commonPrefix","commonprefix","diff_commonSuffix","commonsuffix","diffs","diff_compute_","diff_cleanupMerge","longtext","shorttext","hm","diff_halfMatch_","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","diff_lineMode_","diff_bisect_","diff_linesToChars_","chars1","chars2","linearray","lineArray","diff_charsToLines_","diff_cleanupSemantic","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","front","k1start","k1end","k2start","k2end","k1","k1_offset","y1","x1","k2_offset","diff_bisectSplit_","k2","text1a","text2a","text1b","text2b","diffsb","lineHash","lineStart","lineArrayLength","diff_linesToCharsMunge_","pointermin","pointermax","pointermid","pointerstart","pointerend","diff_commonOverlap_","text_length","best","pattern","dmp","longtext2","shorttext2","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","seed","best_common","prefixLength","suffixLength","hm1","diff_halfMatchI_","hm2","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","diff_cleanupSemanticLossless","deletion","insertion","overlap_length1","overlap_length2","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumericRegex_","nonAlphaNumeric2","whitespace1","whitespaceRegex_","whitespace2","lineBreak1","linebreakRegex_","lineBreak2","blankLine1","blanklineEndRegex_","blankLine2","blanklineStartRegex_","equality1","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","diff_cleanupSemanticScore_","diff_cleanupEfficiency","pre_ins","pre_del","post_ins","post_del","diff_xIndex","loc","last_chars1","last_chars2","diff_prettyHtml","pattern_amp","pattern_lt","pattern_gt","pattern_para","diff_text1","diff_text2","diff_levenshtein","levenshtein","insertions","deletions","diff_toDelta","encodeURI","diff_fromDelta","diffsLength","decodeURI","match_main","match_bitap_","match_alphabet_","accuracy","proximity","score_threshold","best_loc","match_bitapScore_","lastIndexOf","bin_min","bin_mid","matchmask","last_rd","bin_max","finish","rd","charMatch","patch_addContext_","patch","start2","length1","start1","length2","patch_make","opt_b","opt_c","patches","patch_obj","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patch_deepCopy","patchesCopy","patchCopy","patch_apply","nullPadding","patch_addPadding","patch_splitMax","results","start_loc","expected_loc","end_loc","index2","index1","paddingLength","patch_size","bigpatch","precontext","empty","postcontext","patch_toText","patch_fromText","textline","textPointer","patchHeader","sign","diff","split_1","DiffMatchPatch","DiffComponent","DiffComponent2","lhString","rhString","diffedLines","generateDiffedLines","setCodeMarkers","C","chunkType","firstChar","lastChar","linesToHighlight","codeEditorSettings","newMarkerSet","markerObj","default","lib","diff_1"],"mappings":"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,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE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"}