diff --git a/dist/leonardo-api.js b/dist/leonardo-api.js index 59b4413..e05afbd 100644 --- a/dist/leonardo-api.js +++ b/dist/leonardo-api.js @@ -86,17 +86,6 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/ace-builds/src/ace.js": -/*!********************************************!*\ - !*** ./node_modules/ace-builds/src/ace.js ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("__webpack_require__(/*! !./node_modules/script-loader/addScript.js */ \"./node_modules/script-loader/addScript.js\")(__webpack_require__(/*! !./node_modules/raw-loader!./node_modules/ace-builds/src/ace.js */ \"./node_modules/raw-loader/index.js!./node_modules/ace-builds/src/ace.js\"))\n\n//# sourceURL=webpack:///./node_modules/ace-builds/src/ace.js?"); - -/***/ }), - /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/lib/loader.js!./src/leonardo/style/app.less": /*!********************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/lib/loader.js!./src/leonardo/style/app.less ***! @@ -198,17 +187,6 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), -/***/ "./node_modules/raw-loader/index.js!./node_modules/ace-builds/src/ace.js": -/*!**********************************************************************!*\ - !*** ./node_modules/raw-loader!./node_modules/ace-builds/src/ace.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = \"/* ***** 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 = \\\"\\\";\\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\\ndefine(\\\"ace/lib/regexp\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\n var real = {\\n exec: RegExp.prototype.exec,\\n test: RegExp.prototype.test,\\n match: String.prototype.match,\\n replace: String.prototype.replace,\\n split: String.prototype.split\\n },\\n compliantExecNpcg = real.exec.call(/()??/, \\\"\\\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\\n compliantLastIndexIncrement = function () {\\n var x = /^/g;\\n real.test.call(x, \\\"\\\");\\n return !x.lastIndex;\\n }();\\n\\n if (compliantLastIndexIncrement && compliantExecNpcg)\\n return;\\n RegExp.prototype.exec = function (str) {\\n var match = real.exec.apply(this, arguments),\\n name, r2;\\n if ( typeof(str) == 'string' && match) {\\n if (!compliantExecNpcg && match.length > 1 && indexOf(match, \\\"\\\") > -1) {\\n r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \\\"g\\\", \\\"\\\"));\\n real.replace.call(str.slice(match.index), r2, function () {\\n for (var i = 1; i < arguments.length - 2; i++) {\\n if (arguments[i] === undefined)\\n match[i] = undefined;\\n }\\n });\\n }\\n if (this._xregexp && this._xregexp.captureNames) {\\n for (var i = 1; i < match.length; i++) {\\n name = this._xregexp.captureNames[i - 1];\\n if (name)\\n match[name] = match[i];\\n }\\n }\\n if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\\n this.lastIndex--;\\n }\\n return match;\\n };\\n if (!compliantLastIndexIncrement) {\\n RegExp.prototype.test = function (str) {\\n var match = real.exec.call(this, str);\\n if (match && this.global && !match[0].length && (this.lastIndex > match.index))\\n this.lastIndex--;\\n return !!match;\\n };\\n }\\n\\n function getNativeFlags (regex) {\\n return (regex.global ? \\\"g\\\" : \\\"\\\") +\\n (regex.ignoreCase ? \\\"i\\\" : \\\"\\\") +\\n (regex.multiline ? \\\"m\\\" : \\\"\\\") +\\n (regex.extended ? \\\"x\\\" : \\\"\\\") + // Proposed for ES4; included in AS3\\n (regex.sticky ? \\\"y\\\" : \\\"\\\");\\n }\\n\\n function indexOf (array, item, from) {\\n if (Array.prototype.indexOf) // Use the native array method if available\\n return array.indexOf(item, from);\\n for (var i = from || 0; i < array.length; i++) {\\n if (array[i] === item)\\n return i;\\n }\\n return -1;\\n }\\n\\n});\\n\\ndefine(\\\"ace/lib/es5-shim\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\nfunction Empty() {}\\n\\nif (!Function.prototype.bind) {\\n Function.prototype.bind = function bind(that) { // .length is 1\\n var target = this;\\n if (typeof target != \\\"function\\\") {\\n throw new TypeError(\\\"Function.prototype.bind called on incompatible \\\" + target);\\n }\\n var args = slice.call(arguments, 1); // for normal call\\n var bound = function () {\\n\\n if (this instanceof bound) {\\n\\n var result = target.apply(\\n this,\\n args.concat(slice.call(arguments))\\n );\\n if (Object(result) === result) {\\n return result;\\n }\\n return this;\\n\\n } else {\\n return target.apply(\\n that,\\n args.concat(slice.call(arguments))\\n );\\n\\n }\\n\\n };\\n if(target.prototype) {\\n Empty.prototype = target.prototype;\\n bound.prototype = new Empty();\\n Empty.prototype = null;\\n }\\n return bound;\\n };\\n}\\nvar call = Function.prototype.call;\\nvar prototypeOfArray = Array.prototype;\\nvar prototypeOfObject = Object.prototype;\\nvar slice = prototypeOfArray.slice;\\nvar _toString = call.bind(prototypeOfObject.toString);\\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\\nvar defineGetter;\\nvar defineSetter;\\nvar lookupGetter;\\nvar lookupSetter;\\nvar supportsAccessors;\\nif ((supportsAccessors = owns(prototypeOfObject, \\\"__defineGetter__\\\"))) {\\n defineGetter = call.bind(prototypeOfObject.__defineGetter__);\\n defineSetter = call.bind(prototypeOfObject.__defineSetter__);\\n lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\\n lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\\n}\\nif ([1,2].splice(0).length != 2) {\\n if(function() { // test IE < 9 to splice bug - see issue #138\\n function makeArray(l) {\\n var a = new Array(l+2);\\n a[0] = a[1] = 0;\\n return a;\\n }\\n var array = [], lengthBefore;\\n \\n array.splice.apply(array, makeArray(20));\\n array.splice.apply(array, makeArray(26));\\n\\n lengthBefore = array.length; //46\\n array.splice(5, 0, \\\"XXX\\\"); // add one element\\n\\n lengthBefore + 1 == array.length\\n\\n if (lengthBefore + 1 == array.length) {\\n return true;// has right splice implementation without bugs\\n }\\n }()) {//IE 6/7\\n var array_splice = Array.prototype.splice;\\n Array.prototype.splice = function(start, deleteCount) {\\n if (!arguments.length) {\\n return [];\\n } else {\\n return array_splice.apply(this, [\\n start === void 0 ? 0 : start,\\n deleteCount === void 0 ? (this.length - start) : deleteCount\\n ].concat(slice.call(arguments, 2)))\\n }\\n };\\n } else {//IE8\\n Array.prototype.splice = function(pos, removeCount){\\n var length = this.length;\\n if (pos > 0) {\\n if (pos > length)\\n pos = length;\\n } else if (pos == void 0) {\\n pos = 0;\\n } else if (pos < 0) {\\n pos = Math.max(length + pos, 0);\\n }\\n\\n if (!(pos+removeCount < length))\\n removeCount = length - pos;\\n\\n var removed = this.slice(pos, pos+removeCount);\\n var insert = slice.call(arguments, 2);\\n var add = insert.length; \\n if (pos === length) {\\n if (add) {\\n this.push.apply(this, insert);\\n }\\n } else {\\n var remove = Math.min(removeCount, length - pos);\\n var tailOldPos = pos + remove;\\n var tailNewPos = tailOldPos + add - remove;\\n var tailCount = length - tailOldPos;\\n var lengthAfterRemove = length - remove;\\n\\n if (tailNewPos < tailOldPos) { // case A\\n for (var i = 0; i < tailCount; ++i) {\\n this[tailNewPos+i] = this[tailOldPos+i];\\n }\\n } else if (tailNewPos > tailOldPos) { // case B\\n for (i = tailCount; i--; ) {\\n this[tailNewPos+i] = this[tailOldPos+i];\\n }\\n } // else, add == remove (nothing to do)\\n\\n if (add && pos === lengthAfterRemove) {\\n this.length = lengthAfterRemove; // truncate array\\n this.push.apply(this, insert);\\n } else {\\n this.length = lengthAfterRemove + add; // reserves space\\n for (i = 0; i < add; ++i) {\\n this[pos+i] = insert[i];\\n }\\n }\\n }\\n return removed;\\n };\\n }\\n}\\nif (!Array.isArray) {\\n Array.isArray = function isArray(obj) {\\n return _toString(obj) == \\\"[object Array]\\\";\\n };\\n}\\nvar boxedString = Object(\\\"a\\\"),\\n splitString = boxedString[0] != \\\"a\\\" || !(0 in boxedString);\\n\\nif (!Array.prototype.forEach) {\\n Array.prototype.forEach = function forEach(fun /*, thisp*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n thisp = arguments[1],\\n i = -1,\\n length = self.length >>> 0;\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(); // TODO message\\n }\\n\\n while (++i < length) {\\n if (i in self) {\\n fun.call(thisp, self[i], i, object);\\n }\\n }\\n };\\n}\\nif (!Array.prototype.map) {\\n Array.prototype.map = function map(fun /*, thisp*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n result = Array(length),\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self)\\n result[i] = fun.call(thisp, self[i], i, object);\\n }\\n return result;\\n };\\n}\\nif (!Array.prototype.filter) {\\n Array.prototype.filter = function filter(fun /*, thisp */) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n result = [],\\n value,\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self) {\\n value = self[i];\\n if (fun.call(thisp, value, i, object)) {\\n result.push(value);\\n }\\n }\\n }\\n return result;\\n };\\n}\\nif (!Array.prototype.every) {\\n Array.prototype.every = function every(fun /*, thisp */) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self && !fun.call(thisp, self[i], i, object)) {\\n return false;\\n }\\n }\\n return true;\\n };\\n}\\nif (!Array.prototype.some) {\\n Array.prototype.some = function some(fun /*, thisp */) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self && fun.call(thisp, self[i], i, object)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n}\\nif (!Array.prototype.reduce) {\\n Array.prototype.reduce = function reduce(fun /*, initial*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0;\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n if (!length && arguments.length == 1) {\\n throw new TypeError(\\\"reduce of empty array with no initial value\\\");\\n }\\n\\n var i = 0;\\n var result;\\n if (arguments.length >= 2) {\\n result = arguments[1];\\n } else {\\n do {\\n if (i in self) {\\n result = self[i++];\\n break;\\n }\\n if (++i >= length) {\\n throw new TypeError(\\\"reduce of empty array with no initial value\\\");\\n }\\n } while (true);\\n }\\n\\n for (; i < length; i++) {\\n if (i in self) {\\n result = fun.call(void 0, result, self[i], i, object);\\n }\\n }\\n\\n return result;\\n };\\n}\\nif (!Array.prototype.reduceRight) {\\n Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0;\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n if (!length && arguments.length == 1) {\\n throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");\\n }\\n\\n var result, i = length - 1;\\n if (arguments.length >= 2) {\\n result = arguments[1];\\n } else {\\n do {\\n if (i in self) {\\n result = self[i--];\\n break;\\n }\\n if (--i < 0) {\\n throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");\\n }\\n } while (true);\\n }\\n\\n do {\\n if (i in this) {\\n result = fun.call(void 0, result, self[i], i, object);\\n }\\n } while (i--);\\n\\n return result;\\n };\\n}\\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\\n Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\\n var self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n toObject(this),\\n length = self.length >>> 0;\\n\\n if (!length) {\\n return -1;\\n }\\n\\n var i = 0;\\n if (arguments.length > 1) {\\n i = toInteger(arguments[1]);\\n }\\n i = i >= 0 ? i : Math.max(0, length + i);\\n for (; i < length; i++) {\\n if (i in self && self[i] === sought) {\\n return i;\\n }\\n }\\n return -1;\\n };\\n}\\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\\n Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\\n var self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n toObject(this),\\n length = self.length >>> 0;\\n\\n if (!length) {\\n return -1;\\n }\\n var i = length - 1;\\n if (arguments.length > 1) {\\n i = Math.min(i, toInteger(arguments[1]));\\n }\\n i = i >= 0 ? i : length - Math.abs(i);\\n for (; i >= 0; i--) {\\n if (i in self && sought === self[i]) {\\n return i;\\n }\\n }\\n return -1;\\n };\\n}\\nif (!Object.getPrototypeOf) {\\n Object.getPrototypeOf = function getPrototypeOf(object) {\\n return object.__proto__ || (\\n object.constructor ?\\n object.constructor.prototype :\\n prototypeOfObject\\n );\\n };\\n}\\nif (!Object.getOwnPropertyDescriptor) {\\n var ERR_NON_OBJECT = \\\"Object.getOwnPropertyDescriptor called on a \\\" +\\n \\\"non-object: \\\";\\n Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\\n if ((typeof object != \\\"object\\\" && typeof object != \\\"function\\\") || object === null)\\n throw new TypeError(ERR_NON_OBJECT + object);\\n if (!owns(object, property))\\n return;\\n\\n var descriptor, getter, setter;\\n descriptor = { enumerable: true, configurable: true };\\n if (supportsAccessors) {\\n var prototype = object.__proto__;\\n object.__proto__ = prototypeOfObject;\\n\\n var getter = lookupGetter(object, property);\\n var setter = lookupSetter(object, property);\\n object.__proto__ = prototype;\\n\\n if (getter || setter) {\\n if (getter) descriptor.get = getter;\\n if (setter) descriptor.set = setter;\\n return descriptor;\\n }\\n }\\n descriptor.value = object[property];\\n return descriptor;\\n };\\n}\\nif (!Object.getOwnPropertyNames) {\\n Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\\n return Object.keys(object);\\n };\\n}\\nif (!Object.create) {\\n var createEmpty;\\n if (Object.prototype.__proto__ === null) {\\n createEmpty = function () {\\n return { \\\"__proto__\\\": null };\\n };\\n } else {\\n createEmpty = function () {\\n var empty = {};\\n for (var i in empty)\\n empty[i] = null;\\n empty.constructor =\\n empty.hasOwnProperty =\\n empty.propertyIsEnumerable =\\n empty.isPrototypeOf =\\n empty.toLocaleString =\\n empty.toString =\\n empty.valueOf =\\n empty.__proto__ = null;\\n return empty;\\n }\\n }\\n\\n Object.create = function create(prototype, properties) {\\n var object;\\n if (prototype === null) {\\n object = createEmpty();\\n } else {\\n if (typeof prototype != \\\"object\\\")\\n throw new TypeError(\\\"typeof prototype[\\\"+(typeof prototype)+\\\"] != 'object'\\\");\\n var Type = function () {};\\n Type.prototype = prototype;\\n object = new Type();\\n object.__proto__ = prototype;\\n }\\n if (properties !== void 0)\\n Object.defineProperties(object, properties);\\n return object;\\n };\\n}\\n\\nfunction doesDefinePropertyWork(object) {\\n try {\\n Object.defineProperty(object, \\\"sentinel\\\", {});\\n return \\\"sentinel\\\" in object;\\n } catch (exception) {\\n }\\n}\\nif (Object.defineProperty) {\\n var definePropertyWorksOnObject = doesDefinePropertyWork({});\\n var definePropertyWorksOnDom = typeof document == \\\"undefined\\\" ||\\n doesDefinePropertyWork(document.createElement(\\\"div\\\"));\\n if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\\n var definePropertyFallback = Object.defineProperty;\\n }\\n}\\n\\nif (!Object.defineProperty || definePropertyFallback) {\\n var ERR_NON_OBJECT_DESCRIPTOR = \\\"Property description must be an object: \\\";\\n var ERR_NON_OBJECT_TARGET = \\\"Object.defineProperty called on non-object: \\\"\\n var ERR_ACCESSORS_NOT_SUPPORTED = \\\"getters & setters can not be defined \\\" +\\n \\\"on this javascript engine\\\";\\n\\n Object.defineProperty = function defineProperty(object, property, descriptor) {\\n if ((typeof object != \\\"object\\\" && typeof object != \\\"function\\\") || object === null)\\n throw new TypeError(ERR_NON_OBJECT_TARGET + object);\\n if ((typeof descriptor != \\\"object\\\" && typeof descriptor != \\\"function\\\") || descriptor === null)\\n throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\\n if (definePropertyFallback) {\\n try {\\n return definePropertyFallback.call(Object, object, property, descriptor);\\n } catch (exception) {\\n }\\n }\\n if (owns(descriptor, \\\"value\\\")) {\\n\\n if (supportsAccessors && (lookupGetter(object, property) ||\\n lookupSetter(object, property)))\\n {\\n var prototype = object.__proto__;\\n object.__proto__ = prototypeOfObject;\\n delete object[property];\\n object[property] = descriptor.value;\\n object.__proto__ = prototype;\\n } else {\\n object[property] = descriptor.value;\\n }\\n } else {\\n if (!supportsAccessors)\\n throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\\n if (owns(descriptor, \\\"get\\\"))\\n defineGetter(object, property, descriptor.get);\\n if (owns(descriptor, \\\"set\\\"))\\n defineSetter(object, property, descriptor.set);\\n }\\n\\n return object;\\n };\\n}\\nif (!Object.defineProperties) {\\n Object.defineProperties = function defineProperties(object, properties) {\\n for (var property in properties) {\\n if (owns(properties, property))\\n Object.defineProperty(object, property, properties[property]);\\n }\\n return object;\\n };\\n}\\nif (!Object.seal) {\\n Object.seal = function seal(object) {\\n return object;\\n };\\n}\\nif (!Object.freeze) {\\n Object.freeze = function freeze(object) {\\n return object;\\n };\\n}\\ntry {\\n Object.freeze(function () {});\\n} catch (exception) {\\n Object.freeze = (function freeze(freezeObject) {\\n return function freeze(object) {\\n if (typeof object == \\\"function\\\") {\\n return object;\\n } else {\\n return freezeObject(object);\\n }\\n };\\n })(Object.freeze);\\n}\\nif (!Object.preventExtensions) {\\n Object.preventExtensions = function preventExtensions(object) {\\n return object;\\n };\\n}\\nif (!Object.isSealed) {\\n Object.isSealed = function isSealed(object) {\\n return false;\\n };\\n}\\nif (!Object.isFrozen) {\\n Object.isFrozen = function isFrozen(object) {\\n return false;\\n };\\n}\\nif (!Object.isExtensible) {\\n Object.isExtensible = function isExtensible(object) {\\n if (Object(object) === object) {\\n throw new TypeError(); // TODO message\\n }\\n var name = '';\\n while (owns(object, name)) {\\n name += '?';\\n }\\n object[name] = true;\\n var returnValue = owns(object, name);\\n delete object[name];\\n return returnValue;\\n };\\n}\\nif (!Object.keys) {\\n var hasDontEnumBug = true,\\n dontEnums = [\\n \\\"toString\\\",\\n \\\"toLocaleString\\\",\\n \\\"valueOf\\\",\\n \\\"hasOwnProperty\\\",\\n \\\"isPrototypeOf\\\",\\n \\\"propertyIsEnumerable\\\",\\n \\\"constructor\\\"\\n ],\\n dontEnumsLength = dontEnums.length;\\n\\n for (var key in {\\\"toString\\\": null}) {\\n hasDontEnumBug = false;\\n }\\n\\n Object.keys = function keys(object) {\\n\\n if (\\n (typeof object != \\\"object\\\" && typeof object != \\\"function\\\") ||\\n object === null\\n ) {\\n throw new TypeError(\\\"Object.keys called on a non-object\\\");\\n }\\n\\n var keys = [];\\n for (var name in object) {\\n if (owns(object, name)) {\\n keys.push(name);\\n }\\n }\\n\\n if (hasDontEnumBug) {\\n for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\\n var dontEnum = dontEnums[i];\\n if (owns(object, dontEnum)) {\\n keys.push(dontEnum);\\n }\\n }\\n }\\n return keys;\\n };\\n\\n}\\nif (!Date.now) {\\n Date.now = function now() {\\n return new Date().getTime();\\n };\\n}\\nvar ws = \\\"\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\" +\\n \\\"\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\" +\\n \\\"\\\\u2029\\\\uFEFF\\\";\\nif (!String.prototype.trim || ws.trim()) {\\n ws = \\\"[\\\" + ws + \\\"]\\\";\\n var trimBeginRegexp = new RegExp(\\\"^\\\" + ws + ws + \\\"*\\\"),\\n trimEndRegexp = new RegExp(ws + ws + \\\"*$\\\");\\n String.prototype.trim = function trim() {\\n return String(this).replace(trimBeginRegexp, \\\"\\\").replace(trimEndRegexp, \\\"\\\");\\n };\\n}\\n\\nfunction toInteger(n) {\\n n = +n;\\n if (n !== n) { // isNaN\\n n = 0;\\n } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\\n }\\n return n;\\n}\\n\\nfunction isPrimitive(input) {\\n var type = typeof input;\\n return (\\n input === null ||\\n type === \\\"undefined\\\" ||\\n type === \\\"boolean\\\" ||\\n type === \\\"number\\\" ||\\n type === \\\"string\\\"\\n );\\n}\\n\\nfunction toPrimitive(input) {\\n var val, valueOf, toString;\\n if (isPrimitive(input)) {\\n return input;\\n }\\n valueOf = input.valueOf;\\n if (typeof valueOf === \\\"function\\\") {\\n val = valueOf.call(input);\\n if (isPrimitive(val)) {\\n return val;\\n }\\n }\\n toString = input.toString;\\n if (typeof toString === \\\"function\\\") {\\n val = toString.call(input);\\n if (isPrimitive(val)) {\\n return val;\\n }\\n }\\n throw new TypeError();\\n}\\nvar toObject = function (o) {\\n if (o == null) { // this matches both null and undefined\\n throw new TypeError(\\\"can't convert \\\"+o+\\\" to object\\\");\\n }\\n return Object(o);\\n};\\n\\n});\\n\\ndefine(\\\"ace/lib/fixoldbrowsers\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/regexp\\\",\\\"ace/lib/es5-shim\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./regexp\\\");\\nrequire(\\\"./es5-shim\\\");\\n\\n});\\n\\ndefine(\\\"ace/lib/dom\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar XHTML_NS = \\\"http://www.w3.org/1999/xhtml\\\";\\n\\nexports.getDocumentHead = function(doc) {\\n if (!doc)\\n doc = document;\\n return doc.head || doc.getElementsByTagName(\\\"head\\\")[0] || doc.documentElement;\\n};\\n\\nexports.createElement = function(tag, ns) {\\n return document.createElementNS ?\\n document.createElementNS(ns || XHTML_NS, tag) :\\n document.createElement(tag);\\n};\\n\\nexports.hasCssClass = function(el, name) {\\n var classes = (el.className + \\\"\\\").split(/\\\\s+/g);\\n return classes.indexOf(name) !== -1;\\n};\\nexports.addCssClass = function(el, name) {\\n if (!exports.hasCssClass(el, name)) {\\n el.className += \\\" \\\" + name;\\n }\\n};\\nexports.removeCssClass = function(el, name) {\\n var classes = el.className.split(/\\\\s+/g);\\n while (true) {\\n var index = classes.indexOf(name);\\n if (index == -1) {\\n break;\\n }\\n classes.splice(index, 1);\\n }\\n el.className = classes.join(\\\" \\\");\\n};\\n\\nexports.toggleCssClass = function(el, name) {\\n var classes = el.className.split(/\\\\s+/g), add = true;\\n while (true) {\\n var index = classes.indexOf(name);\\n if (index == -1) {\\n break;\\n }\\n add = false;\\n classes.splice(index, 1);\\n }\\n if (add)\\n classes.push(name);\\n\\n el.className = classes.join(\\\" \\\");\\n return add;\\n};\\nexports.setCssClass = function(node, className, include) {\\n if (include) {\\n exports.addCssClass(node, className);\\n } else {\\n exports.removeCssClass(node, className);\\n }\\n};\\n\\nexports.hasCssString = function(id, doc) {\\n var index = 0, sheets;\\n doc = doc || document;\\n\\n if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\\n while (index < sheets.length)\\n if (sheets[index++].owningElement.id === id) return true;\\n } else if ((sheets = doc.getElementsByTagName(\\\"style\\\"))) {\\n while (index < sheets.length)\\n if (sheets[index++].id === id) return true;\\n }\\n\\n return false;\\n};\\n\\nexports.importCssString = function importCssString(cssText, id, doc) {\\n doc = doc || document;\\n if (id && exports.hasCssString(id, doc))\\n return null;\\n \\n var style;\\n \\n if (id)\\n cssText += \\\"\\\\n/*# sourceURL=ace/css/\\\" + id + \\\" */\\\";\\n \\n if (doc.createStyleSheet) {\\n style = doc.createStyleSheet();\\n style.cssText = cssText;\\n if (id)\\n style.owningElement.id = id;\\n } else {\\n style = exports.createElement(\\\"style\\\");\\n style.appendChild(doc.createTextNode(cssText));\\n if (id)\\n style.id = id;\\n\\n exports.getDocumentHead(doc).appendChild(style);\\n }\\n};\\n\\nexports.importCssStylsheet = function(uri, doc) {\\n if (doc.createStyleSheet) {\\n doc.createStyleSheet(uri);\\n } else {\\n var link = exports.createElement('link');\\n link.rel = 'stylesheet';\\n link.href = uri;\\n\\n exports.getDocumentHead(doc).appendChild(link);\\n }\\n};\\n\\nexports.getInnerWidth = function(element) {\\n return (\\n parseInt(exports.computedStyle(element, \\\"paddingLeft\\\"), 10) +\\n parseInt(exports.computedStyle(element, \\\"paddingRight\\\"), 10) + \\n element.clientWidth\\n );\\n};\\n\\nexports.getInnerHeight = function(element) {\\n return (\\n parseInt(exports.computedStyle(element, \\\"paddingTop\\\"), 10) +\\n parseInt(exports.computedStyle(element, \\\"paddingBottom\\\"), 10) +\\n element.clientHeight\\n );\\n};\\n\\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\\nif (typeof document == \\\"undefined\\\") {\\n exports.importCssString = function() {};\\n return;\\n}\\n\\nif (window.pageYOffset !== undefined) {\\n exports.getPageScrollTop = function() {\\n return window.pageYOffset;\\n };\\n\\n exports.getPageScrollLeft = function() {\\n return window.pageXOffset;\\n };\\n}\\nelse {\\n exports.getPageScrollTop = function() {\\n return document.body.scrollTop;\\n };\\n\\n exports.getPageScrollLeft = function() {\\n return document.body.scrollLeft;\\n };\\n}\\n\\nif (window.getComputedStyle)\\n exports.computedStyle = function(element, style) {\\n if (style)\\n return (window.getComputedStyle(element, \\\"\\\") || {})[style] || \\\"\\\";\\n return window.getComputedStyle(element, \\\"\\\") || {};\\n };\\nelse\\n exports.computedStyle = function(element, style) {\\n if (style)\\n return element.currentStyle[style];\\n return element.currentStyle;\\n };\\nexports.setInnerHtml = function(el, innerHtml) {\\n var element = el.cloneNode(false);//document.createElement(\\\"div\\\");\\n element.innerHTML = innerHtml;\\n el.parentNode.replaceChild(element, el);\\n return element;\\n};\\n\\nif (\\\"textContent\\\" in document.documentElement) {\\n exports.setInnerText = function(el, innerText) {\\n el.textContent = innerText;\\n };\\n\\n exports.getInnerText = function(el) {\\n return el.textContent;\\n };\\n}\\nelse {\\n exports.setInnerText = function(el, innerText) {\\n el.innerText = innerText;\\n };\\n\\n exports.getInnerText = function(el) {\\n return el.innerText;\\n };\\n}\\n\\nexports.getParentWindow = function(document) {\\n return document.defaultView || document.parentWindow;\\n};\\n\\n});\\n\\ndefine(\\\"ace/lib/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\\ndefine(\\\"ace/lib/keys\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/fixoldbrowsers\\\",\\\"ace/lib/oop\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./fixoldbrowsers\\\");\\n\\nvar oop = require(\\\"./oop\\\");\\nvar Keys = (function() {\\n var ret = {\\n MODIFIER_KEYS: {\\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\\n },\\n\\n KEY_MODS: {\\n \\\"ctrl\\\": 1, \\\"alt\\\": 2, \\\"option\\\" : 2, \\\"shift\\\": 4,\\n \\\"super\\\": 8, \\\"meta\\\": 8, \\\"command\\\": 8, \\\"cmd\\\": 8\\n },\\n\\n FUNCTION_KEYS : {\\n 8 : \\\"Backspace\\\",\\n 9 : \\\"Tab\\\",\\n 13 : \\\"Return\\\",\\n 19 : \\\"Pause\\\",\\n 27 : \\\"Esc\\\",\\n 32 : \\\"Space\\\",\\n 33 : \\\"PageUp\\\",\\n 34 : \\\"PageDown\\\",\\n 35 : \\\"End\\\",\\n 36 : \\\"Home\\\",\\n 37 : \\\"Left\\\",\\n 38 : \\\"Up\\\",\\n 39 : \\\"Right\\\",\\n 40 : \\\"Down\\\",\\n 44 : \\\"Print\\\",\\n 45 : \\\"Insert\\\",\\n 46 : \\\"Delete\\\",\\n 96 : \\\"Numpad0\\\",\\n 97 : \\\"Numpad1\\\",\\n 98 : \\\"Numpad2\\\",\\n 99 : \\\"Numpad3\\\",\\n 100: \\\"Numpad4\\\",\\n 101: \\\"Numpad5\\\",\\n 102: \\\"Numpad6\\\",\\n 103: \\\"Numpad7\\\",\\n 104: \\\"Numpad8\\\",\\n 105: \\\"Numpad9\\\",\\n '-13': \\\"NumpadEnter\\\",\\n 112: \\\"F1\\\",\\n 113: \\\"F2\\\",\\n 114: \\\"F3\\\",\\n 115: \\\"F4\\\",\\n 116: \\\"F5\\\",\\n 117: \\\"F6\\\",\\n 118: \\\"F7\\\",\\n 119: \\\"F8\\\",\\n 120: \\\"F9\\\",\\n 121: \\\"F10\\\",\\n 122: \\\"F11\\\",\\n 123: \\\"F12\\\",\\n 144: \\\"Numlock\\\",\\n 145: \\\"Scrolllock\\\"\\n },\\n\\n PRINTABLE_KEYS: {\\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\\n 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\\ndefine(\\\"ace/lib/useragent\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nexports.OS = {\\n LINUX: \\\"LINUX\\\",\\n MAC: \\\"MAC\\\",\\n WINDOWS: \\\"WINDOWS\\\"\\n};\\nexports.getOS = function() {\\n if (exports.isMac) {\\n return exports.OS.MAC;\\n } else if (exports.isLinux) {\\n return exports.OS.LINUX;\\n } else {\\n return exports.OS.WINDOWS;\\n }\\n};\\nif (typeof navigator != \\\"object\\\")\\n return;\\n\\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\\\"other\\\"])[0].toLowerCase();\\nvar ua = navigator.userAgent;\\nexports.isWin = (os == \\\"win\\\");\\nexports.isMac = (os == \\\"mac\\\");\\nexports.isLinux = (os == \\\"linux\\\");\\nexports.isIE = \\n (navigator.appName == \\\"Microsoft Internet Explorer\\\" || navigator.appName.indexOf(\\\"MSAppHost\\\") >= 0)\\n ? parseFloat((ua.match(/(?:MSIE |Trident\\\\/[0-9]+[\\\\.0-9]+;.*rv:)([0-9]+[\\\\.0-9]+)/)||[])[1])\\n : parseFloat((ua.match(/(?:Trident\\\\/[0-9]+[\\\\.0-9]+;.*rv:)([0-9]+[\\\\.0-9]+)/)||[])[1]); // for ie\\n \\nexports.isOldIE = exports.isIE && exports.isIE < 9;\\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \\\"Gecko\\\";\\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\\\d+)/)||[])[1], 10) < 4;\\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \\\"[object Opera]\\\";\\nexports.isWebKit = parseFloat(ua.split(\\\"WebKit/\\\")[1]) || undefined;\\n\\nexports.isChrome = parseFloat(ua.split(\\\" Chrome/\\\")[1]) || undefined;\\n\\nexports.isAIR = ua.indexOf(\\\"AdobeAIR\\\") >= 0;\\n\\nexports.isIPad = ua.indexOf(\\\"iPad\\\") >= 0;\\n\\nexports.isChromeOS = ua.indexOf(\\\" CrOS \\\") >= 0;\\n\\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\\n\\nif (exports.isIOS) exports.isMac = true;\\n\\n});\\n\\ndefine(\\\"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\\nexports.addListener = function(elem, type, callback) {\\n if (elem.addEventListener) {\\n return elem.addEventListener(type, callback, false);\\n }\\n if (elem.attachEvent) {\\n var wrapper = function() {\\n callback.call(elem, window.event);\\n };\\n callback._wrapper = wrapper;\\n elem.attachEvent(\\\"on\\\" + type, wrapper);\\n }\\n};\\n\\nexports.removeListener = function(elem, type, callback) {\\n if (elem.removeEventListener) {\\n return elem.removeEventListener(type, callback, false);\\n }\\n if (elem.detachEvent) {\\n elem.detachEvent(\\\"on\\\" + type, callback._wrapper || callback);\\n }\\n};\\nexports.stopEvent = function(e) {\\n exports.stopPropagation(e);\\n exports.preventDefault(e);\\n return false;\\n};\\n\\nexports.stopPropagation = function(e) {\\n if (e.stopPropagation)\\n e.stopPropagation();\\n else\\n e.cancelBubble = true;\\n};\\n\\nexports.preventDefault = function(e) {\\n if (e.preventDefault)\\n e.preventDefault();\\n else\\n e.returnValue = false;\\n};\\nexports.getButton = function(e) {\\n if (e.type == \\\"dblclick\\\")\\n return 0;\\n if (e.type == \\\"contextmenu\\\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\\n return 2;\\n if (e.preventDefault) {\\n return e.button;\\n }\\n else {\\n return {1:0, 2:2, 4:1}[e.button];\\n }\\n};\\n\\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\\n function onMouseUp(e) {\\n eventHandler && eventHandler(e);\\n releaseCaptureHandler && releaseCaptureHandler(e);\\n\\n exports.removeListener(document, \\\"mousemove\\\", eventHandler, true);\\n exports.removeListener(document, \\\"mouseup\\\", onMouseUp, true);\\n exports.removeListener(document, \\\"dragstart\\\", onMouseUp, true);\\n }\\n\\n exports.addListener(document, \\\"mousemove\\\", eventHandler, true);\\n exports.addListener(document, \\\"mouseup\\\", onMouseUp, true);\\n exports.addListener(document, \\\"dragstart\\\", onMouseUp, true);\\n \\n return onMouseUp;\\n};\\n\\nexports.addTouchMoveListener = function (el, callback) {\\n var startx, starty;\\n exports.addListener(el, \\\"touchstart\\\", function (e) {\\n var touches = e.touches;\\n var touchObj = touches[0];\\n startx = touchObj.clientX;\\n starty = touchObj.clientY;\\n });\\n exports.addListener(el, \\\"touchmove\\\", function (e) {\\n var touches = e.touches;\\n if (touches.length > 1) return;\\n \\n var touchObj = touches[0];\\n\\n e.wheelX = startx - touchObj.clientX;\\n e.wheelY = starty - touchObj.clientY;\\n\\n startx = touchObj.clientX;\\n starty = touchObj.clientY;\\n\\n callback(e);\\n });\\n};\\n\\nexports.addMouseWheelListener = function(el, callback) {\\n if (\\\"onmousewheel\\\" in el) {\\n exports.addListener(el, \\\"mousewheel\\\", function(e) {\\n var factor = 8;\\n if (e.wheelDeltaX !== undefined) {\\n e.wheelX = -e.wheelDeltaX / factor;\\n e.wheelY = -e.wheelDeltaY / factor;\\n } else {\\n e.wheelX = 0;\\n e.wheelY = -e.wheelDelta / factor;\\n }\\n callback(e);\\n });\\n } else if (\\\"onwheel\\\" in el) {\\n exports.addListener(el, \\\"wheel\\\", function(e) {\\n var factor = 0.35;\\n switch (e.deltaMode) {\\n case e.DOM_DELTA_PIXEL:\\n e.wheelX = e.deltaX * factor || 0;\\n e.wheelY = e.deltaY * factor || 0;\\n break;\\n case e.DOM_DELTA_LINE:\\n case e.DOM_DELTA_PAGE:\\n e.wheelX = (e.deltaX || 0) * 5;\\n e.wheelY = (e.deltaY || 0) * 5;\\n break;\\n }\\n \\n callback(e);\\n });\\n } else {\\n exports.addListener(el, \\\"DOMMouseScroll\\\", function(e) {\\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\\n e.wheelX = (e.detail || 0) * 5;\\n e.wheelY = 0;\\n } else {\\n e.wheelX = 0;\\n e.wheelY = (e.detail || 0) * 5;\\n }\\n callback(e);\\n });\\n }\\n};\\n\\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\\n var clicks = 0;\\n var startX, startY, timer; \\n var eventNames = {\\n 2: \\\"dblclick\\\",\\n 3: \\\"tripleclick\\\",\\n 4: \\\"quadclick\\\"\\n };\\n\\n 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 function onDblclick(e) {\\n clicks = 2;\\n if (timer)\\n clearTimeout(timer);\\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\\n eventHandler[callbackName](\\\"mousedown\\\", e);\\n eventHandler[callbackName](eventNames[clicks], e);\\n }\\n if (!Array.isArray(elements))\\n elements = [elements];\\n elements.forEach(function(el) {\\n exports.addListener(el, \\\"mousedown\\\", onMousedown);\\n if (useragent.isOldIE)\\n exports.addListener(el, \\\"dblclick\\\", onDblclick);\\n });\\n};\\n\\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\\\"KeyboardEvent\\\" in window)\\n ? function(e) {\\n return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\\n }\\n : function(e) {\\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\\n };\\n\\nexports.getModifierString = function(e) {\\n return keys.KEY_MODS[getModifierHash(e)];\\n};\\n\\nfunction normalizeCommandKeys(callback, e, keyCode) {\\n var hashId = getModifierHash(e);\\n\\n if (!useragent.isMac && pressedKeys) {\\n if (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 if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\\n keyCode = -1;\\n }\\n \\n if (!hashId && keyCode === 13) {\\n var location = \\\"location\\\" in e ? e.location : e.keyLocation;\\n if (location === 3) {\\n callback(e, hashId, -keyCode);\\n if (e.defaultPrevented)\\n return;\\n }\\n }\\n \\n if (useragent.isChromeOS && hashId & 8) {\\n callback(e, hashId, keyCode);\\n if (e.defaultPrevented)\\n return;\\n else\\n hashId &= ~8;\\n }\\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\\n return false;\\n }\\n \\n return callback(e, hashId, keyCode);\\n}\\n\\n\\nexports.addCommandKeyListener = function(el, callback) {\\n var addListener = exports.addListener;\\n if (useragent.isOldGecko || (useragent.isOpera && !(\\\"KeyboardEvent\\\" in window))) {\\n var lastKeyDownKeyCode = null;\\n addListener(el, \\\"keydown\\\", function(e) {\\n lastKeyDownKeyCode = e.keyCode;\\n });\\n addListener(el, \\\"keypress\\\", function(e) {\\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\\n });\\n } else {\\n var lastDefaultPrevented = null;\\n\\n addListener(el, \\\"keydown\\\", function(e) {\\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\\n var result = normalizeCommandKeys(callback, e, e.keyCode);\\n lastDefaultPrevented = e.defaultPrevented;\\n return result;\\n });\\n\\n addListener(el, \\\"keypress\\\", function(e) {\\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\\n exports.stopEvent(e);\\n lastDefaultPrevented = null;\\n }\\n });\\n\\n addListener(el, \\\"keyup\\\", function(e) {\\n pressedKeys[e.keyCode] = null;\\n });\\n\\n if (!pressedKeys) {\\n 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 exports.addListener(win, \\\"message\\\", function listener(e) {\\n if (e.data == messageName) {\\n exports.stopPropagation(e);\\n exports.removeListener(win, \\\"message\\\", listener);\\n callback();\\n }\\n });\\n win.postMessage(messageName, \\\"*\\\");\\n };\\n}\\n\\n\\nexports.nextFrame = 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\\ndefine(\\\"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 PLACEHOLDER.length)\\n data = data.substr(9);\\n else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4))\\n data = data.substr(4, data.length - PLACEHOLDER.length + 1);\\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n if (data == PLACEHOLDER.charAt(0)) {\\n } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n \\n if (data)\\n host.onTextInput(data);\\n }\\n if (copied) {\\n copied = false;\\n }\\n if (afterContextMenu)\\n afterContextMenu = false;\\n };\\n var onInput = function(e) {\\n if (inComposition)\\n return;\\n var data = text.value;\\n sendText(data);\\n resetValue();\\n };\\n \\n var handleClipboardData = function(e, data, 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 (useragent.isIOS) {\\n cut = isCut;\\n text.value = \\\"\\\\n aa\\\" + data + \\\"a a\\\\n\\\";\\n text.setSelectionRange(4, 4 + data.length);\\n copied = {\\n value: data\\n };\\n }\\n isCut ? host.onCut() : host.onCopy();\\n if (!useragent.isIOS) event.preventDefault(e);\\n } else {\\n copied = true;\\n text.value = data;\\n text.select();\\n setTimeout(function(){\\n copied = false;\\n resetValue();\\n resetSelection();\\n isCut ? host.onCut() : host.onCopy();\\n });\\n }\\n };\\n \\n var onCut = function(e) {\\n doCopy(e, true);\\n };\\n \\n var onCopy = function(e) {\\n doCopy(e, false);\\n };\\n \\n var onPaste = function(e) {\\n var data = handleClipboardData(e);\\n if (typeof data == \\\"string\\\") {\\n if (data)\\n host.onPaste(data, 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));\\n\\n event.addListener(text, \\\"select\\\", onSelect);\\n\\n event.addListener(text, \\\"input\\\", onInput);\\n\\n event.addListener(text, \\\"cut\\\", onCut);\\n event.addListener(text, \\\"copy\\\", onCopy);\\n event.addListener(text, \\\"paste\\\", onPaste);\\n var onCompositionStart = function(e) {\\n if (inComposition || !host.onCompositionStart || host.$readOnly) \\n return;\\n inComposition = {};\\n inComposition.canUndo = host.session.$undoManager;\\n host.onCompositionStart();\\n setTimeout(onCompositionUpdate, 0);\\n host.on(\\\"mousedown\\\", onCompositionEnd);\\n if (inComposition.canUndo && !host.selection.isEmpty()) {\\n host.insert(\\\"\\\");\\n host.session.markUndoGroup();\\n host.selection.clearSelection();\\n }\\n host.session.markUndoGroup();\\n };\\n\\n var onCompositionUpdate = function() {\\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\\n return;\\n var val = text.value.replace(/\\\\x01/g, \\\"\\\");\\n if (inComposition.lastValue === val) return;\\n \\n host.onCompositionUpdate(val);\\n if (inComposition.lastValue)\\n host.undo();\\n if (inComposition.canUndo)\\n inComposition.lastValue = val;\\n if (inComposition.lastValue) {\\n var r = host.selection.getRange();\\n host.insert(inComposition.lastValue);\\n host.session.markUndoGroup();\\n inComposition.range = host.selection.getRange();\\n host.selection.setRange(r);\\n host.selection.clearSelection();\\n }\\n };\\n\\n var onCompositionEnd = function(e) {\\n if (!host.onCompositionEnd || host.$readOnly) return;\\n var c = inComposition;\\n inComposition = false;\\n var timer = setTimeout(function() {\\n timer = null;\\n var str = text.value.replace(/\\\\x01/g, \\\"\\\");\\n if (inComposition)\\n return;\\n else if (str == c.lastValue)\\n resetValue();\\n else if (!c.lastValue && str) {\\n resetValue();\\n sendText(str);\\n }\\n });\\n inputHandler = function compositionInputHandler(str) {\\n if (timer)\\n clearTimeout(timer);\\n str = str.replace(/\\\\x01/g, \\\"\\\");\\n if (str == c.lastValue)\\n return \\\"\\\";\\n if (c.lastValue && timer)\\n host.undo();\\n return str;\\n };\\n host.onCompositionEnd();\\n host.removeListener(\\\"mousedown\\\", onCompositionEnd);\\n if (e.type == \\\"compositionend\\\" && c.range) {\\n host.selection.setRange(c.range);\\n }\\n var needsOnInput =\\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\\n\\n if (needsOnInput) {\\n onInput();\\n }\\n };\\n \\n \\n\\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\\n\\n event.addListener(text, \\\"compositionstart\\\", onCompositionStart);\\n if (useragent.isGecko) {\\n event.addListener(text, \\\"text\\\", function(){syncComposition.schedule();});\\n } else {\\n event.addListener(text, \\\"keyup\\\", function(){syncComposition.schedule();});\\n event.addListener(text, \\\"keydown\\\", function(){syncComposition.schedule();});\\n }\\n event.addListener(text, \\\"compositionend\\\", onCompositionEnd);\\n\\n this.getElement = function() {\\n return text;\\n };\\n\\n this.setReadOnly = function(readOnly) {\\n text.readOnly = readOnly;\\n };\\n\\n this.onContextMenu = function(e) {\\n afterContextMenu = true;\\n resetSelection(host.selection.isEmpty());\\n host._emit(\\\"nativecontextmenu\\\", {target: host, domEvent: e});\\n this.moveToMouse(e, true);\\n };\\n \\n this.moveToMouse = function(e, bringToFront) {\\n if (!tempStyle)\\n tempStyle = text.style.cssText;\\n text.style.cssText = (bringToFront ? \\\"z-index:100000;\\\" : \\\"\\\")\\n + \\\"height:\\\" + text.style.height + \\\";\\\"\\n + (useragent.isIE ? \\\"opacity:0.1;\\\" : \\\"\\\");\\n\\n var rect = host.container.getBoundingClientRect();\\n var style = dom.computedStyle(host.container);\\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\\n var maxTop = rect.bottom - top - text.clientHeight -2;\\n var move = function(e) {\\n text.style.left = e.clientX - left - 2 + \\\"px\\\";\\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \\\"px\\\";\\n }; \\n move(e);\\n\\n if (e.type != \\\"mousedown\\\")\\n return;\\n\\n if (host.renderer.$keepTextAreaAtCursor)\\n host.renderer.$keepTextAreaAtCursor = null;\\n\\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 if (host.renderer.$keepTextAreaAtCursor == null) {\\n host.renderer.$keepTextAreaAtCursor = true;\\n host.renderer.$moveTextAreaToCursor();\\n }\\n }, 0);\\n }\\n\\n var onContextMenu = function(e) {\\n host.textInput.onContextMenu(e);\\n onContextMenuClose();\\n };\\n event.addListener(text, \\\"mouseup\\\", onContextMenu);\\n event.addListener(text, \\\"mousedown\\\", function(e) {\\n e.preventDefault();\\n onContextMenuClose();\\n });\\n event.addListener(host.renderer.scroller, \\\"contextmenu\\\", onContextMenu);\\n event.addListener(text, \\\"contextmenu\\\", onContextMenu);\\n \\n if (useragent.isIOS) {\\n var typingResetTimeout = null;\\n var typing = false;\\n\\n parentNode.addEventListener(\\\"keydown\\\", function (e) {\\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\\n typing = true;\\n });\\n\\n parentNode.addEventListener(\\\"keyup\\\", function (e) {\\n typingResetTimeout = setTimeout(function () {\\n typing = false;\\n }, 100);\\n });\\n var detectArrowKeys = function(e) {\\n if (document.activeElement !== text) return;\\n if (typing) return;\\n \\n if (cut) {\\n return setTimeout(function () {\\n cut = false;\\n }, 100);\\n }\\n var selectionStart = text.selectionStart;\\n var selectionEnd = text.selectionEnd;\\n text.setSelectionRange(4, 5);\\n if (selectionStart == selectionEnd) {\\n switch (selectionStart) {\\n case 0: host.onCommandKey(null, 0, KEYS.up); break;\\n case 1: host.onCommandKey(null, 0, KEYS.home); break;\\n case 2: host.onCommandKey(null, MODS.option, KEYS.left); break;\\n case 4: host.onCommandKey(null, 0, KEYS.left); break;\\n case 5: host.onCommandKey(null, 0, KEYS.right); break;\\n case 7: host.onCommandKey(null, MODS.option, KEYS.right); break;\\n case 8: host.onCommandKey(null, 0, KEYS.end); break;\\n case 9: host.onCommandKey(null, 0, KEYS.down); break;\\n }\\n } else {\\n switch (selectionEnd) {\\n case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break;\\n case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break;\\n case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break;\\n case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break;\\n }\\n switch (selectionStart) {\\n case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break;\\n case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break;\\n case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break;\\n case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break;\\n }\\n }\\n };\\n document.addEventListener(\\\"selectionchange\\\", detectArrowKeys);\\n host.on(\\\"destroy\\\", function() {\\n document.removeEventListener(\\\"selectionchange\\\", detectArrowKeys);\\n });\\n }\\n};\\n\\nexports.TextInput = TextInput;\\n});\\n\\ndefine(\\\"ace/keyboard/textinput\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/event\\\",\\\"ace/lib/useragent\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/keyboard/textinput_ios\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar event = require(\\\"../lib/event\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\nvar dom = require(\\\"../lib/dom\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar BROKEN_SETDATA = useragent.isChrome < 18;\\nvar USE_IE_MIME_TYPE = useragent.isIE;\\n\\nvar TextInputIOS = require(\\\"./textinput_ios\\\").TextInput;\\nvar TextInput = function(parentNode, host) {\\n if (useragent.isIOS)\\n return TextInputIOS.call(this, parentNode, host);\\n \\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 PLACEHOLDER = \\\"\\\\u2028\\\\u2028\\\";\\n\\n var copied = false;\\n var pasted = false;\\n var inComposition = false;\\n var tempStyle = '';\\n var isSelectionEmpty = true;\\n try { var isFocused = document.activeElement === text; } catch(e) {}\\n \\n event.addListener(text, \\\"blur\\\", function(e) {\\n host.onBlur(e);\\n isFocused = false;\\n });\\n event.addListener(text, \\\"focus\\\", function(e) {\\n isFocused = true;\\n host.onFocus(e);\\n resetSelection();\\n });\\n this.focus = function() {\\n if (tempStyle) return text.focus();\\n var top = text.style.top;\\n text.style.position = \\\"fixed\\\";\\n text.style.top = \\\"0px\\\";\\n text.focus();\\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 var syncSelection = lang.delayedCall(function() {\\n isFocused && resetSelection(isSelectionEmpty);\\n });\\n var syncValue = lang.delayedCall(function() {\\n if (!inComposition) {\\n text.value = PLACEHOLDER;\\n isFocused && resetSelection();\\n }\\n });\\n\\n function resetSelection(isEmpty) {\\n if (inComposition)\\n return;\\n inComposition = true;\\n \\n if (inputHandler) {\\n var selectionStart = 0;\\n var selectionEnd = isEmpty ? 0 : text.value.length - 1;\\n } else {\\n var selectionStart = isEmpty ? 2 : 1;\\n var selectionEnd = 2;\\n }\\n try {\\n text.setSelectionRange(selectionStart, selectionEnd);\\n } catch(e){}\\n \\n inComposition = false;\\n }\\n\\n function resetValue() {\\n if (inComposition)\\n return;\\n text.value = PLACEHOLDER;\\n if (useragent.isWebKit)\\n syncValue.schedule();\\n }\\n\\n useragent.isWebKit || host.addEventListener('changeSelection', function() {\\n if (host.selection.isEmpty() != isSelectionEmpty) {\\n isSelectionEmpty = !isSelectionEmpty;\\n syncSelection.schedule();\\n }\\n });\\n\\n resetValue();\\n if (isFocused)\\n host.onFocus();\\n\\n\\n var isAllSelected = function(text) {\\n return text.selectionStart === 0 && text.selectionEnd === text.value.length;\\n };\\n\\n var onSelect = function(e) {\\n if (copied) {\\n copied = false;\\n } else if (isAllSelected(text)) {\\n host.selectAll();\\n resetSelection();\\n } else if (inputHandler) {\\n resetSelection(host.selection.isEmpty());\\n }\\n };\\n\\n var inputHandler = null;\\n this.setInputHandler = function(cb) {inputHandler = cb;};\\n this.getInputHandler = function() {return inputHandler;};\\n var afterContextMenu = false;\\n \\n var sendText = function(data) {\\n if (inputHandler) {\\n data = inputHandler(data);\\n inputHandler = null;\\n }\\n if (pasted) {\\n resetSelection();\\n if (data)\\n host.onPaste(data);\\n pasted = false;\\n } else if (data == PLACEHOLDER.charAt(0)) {\\n if (afterContextMenu)\\n host.execCommand(\\\"del\\\", {source: \\\"ace\\\"});\\n else // some versions of android do not fire keydown when pressing backspace\\n host.execCommand(\\\"backspace\\\", {source: \\\"ace\\\"});\\n } else {\\n if (data.substring(0, 2) == PLACEHOLDER)\\n data = data.substr(2);\\n else if (data.charAt(0) == PLACEHOLDER.charAt(0))\\n data = data.substr(1);\\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n \\n if (data)\\n host.onTextInput(data);\\n }\\n if (afterContextMenu)\\n afterContextMenu = false;\\n };\\n var onInput = function(e) {\\n if (inComposition)\\n return;\\n var data = text.value;\\n sendText(data);\\n resetValue();\\n };\\n \\n var handleClipboardData = function(e, data, 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 isCut ? host.onCut() : host.onCopy();\\n event.preventDefault(e);\\n } else {\\n copied = true;\\n text.value = data;\\n text.select();\\n setTimeout(function(){\\n copied = false;\\n resetValue();\\n resetSelection();\\n isCut ? host.onCut() : host.onCopy();\\n });\\n }\\n };\\n \\n var onCut = function(e) {\\n doCopy(e, true);\\n };\\n \\n var onCopy = function(e) {\\n doCopy(e, false);\\n };\\n \\n var onPaste = function(e) {\\n var data = handleClipboardData(e);\\n if (typeof data == \\\"string\\\") {\\n if (data)\\n host.onPaste(data, 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));\\n\\n event.addListener(text, \\\"select\\\", onSelect);\\n\\n event.addListener(text, \\\"input\\\", onInput);\\n\\n event.addListener(text, \\\"cut\\\", onCut);\\n event.addListener(text, \\\"copy\\\", onCopy);\\n event.addListener(text, \\\"paste\\\", onPaste);\\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\\n event.addListener(parentNode, \\\"keydown\\\", function(e) {\\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\\n return;\\n\\n switch (e.keyCode) {\\n case 67:\\n onCopy(e);\\n break;\\n case 86:\\n onPaste(e);\\n break;\\n case 88:\\n onCut(e);\\n break;\\n }\\n });\\n }\\n var onCompositionStart = function(e) {\\n if (inComposition || !host.onCompositionStart || host.$readOnly) \\n return;\\n inComposition = {};\\n inComposition.canUndo = host.session.$undoManager;\\n host.onCompositionStart();\\n setTimeout(onCompositionUpdate, 0);\\n host.on(\\\"mousedown\\\", onCompositionEnd);\\n if (inComposition.canUndo && !host.selection.isEmpty()) {\\n host.insert(\\\"\\\");\\n host.session.markUndoGroup();\\n host.selection.clearSelection();\\n }\\n host.session.markUndoGroup();\\n };\\n\\n var onCompositionUpdate = function() {\\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\\n return;\\n var val = text.value.replace(/\\\\u2028/g, \\\"\\\");\\n if (inComposition.lastValue === val) return;\\n \\n host.onCompositionUpdate(val);\\n if (inComposition.lastValue)\\n host.undo();\\n if (inComposition.canUndo)\\n inComposition.lastValue = val;\\n if (inComposition.lastValue) {\\n var r = host.selection.getRange();\\n host.insert(inComposition.lastValue);\\n host.session.markUndoGroup();\\n inComposition.range = host.selection.getRange();\\n host.selection.setRange(r);\\n host.selection.clearSelection();\\n }\\n };\\n\\n var onCompositionEnd = function(e) {\\n if (!host.onCompositionEnd || host.$readOnly) return;\\n var c = inComposition;\\n inComposition = false;\\n var timer = setTimeout(function() {\\n timer = null;\\n var str = text.value.replace(/\\\\u2028/g, \\\"\\\");\\n if (inComposition)\\n return;\\n else if (str == c.lastValue)\\n resetValue();\\n else if (!c.lastValue && str) {\\n resetValue();\\n sendText(str);\\n }\\n });\\n inputHandler = function compositionInputHandler(str) {\\n if (timer)\\n clearTimeout(timer);\\n str = str.replace(/\\\\u2028/g, \\\"\\\");\\n if (str == c.lastValue)\\n return \\\"\\\";\\n if (c.lastValue && timer)\\n host.undo();\\n return str;\\n };\\n host.onCompositionEnd();\\n host.removeListener(\\\"mousedown\\\", onCompositionEnd);\\n if (e.type == \\\"compositionend\\\" && c.range) {\\n host.selection.setRange(c.range);\\n }\\n var needsOnInput =\\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\\n\\n if (needsOnInput) {\\n onInput();\\n }\\n };\\n \\n \\n\\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\\n\\n event.addListener(text, \\\"compositionstart\\\", onCompositionStart);\\n if (useragent.isGecko) {\\n event.addListener(text, \\\"text\\\", function(){syncComposition.schedule();});\\n } else {\\n event.addListener(text, \\\"keyup\\\", function(){syncComposition.schedule();});\\n event.addListener(text, \\\"keydown\\\", function(){syncComposition.schedule();});\\n }\\n event.addListener(text, \\\"compositionend\\\", onCompositionEnd);\\n\\n this.getElement = function() {\\n return text;\\n };\\n\\n this.setReadOnly = function(readOnly) {\\n text.readOnly = readOnly;\\n };\\n\\n this.onContextMenu = function(e) {\\n afterContextMenu = true;\\n resetSelection(host.selection.isEmpty());\\n host._emit(\\\"nativecontextmenu\\\", {target: host, domEvent: e});\\n this.moveToMouse(e, true);\\n };\\n \\n this.moveToMouse = function(e, bringToFront) {\\n if (!tempStyle)\\n tempStyle = text.style.cssText;\\n text.style.cssText = (bringToFront ? \\\"z-index:100000;\\\" : \\\"\\\")\\n + \\\"height:\\\" + text.style.height + \\\";\\\"\\n + (useragent.isIE ? \\\"opacity:0.1;\\\" : \\\"\\\");\\n\\n var rect = host.container.getBoundingClientRect();\\n var style = dom.computedStyle(host.container);\\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\\n var maxTop = rect.bottom - top - text.clientHeight -2;\\n var move = function(e) {\\n text.style.left = e.clientX - left - 2 + \\\"px\\\";\\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \\\"px\\\";\\n }; \\n move(e);\\n\\n if (e.type != \\\"mousedown\\\")\\n return;\\n\\n if (host.renderer.$keepTextAreaAtCursor)\\n host.renderer.$keepTextAreaAtCursor = null;\\n\\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 if (host.renderer.$keepTextAreaAtCursor == null) {\\n host.renderer.$keepTextAreaAtCursor = true;\\n host.renderer.$moveTextAreaToCursor();\\n }\\n }, 0);\\n }\\n\\n var onContextMenu = function(e) {\\n host.textInput.onContextMenu(e);\\n onContextMenuClose();\\n };\\n event.addListener(text, \\\"mouseup\\\", onContextMenu);\\n event.addListener(text, \\\"mousedown\\\", function(e) {\\n e.preventDefault();\\n onContextMenuClose();\\n });\\n event.addListener(host.renderer.scroller, \\\"contextmenu\\\", onContextMenu);\\n event.addListener(text, \\\"contextmenu\\\", onContextMenu);\\n};\\n\\nexports.TextInput = TextInput;\\n});\\n\\ndefine(\\\"ace/mouse/default_handlers\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/event\\\",\\\"ace/lib/useragent\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar event = require(\\\"../lib/event\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\n\\nvar DRAG_OFFSET = 0; // pixels\\nvar SCROLL_COOLDOWN_T = 250; // 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 editor.setDefaultHandler(\\\"touchmove\\\", this.onTouchMove.bind(mouseHandler));\\n\\n var exports = [\\\"select\\\", \\\"startSelect\\\", \\\"selectEnd\\\", \\\"selectAllEnd\\\", \\\"selectByWordsEnd\\\",\\n \\\"selectByLinesEnd\\\", \\\"dragWait\\\", \\\"dragWaitEnd\\\", \\\"focusWait\\\"];\\n\\n exports.forEach(function(x) {\\n mouseHandler[x] = this[x];\\n }, this);\\n\\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \\\"getLineRange\\\");\\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \\\"getWordRange\\\");\\n}\\n\\n(function() {\\n\\n this.onMouseDown = function(ev) {\\n var inSelection = ev.inSelection();\\n var pos = ev.getDocumentPosition();\\n this.mousedownEvent = ev;\\n var editor = this.editor;\\n\\n var button = ev.getButton();\\n if (button !== 0) {\\n var selectionRange = editor.getSelectionRange();\\n var selectionEmpty = selectionRange.isEmpty();\\n editor.$blockScrolling++;\\n if (selectionEmpty || button == 1)\\n editor.selection.moveToPosition(pos);\\n editor.$blockScrolling--;\\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.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\\n this.setState(\\\"focusWait\\\");\\n this.captureMouse(ev);\\n return;\\n }\\n }\\n\\n this.captureMouse(ev);\\n this.startSelect(pos, ev.domEvent._clicks > 1);\\n return ev.preventDefault();\\n };\\n\\n this.startSelect = function(pos, waitForClickSelection) {\\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\\n var editor = this.editor;\\n editor.$blockScrolling++;\\n if (this.mousedownEvent.getShiftKey())\\n editor.selection.selectToPosition(pos);\\n else if (!waitForClickSelection)\\n editor.selection.moveToPosition(pos);\\n if (!waitForClickSelection)\\n this.select();\\n if (editor.renderer.scroller.setCapture) {\\n editor.renderer.scroller.setCapture();\\n }\\n editor.setStyle(\\\"ace_selecting\\\");\\n this.setState(\\\"select\\\");\\n editor.$blockScrolling--;\\n };\\n\\n this.select = function() {\\n var anchor, editor = this.editor;\\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\\n editor.$blockScrolling++;\\n if (this.$clickSelection) {\\n var cmp = this.$clickSelection.comparePoint(cursor);\\n\\n if (cmp == -1) {\\n anchor = this.$clickSelection.end;\\n } else if (cmp == 1) {\\n anchor = this.$clickSelection.start;\\n } else {\\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\\n cursor = orientedRange.cursor;\\n anchor = orientedRange.anchor;\\n }\\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\\n }\\n editor.selection.selectToPosition(cursor);\\n editor.$blockScrolling--;\\n editor.renderer.scrollCursorIntoView();\\n };\\n\\n this.extendSelectionBy = function(unitName) {\\n var anchor, editor = this.editor;\\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\\n var range = editor.selection[unitName](cursor.row, cursor.column);\\n editor.$blockScrolling++;\\n if (this.$clickSelection) {\\n var cmpStart = this.$clickSelection.comparePoint(range.start);\\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\\n\\n if (cmpStart == -1 && cmpEnd <= 0) {\\n anchor = this.$clickSelection.end;\\n if (range.end.row != cursor.row || range.end.column != cursor.column)\\n cursor = range.start;\\n } else if (cmpEnd == 1 && cmpStart >= 0) {\\n anchor = this.$clickSelection.start;\\n if (range.start.row != cursor.row || range.start.column != cursor.column)\\n cursor = range.end;\\n } else if (cmpStart == -1 && cmpEnd == 1) {\\n cursor = range.end;\\n anchor = range.start;\\n } else {\\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\\n cursor = orientedRange.cursor;\\n anchor = orientedRange.anchor;\\n }\\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\\n }\\n editor.selection.selectToPosition(cursor);\\n editor.$blockScrolling--;\\n editor.renderer.scrollCursorIntoView();\\n };\\n\\n this.selectEnd =\\n this.selectAllEnd =\\n this.selectByWordsEnd =\\n this.selectByLinesEnd = function() {\\n this.$clickSelection = null;\\n this.editor.unsetStyle(\\\"ace_selecting\\\");\\n if (this.editor.renderer.scroller.releaseCapture) {\\n this.editor.renderer.scroller.releaseCapture();\\n }\\n };\\n\\n this.focusWait = function() {\\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\\n var time = Date.now();\\n\\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\\n this.startSelect(this.mousedownEvent.getDocumentPosition());\\n };\\n\\n this.onDoubleClick = function(ev) {\\n var pos = ev.getDocumentPosition();\\n var editor = this.editor;\\n var session = editor.session;\\n\\n var range = session.getBracketRange(pos);\\n if (range) {\\n if (range.isEmpty()) {\\n range.start.column--;\\n range.end.column++;\\n }\\n this.setState(\\\"select\\\");\\n } else {\\n range = editor.selection.getWordRange(pos.row, pos.column);\\n this.setState(\\\"selectByWords\\\");\\n }\\n this.$clickSelection = range;\\n this.select();\\n };\\n\\n this.onTripleClick = function(ev) {\\n var pos = ev.getDocumentPosition();\\n var editor = this.editor;\\n\\n this.setState(\\\"selectByLines\\\");\\n var range = editor.getSelectionRange();\\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\\n } else {\\n this.$clickSelection = editor.selection.getLineRange(pos.row);\\n }\\n this.select();\\n };\\n\\n this.onQuadClick = function(ev) {\\n var editor = this.editor;\\n\\n editor.selectAll();\\n this.$clickSelection = editor.getSelectionRange();\\n this.setState(\\\"selectAll\\\");\\n };\\n\\n this.onMouseWheel = function(ev) {\\n if (ev.getAccelKey())\\n return;\\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\\n ev.wheelX = ev.wheelY;\\n ev.wheelY = 0;\\n }\\n \\n var 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 = ev.wheelX / dt;\\n var vy = ev.wheelY / dt;\\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.1 * Math.abs(prevScroll.vx)\\n && Math.abs(vy) <= 1.1 * 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 this.onTouchMove = function(ev) {\\n this.editor._emit(\\\"mousewheel\\\", ev);\\n };\\n\\n}).call(DefaultHandlers.prototype);\\n\\nexports.DefaultHandlers = DefaultHandlers;\\n\\nfunction calcDistance(ax, ay, bx, by) {\\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\\n}\\n\\nfunction calcRangeOrientation(range, cursor) {\\n if (range.start.row == range.end.row)\\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\\n var cmp = cursor.column - 4;\\n else\\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\\n\\n if (cmp < 0)\\n return {cursor: range.start, anchor: range.end};\\n else\\n return {cursor: range.end, anchor: range.start};\\n}\\n\\n});\\n\\ndefine(\\\"ace/tooltip\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nfunction Tooltip (parentNode) {\\n this.isOpen = false;\\n this.$element = null;\\n this.$parentNode = parentNode;\\n}\\n\\n(function() {\\n this.$init = function() {\\n this.$element = dom.createElement(\\\"div\\\");\\n this.$element.className = \\\"ace_tooltip\\\";\\n this.$element.style.display = \\\"none\\\";\\n this.$parentNode.appendChild(this.$element);\\n return this.$element;\\n };\\n this.getElement = function() {\\n return this.$element || this.$init();\\n };\\n this.setText = function(text) {\\n dom.setInnerText(this.getElement(), text);\\n };\\n this.setHtml = function(html) {\\n this.getElement().innerHTML = html;\\n };\\n this.setPosition = function(x, y) {\\n this.getElement().style.left = x + \\\"px\\\";\\n this.getElement().style.top = y + \\\"px\\\";\\n };\\n this.setClassName = function(className) {\\n dom.addCssClass(this.getElement(), className);\\n };\\n this.show = function(text, x, y) {\\n if (text != null)\\n this.setText(text);\\n if (x != null && y != null)\\n this.setPosition(x, y);\\n if (!this.isOpen) {\\n this.getElement().style.display = \\\"block\\\";\\n this.isOpen = true;\\n }\\n };\\n\\n this.hide = function() {\\n if (this.isOpen) {\\n this.getElement().style.display = \\\"none\\\";\\n this.isOpen = false;\\n }\\n };\\n this.getHeight = function() {\\n return this.getElement().offsetHeight;\\n };\\n this.getWidth = function() {\\n return this.getElement().offsetWidth;\\n };\\n \\n 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\\ndefine(\\\"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.removeEventListener(\\\"mousewheel\\\", hideTooltip);\\n }\\n }\\n\\n function moveTooltip(e) {\\n tooltip.setPosition(e.x, e.y);\\n }\\n\\n mouseHandler.editor.setDefaultHandler(\\\"guttermousemove\\\", function(e) {\\n var target = e.domEvent.target || e.domEvent.srcElement;\\n if (dom.hasCssClass(target, \\\"ace_fold-widget\\\"))\\n return hideTooltip();\\n\\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\\n moveTooltip(e);\\n\\n mouseEvent = e;\\n if (tooltipTimeout)\\n return;\\n tooltipTimeout = setTimeout(function() {\\n tooltipTimeout = null;\\n if (mouseEvent && !mouseHandler.isMousePressed)\\n showTooltip();\\n else\\n hideTooltip();\\n }, 50);\\n });\\n\\n event.addListener(editor.renderer.$gutter, \\\"mouseout\\\", function(e) {\\n mouseEvent = null;\\n if (!tooltipAnnotation || tooltipTimeout)\\n return;\\n\\n tooltipTimeout = setTimeout(function() {\\n tooltipTimeout = null;\\n hideTooltip();\\n }, 50);\\n });\\n \\n editor.on(\\\"changeSession\\\", hideTooltip);\\n}\\n\\nfunction GutterTooltip(parentNode) {\\n Tooltip.call(this, parentNode);\\n}\\n\\noop.inherits(GutterTooltip, Tooltip);\\n\\n(function(){\\n this.setPosition = function(x, y) {\\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\\n var width = this.getWidth();\\n var height = this.getHeight();\\n x += 15;\\n y += 15;\\n if (x + width > windowWidth) {\\n x -= (x + width) - windowWidth;\\n }\\n if (y + height > windowHeight) {\\n y -= 20 + height;\\n }\\n Tooltip.prototype.setPosition.call(this, x, y);\\n };\\n\\n}).call(GutterTooltip.prototype);\\n\\n\\n\\nexports.GutterHandler = GutterHandler;\\n\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"ace/mouse/dragdrop_handler\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/event\\\",\\\"ace/lib/useragent\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar event = require(\\\"../lib/event\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\n\\nvar AUTOSCROLL_DELAY = 200;\\nvar SCROLL_CURSOR_DELAY = 200;\\nvar SCROLL_CURSOR_HYSTERESIS = 5;\\n\\nfunction DragdropHandler(mouseHandler) {\\n\\n var editor = mouseHandler.editor;\\n\\n var blankImage = dom.createElement(\\\"img\\\");\\n blankImage.src = \\\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\\\";\\n if (useragent.isOpera)\\n blankImage.style.cssText = \\\"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\\\";\\n\\n var exports = [\\\"dragWait\\\", \\\"dragWaitEnd\\\", \\\"startDrag\\\", \\\"dragReadyEnd\\\", \\\"onMouseDrag\\\"];\\n\\n exports.forEach(function(x) {\\n mouseHandler[x] = this[x];\\n }, this);\\n editor.addEventListener(\\\"mousedown\\\", this.onMouseDown.bind(mouseHandler));\\n\\n\\n var mouseTarget = editor.container;\\n var dragSelectionMarker, x, y;\\n var timerId, range;\\n var dragCursor, counter = 0;\\n var dragOperation;\\n var isInternal;\\n var autoScrollStartTime;\\n var cursorMovedTime;\\n var cursorPointOnCaretMoved;\\n\\n this.onDragStart = function(e) {\\n if (this.cancelDrag || !mouseTarget.draggable) {\\n var self = this;\\n setTimeout(function(){\\n self.startSelect();\\n self.captureMouse(e);\\n }, 0);\\n return e.preventDefault();\\n }\\n range = editor.getSelectionRange();\\n\\n var dataTransfer = e.dataTransfer;\\n dataTransfer.effectAllowed = editor.getReadOnly() ? \\\"copy\\\" : \\\"copyMove\\\";\\n if (useragent.isOpera) {\\n editor.container.appendChild(blankImage);\\n blankImage.scrollTop = 0;\\n }\\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\\n if (useragent.isOpera) {\\n editor.container.removeChild(blankImage);\\n }\\n dataTransfer.clearData();\\n dataTransfer.setData(\\\"Text\\\", editor.session.getTextRange());\\n\\n isInternal = true;\\n this.setState(\\\"drag\\\");\\n };\\n\\n this.onDragEnd = function(e) {\\n mouseTarget.draggable = false;\\n isInternal = false;\\n this.setState(null);\\n if (!editor.getReadOnly()) {\\n var dropEffect = e.dataTransfer.dropEffect;\\n if (!dragOperation && dropEffect == \\\"move\\\")\\n editor.session.remove(editor.getSelectionRange());\\n editor.renderer.$cursorLayer.setBlinking(true);\\n }\\n this.editor.unsetStyle(\\\"ace_dragging\\\");\\n this.editor.renderer.setCursorStyle(\\\"\\\");\\n };\\n\\n this.onDragEnter = function(e) {\\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\\n return;\\n x = e.clientX;\\n y = e.clientY;\\n if (!dragSelectionMarker)\\n addDragMarker();\\n counter++;\\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\\n return event.preventDefault(e);\\n };\\n\\n this.onDragOver = function(e) {\\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\\n return;\\n x = e.clientX;\\n y = e.clientY;\\n if (!dragSelectionMarker) {\\n addDragMarker();\\n counter++;\\n }\\n if (onMouseMoveTimer !== null)\\n onMouseMoveTimer = null;\\n\\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\\n return event.preventDefault(e);\\n };\\n\\n this.onDragLeave = function(e) {\\n counter--;\\n if (counter <= 0 && dragSelectionMarker) {\\n clearDragMarker();\\n dragOperation = null;\\n return event.preventDefault(e);\\n }\\n };\\n\\n this.onDrop = function(e) {\\n if (!dragCursor)\\n return;\\n var dataTransfer = e.dataTransfer;\\n if (isInternal) {\\n switch (dragOperation) {\\n case \\\"move\\\":\\n if (range.contains(dragCursor.row, dragCursor.column)) {\\n range = {\\n start: dragCursor,\\n end: dragCursor\\n };\\n } else {\\n range = editor.moveText(range, dragCursor);\\n }\\n break;\\n case \\\"copy\\\":\\n range = editor.moveText(range, dragCursor, true);\\n break;\\n }\\n } else {\\n var dropData = dataTransfer.getData('Text');\\n range = {\\n start: dragCursor,\\n end: editor.session.insert(dragCursor, dropData)\\n };\\n editor.focus();\\n dragOperation = null;\\n }\\n clearDragMarker();\\n return event.preventDefault(e);\\n };\\n\\n event.addListener(mouseTarget, \\\"dragstart\\\", this.onDragStart.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragend\\\", this.onDragEnd.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragenter\\\", this.onDragEnter.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragover\\\", this.onDragOver.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragleave\\\", this.onDragLeave.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"drop\\\", this.onDrop.bind(mouseHandler));\\n\\n function scrollCursorIntoView(cursor, prevCursor) {\\n var now = Date.now();\\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\\n if (!cursorMovedTime || vMovement || hMovement) {\\n editor.$blockScrolling += 1;\\n editor.moveCursorToPosition(cursor);\\n editor.$blockScrolling -= 1;\\n cursorMovedTime = now;\\n cursorPointOnCaretMoved = {x: x, y: y};\\n } else {\\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\\n cursorMovedTime = null;\\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\\n editor.renderer.scrollCursorIntoView();\\n cursorMovedTime = null;\\n }\\n }\\n }\\n\\n function autoScroll(cursor, prevCursor) {\\n var now = Date.now();\\n var lineHeight = editor.renderer.layerConfig.lineHeight;\\n var characterWidth = editor.renderer.layerConfig.characterWidth;\\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\\n var offsets = {\\n x: {\\n left: x - editorRect.left,\\n right: editorRect.right - x\\n },\\n y: {\\n top: y - editorRect.top,\\n bottom: editorRect.bottom - y\\n }\\n };\\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\\n var scrollCursor = {row: cursor.row, column: cursor.column};\\n if (nearestXOffset / characterWidth <= 2) {\\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\\n }\\n if (nearestYOffset / lineHeight <= 1) {\\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\\n }\\n var vScroll = cursor.row != scrollCursor.row;\\n var hScroll = cursor.column != scrollCursor.column;\\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\\n if (vScroll || (hScroll && !vMovement)) {\\n if (!autoScrollStartTime)\\n autoScrollStartTime = now;\\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\\n editor.renderer.scrollCursorIntoView(scrollCursor);\\n } else {\\n autoScrollStartTime = null;\\n }\\n }\\n\\n function onDragInterval() {\\n var prevCursor = dragCursor;\\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\\n scrollCursorIntoView(dragCursor, prevCursor);\\n autoScroll(dragCursor, prevCursor);\\n }\\n\\n function addDragMarker() {\\n range = editor.selection.toOrientedRange();\\n dragSelectionMarker = editor.session.addMarker(range, \\\"ace_selection\\\", editor.getSelectionStyle());\\n editor.clearSelection();\\n if (editor.isFocused())\\n editor.renderer.$cursorLayer.setBlinking(false);\\n clearInterval(timerId);\\n onDragInterval();\\n timerId = setInterval(onDragInterval, 20);\\n counter = 0;\\n event.addListener(document, \\\"mousemove\\\", onMouseMove);\\n }\\n\\n function clearDragMarker() {\\n clearInterval(timerId);\\n editor.session.removeMarker(dragSelectionMarker);\\n dragSelectionMarker = null;\\n editor.$blockScrolling += 1;\\n editor.selection.fromOrientedRange(range);\\n editor.$blockScrolling -= 1;\\n if (editor.isFocused() && !isInternal)\\n editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\\n range = null;\\n dragCursor = null;\\n counter = 0;\\n autoScrollStartTime = null;\\n cursorMovedTime = null;\\n event.removeListener(document, \\\"mousemove\\\", onMouseMove);\\n }\\n var onMouseMoveTimer = null;\\n function onMouseMove() {\\n if (onMouseMoveTimer == null) {\\n onMouseMoveTimer = setTimeout(function() {\\n if (onMouseMoveTimer != null && dragSelectionMarker)\\n clearDragMarker();\\n }, 20);\\n }\\n }\\n\\n function canAccept(dataTransfer) {\\n var types = dataTransfer.types;\\n return !types || Array.prototype.some.call(types, function(type) {\\n return type == 'text/plain' || type == 'Text';\\n });\\n }\\n\\n function getDropEffect(e) {\\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\\n\\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\\n var effectAllowed = \\\"uninitialized\\\";\\n try {\\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\\n } catch (e) {}\\n var dropEffect = \\\"none\\\";\\n\\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\\n dropEffect = \\\"copy\\\";\\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\\n dropEffect = \\\"move\\\";\\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\\n dropEffect = \\\"copy\\\";\\n\\n return dropEffect;\\n }\\n}\\n\\n(function() {\\n\\n this.dragWait = function() {\\n var interval = Date.now() - this.mousedownEvent.time;\\n if (interval > this.editor.getDragDelay())\\n this.startDrag();\\n };\\n\\n this.dragWaitEnd = function() {\\n var target = this.editor.container;\\n target.draggable = false;\\n this.startSelect(this.mousedownEvent.getDocumentPosition());\\n this.selectEnd();\\n };\\n\\n this.dragReadyEnd = function(e) {\\n this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\\n this.editor.unsetStyle(\\\"ace_dragging\\\");\\n this.editor.renderer.setCursorStyle(\\\"\\\");\\n this.dragWaitEnd();\\n };\\n\\n this.startDrag = function(){\\n this.cancelDrag = false;\\n var editor = this.editor;\\n var target = editor.container;\\n target.draggable = true;\\n editor.renderer.$cursorLayer.setBlinking(false);\\n editor.setStyle(\\\"ace_dragging\\\");\\n var cursorStyle = useragent.isWin ? \\\"default\\\" : \\\"move\\\";\\n editor.renderer.setCursorStyle(cursorStyle);\\n this.setState(\\\"dragReady\\\");\\n };\\n\\n this.onMouseDrag = function(e) {\\n var target = this.editor.container;\\n if (useragent.isIE && this.state == \\\"dragReady\\\") {\\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\\n if (distance > 3)\\n target.dragDrop();\\n }\\n if (this.state === \\\"dragWait\\\") {\\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\\n if (distance > 0) {\\n target.draggable = false;\\n this.startSelect(this.mousedownEvent.getDocumentPosition());\\n }\\n }\\n };\\n\\n this.onMouseDown = function(e) {\\n if (!this.$dragEnabled)\\n return;\\n this.mousedownEvent = e;\\n var editor = this.editor;\\n\\n var inSelection = e.inSelection();\\n var button = e.getButton();\\n var clickCount = e.domEvent.detail || 1;\\n if (clickCount === 1 && button === 0 && inSelection) {\\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\\n return;\\n this.mousedownEvent.time = Date.now();\\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\\n if (\\\"unselectable\\\" in eventTarget)\\n eventTarget.unselectable = \\\"on\\\";\\n if (editor.getDragDelay()) {\\n if (useragent.isWebKit) {\\n this.cancelDrag = true;\\n var mouseTarget = editor.container;\\n mouseTarget.draggable = true;\\n }\\n this.setState(\\\"dragWait\\\");\\n } else {\\n this.startDrag();\\n }\\n this.captureMouse(e, this.onMouseDrag.bind(this));\\n e.defaultPrevented = true;\\n }\\n };\\n\\n}).call(DragdropHandler.prototype);\\n\\n\\nfunction calcDistance(ax, ay, bx, by) {\\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\\n}\\n\\nexports.DragdropHandler = DragdropHandler;\\n\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"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 net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\\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;\\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\\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))\\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\\ndefine(\\\"ace/bidihandler\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/bidiutil\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar bidiUtil = require(\\\"./lib/bidiutil\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar useragent = require(\\\"./lib/useragent\\\");\\nvar bidiRE = /[\\\\u0590-\\\\u05f4\\\\u0600-\\\\u06ff\\\\u0700-\\\\u08ac]/;\\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.line = \\\"\\\";\\n this.wrapIndent = 0;\\n this.isLastRow = false;\\n this.EOF = \\\"\\\\xB6\\\";\\n this.seenBidi = false;\\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 }\\n\\n return splitIndex;\\n };\\n\\n this.updateRowLine = function(docRow, splitIndex) {\\n if (docRow === undefined)\\n docRow = this.getDocumentRow();\\n \\n this.wrapIndent = 0;\\n this.isLastRow = (docRow === this.session.getLength() - 1);\\n this.line = this.session.getLine(docRow);\\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.line = (splitIndex < splits.length) ?\\n this.line.substring(splits[splitIndex - 1], splits[splits.length - 1]) :\\n this.line.substring(splits[splits.length - 1]);\\n } else {\\n this.line = this.line.substring(0, splits[splitIndex]);\\n }\\n }\\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 \\n this.updateBidiMap = function() {\\n var textCharTypes = [], endOfLine = this.isLastRow ? this.EOF : this.EOL;\\n var line = this.line + (this.showInvisibles ? endOfLine : bidiUtil.DOT);\\n if (bidiUtil.hasBidiCharacters(line, textCharTypes)) {\\n this.bidiMap = bidiUtil.doBidiReorder(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.seenBidi)\\n return;\\n if (this.characterWidth === fontMetrics.$characterSize.width)\\n return;\\n\\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] = useragent.isChrome ? bidiCharWidth : bidiCharWidth * 0.45;\\n this.charWidths[bidiUtil.B] = 0;\\n\\n this.currentRow = null;\\n };\\n\\n this.getShowInvisibles = function() {\\n return this.showInvisibles;\\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.setTextDir = function(isRtlDir) {\\n this.isRtlDir = isRtlDir; \\n };\\n this.getPosLeft = function(col) {\\n col -= this.wrapIndent;\\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(col > 0 ? col - 1 : 0, this.bidiMap),\\n levels = this.bidiMap.bidiLevels, left = 0;\\n\\n if (col === 0 && 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 (col !== 0 && levels[visualIdx] % 2 === 0)\\n left += this.charWidths[levels[visualIdx]];\\n\\n if (this.wrapIndent)\\n left += this.wrapIndent * this.charWidths[bidiUtil.L];\\n\\n return left;\\n };\\n this.getSelections = function(startCol, endCol) {\\n var map = this.bidiMap, levels = map.bidiLevels, level, offset = this.wrapIndent * this.charWidths[bidiUtil.L], selections = [],\\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\\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 return selections;\\n };\\n this.offsetToCol = function(posX) {\\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.wrapIndent * this.charWidths[bidiUtil.L];\\n }\\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 return (logicalIdx + this.wrapIndent);\\n };\\n\\n}).call(BidiHandler.prototype);\\n\\nexports.BidiHandler = BidiHandler;\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"ace/selection\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar EventEmitter = require(\\\"./lib/event_emitter\\\").EventEmitter;\\nvar Range = require(\\\"./range\\\").Range;\\nvar Selection = function(session) {\\n this.session = session;\\n this.doc = session.getDocument();\\n\\n this.clearSelection();\\n this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\\n this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\\n\\n var self = this;\\n this.lead.on(\\\"change\\\", function(e) {\\n self._emit(\\\"changeCursor\\\");\\n if (!self.$isEmpty)\\n self._emit(\\\"changeSelection\\\");\\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\\n self.$desiredColumn = null;\\n });\\n\\n this.selectionAnchor.on(\\\"change\\\", function() {\\n if (!self.$isEmpty)\\n self._emit(\\\"changeSelection\\\");\\n });\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n this.isEmpty = function() {\\n return (this.$isEmpty || (\\n this.anchor.row == this.lead.row &&\\n this.anchor.column == this.lead.column\\n ));\\n };\\n this.isMultiLine = function() {\\n if (this.isEmpty()) {\\n return false;\\n }\\n\\n return this.getRange().isMultiLine();\\n };\\n this.getCursor = function() {\\n return this.lead.getPosition();\\n };\\n this.setSelectionAnchor = function(row, column) {\\n this.anchor.setPosition(row, column);\\n\\n if (this.$isEmpty) {\\n this.$isEmpty = false;\\n this._emit(\\\"changeSelection\\\");\\n }\\n };\\n this.getSelectionAnchor = function() {\\n if (this.$isEmpty)\\n return this.getSelectionLead();\\n else\\n return this.anchor.getPosition();\\n };\\n this.getSelectionLead = function() {\\n return this.lead.getPosition();\\n };\\n this.shiftSelection = function(columns) {\\n if (this.$isEmpty) {\\n this.moveCursorTo(this.lead.row, this.lead.column + columns);\\n return;\\n }\\n\\n var anchor = this.getSelectionAnchor();\\n var lead = this.getSelectionLead();\\n\\n var isBackwards = this.isBackwards();\\n\\n if (!isBackwards || anchor.column !== 0)\\n this.setSelectionAnchor(anchor.row, anchor.column + columns);\\n\\n if (isBackwards || lead.column !== 0) {\\n this.$moveSelection(function() {\\n this.moveCursorTo(lead.row, lead.column + columns);\\n });\\n }\\n };\\n this.isBackwards = function() {\\n var anchor = this.anchor;\\n var lead = this.lead;\\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\\n };\\n this.getRange = function() {\\n var anchor = this.anchor;\\n var lead = this.lead;\\n\\n if (this.isEmpty())\\n return Range.fromPoints(lead, lead);\\n\\n if (this.isBackwards()) {\\n return Range.fromPoints(lead, anchor);\\n }\\n else {\\n return Range.fromPoints(anchor, lead);\\n }\\n };\\n this.clearSelection = function() {\\n if (!this.$isEmpty) {\\n this.$isEmpty = true;\\n this._emit(\\\"changeSelection\\\");\\n }\\n };\\n this.selectAll = function() {\\n var lastRow = this.doc.getLength() - 1;\\n this.setSelectionAnchor(0, 0);\\n this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\\n };\\n this.setRange =\\n this.setSelectionRange = function(range, reverse) {\\n if (reverse) {\\n this.setSelectionAnchor(range.end.row, range.end.column);\\n this.selectTo(range.start.row, range.start.column);\\n } else {\\n this.setSelectionAnchor(range.start.row, range.start.column);\\n this.selectTo(range.end.row, range.end.column);\\n }\\n if (this.getRange().isEmpty())\\n this.$isEmpty = true;\\n this.$desiredColumn = null;\\n };\\n\\n this.$moveSelection = function(mover) {\\n var lead = this.lead;\\n if (this.$isEmpty)\\n this.setSelectionAnchor(lead.row, lead.column);\\n\\n mover.call(this);\\n };\\n this.selectTo = function(row, column) {\\n this.$moveSelection(function() {\\n this.moveCursorTo(row, column);\\n });\\n };\\n this.selectToPosition = function(pos) {\\n this.$moveSelection(function() {\\n this.moveCursorToPosition(pos);\\n });\\n };\\n this.moveTo = function(row, column) {\\n this.clearSelection();\\n this.moveCursorTo(row, column);\\n };\\n this.moveToPosition = function(pos) {\\n this.clearSelection();\\n this.moveCursorToPosition(pos);\\n };\\n this.selectUp = function() {\\n this.$moveSelection(this.moveCursorUp);\\n };\\n this.selectDown = function() {\\n this.$moveSelection(this.moveCursorDown);\\n };\\n this.selectRight = function() {\\n this.$moveSelection(this.moveCursorRight);\\n };\\n this.selectLeft = function() {\\n this.$moveSelection(this.moveCursorLeft);\\n };\\n this.selectLineStart = function() {\\n this.$moveSelection(this.moveCursorLineStart);\\n };\\n this.selectLineEnd = function() {\\n this.$moveSelection(this.moveCursorLineEnd);\\n };\\n this.selectFileEnd = function() {\\n this.$moveSelection(this.moveCursorFileEnd);\\n };\\n this.selectFileStart = function() {\\n this.$moveSelection(this.moveCursorFileStart);\\n };\\n this.selectWordRight = function() {\\n this.$moveSelection(this.moveCursorWordRight);\\n };\\n this.selectWordLeft = function() {\\n this.$moveSelection(this.moveCursorWordLeft);\\n };\\n this.getWordRange = function(row, column) {\\n if (typeof column == \\\"undefined\\\") {\\n var cursor = row || this.lead;\\n row = cursor.row;\\n column = cursor.column;\\n }\\n return this.session.getWordRange(row, column);\\n };\\n this.selectWord = function() {\\n this.setSelectionRange(this.getWordRange());\\n };\\n this.selectAWord = function() {\\n var cursor = this.getCursor();\\n var range = this.session.getAWordRange(cursor.row, cursor.column);\\n this.setSelectionRange(range);\\n };\\n\\n this.getLineRange = function(row, excludeLastChar) {\\n var rowStart = typeof row == \\\"number\\\" ? row : this.lead.row;\\n var rowEnd;\\n\\n var foldLine = this.session.getFoldLine(rowStart);\\n if (foldLine) {\\n rowStart = foldLine.start.row;\\n rowEnd = foldLine.end.row;\\n } else {\\n rowEnd = rowStart;\\n }\\n if (excludeLastChar === true)\\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\\n else\\n return new Range(rowStart, 0, rowEnd + 1, 0);\\n };\\n this.selectLine = function() {\\n this.setSelectionRange(this.getLineRange());\\n };\\n this.moveCursorUp = function() {\\n this.moveCursorBy(-1, 0);\\n };\\n this.moveCursorDown = function() {\\n this.moveCursorBy(1, 0);\\n };\\n this.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 var match;\\n this.session.nonTokenRe.lastIndex = 0;\\n this.session.tokenRe.lastIndex = 0;\\n var fold = this.session.getFoldAt(row, column, 1);\\n if (fold) {\\n this.moveCursorTo(fold.end.row, fold.end.column);\\n return;\\n }\\n if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\\n column += this.session.nonTokenRe.lastIndex;\\n this.session.nonTokenRe.lastIndex = 0;\\n rightOfCursor = line.substring(column);\\n }\\n if (column >= line.length) {\\n this.moveCursorTo(row, line.length);\\n this.moveCursorRight();\\n if (row < this.doc.getLength() - 1)\\n this.moveCursorWordRight();\\n return;\\n }\\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\\n column += this.session.tokenRe.lastIndex;\\n this.session.tokenRe.lastIndex = 0;\\n }\\n\\n this.moveCursorTo(row, column);\\n };\\n this.moveCursorLongWordLeft = function() {\\n var row = this.lead.row;\\n var column = this.lead.column;\\n var fold;\\n if (fold = this.session.getFoldAt(row, column, -1)) {\\n this.moveCursorTo(fold.start.row, fold.start.column);\\n return;\\n }\\n\\n var str = this.session.getFoldStringAt(row, column, -1);\\n if (str == null) {\\n str = this.doc.getLine(row).substring(0, column);\\n }\\n\\n var leftOfCursor = lang.stringReverse(str);\\n var match;\\n this.session.nonTokenRe.lastIndex = 0;\\n this.session.tokenRe.lastIndex = 0;\\n if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\\n column -= this.session.nonTokenRe.lastIndex;\\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\\n this.session.nonTokenRe.lastIndex = 0;\\n }\\n if (column <= 0) {\\n this.moveCursorTo(row, 0);\\n this.moveCursorLeft();\\n if (row > 0)\\n this.moveCursorWordLeft();\\n return;\\n }\\n if (match = this.session.tokenRe.exec(leftOfCursor)) {\\n column -= this.session.tokenRe.lastIndex;\\n this.session.tokenRe.lastIndex = 0;\\n }\\n\\n this.moveCursorTo(row, column);\\n };\\n\\n this.$shortWordEndIndex = function(rightOfCursor) {\\n var match, index = 0, ch;\\n var whitespaceRe = /\\\\s/;\\n var tokenRe = this.session.tokenRe;\\n\\n tokenRe.lastIndex = 0;\\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\\n index = this.session.tokenRe.lastIndex;\\n } else {\\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\\n index ++;\\n\\n if (index < 1) {\\n tokenRe.lastIndex = 0;\\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\\n tokenRe.lastIndex = 0;\\n index ++;\\n if (whitespaceRe.test(ch)) {\\n if (index > 2) {\\n index--;\\n break;\\n } else {\\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\\n index ++;\\n if (index > 2)\\n break;\\n }\\n }\\n }\\n }\\n }\\n tokenRe.lastIndex = 0;\\n\\n return index;\\n };\\n\\n this.moveCursorShortWordRight = function() {\\n var row = this.lead.row;\\n var column = this.lead.column;\\n var line = this.doc.getLine(row);\\n var rightOfCursor = line.substring(column);\\n\\n var fold = this.session.getFoldAt(row, column, 1);\\n if (fold)\\n return this.moveCursorTo(fold.end.row, fold.end.column);\\n\\n if (column == line.length) {\\n var l = this.doc.getLength();\\n do {\\n row++;\\n rightOfCursor = this.doc.getLine(row);\\n } while (row < l && /^\\\\s*$/.test(rightOfCursor));\\n\\n if (!/^\\\\s+/.test(rightOfCursor))\\n rightOfCursor = \\\"\\\";\\n column = 0;\\n }\\n\\n var index = this.$shortWordEndIndex(rightOfCursor);\\n\\n this.moveCursorTo(row, column + index);\\n };\\n\\n this.moveCursorShortWordLeft = function() {\\n var row = this.lead.row;\\n var column = this.lead.column;\\n\\n var fold;\\n if (fold = this.session.getFoldAt(row, column, -1))\\n return this.moveCursorTo(fold.start.row, fold.start.column);\\n\\n var line = this.session.getLine(row).substring(0, column);\\n if (column === 0) {\\n do {\\n row--;\\n line = this.doc.getLine(row);\\n } while (row > 0 && /^\\\\s*$/.test(line));\\n\\n column = line.length;\\n if (!/\\\\s+$/.test(line))\\n line = \\\"\\\";\\n }\\n\\n var leftOfCursor = lang.stringReverse(line);\\n var index = this.$shortWordEndIndex(leftOfCursor);\\n\\n return this.moveCursorTo(row, column - index);\\n };\\n\\n this.moveCursorWordRight = function() {\\n if (this.session.$selectLongWords)\\n this.moveCursorLongWordRight();\\n else\\n this.moveCursorShortWordRight();\\n };\\n\\n this.moveCursorWordLeft = function() {\\n if (this.session.$selectLongWords)\\n this.moveCursorLongWordLeft();\\n else\\n this.moveCursorShortWordLeft();\\n };\\n this.moveCursorBy = function(rows, chars) {\\n var screenPos = this.session.documentToScreenPosition(\\n this.lead.row,\\n this.lead.column\\n );\\n\\n 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 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 if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\\n if (docPos.row > 0 || rows > 0)\\n docPos.row++;\\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 this.session = this.doc = null;\\n };\\n\\n this.fromOrientedRange = function(range) {\\n this.setSelectionRange(range, range.cursor == range.start);\\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\\n };\\n\\n this.toOrientedRange = function(range) {\\n var r = this.getRange();\\n if (range) {\\n range.start.column = r.start.column;\\n range.start.row = r.start.row;\\n range.end.column = r.end.column;\\n range.end.row = r.end.row;\\n } else {\\n range = r;\\n }\\n\\n range.cursor = this.isBackwards() ? range.start : range.end;\\n range.desiredColumn = this.$desiredColumn;\\n return range;\\n };\\n this.getRangeOfMovements = function(func) {\\n var start = this.getCursor();\\n try {\\n func(this);\\n var end = this.getCursor();\\n return Range.fromPoints(start,end);\\n } catch(e) {\\n return Range.fromPoints(start,start);\\n } finally {\\n this.moveCursorToPosition(start);\\n }\\n };\\n\\n this.toJSON = function() {\\n if (this.rangeCount) {\\n var data = this.ranges.map(function(r) {\\n var r1 = r.clone();\\n r1.isBackwards = r.cursor == r.start;\\n return r1;\\n });\\n } else {\\n var data = this.getRange();\\n data.isBackwards = this.isBackwards();\\n }\\n return data;\\n };\\n\\n this.fromJSON = function(data) {\\n if (data.start == undefined) {\\n if (this.rangeList) {\\n this.toSingleRange(data[0]);\\n for (var i = data.length; i--; ) {\\n var r = Range.fromPoints(data[i].start, data[i].end);\\n if (data[i].isBackwards)\\n r.cursor = r.start;\\n this.addRange(r, true);\\n }\\n return;\\n } else\\n data = data[0];\\n }\\n if (this.rangeList)\\n this.toSingleRange(data);\\n this.setSelectionRange(data, data.isBackwards);\\n };\\n\\n this.isEqual = function(data) {\\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\\n return false;\\n if (!data.length || !this.ranges)\\n return this.getRange().isEqual(data);\\n\\n for (var i = this.ranges.length; i--; ) {\\n if (!this.ranges[i].isEqual(data[i]))\\n return false;\\n }\\n return true;\\n };\\n\\n}).call(Selection.prototype);\\n\\nexports.Selection = Selection;\\n});\\n\\ndefine(\\\"ace/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 += 2000),\\n type: \\\"overflow\\\"\\n };\\n }\\n currentState = \\\"start\\\";\\n stack = [];\\n break;\\n }\\n }\\n\\n if (token.type)\\n tokens.push(token);\\n \\n if (stack.length > 1) {\\n if (stack[0] !== currentState)\\n stack.unshift(\\\"#tmp\\\", currentState);\\n }\\n return {\\n tokens : tokens,\\n state : stack.length ? stack : currentState\\n };\\n };\\n \\n this.reportError = config.reportError;\\n \\n}).call(Tokenizer.prototype);\\n\\nexports.Tokenizer = Tokenizer;\\n});\\n\\ndefine(\\\"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 Object.keys(map).forEach(function(className) {\\n var a = map[className];\\n if (ignoreCase)\\n a = a.toLowerCase();\\n var list = a.split(splitChar || \\\"|\\\");\\n for (var i = list.length; i--; )\\n keywords[list[i]] = className;\\n });\\n if (Object.getPrototypeOf(keywords)) {\\n keywords.__proto__ = null;\\n }\\n this.$keywordList = Object.keys(keywords);\\n map = null;\\n return ignoreCase\\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\\n : function(value) {return keywords[value] || defaultToken; };\\n };\\n\\n this.getKeywords = function() {\\n return this.$keywords;\\n };\\n\\n}).call(TextHighlightRules.prototype);\\n\\nexports.TextHighlightRules = TextHighlightRules;\\n});\\n\\ndefine(\\\"ace/mode/behaviour\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"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\\ndefine(\\\"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\\ndefine(\\\"ace/mode/behaviour/cstyle\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/mode/behaviour\\\",\\\"ace/token_iterator\\\",\\\"ace/lib/lang\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"../../lib/oop\\\");\\nvar Behaviour = require(\\\"../behaviour\\\").Behaviour;\\nvar TokenIterator = require(\\\"../../token_iterator\\\").TokenIterator;\\nvar lang = require(\\\"../../lib/lang\\\");\\n\\nvar SAFE_INSERT_IN_TOKENS =\\n [\\\"text\\\", \\\"paren.rparen\\\", \\\"punctuation.operator\\\"];\\nvar SAFE_INSERT_BEFORE_TOKENS =\\n [\\\"text\\\", \\\"paren.rparen\\\", \\\"punctuation.operator\\\", \\\"comment\\\"];\\n\\nvar context;\\nvar contextCache = {};\\nvar 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 pair = true;\\n }\\n return {\\n text: pair ? quote + quote : \\\"\\\",\\n selection: [1,1]\\n };\\n }\\n }\\n });\\n\\n this.add(\\\"string_dquotes\\\", \\\"deletion\\\", function(state, action, editor, session, range) {\\n var selected = session.doc.getTextRange(range);\\n if (!range.isMultiLine() && (selected == '\\\"' || selected == \\\"'\\\")) {\\n initContext(editor);\\n var line = session.doc.getLine(range.start.row);\\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\\n if (rightChar == selected) {\\n range.end.column++;\\n return range;\\n }\\n }\\n });\\n\\n};\\n\\n \\nCstyleBehaviour.isSaneInsertion = function(editor, session) {\\n var cursor = editor.getCursorPosition();\\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\\n if (!this.$matchTokenType(iterator.getCurrentToken() || \\\"text\\\", SAFE_INSERT_IN_TOKENS)) {\\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \\\"text\\\", SAFE_INSERT_IN_TOKENS))\\n return false;\\n }\\n iterator.stepForward();\\n return iterator.getCurrentTokenRow() !== cursor.row ||\\n this.$matchTokenType(iterator.getCurrentToken() || \\\"text\\\", SAFE_INSERT_BEFORE_TOKENS);\\n};\\n\\nCstyleBehaviour.$matchTokenType = function(token, types) {\\n return types.indexOf(token.type || token) > -1;\\n};\\n\\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\\n var cursor = editor.getCursorPosition();\\n var line = session.doc.getLine(cursor.row);\\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\\n context.autoInsertedBrackets = 0;\\n context.autoInsertedRow = cursor.row;\\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\\n context.autoInsertedBrackets++;\\n};\\n\\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\\n var cursor = editor.getCursorPosition();\\n var line = session.doc.getLine(cursor.row);\\n if (!this.isMaybeInsertedClosing(cursor, line))\\n context.maybeInsertedBrackets = 0;\\n context.maybeInsertedRow = cursor.row;\\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\\n context.maybeInsertedLineEnd = line.substr(cursor.column);\\n context.maybeInsertedBrackets++;\\n};\\n\\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\\n return context.autoInsertedBrackets > 0 &&\\n cursor.row === context.autoInsertedRow &&\\n bracket === context.autoInsertedLineEnd[0] &&\\n line.substr(cursor.column) === context.autoInsertedLineEnd;\\n};\\n\\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\\n return context.maybeInsertedBrackets > 0 &&\\n cursor.row === context.maybeInsertedRow &&\\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\\n};\\n\\nCstyleBehaviour.popAutoInsertedClosing = function() {\\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\\n context.autoInsertedBrackets--;\\n};\\n\\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\\n if (context) {\\n context.maybeInsertedBrackets = 0;\\n context.maybeInsertedRow = -1;\\n }\\n};\\n\\n\\n\\noop.inherits(CstyleBehaviour, Behaviour);\\n\\nexports.CstyleBehaviour = CstyleBehaviour;\\n});\\n\\ndefine(\\\"ace/unicode\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nexports.packages = {};\\n\\naddUnicodePackage({\\n L: \\\"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\\\",\\n Ll: \\\"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\\\",\\n Lu: \\\"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\\\",\\n Lt: \\\"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\\\",\\n Lm: \\\"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\\\",\\n Lo: \\\"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\\\",\\n M: \\\"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\\\",\\n Mn: \\\"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\\\",\\n Mc: \\\"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\\\",\\n Me: \\\"0488048906DE20DD-20E020E2-20E4A670-A672\\\",\\n N: \\\"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\\\",\\n Nd: \\\"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\\\",\\n Nl: \\\"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\\\",\\n No: \\\"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\\\",\\n P: \\\"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\\\",\\n Pd: \\\"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\\\",\\n Ps: \\\"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\\\",\\n Pe: \\\"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\\\",\\n Pi: \\\"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\\\",\\n Pf: \\\"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\\\",\\n Pc: \\\"005F203F20402054FE33FE34FE4D-FE4FFF3F\\\",\\n Po: \\\"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\\\",\\n S: \\\"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\\\",\\n Sm: \\\"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\\\",\\n Sc: \\\"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\\\",\\n Sk: \\\"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\\\",\\n So: \\\"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\\\",\\n Z: \\\"002000A01680180E2000-200A20282029202F205F3000\\\",\\n Zs: \\\"002000A01680180E2000-200A202F205F3000\\\",\\n Zl: \\\"2028\\\",\\n Zp: \\\"2029\\\",\\n C: \\\"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\\\",\\n Cc: \\\"0000-001F007F-009F\\\",\\n Cf: \\\"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\\\",\\n Co: \\\"E000-F8FF\\\",\\n Cs: \\\"D800-DFFF\\\",\\n Cn: \\\"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\\\"\\n});\\n\\nfunction addUnicodePackage (pack) {\\n var codePoint = /\\\\w{4}/g;\\n for (var name in pack)\\n exports.packages[name] = pack[name].replace(codePoint, \\\"\\\\\\\\u$&\\\");\\n}\\n\\n});\\n\\ndefine(\\\"ace/mode/text\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"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\\\";\\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(\\\"^[\\\"\\n + unicode.packages.L\\n + unicode.packages.Mn + unicode.packages.Mc\\n + unicode.packages.Nd\\n + unicode.packages.Pc + \\\"\\\\\\\\$_]+\\\", \\\"g\\\"\\n );\\n\\n this.nonTokenRe = new RegExp(\\\"^(?:[^\\\"\\n + unicode.packages.L\\n + unicode.packages.Mn + unicode.packages.Mc\\n + unicode.packages.Nd\\n + unicode.packages.Pc + \\\"\\\\\\\\$_]|\\\\\\\\s])+\\\", \\\"g\\\"\\n );\\n\\n this.getTokenizer = function() {\\n if (!this.$tokenizer) {\\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(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 return true;\\n };\\n }\\n\\n function iter(fun) {\\n for (var i = startRow; i <= endRow; i++)\\n fun(doc.getLine(i), i);\\n }\\n\\n\\n var minEmptyLength = Infinity;\\n iter(function(line, i) {\\n var indent = line.search(/\\\\S/);\\n if (indent !== -1) {\\n if (indent < minIndent)\\n minIndent = indent;\\n if (shouldRemove && !testRemove(line, i))\\n shouldRemove = false;\\n } else if (minEmptyLength > line.length) {\\n minEmptyLength = line.length;\\n }\\n });\\n\\n if (minIndent == Infinity) {\\n minIndent = minEmptyLength;\\n ignoreBlankLines = false;\\n shouldRemove = false;\\n }\\n\\n if (insertAtTabStop && minIndent % tabSize != 0)\\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\\n\\n iter(shouldRemove ? uncomment : comment);\\n };\\n\\n this.toggleBlockComment = function(state, session, range, cursor) {\\n var comment = this.blockComment;\\n if (!comment)\\n return;\\n if (!comment.start && comment[0])\\n comment = comment[0];\\n\\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\\n var token = iterator.getCurrentToken();\\n\\n var sel = session.selection;\\n var initialRange = session.selection.toOrientedRange();\\n var startRow, colDiff;\\n\\n if (token && /comment/.test(token.type)) {\\n var startRange, endRange;\\n while (token && /comment/.test(token.type)) {\\n var i = token.value.indexOf(comment.start);\\n if (i != -1) {\\n var row = iterator.getCurrentTokenRow();\\n var column = iterator.getCurrentTokenColumn() + i;\\n startRange = new Range(row, column, row, column + comment.start.length);\\n break;\\n }\\n token = iterator.stepBackward();\\n }\\n\\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\\n var token = iterator.getCurrentToken();\\n while (token && /comment/.test(token.type)) {\\n var i = token.value.indexOf(comment.end);\\n if (i != -1) {\\n var row = iterator.getCurrentTokenRow();\\n var column = iterator.getCurrentTokenColumn() + i;\\n endRange = new Range(row, column, row, column + comment.end.length);\\n break;\\n }\\n token = iterator.stepForward();\\n }\\n if (endRange)\\n session.remove(endRange);\\n if (startRange) {\\n session.remove(startRange);\\n startRow = startRange.start.row;\\n colDiff = -comment.start.length;\\n }\\n } else {\\n colDiff = comment.start.length;\\n startRow = range.start.row;\\n session.insert(range.end, comment.end);\\n session.insert(range.start, comment.start);\\n }\\n if (initialRange.start.row == startRow)\\n initialRange.start.column += colDiff;\\n if (initialRange.end.row == startRow)\\n initialRange.end.column += colDiff;\\n session.selection.fromOrientedRange(initialRange);\\n };\\n\\n this.getNextLineIndent = function(state, line, tab) {\\n return this.$getIndent(line);\\n };\\n\\n this.checkOutdent = function(state, line, input) {\\n return false;\\n };\\n\\n this.autoOutdent = function(state, doc, row) {\\n };\\n\\n this.$getIndent = function(line) {\\n return line.match(/^\\\\s*/)[0];\\n };\\n\\n this.createWorker = function(session) {\\n return null;\\n };\\n\\n this.createModeDelegates = function (mapping) {\\n this.$embeds = [];\\n this.$modes = {};\\n for (var i in mapping) {\\n if (mapping[i]) {\\n this.$embeds.push(i);\\n this.$modes[i] = new mapping[i]();\\n }\\n }\\n\\n var delegations = [\\\"toggleBlockComment\\\", \\\"toggleCommentLines\\\", \\\"getNextLineIndent\\\", \\n \\\"checkOutdent\\\", \\\"autoOutdent\\\", \\\"transformAction\\\", \\\"getCompletions\\\"];\\n\\n for (var i = 0; i < delegations.length; i++) {\\n (function(scope) {\\n var functionName = delegations[i];\\n var defaultHandler = scope[functionName];\\n scope[delegations[i]] = function() {\\n return this.$delegator(functionName, arguments, defaultHandler);\\n };\\n }(this));\\n }\\n };\\n\\n this.$delegator = function(method, args, defaultHandler) {\\n var state = args[0];\\n if (typeof state != \\\"string\\\")\\n state = state[0];\\n for (var i = 0; i < this.$embeds.length; i++) {\\n if (!this.$modes[this.$embeds[i]]) continue;\\n\\n var split = state.split(this.$embeds[i]);\\n if (!split[0] && split[1]) {\\n args[0] = split[1];\\n var mode = this.$modes[this.$embeds[i]];\\n return mode[method].apply(mode, args);\\n }\\n }\\n var ret = defaultHandler.apply(this, args);\\n return defaultHandler ? ret : undefined;\\n };\\n\\n this.transformAction = function(state, action, editor, session, param) {\\n if (this.$behaviour) {\\n var behaviours = this.$behaviour.getBehaviours();\\n for (var key in behaviours) {\\n if (behaviours[key][action]) {\\n var ret = behaviours[key][action].apply(this, arguments);\\n if (ret) {\\n return ret;\\n }\\n }\\n }\\n }\\n };\\n \\n this.getKeywords = function(append) {\\n if (!this.completionKeywords) {\\n var rules = this.$tokenizer.rules;\\n var completionKeywords = [];\\n for (var rule in rules) {\\n var ruleItr = rules[rule];\\n for (var r = 0, l = ruleItr.length; r < l; r++) {\\n if (typeof ruleItr[r].token === \\\"string\\\") {\\n if (/keyword|support|storage/.test(ruleItr[r].token))\\n completionKeywords.push(ruleItr[r].regex);\\n }\\n else if (typeof ruleItr[r].token === \\\"object\\\") {\\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \\n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\\n var rule = ruleItr[r].regex.match(/\\\\(.+?\\\\)/g)[a];\\n completionKeywords.push(rule.substr(1, rule.length - 2));\\n }\\n }\\n }\\n }\\n }\\n this.completionKeywords = completionKeywords;\\n }\\n if (!append)\\n return this.$keywordList;\\n return completionKeywords.concat(this.$keywordList || []);\\n };\\n \\n this.$createKeywordList = function() {\\n if (!this.$highlightRules)\\n this.getTokenizer();\\n return this.$keywordList = this.$highlightRules.$keywordList || [];\\n };\\n\\n this.getCompletions = function(state, session, pos, prefix) {\\n var keywords = this.$keywordList || this.$createKeywordList();\\n return keywords.map(function(word) {\\n return {\\n name: word,\\n value: word,\\n score: 0,\\n meta: \\\"keyword\\\"\\n };\\n });\\n };\\n\\n this.$id = \\\"ace/mode/text\\\";\\n}).call(Mode.prototype);\\n\\nexports.Mode = Mode;\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"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.removeEventListener(\\\"change\\\", this.$onChange);\\n };\\n this.attach = function(doc) {\\n this.document = doc || this.document;\\n this.document.on(\\\"change\\\", this.$onChange);\\n };\\n this.$clipPositionToDocument = function(row, column) {\\n var pos = {};\\n\\n if (row >= this.document.getLength()) {\\n pos.row = Math.max(0, this.document.getLength() - 1);\\n pos.column = this.document.getLine(pos.row).length;\\n }\\n else if (row < 0) {\\n pos.row = 0;\\n pos.column = 0;\\n }\\n else {\\n pos.row = row;\\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\\n }\\n\\n if (column < 0)\\n pos.column = 0;\\n\\n return pos;\\n };\\n\\n}).call(Anchor.prototype);\\n\\n});\\n\\ndefine(\\\"ace/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 applyDelta(this.$lines, delta, doNotValidate);\\n this._signal(\\\"change\\\", delta);\\n };\\n \\n this.$splitAndapplyLargeDelta = function(delta, MAX) {\\n var lines = delta.lines;\\n var l = lines.length;\\n var row = delta.start.row; \\n var column = delta.start.column;\\n var from = 0, to = 0;\\n do {\\n from = to;\\n to += MAX - 1;\\n var chunk = lines.slice(from, to);\\n if (to > l) {\\n delta.lines = chunk;\\n delta.start.row = row + from;\\n delta.start.column = column;\\n break;\\n }\\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 } while(true);\\n };\\n this.revertDelta = function(delta) {\\n this.applyDelta({\\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: lines[l-1].length};\\n };\\n this.positionToIndex = function(pos, startRow) {\\n var lines = this.$lines || this.getAllLines();\\n var newlineLength = this.getNewLineCharacter().length;\\n var index = 0;\\n var row = Math.min(pos.row, lines.length);\\n for (var i = startRow || 0; i < row; ++i)\\n index += lines[i].length + newlineLength;\\n\\n return index + pos.column;\\n };\\n\\n}).call(Document.prototype);\\n\\nexports.Document = Document;\\n});\\n\\ndefine(\\\"ace/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\\ndefine(\\\"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\\ndefine(\\\"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\\ndefine(\\\"ace/range_list\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nvar Range = require(\\\"./range\\\").Range;\\nvar comparePoints = Range.comparePoints;\\n\\nvar RangeList = function() {\\n this.ranges = [];\\n};\\n\\n(function() {\\n this.comparePoints = comparePoints;\\n\\n this.pointIndex = function(pos, excludeEdges, startIndex) {\\n var list = this.ranges;\\n\\n for (var i = startIndex || 0; i < list.length; i++) {\\n var range = list[i];\\n var cmpEnd = comparePoints(pos, range.end);\\n if (cmpEnd > 0)\\n continue;\\n var cmpStart = comparePoints(pos, range.start);\\n if (cmpEnd === 0)\\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\\n return i;\\n\\n return -i-1;\\n }\\n return -i - 1;\\n };\\n\\n this.add = function(range) {\\n var excludeEdges = !range.isEmpty();\\n var startIndex = this.pointIndex(range.start, excludeEdges);\\n if (startIndex < 0)\\n startIndex = -startIndex - 1;\\n\\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\\n\\n if (endIndex < 0)\\n endIndex = -endIndex - 1;\\n else\\n endIndex++;\\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\\n };\\n\\n this.addList = function(list) {\\n var removed = [];\\n for (var i = list.length; i--; ) {\\n removed.push.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 if (delta.action == \\\"insert\\\"){\\n var start = delta.start;\\n var end = delta.end;\\n } else {\\n var end = delta.start;\\n var start = delta.end;\\n }\\n var startRow = start.row;\\n var endRow = end.row;\\n var lineDif = endRow - startRow;\\n\\n var colDiff = -start.column + end.column;\\n var ranges = this.ranges;\\n\\n for (var i = 0, n = ranges.length; i < n; i++) {\\n var r = ranges[i];\\n if (r.end.row < startRow)\\n continue;\\n if (r.start.row > startRow)\\n break;\\n\\n if (r.start.row == startRow && r.start.column >= start.column ) {\\n if (r.start.column == start.column && this.$insertRight) {\\n } else {\\n r.start.column += colDiff;\\n r.start.row += lineDif;\\n }\\n }\\n if (r.end.row == startRow && r.end.column >= start.column) {\\n if (r.end.column == start.column && this.$insertRight) {\\n continue;\\n }\\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \\n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\\n r.end.column -= colDiff;\\n }\\n r.end.column += colDiff;\\n r.end.row += lineDif;\\n }\\n }\\n\\n if (lineDif != 0 && i < n) {\\n for (; i < n; i++) {\\n var r = ranges[i];\\n r.start.row += lineDif;\\n r.end.row += lineDif;\\n }\\n }\\n };\\n\\n}).call(RangeList.prototype);\\n\\nexports.RangeList = RangeList;\\n});\\n\\ndefine(\\\"ace/edit_session/fold\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/range_list\\\",\\\"ace/lib/oop\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../range\\\").Range;\\nvar RangeList = require(\\\"../range_list\\\").RangeList;\\nvar oop = require(\\\"../lib/oop\\\");\\nvar Fold = exports.Fold = function(range, placeholder) {\\n this.foldLine = null;\\n this.placeholder = placeholder;\\n this.range = range;\\n this.start = range.start;\\n this.end = range.end;\\n\\n this.sameRow = range.start.row == range.end.row;\\n this.subFolds = this.ranges = [];\\n};\\n\\noop.inherits(Fold, RangeList);\\n\\n(function() {\\n\\n this.toString = function() {\\n return '\\\"' + this.placeholder + '\\\" ' + this.range.toString();\\n };\\n\\n this.setFoldLine = function(foldLine) {\\n this.foldLine = foldLine;\\n this.subFolds.forEach(function(fold) {\\n fold.setFoldLine(foldLine);\\n });\\n };\\n\\n this.clone = function() {\\n var range = this.range.clone();\\n var fold = new Fold(range, this.placeholder);\\n this.subFolds.forEach(function(subFold) {\\n fold.subFolds.push(subFold.clone());\\n });\\n fold.collapseChildren = this.collapseChildren;\\n return fold;\\n };\\n\\n this.addSubFold = function(fold) {\\n if (this.range.isEqual(fold))\\n return;\\n\\n if (!this.range.containsRange(fold))\\n throw new Error(\\\"A fold can't intersect already existing fold\\\" + fold.range + this.range);\\n consumeRange(fold, this.start);\\n\\n var row = fold.start.row, column = fold.start.column;\\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\\n cmp = this.subFolds[i].range.compare(row, column);\\n if (cmp != 1)\\n break;\\n }\\n var afterStart = this.subFolds[i];\\n\\n if (cmp == 0)\\n return afterStart.addSubFold(fold);\\n var row = fold.range.end.row, column = fold.range.end.column;\\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\\n cmp = this.subFolds[j].range.compare(row, column);\\n if (cmp != 1)\\n break;\\n }\\n var afterEnd = this.subFolds[j];\\n\\n if (cmp == 0)\\n throw new Error(\\\"A fold can't intersect already existing fold\\\" + fold.range + this.range);\\n\\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\\n fold.setFoldLine(this.foldLine);\\n\\n return fold;\\n };\\n \\n this.restoreRange = function(range) {\\n return restoreRange(range, this.start);\\n };\\n\\n}).call(Fold.prototype);\\n\\nfunction consumePoint(point, anchor) {\\n point.row -= anchor.row;\\n if (point.row == 0)\\n point.column -= anchor.column;\\n}\\nfunction consumeRange(range, anchor) {\\n consumePoint(range.start, anchor);\\n consumePoint(range.end, anchor);\\n}\\nfunction restorePoint(point, anchor) {\\n if (point.row == 0)\\n point.column += anchor.column;\\n point.row += anchor.row;\\n}\\nfunction restoreRange(range, anchor) {\\n restorePoint(range.start, anchor);\\n restorePoint(range.end, anchor);\\n}\\n\\n});\\n\\ndefine(\\\"ace/edit_session/folding\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/edit_session/fold_line\\\",\\\"ace/edit_session/fold\\\",\\\"ace/token_iterator\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../range\\\").Range;\\nvar FoldLine = require(\\\"./fold_line\\\").FoldLine;\\nvar Fold = require(\\\"./fold\\\").Fold;\\nvar TokenIterator = require(\\\"../token_iterator\\\").TokenIterator;\\n\\nfunction Folding() {\\n this.getFoldAt = function(row, column, side) {\\n var foldLine = this.getFoldLine(row);\\n if (!foldLine)\\n return null;\\n\\n var folds = foldLine.folds;\\n for (var i = 0; i < folds.length; i++) {\\n var fold = folds[i];\\n if (fold.range.contains(row, column)) {\\n if (side == 1 && fold.range.isEnd(row, column)) {\\n continue;\\n } else if (side == -1 && fold.range.isStart(row, column)) {\\n continue;\\n }\\n return fold;\\n }\\n }\\n };\\n this.getFoldsInRange = function(range) {\\n var start = range.start;\\n var end = range.end;\\n var foldLines = this.$foldData;\\n var foundFolds = [];\\n\\n start.column += 1;\\n end.column -= 1;\\n\\n for (var i = 0; i < foldLines.length; i++) {\\n var cmp = foldLines[i].range.compareRange(range);\\n if (cmp == 2) {\\n continue;\\n }\\n else if (cmp == -2) {\\n break;\\n }\\n\\n var folds = foldLines[i].folds;\\n for (var j = 0; j < folds.length; j++) {\\n var fold = folds[j];\\n cmp = fold.range.compareRange(range);\\n if (cmp == -2) {\\n break;\\n } else if (cmp == 2) {\\n continue;\\n } else\\n if (cmp == 42) {\\n break;\\n }\\n foundFolds.push(fold);\\n }\\n }\\n start.column -= 1;\\n end.column += 1;\\n\\n return foundFolds;\\n };\\n\\n this.getFoldsInRangeList = function(ranges) {\\n if (Array.isArray(ranges)) {\\n var folds = [];\\n ranges.forEach(function(range) {\\n folds = folds.concat(this.getFoldsInRange(range));\\n }, this);\\n } else {\\n var folds = this.getFoldsInRange(ranges);\\n }\\n return folds;\\n };\\n this.getAllFolds = function() {\\n var folds = [];\\n var foldLines = this.$foldData;\\n \\n for (var i = 0; i < foldLines.length; i++)\\n for (var j = 0; j < foldLines[i].folds.length; j++)\\n folds.push(foldLines[i].folds[j]);\\n\\n return folds;\\n };\\n this.getFoldStringAt = function(row, column, trim, foldLine) {\\n foldLine = foldLine || this.getFoldLine(row);\\n if (!foldLine)\\n return null;\\n\\n var lastFold = {\\n end: { column: 0 }\\n };\\n var str, fold;\\n for (var i = 0; i < foldLine.folds.length; i++) {\\n fold = foldLine.folds[i];\\n var cmp = fold.range.compareEnd(row, column);\\n if (cmp == -1) {\\n str = this\\n .getLine(fold.start.row)\\n .substring(lastFold.end.column, fold.start.column);\\n break;\\n }\\n else if (cmp === 0) {\\n return null;\\n }\\n lastFold = fold;\\n }\\n if (!str)\\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\\n\\n if (trim == -1)\\n return str.substring(0, column - lastFold.end.column);\\n else if (trim == 1)\\n return str.substring(column - lastFold.end.column);\\n else\\n return str;\\n };\\n\\n this.getFoldLine = function(docRow, startFoldLine) {\\n var foldData = this.$foldData;\\n var i = 0;\\n if (startFoldLine)\\n i = foldData.indexOf(startFoldLine);\\n if (i == -1)\\n i = 0;\\n for (i; i < foldData.length; i++) {\\n var foldLine = foldData[i];\\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\\n return foldLine;\\n } else if (foldLine.end.row > docRow) {\\n return null;\\n }\\n }\\n return null;\\n };\\n this.getNextFoldLine = function(docRow, startFoldLine) {\\n var foldData = this.$foldData;\\n var i = 0;\\n if (startFoldLine)\\n i = foldData.indexOf(startFoldLine);\\n if (i == -1)\\n i = 0;\\n for (i; i < foldData.length; i++) {\\n var foldLine = foldData[i];\\n if (foldLine.end.row >= docRow) {\\n return foldLine;\\n }\\n }\\n return null;\\n };\\n\\n this.getFoldedRowCount = function(first, last) {\\n var foldData = this.$foldData, rowCount = last-first+1;\\n for (var i = 0; i < foldData.length; i++) {\\n var foldLine = foldData[i],\\n end = foldLine.end.row,\\n start = foldLine.start.row;\\n if (end >= last) {\\n if (start < last) {\\n if (start >= first)\\n rowCount -= last-start;\\n else\\n rowCount = 0; // in one fold\\n }\\n break;\\n } else if (end >= first){\\n if (start >= first) // fold inside range\\n rowCount -= end-start;\\n else\\n rowCount -= end-first+1;\\n }\\n }\\n return rowCount;\\n };\\n\\n this.$addFoldLine = function(foldLine) {\\n this.$foldData.push(foldLine);\\n this.$foldData.sort(function(a, b) {\\n return a.start.row - b.start.row;\\n });\\n return foldLine;\\n };\\n this.addFold = function(placeholder, range) {\\n var foldData = this.$foldData;\\n var added = false;\\n var fold;\\n \\n if (placeholder instanceof Fold)\\n fold = placeholder;\\n else {\\n fold = new Fold(range, placeholder);\\n fold.collapseChildren = range.collapseChildren;\\n }\\n this.$clipRangeToDocument(fold.range);\\n\\n var startRow = fold.start.row;\\n var startColumn = fold.start.column;\\n var endRow = fold.end.row;\\n var endColumn = fold.end.column;\\n if (!(startRow < endRow || \\n startRow == endRow && startColumn <= endColumn - 2))\\n throw new Error(\\\"The range has to be at least 2 characters width\\\");\\n\\n var startFold = this.getFoldAt(startRow, startColumn, 1);\\n var endFold = this.getFoldAt(endRow, endColumn, -1);\\n if (startFold && endFold == startFold)\\n return startFold.addSubFold(fold);\\n\\n if (startFold && !startFold.range.isStart(startRow, startColumn))\\n this.removeFold(startFold);\\n \\n if (endFold && !endFold.range.isEnd(endRow, endColumn))\\n this.removeFold(endFold);\\n var folds = this.getFoldsInRange(fold.range);\\n if (folds.length > 0) {\\n this.removeFolds(folds);\\n folds.forEach(function(subFold) {\\n fold.addSubFold(subFold);\\n });\\n }\\n\\n for (var i = 0; i < foldData.length; i++) {\\n var foldLine = foldData[i];\\n if (endRow == foldLine.start.row) {\\n foldLine.addFold(fold);\\n added = true;\\n break;\\n } else if (startRow == foldLine.end.row) {\\n foldLine.addFold(fold);\\n added = true;\\n if (!fold.sameRow) {\\n var foldLineNext = foldData[i + 1];\\n if (foldLineNext && foldLineNext.start.row == endRow) {\\n foldLine.merge(foldLineNext);\\n break;\\n }\\n }\\n break;\\n } else if (endRow <= foldLine.start.row) {\\n break;\\n }\\n }\\n\\n if (!added)\\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\\n\\n if (this.$useWrapMode)\\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\\n else\\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\\n this.$modified = true;\\n this._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 expandInner = true;\\n } else if (typeof location == \\\"number\\\")\\n range = new Range(location, 0, location, this.getLine(location).length);\\n else if (\\\"row\\\" in location)\\n range = Range.fromPoints(location, location);\\n else\\n range = location;\\n \\n folds = this.getFoldsInRangeList(range);\\n if (expandInner) {\\n this.removeFolds(folds);\\n } else {\\n var subFolds = folds;\\n while (subFolds.length) {\\n this.expandFolds(subFolds);\\n subFolds = this.getFoldsInRangeList(range);\\n }\\n }\\n if (folds.length)\\n return folds;\\n };\\n this.isRowFolded = function(docRow, startFoldRow) {\\n return !!this.getFoldLine(docRow, startFoldRow);\\n };\\n\\n this.getRowFoldEnd = function(docRow, startFoldRow) {\\n var foldLine = this.getFoldLine(docRow, startFoldRow);\\n return foldLine ? foldLine.end.row : docRow;\\n };\\n\\n this.getRowFoldStart = function(docRow, startFoldRow) {\\n var foldLine = this.getFoldLine(docRow, startFoldRow);\\n return foldLine ? foldLine.start.row : docRow;\\n };\\n\\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\\n if (startRow == null)\\n startRow = foldLine.start.row;\\n if (startColumn == null)\\n startColumn = 0;\\n if (endRow == null)\\n endRow = foldLine.end.row;\\n if (endColumn == null)\\n endColumn = this.getLine(endRow).length;\\n var doc = this.doc;\\n var textLine = \\\"\\\";\\n\\n foldLine.walk(function(placeholder, row, column, lastColumn) {\\n if (row < startRow)\\n return;\\n if (row == startRow) {\\n if (column < startColumn)\\n return;\\n lastColumn = Math.max(startColumn, lastColumn);\\n }\\n\\n if (placeholder != null) {\\n textLine += placeholder;\\n } else {\\n textLine += doc.getLine(row).substring(lastColumn, column);\\n }\\n }, endRow, endColumn);\\n return textLine;\\n };\\n\\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\\n var foldLine = this.getFoldLine(row);\\n\\n if (!foldLine) {\\n var line;\\n line = this.doc.getLine(row);\\n return line.substring(startColumn || 0, endColumn || line.length);\\n } else {\\n return this.getFoldDisplayLine(\\n foldLine, row, endColumn, startRow, startColumn);\\n }\\n };\\n\\n this.$cloneFoldData = function() {\\n var fd = [];\\n fd = this.$foldData.map(function(foldLine) {\\n var folds = foldLine.folds.map(function(fold) {\\n return fold.clone();\\n });\\n return new FoldLine(fd, folds);\\n });\\n\\n return fd;\\n };\\n\\n this.toggleFold = function(tryToUnfold) {\\n var selection = this.selection;\\n var range = selection.getRange();\\n var fold;\\n var bracketPos;\\n\\n if (range.isEmpty()) {\\n var cursor = range.start;\\n fold = this.getFoldAt(cursor.row, cursor.column);\\n\\n if (fold) {\\n this.expandFold(fold);\\n return;\\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\\n if (range.comparePoint(bracketPos) == 1) {\\n range.end = bracketPos;\\n } else {\\n range.start = bracketPos;\\n range.start.column++;\\n range.end.column--;\\n }\\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\\n if (range.comparePoint(bracketPos) == 1)\\n range.end = bracketPos;\\n else\\n range.start = bracketPos;\\n\\n range.start.column++;\\n } else {\\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\\n }\\n } else {\\n var folds = this.getFoldsInRange(range);\\n if (tryToUnfold && folds.length) {\\n this.expandFolds(folds);\\n return;\\n } else if (folds.length == 1 ) {\\n fold = folds[0];\\n }\\n }\\n\\n if (!fold)\\n fold = this.getFoldAt(range.start.row, range.start.column);\\n\\n if (fold && fold.range.toString() == range.toString()) {\\n this.expandFold(fold);\\n return;\\n }\\n\\n var placeholder = \\\"...\\\";\\n if (!range.isMultiLine()) {\\n placeholder = this.getTextRange(range);\\n if (placeholder.length < 4)\\n return;\\n placeholder = placeholder.trim().substring(0, 2) + \\\"..\\\";\\n }\\n\\n this.addFold(placeholder, range);\\n };\\n\\n this.getCommentFoldRange = function(row, column, dir) {\\n var iterator = new TokenIterator(this, row, column);\\n var token = iterator.getCurrentToken();\\n var type = 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) {\\n if (depth == undefined)\\n depth = 100000; // JSON.stringify doesn't hanle Infinity\\n var foldWidgets = this.foldWidgets;\\n if (!foldWidgets)\\n return; // mode doesn't support folding\\n endRow = endRow || this.getLength();\\n startRow = startRow || 0;\\n for (var row = startRow; row < endRow; row++) {\\n if (foldWidgets[row] == null)\\n foldWidgets[row] = this.getFoldWidget(row);\\n if (foldWidgets[row] != \\\"start\\\")\\n continue;\\n\\n var range = this.getFoldWidgetRange(row);\\n if (range && range.isMultiLine()\\n && range.end.row <= endRow\\n && range.start.row >= startRow\\n ) {\\n row = range.end.row;\\n try {\\n var fold = this.addFold(\\\"...\\\", range);\\n if (fold)\\n fold.collapseChildren = depth;\\n } catch(e) {}\\n }\\n }\\n };\\n this.$foldStyles = {\\n \\\"manual\\\": 1,\\n \\\"markbegin\\\": 1,\\n \\\"markbeginend\\\": 1\\n };\\n this.$foldStyle = \\\"markbegin\\\";\\n this.setFoldStyle = function(style) {\\n if (!this.$foldStyles[style])\\n throw new Error(\\\"invalid fold style: \\\" + style + \\\"[\\\" + Object.keys(this.$foldStyles).join(\\\", \\\") + \\\"]\\\");\\n \\n if (this.$foldStyle == style)\\n return;\\n\\n this.$foldStyle = style;\\n \\n if (style == \\\"manual\\\")\\n this.unfold();\\n var mode = this.$foldMode;\\n this.$setFolding(null);\\n this.$setFolding(mode);\\n };\\n\\n this.$setFolding = function(foldMode) {\\n if (this.$foldMode == foldMode)\\n return;\\n \\n this.$foldMode = foldMode;\\n \\n this.off('change', this.$updateFoldWidgets);\\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\\n this._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\\ndefine(\\\"ace/edit_session/bracket_match\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/token_iterator\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar TokenIterator = require(\\\"../token_iterator\\\").TokenIterator;\\nvar Range = require(\\\"../range\\\").Range;\\n\\n\\nfunction BracketMatch() {\\n\\n this.findMatchingBracket = function(position, chr) {\\n if (position.column == 0) return null;\\n\\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\\n if (charBeforeCursor == \\\"\\\") return null;\\n\\n var match = charBeforeCursor.match(/([\\\\(\\\\[\\\\{])|([\\\\)\\\\]\\\\}])/);\\n if (!match)\\n return null;\\n\\n if (match[1])\\n return this.$findClosingBracket(match[1], position);\\n else\\n return this.$findOpeningBracket(match[2], position);\\n };\\n \\n this.getBracketRange = function(pos) {\\n var line = this.getLine(pos.row);\\n var before = true, range;\\n\\n var chr = line.charAt(pos.column-1);\\n var match = chr && chr.match(/([\\\\(\\\\[\\\\{])|([\\\\)\\\\]\\\\}])/);\\n if (!match) {\\n chr = line.charAt(pos.column);\\n pos = {row: pos.row, column: pos.column + 1};\\n match = chr && chr.match(/([\\\\(\\\\[\\\\{])|([\\\\)\\\\]\\\\}])/);\\n before = false;\\n }\\n if (!match)\\n return null;\\n\\n if (match[1]) {\\n var bracketPos = this.$findClosingBracket(match[1], pos);\\n if (!bracketPos)\\n return null;\\n range = Range.fromPoints(pos, bracketPos);\\n if (!before) {\\n range.end.column++;\\n range.start.column--;\\n }\\n range.cursor = range.end;\\n } else {\\n var bracketPos = this.$findOpeningBracket(match[2], pos);\\n if (!bracketPos)\\n return null;\\n range = Range.fromPoints(bracketPos, pos);\\n if (!before) {\\n range.start.column++;\\n range.end.column--;\\n }\\n range.cursor = range.start;\\n }\\n \\n return range;\\n };\\n\\n this.$brackets = {\\n \\\")\\\": \\\"(\\\",\\n \\\"(\\\": \\\")\\\",\\n \\\"]\\\": \\\"[\\\",\\n \\\"[\\\": \\\"]\\\",\\n \\\"{\\\": \\\"}\\\",\\n \\\"}\\\": \\\"{\\\"\\n };\\n\\n this.$findOpeningBracket = function(bracket, position, typeRe) {\\n var openBracket = this.$brackets[bracket];\\n var depth = 1;\\n\\n var iterator = new TokenIterator(this, position.row, position.column);\\n var token = iterator.getCurrentToken();\\n if (!token)\\n token = iterator.stepForward();\\n if (!token)\\n return;\\n \\n if (!typeRe){\\n typeRe = new RegExp(\\n \\\"(\\\\\\\\.?\\\" +\\n token.type.replace(\\\".\\\", \\\"\\\\\\\\.\\\").replace(\\\"rparen\\\", \\\".paren\\\")\\n .replace(/\\\\b(?:end)\\\\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\\ndefine(\\\"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.$bidiHandler = new BidiHandler(this);\\n this.setDocument(text);\\n this.selection = new Selection(this);\\n\\n config.resetOptions(this);\\n this.setMode(mode);\\n config._signal(\\\"session\\\", this);\\n};\\n\\n\\nEditSession.$uid = 0;\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n this.setDocument = function(doc) {\\n if (this.doc)\\n this.doc.removeListener(\\\"change\\\", this.$onChange);\\n\\n this.doc = doc;\\n doc.on(\\\"change\\\", this.$onChange);\\n\\n if (this.bgTokenizer)\\n this.bgTokenizer.setDocument(this.getDocument());\\n\\n this.resetCaches();\\n };\\n this.getDocument = function() {\\n return this.doc;\\n };\\n this.$resetRowCache = function(docRow) {\\n if (!docRow) {\\n this.$docRowCache = [];\\n this.$screenRowCache = [];\\n return;\\n }\\n var l = this.$docRowCache.length;\\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\\n if (l > i) {\\n this.$docRowCache.splice(i, l);\\n this.$screenRowCache.splice(i, l);\\n }\\n };\\n\\n this.$getRowCacheIndex = function(cacheArray, val) {\\n var low = 0;\\n var hi = cacheArray.length - 1;\\n\\n while (low <= hi) {\\n var mid = (low + hi) >> 1;\\n var c = cacheArray[mid];\\n\\n if (val > c)\\n low = mid + 1;\\n else if (val < c)\\n hi = mid - 1;\\n else\\n return mid;\\n }\\n\\n return low -1;\\n };\\n\\n this.resetCaches = function() {\\n this.$modified = true;\\n this.$wrapData = [];\\n this.$rowLengthCache = [];\\n this.$resetRowCache(0);\\n if (this.bgTokenizer)\\n this.bgTokenizer.start(0);\\n };\\n\\n this.onChangeFold = function(e) {\\n var fold = e.data;\\n this.$resetRowCache(fold.start.row);\\n };\\n\\n this.onChange = function(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 && !delta.ignore) {\\n this.$deltasDoc.push(delta);\\n if (removedFolds && removedFolds.length != 0) {\\n this.$deltasFold.push({\\n action: \\\"removeFolds\\\",\\n folds: removedFolds\\n });\\n }\\n\\n this.$informUndoManager.schedule();\\n }\\n\\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\\n this._signal(\\\"change\\\", 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.$deltas = [];\\n this.$deltasDoc = [];\\n this.$deltasFold = [];\\n this.setUndoManager(this.$undoManager);\\n this.getUndoManager().reset();\\n };\\n this.getValue =\\n this.toString = function() {\\n return this.doc.getValue();\\n };\\n this.getSelection = function() {\\n return this.selection;\\n };\\n this.getState = function(row) {\\n return this.bgTokenizer.getState(row);\\n };\\n this.getTokens = function(row) {\\n return this.bgTokenizer.getTokens(row);\\n };\\n this.getTokenAt = function(row, column) {\\n var tokens = this.bgTokenizer.getTokens(row);\\n var token, c = 0;\\n if (column == null) {\\n 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 this.$deltas = [];\\n this.$deltasDoc = [];\\n this.$deltasFold = [];\\n\\n if (this.$informUndoManager)\\n this.$informUndoManager.cancel();\\n\\n if (undoManager) {\\n var self = this;\\n\\n this.$syncInformUndoManager = function() {\\n self.$informUndoManager.cancel();\\n\\n if (self.$deltasFold.length) {\\n self.$deltas.push({\\n group: \\\"fold\\\",\\n deltas: self.$deltasFold\\n });\\n self.$deltasFold = [];\\n }\\n\\n if (self.$deltasDoc.length) {\\n self.$deltas.push({\\n group: \\\"doc\\\",\\n deltas: self.$deltasDoc\\n });\\n self.$deltasDoc = [];\\n }\\n\\n if (self.$deltas.length > 0) {\\n undoManager.execute({\\n action: \\\"aceupdate\\\",\\n args: [self.$deltas, self],\\n merge: self.mergeUndoDeltas\\n });\\n }\\n self.mergeUndoDeltas = false;\\n self.$deltas = [];\\n };\\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\\n }\\n };\\n this.markUndoGroup = function() {\\n if (this.$syncInformUndoManager)\\n this.$syncInformUndoManager();\\n };\\n \\n this.$defaultUndoManager = {\\n undo: function() {},\\n redo: function() {},\\n reset: function() {}\\n };\\n this.getUndoManager = function() {\\n return this.$undoManager || this.$defaultUndoManager;\\n };\\n this.getTabString = function() {\\n if (this.getUseSoftTabs()) {\\n return lang.stringRepeat(\\\" \\\", this.getTabSize());\\n } else {\\n return \\\"\\\\t\\\";\\n }\\n };\\n this.setUseSoftTabs = function(val) {\\n this.setOption(\\\"useSoftTabs\\\", val);\\n };\\n this.getUseSoftTabs = function() {\\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\\n };\\n this.setTabSize = function(tabSize) {\\n this.setOption(\\\"tabSize\\\", tabSize);\\n };\\n this.getTabSize = function() {\\n return this.$tabSize;\\n };\\n this.isTabStop = function(position) {\\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\\n };\\n 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 = {};\\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 this.$mode = mode;\\n\\n this.$stopWorker();\\n\\n if (this.$useWorker)\\n this.$startWorker();\\n\\n var tokenizer = mode.getTokenizer();\\n\\n if(tokenizer.addEventListener !== undefined) {\\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\\n tokenizer.addEventListener(\\\"update\\\", onReloadTokenizer);\\n }\\n\\n if (!this.bgTokenizer) {\\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\\n var _self = this;\\n this.bgTokenizer.addEventListener(\\\"update\\\", function(e) {\\n _self._signal(\\\"tokenizerUpdate\\\", e);\\n });\\n } else {\\n this.bgTokenizer.setTokenizer(tokenizer);\\n }\\n\\n this.bgTokenizer.setDocument(this.getDocument());\\n\\n this.tokenRe = mode.tokenRe;\\n this.nonTokenRe = mode.nonTokenRe;\\n\\n \\n if (!$isPlaceholder) {\\n if (mode.attachToSession)\\n mode.attachToSession(this);\\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\\n this.$setFolding(mode.foldingRules);\\n this.bgTokenizer.start(0);\\n this._emit(\\\"changeMode\\\");\\n }\\n };\\n\\n this.$stopWorker = function() {\\n if (this.$worker) {\\n this.$worker.terminate();\\n this.$worker = null;\\n }\\n };\\n\\n this.$startWorker = function() {\\n try {\\n this.$worker = this.$mode.createWorker(this);\\n } catch (e) {\\n config.warn(\\\"Could not load worker\\\", e);\\n this.$worker = null;\\n }\\n };\\n this.getMode = function() {\\n return this.$mode;\\n };\\n\\n this.$scrollTop = 0;\\n this.setScrollTop = function(scrollTop) {\\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\\n return;\\n\\n this.$scrollTop = scrollTop;\\n this._signal(\\\"changeScrollTop\\\", scrollTop);\\n };\\n this.getScrollTop = function() {\\n return this.$scrollTop;\\n };\\n\\n this.$scrollLeft = 0;\\n this.setScrollLeft = function(scrollLeft) {\\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\\n return;\\n\\n this.$scrollLeft = scrollLeft;\\n this._signal(\\\"changeScrollLeft\\\", scrollLeft);\\n };\\n this.getScrollLeft = function() {\\n return this.$scrollLeft;\\n };\\n this.getScreenWidth = function() {\\n this.$computeWidth();\\n if (this.lineWidgets) \\n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\\n return this.screenWidth;\\n };\\n \\n this.getLineWidgetMaxWidth = function() {\\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\\n var width = 0;\\n this.lineWidgets.forEach(function(w) {\\n if (w && w.screenWidth > width)\\n width = w.screenWidth;\\n });\\n return this.lineWidgetWidth = width;\\n };\\n\\n this.$computeWidth = function(force) {\\n if (this.$modified || force) {\\n this.$modified = false;\\n\\n if (this.$useWrapMode)\\n return this.screenWidth = this.$wrapLimit;\\n\\n var lines = this.doc.getAllLines();\\n var cache = this.$rowLengthCache;\\n var longestScreenLine = 0;\\n var foldIndex = 0;\\n var foldLine = this.$foldData[foldIndex];\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n var len = lines.length;\\n\\n for (var i = 0; i < len; i++) {\\n if (i > foldStart) {\\n i = foldLine.end.row + 1;\\n if (i >= len)\\n break;\\n foldLine = this.$foldData[foldIndex++];\\n foldStart = foldLine ? foldLine.start.row : Infinity;\\n }\\n\\n if (cache[i] == null)\\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\\n\\n if (cache[i] > longestScreenLine)\\n longestScreenLine = cache[i];\\n }\\n this.screenWidth = longestScreenLine;\\n }\\n };\\n this.getLine = function(row) {\\n return this.doc.getLine(row);\\n };\\n this.getLines = function(firstRow, lastRow) {\\n return this.doc.getLines(firstRow, lastRow);\\n };\\n this.getLength = function() {\\n return this.doc.getLength();\\n };\\n this.getTextRange = function(range) {\\n return this.doc.getTextRange(range || this.selection.getRange());\\n };\\n this.insert = function(position, text) {\\n return this.doc.insert(position, text);\\n };\\n this.remove = function(range) {\\n return this.doc.remove(range);\\n };\\n this.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 var lastUndoRange = null;\\n for (var i = deltas.length - 1; i != -1; i--) {\\n var delta = deltas[i];\\n if (delta.group == \\\"doc\\\") {\\n this.doc.revertDeltas(delta.deltas);\\n lastUndoRange =\\n this.$getUndoSelection(delta.deltas, true, lastUndoRange);\\n } else {\\n delta.deltas.forEach(function(foldDelta) {\\n this.addFolds(foldDelta.folds);\\n }, this);\\n }\\n }\\n this.$fromUndo = false;\\n lastUndoRange &&\\n this.$undoSelect &&\\n !dontSelect &&\\n this.selection.setSelectionRange(lastUndoRange);\\n return lastUndoRange;\\n };\\n this.redoChanges = function(deltas, dontSelect) {\\n if (!deltas.length)\\n return;\\n\\n this.$fromUndo = true;\\n var lastUndoRange = null;\\n for (var i = 0; i < deltas.length; i++) {\\n var delta = deltas[i];\\n if (delta.group == \\\"doc\\\") {\\n this.doc.applyDeltas(delta.deltas);\\n lastUndoRange =\\n this.$getUndoSelection(delta.deltas, false, lastUndoRange);\\n }\\n }\\n this.$fromUndo = false;\\n lastUndoRange &&\\n this.$undoSelect &&\\n !dontSelect &&\\n this.selection.setSelectionRange(lastUndoRange);\\n return lastUndoRange;\\n };\\n this.setUndoSelect = function(enable) {\\n this.$undoSelect = enable;\\n };\\n\\n this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\\n function isInsert(delta) {\\n return isUndo ? delta.action !== \\\"insert\\\" : delta.action === \\\"insert\\\";\\n }\\n\\n var delta = deltas[0];\\n var range, point;\\n var lastDeltaIsInsert = false;\\n if (isInsert(delta)) {\\n range = Range.fromPoints(delta.start, delta.end);\\n lastDeltaIsInsert = true;\\n } else {\\n range = Range.fromPoints(delta.start, delta.start);\\n lastDeltaIsInsert = false;\\n }\\n\\n for (var i = 1; i < deltas.length; i++) {\\n delta = deltas[i];\\n if (isInsert(delta)) {\\n point = delta.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 lastDeltaIsInsert = true;\\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 lastDeltaIsInsert = false;\\n }\\n }\\n if (lastUndoRange != null) {\\n if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\\n lastUndoRange.start.column += range.end.column - range.start.column;\\n lastUndoRange.end.column += range.end.column - range.start.column;\\n }\\n\\n var cmp = lastUndoRange.compareRange(range);\\n if (cmp == 1) {\\n range.setStart(lastUndoRange.start);\\n } else if (cmp == -1) {\\n range.setEnd(lastUndoRange.end);\\n }\\n }\\n\\n return range;\\n };\\n this.replace = function(range, text) {\\n return this.doc.replace(range, text);\\n };\\n this.moveText = function(fromRange, toPosition, copy) {\\n var text = this.getTextRange(fromRange);\\n var folds = this.getFoldsInRange(fromRange);\\n\\n var toRange = Range.fromPoints(toPosition, toPosition);\\n if (!copy) {\\n this.remove(fromRange);\\n var rowDiff = fromRange.start.row - fromRange.end.row;\\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\\n if (collDiff) {\\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\\n toRange.start.column += collDiff;\\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\\n toRange.end.column += collDiff;\\n }\\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\\n toRange.start.row += rowDiff;\\n toRange.end.row += rowDiff;\\n }\\n }\\n\\n toRange.end = this.insert(toRange.start, text);\\n if (folds.length) {\\n var oldStart = fromRange.start;\\n var newStart = toRange.start;\\n var rowDiff = newStart.row - oldStart.row;\\n var collDiff = newStart.column - oldStart.column;\\n this.addFolds(folds.map(function(x) {\\n x = x.clone();\\n if (x.start.row == oldStart.row)\\n x.start.column += collDiff;\\n if (x.end.row == oldStart.row)\\n x.end.column += collDiff;\\n x.start.row += rowDiff;\\n x.end.row += rowDiff;\\n return x;\\n }));\\n }\\n\\n return toRange;\\n };\\n this.indentRows = function(startRow, endRow, indentString) {\\n indentString = indentString.replace(/\\\\t/g, this.getTabString());\\n for (var row=startRow; row<=endRow; row++)\\n this.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 displayed = tokens.slice(lastSplit, screenPos);\\n var len = displayed.length;\\n displayed.join(\\\"\\\")\\n .replace(/12/g, function() {\\n len -= 1;\\n })\\n .replace(/2/g, function() {\\n len -= 1;\\n });\\n\\n 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 if (this.lineWidgets)\\n var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\\n else \\n h = 0;\\n if (!this.$useWrapMode || !this.$wrapData[row]) {\\n return 1 + h;\\n } else {\\n return this.$wrapData[row].length + 1 + h;\\n }\\n };\\n this.getRowLineCount = function(row) {\\n if (!this.$useWrapMode || !this.$wrapData[row]) {\\n return 1;\\n } else {\\n return this.$wrapData[row].length + 1;\\n }\\n };\\n\\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;\\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 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 };\\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.$modified = true;\\n this.$resetRowCache(0);\\n this.$updateWrapData(0, this.getLength() - 1);\\n }\\n }\\n },\\n initialValue: \\\"auto\\\"\\n },\\n indentedSoftWrap: { initialValue: true },\\n firstLineNumber: {\\n set: function() {this._signal(\\\"changeBreakpoint\\\");},\\n initialValue: 1\\n },\\n useWorker: {\\n set: function(useWorker) {\\n this.$useWorker = useWorker;\\n\\n this.$stopWorker();\\n if (useWorker)\\n this.$startWorker();\\n },\\n initialValue: true\\n },\\n useSoftTabs: {initialValue: true},\\n tabSize: {\\n set: function(tabSize) {\\n if (isNaN(tabSize) || this.$tabSize === tabSize) return;\\n\\n this.$modified = true;\\n this.$rowLengthCache = [];\\n this.$tabSize = tabSize;\\n this._signal(\\\"changeTabSize\\\");\\n },\\n initialValue: 4,\\n handlesSet: true\\n },\\n navigateWithinSoftTabs: {initialValue: false},\\n overwrite: {\\n set: function(val) {this._signal(\\\"changeOverwrite\\\");},\\n initialValue: false\\n },\\n newLineMode: {\\n set: function(val) {this.doc.setNewLineMode(val);},\\n get: function() {return this.doc.getNewLineMode();},\\n handlesSet: true\\n },\\n mode: {\\n set: function(val) { this.setMode(val); },\\n get: function() { return this.$modeId; }\\n }\\n});\\n\\nexports.EditSession = EditSession;\\n});\\n\\ndefine(\\\"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) 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 m;\\n var last = startIndex;\\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\\ndefine(\\\"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\\ndefine(\\\"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 (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.removeEventListener(\\\"exec\\\", this.$addCommandToMacro);\\n\\n if (!this.macro.length)\\n this.macro = this.oldMacro;\\n\\n return this.recording = false;\\n }\\n if (!this.$addCommandToMacro) {\\n this.$addCommandToMacro = function(e) {\\n this.macro.push([e.command, e.args]);\\n }.bind(this);\\n }\\n\\n this.oldMacro = this.macro;\\n this.macro = [];\\n this.on(\\\"exec\\\", this.$addCommandToMacro);\\n return this.recording = true;\\n };\\n\\n this.replay = function(editor) {\\n if (this.$inReplay || !this.macro)\\n return;\\n\\n if (this.recording)\\n return this.toggleRecording(editor);\\n\\n try {\\n this.$inReplay = true;\\n this.macro.forEach(function(x) {\\n if (typeof x == \\\"string\\\")\\n this.exec(x, editor);\\n else\\n this.exec(x[0], editor, x[1]);\\n }, this);\\n } finally {\\n this.$inReplay = false;\\n }\\n };\\n\\n this.trimMacro = function(m) {\\n return m.map(function(x){\\n if (typeof x[0] != \\\"string\\\")\\n x[0] = x[0].name;\\n if (!x[1])\\n x = x[0];\\n return x;\\n });\\n };\\n\\n}).call(CommandManager.prototype);\\n\\nexports.CommandManager = CommandManager;\\n\\n});\\n\\ndefine(\\\"ace/commands/default_commands\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/lang\\\",\\\"ace/config\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar lang = require(\\\"../lib/lang\\\");\\nvar config = require(\\\"../config\\\");\\nvar Range = require(\\\"../range\\\").Range;\\n\\nfunction bindKey(win, mac) {\\n return {win: win, mac: mac};\\n}\\nexports.commands = [{\\n name: \\\"showSettingsMenu\\\",\\n bindKey: bindKey(\\\"Ctrl-,\\\", \\\"Command-,\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/settings_menu\\\", function(module) {\\n module.init(editor);\\n editor.showSettingsMenu();\\n });\\n },\\n readOnly: true\\n}, {\\n name: \\\"goToNextError\\\",\\n bindKey: bindKey(\\\"Alt-E\\\", \\\"F4\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/error_marker\\\", function(module) {\\n module.showErrorMarker(editor, 1);\\n });\\n },\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"goToPreviousError\\\",\\n bindKey: bindKey(\\\"Alt-Shift-E\\\", \\\"Shift-F4\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/error_marker\\\", function(module) {\\n module.showErrorMarker(editor, -1);\\n });\\n },\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectall\\\",\\n bindKey: bindKey(\\\"Ctrl-A\\\", \\\"Command-A\\\"),\\n exec: function(editor) { editor.selectAll(); },\\n readOnly: true\\n}, {\\n name: \\\"centerselection\\\",\\n bindKey: bindKey(null, \\\"Ctrl-L\\\"),\\n exec: function(editor) { editor.centerSelection(); },\\n readOnly: true\\n}, {\\n name: \\\"gotoline\\\",\\n bindKey: bindKey(\\\"Ctrl-L\\\", \\\"Command-L\\\"),\\n exec: function(editor) {\\n var line = parseInt(prompt(\\\"Enter line number:\\\"), 10);\\n if (!isNaN(line)) {\\n editor.gotoLine(line);\\n }\\n },\\n readOnly: true\\n}, {\\n name: \\\"fold\\\",\\n bindKey: bindKey(\\\"Alt-L|Ctrl-F1\\\", \\\"Command-Alt-L|Command-F1\\\"),\\n exec: function(editor) { editor.session.toggleFold(false); },\\n 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 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 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 bindKey: bindKey(null, \\\"Ctrl-Command-Option-0\\\"),\\n exec: function(editor) { editor.session.foldAll(); },\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"foldOther\\\",\\n bindKey: bindKey(\\\"Alt-0\\\", \\\"Command-Option-0\\\"),\\n exec: function(editor) { \\n editor.session.foldAll();\\n editor.session.unfold(editor.selection.getAllRanges());\\n },\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"unfoldall\\\",\\n bindKey: bindKey(\\\"Alt-Shift-0\\\", \\\"Command-Option-Shift-0\\\"),\\n exec: function(editor) { editor.session.unfold(); },\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"findnext\\\",\\n bindKey: bindKey(\\\"Ctrl-K\\\", \\\"Command-G\\\"),\\n exec: function(editor) { editor.findNext(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"findprevious\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-K\\\", \\\"Command-Shift-G\\\"),\\n exec: function(editor) { editor.findPrevious(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectOrFindNext\\\",\\n bindKey: bindKey(\\\"Alt-K\\\", \\\"Ctrl-G\\\"),\\n exec: function(editor) {\\n if (editor.selection.isEmpty())\\n editor.selection.selectWord();\\n else\\n editor.findNext(); \\n },\\n readOnly: true\\n}, {\\n name: \\\"selectOrFindPrevious\\\",\\n bindKey: bindKey(\\\"Alt-Shift-K\\\", \\\"Ctrl-Shift-G\\\"),\\n exec: function(editor) { \\n if (editor.selection.isEmpty())\\n editor.selection.selectWord();\\n else\\n editor.findPrevious();\\n },\\n readOnly: true\\n}, {\\n name: \\\"find\\\",\\n bindKey: bindKey(\\\"Ctrl-F\\\", \\\"Command-F\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/searchbox\\\", function(e) {e.Search(editor);});\\n },\\n readOnly: true\\n}, {\\n name: \\\"overwrite\\\",\\n bindKey: \\\"Insert\\\",\\n exec: function(editor) { editor.toggleOverwrite(); },\\n readOnly: true\\n}, {\\n name: \\\"selecttostart\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Home\\\", \\\"Command-Shift-Home|Command-Shift-Up\\\"),\\n exec: function(editor) { editor.getSelection().selectFileStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"gotostart\\\",\\n bindKey: bindKey(\\\"Ctrl-Home\\\", \\\"Command-Home|Command-Up\\\"),\\n exec: function(editor) { editor.navigateFileStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"selectup\\\",\\n bindKey: bindKey(\\\"Shift-Up\\\", \\\"Shift-Up|Ctrl-Shift-P\\\"),\\n exec: function(editor) { editor.getSelection().selectUp(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"golineup\\\",\\n bindKey: bindKey(\\\"Up\\\", \\\"Up|Ctrl-P\\\"),\\n exec: function(editor, args) { editor.navigateUp(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttoend\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-End\\\", \\\"Command-Shift-End|Command-Shift-Down\\\"),\\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"gotoend\\\",\\n bindKey: bindKey(\\\"Ctrl-End\\\", \\\"Command-End|Command-Down\\\"),\\n exec: function(editor) { editor.navigateFileEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"selectdown\\\",\\n bindKey: bindKey(\\\"Shift-Down\\\", \\\"Shift-Down|Ctrl-Shift-N\\\"),\\n exec: function(editor) { editor.getSelection().selectDown(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"golinedown\\\",\\n bindKey: bindKey(\\\"Down\\\", \\\"Down|Ctrl-N\\\"),\\n exec: function(editor, args) { editor.navigateDown(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectwordleft\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Left\\\", \\\"Option-Shift-Left\\\"),\\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotowordleft\\\",\\n bindKey: bindKey(\\\"Ctrl-Left\\\", \\\"Option-Left\\\"),\\n exec: function(editor) { editor.navigateWordLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttolinestart\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Left\\\", \\\"Command-Shift-Left|Ctrl-Shift-A\\\"),\\n exec: function(editor) { editor.getSelection().selectLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotolinestart\\\",\\n bindKey: bindKey(\\\"Alt-Left|Home\\\", \\\"Command-Left|Home|Ctrl-A\\\"),\\n exec: function(editor) { editor.navigateLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectleft\\\",\\n bindKey: bindKey(\\\"Shift-Left\\\", \\\"Shift-Left|Ctrl-Shift-B\\\"),\\n exec: function(editor) { editor.getSelection().selectLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotoleft\\\",\\n bindKey: bindKey(\\\"Left\\\", \\\"Left|Ctrl-B\\\"),\\n exec: function(editor, args) { editor.navigateLeft(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectwordright\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Right\\\", \\\"Option-Shift-Right\\\"),\\n exec: function(editor) { editor.getSelection().selectWordRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotowordright\\\",\\n bindKey: bindKey(\\\"Ctrl-Right\\\", \\\"Option-Right\\\"),\\n exec: function(editor) { editor.navigateWordRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttolineend\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Right\\\", \\\"Command-Shift-Right|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 bindKey: bindKey(\\\"Alt-Right|End\\\", \\\"Command-Right|End|Ctrl-E\\\"),\\n exec: function(editor) { editor.navigateLineEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectright\\\",\\n bindKey: bindKey(\\\"Shift-Right\\\", \\\"Shift-Right\\\"),\\n exec: function(editor) { editor.getSelection().selectRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotoright\\\",\\n bindKey: bindKey(\\\"Right\\\", \\\"Right|Ctrl-F\\\"),\\n exec: function(editor, args) { editor.navigateRight(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectpagedown\\\",\\n bindKey: \\\"Shift-PageDown\\\",\\n exec: function(editor) { editor.selectPageDown(); },\\n readOnly: true\\n}, {\\n name: \\\"pagedown\\\",\\n bindKey: bindKey(null, \\\"Option-PageDown\\\"),\\n exec: function(editor) { editor.scrollPageDown(); },\\n readOnly: true\\n}, {\\n name: \\\"gotopagedown\\\",\\n bindKey: bindKey(\\\"PageDown\\\", \\\"PageDown|Ctrl-V\\\"),\\n exec: function(editor) { editor.gotoPageDown(); },\\n readOnly: true\\n}, {\\n name: \\\"selectpageup\\\",\\n bindKey: \\\"Shift-PageUp\\\",\\n exec: function(editor) { editor.selectPageUp(); },\\n readOnly: true\\n}, {\\n name: \\\"pageup\\\",\\n bindKey: bindKey(null, \\\"Option-PageUp\\\"),\\n exec: function(editor) { editor.scrollPageUp(); },\\n readOnly: true\\n}, {\\n name: \\\"gotopageup\\\",\\n bindKey: \\\"PageUp\\\",\\n exec: function(editor) { editor.gotoPageUp(); },\\n readOnly: true\\n}, {\\n name: \\\"scrollup\\\",\\n bindKey: bindKey(\\\"Ctrl-Up\\\", null),\\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\\n readOnly: true\\n}, {\\n name: \\\"scrolldown\\\",\\n bindKey: bindKey(\\\"Ctrl-Down\\\", null),\\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\\n readOnly: true\\n}, {\\n name: \\\"selectlinestart\\\",\\n bindKey: \\\"Shift-Home\\\",\\n exec: function(editor) { editor.getSelection().selectLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectlineend\\\",\\n bindKey: \\\"Shift-End\\\",\\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"togglerecording\\\",\\n bindKey: bindKey(\\\"Ctrl-Alt-E\\\", \\\"Command-Option-E\\\"),\\n exec: function(editor) { editor.commands.toggleRecording(editor); },\\n readOnly: true\\n}, {\\n name: \\\"replaymacro\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-E\\\", \\\"Command-Shift-E\\\"),\\n exec: function(editor) { editor.commands.replay(editor); },\\n readOnly: true\\n}, {\\n name: \\\"jumptomatching\\\",\\n bindKey: bindKey(\\\"Ctrl-P\\\", \\\"Ctrl-P\\\"),\\n exec: function(editor) { editor.jumpToMatching(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttomatching\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-P\\\", \\\"Ctrl-Shift-P\\\"),\\n exec: function(editor) { editor.jumpToMatching(true); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"expandToMatching\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-M\\\", \\\"Ctrl-Shift-M\\\"),\\n exec: function(editor) { editor.jumpToMatching(true, true); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"passKeysToBrowser\\\",\\n bindKey: bindKey(null, null),\\n exec: function() {},\\n passEvent: true,\\n readOnly: true\\n}, {\\n name: \\\"copy\\\",\\n exec: function(editor) {\\n },\\n readOnly: true\\n},\\n{\\n name: \\\"cut\\\",\\n exec: function(editor) {\\n var range = editor.getSelectionRange();\\n editor._emit(\\\"cut\\\", range);\\n\\n if (!editor.selection.isEmpty()) {\\n editor.session.remove(range);\\n editor.clearSelection();\\n }\\n },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"paste\\\",\\n exec: function(editor, args) {\\n editor.$handlePaste(args);\\n },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removeline\\\",\\n bindKey: bindKey(\\\"Ctrl-D\\\", \\\"Command-D\\\"),\\n exec: function(editor) { editor.removeLines(); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEachLine\\\"\\n}, {\\n name: \\\"duplicateSelection\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-D\\\", \\\"Command-Shift-D\\\"),\\n exec: function(editor) { editor.duplicateSelection(); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"sortlines\\\",\\n bindKey: bindKey(\\\"Ctrl-Alt-S\\\", \\\"Command-Alt-S\\\"),\\n exec: function(editor) { editor.sortLines(); },\\n scrollIntoView: \\\"selection\\\",\\n multiSelectAction: \\\"forEachLine\\\"\\n}, {\\n name: \\\"togglecomment\\\",\\n bindKey: bindKey(\\\"Ctrl-/\\\", \\\"Command-/\\\"),\\n exec: function(editor) { editor.toggleCommentLines(); },\\n multiSelectAction: \\\"forEachLine\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"toggleBlockComment\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-/\\\", \\\"Command-Shift-/\\\"),\\n exec: function(editor) { editor.toggleBlockComment(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"modifyNumberUp\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Up\\\", \\\"Alt-Shift-Up\\\"),\\n exec: function(editor) { editor.modifyNumber(1); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"modifyNumberDown\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Down\\\", \\\"Alt-Shift-Down\\\"),\\n exec: function(editor) { editor.modifyNumber(-1); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"replace\\\",\\n bindKey: bindKey(\\\"Ctrl-H\\\", \\\"Command-Option-F\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/searchbox\\\", function(e) {e.Search(editor, true);});\\n }\\n}, {\\n name: \\\"undo\\\",\\n bindKey: bindKey(\\\"Ctrl-Z\\\", \\\"Command-Z\\\"),\\n exec: function(editor) { editor.undo(); }\\n}, {\\n name: \\\"redo\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Z|Ctrl-Y\\\", \\\"Command-Shift-Z|Command-Y\\\"),\\n exec: function(editor) { editor.redo(); }\\n}, {\\n name: \\\"copylinesup\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Up\\\", \\\"Command-Option-Up\\\"),\\n exec: function(editor) { editor.copyLinesUp(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"movelinesup\\\",\\n bindKey: bindKey(\\\"Alt-Up\\\", \\\"Option-Up\\\"),\\n exec: function(editor) { editor.moveLinesUp(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"copylinesdown\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Down\\\", \\\"Command-Option-Down\\\"),\\n exec: function(editor) { editor.copyLinesDown(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"movelinesdown\\\",\\n bindKey: bindKey(\\\"Alt-Down\\\", \\\"Option-Down\\\"),\\n exec: function(editor) { editor.moveLinesDown(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"del\\\",\\n bindKey: bindKey(\\\"Delete\\\", \\\"Delete|Ctrl-D|Shift-Delete\\\"),\\n exec: function(editor) { editor.remove(\\\"right\\\"); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"backspace\\\",\\n bindKey: bindKey(\\n \\\"Shift-Backspace|Backspace\\\",\\n \\\"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\\\"\\n ),\\n exec: function(editor) { editor.remove(\\\"left\\\"); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"cut_or_delete\\\",\\n bindKey: bindKey(\\\"Shift-Delete\\\", null),\\n exec: function(editor) { \\n if (editor.selection.isEmpty()) {\\n editor.remove(\\\"left\\\");\\n } else {\\n return false;\\n }\\n },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removetolinestart\\\",\\n bindKey: bindKey(\\\"Alt-Backspace\\\", \\\"Command-Backspace\\\"),\\n exec: function(editor) { editor.removeToLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removetolineend\\\",\\n bindKey: bindKey(\\\"Alt-Delete\\\", \\\"Ctrl-K|Command-Delete\\\"),\\n exec: function(editor) { editor.removeToLineEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removetolinestarthard\\\",\\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 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 bindKey: bindKey(\\\"Ctrl-Backspace\\\", \\\"Alt-Backspace|Ctrl-Alt-Backspace\\\"),\\n exec: function(editor) { editor.removeWordLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removewordright\\\",\\n bindKey: bindKey(\\\"Ctrl-Delete\\\", \\\"Alt-Delete\\\"),\\n exec: function(editor) { editor.removeWordRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"outdent\\\",\\n bindKey: bindKey(\\\"Shift-Tab\\\", \\\"Shift-Tab\\\"),\\n exec: function(editor) { editor.blockOutdent(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"indent\\\",\\n bindKey: bindKey(\\\"Tab\\\", \\\"Tab\\\"),\\n exec: function(editor) { editor.indent(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"blockoutdent\\\",\\n bindKey: bindKey(\\\"Ctrl-[\\\", \\\"Ctrl-[\\\"),\\n exec: function(editor) { editor.blockOutdent(); },\\n multiSelectAction: \\\"forEachLine\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"blockindent\\\",\\n bindKey: bindKey(\\\"Ctrl-]\\\", \\\"Ctrl-]\\\"),\\n exec: function(editor) { editor.blockIndent(); },\\n multiSelectAction: \\\"forEachLine\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"insertstring\\\",\\n exec: function(editor, str) { editor.insert(str); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"inserttext\\\",\\n exec: function(editor, args) {\\n editor.insert(lang.stringRepeat(args.text || \\\"\\\", args.times || 1));\\n },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"splitline\\\",\\n bindKey: bindKey(null, \\\"Ctrl-O\\\"),\\n exec: function(editor) { editor.splitLine(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"transposeletters\\\",\\n bindKey: bindKey(\\\"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 bindKey: bindKey(\\\"Ctrl-U\\\", \\\"Ctrl-U\\\"),\\n exec: function(editor) { editor.toUpperCase(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"tolowercase\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-U\\\", \\\"Ctrl-Shift-U\\\"),\\n exec: function(editor) { editor.toLowerCase(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"expandtoline\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-L\\\", \\\"Command-Shift-L\\\"),\\n exec: function(editor) {\\n var range = editor.selection.getRange();\\n\\n range.start.column = range.end.column = 0;\\n range.end.row++;\\n editor.selection.setRange(range, false);\\n },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"joinlines\\\",\\n bindKey: bindKey(null, null),\\n exec: function(editor) {\\n var isBackwards = editor.selection.isBackwards();\\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\\n var selectedCount = selectedText.replace(/\\\\n\\\\s*/, \\\" \\\").length;\\n var insertLine = editor.session.doc.getLine(selectionStart.row);\\n\\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\\n if (curLine.length !== 0) {\\n curLine = \\\" \\\" + curLine;\\n }\\n insertLine += curLine;\\n }\\n\\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\\n insertLine += editor.session.doc.getNewLineCharacter();\\n }\\n\\n editor.clearSelection();\\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\\n\\n if (selectedCount > 0) {\\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\\n } else {\\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\\n }\\n },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true\\n}, {\\n name: \\\"invertSelection\\\",\\n bindKey: bindKey(null, null),\\n exec: function(editor) {\\n var endRow = editor.session.doc.getLength() - 1;\\n var endCol = editor.session.doc.getLine(endRow).length;\\n var ranges = editor.selection.rangeList.ranges;\\n var newRanges = [];\\n if (ranges.length < 1) {\\n ranges = [editor.selection.getRange()];\\n }\\n\\n for (var i = 0; i < ranges.length; i++) {\\n if (i == (ranges.length - 1)) {\\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\\n }\\n }\\n\\n if (i === 0) {\\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\\n }\\n } else {\\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\\n }\\n }\\n\\n editor.exitMultiSelectMode();\\n editor.clearSelection();\\n\\n for(var i = 0; i < newRanges.length; i++) {\\n editor.selection.addRange(newRanges[i], false);\\n }\\n },\\n readOnly: true,\\n scrollIntoView: \\\"none\\\"\\n}];\\n\\n});\\n\\ndefine(\\\"ace/editor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/fixoldbrowsers\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\",\\\"ace/keyboard/textinput\\\",\\\"ace/mouse/mouse_handler\\\",\\\"ace/mouse/fold_handler\\\",\\\"ace/keyboard/keybinding\\\",\\\"ace/edit_session\\\",\\\"ace/search\\\",\\\"ace/range\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/commands/command_manager\\\",\\\"ace/commands/default_commands\\\",\\\"ace/config\\\",\\\"ace/token_iterator\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./lib/fixoldbrowsers\\\");\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar useragent = require(\\\"./lib/useragent\\\");\\nvar TextInput = require(\\\"./keyboard/textinput\\\").TextInput;\\nvar MouseHandler = require(\\\"./mouse/mouse_handler\\\").MouseHandler;\\nvar FoldHandler = require(\\\"./mouse/fold_handler\\\").FoldHandler;\\nvar KeyBinding = require(\\\"./keyboard/keybinding\\\").KeyBinding;\\nvar EditSession = require(\\\"./edit_session\\\").EditSession;\\nvar Search = require(\\\"./search\\\").Search;\\nvar Range = require(\\\"./range\\\").Range;\\nvar EventEmitter = require(\\\"./lib/event_emitter\\\").EventEmitter;\\nvar CommandManager = require(\\\"./commands/command_manager\\\").CommandManager;\\nvar defaultCommands = require(\\\"./commands/default_commands\\\").commands;\\nvar config = require(\\\"./config\\\");\\nvar TokenIterator = require(\\\"./token_iterator\\\").TokenIterator;\\nvar Editor = function(renderer, session) {\\n var container = renderer.getContainerElement();\\n this.container = container;\\n this.renderer = renderer;\\n 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.$blockScrolling = 0;\\n this.$search = new Search().set({\\n wrap: true\\n });\\n\\n this.$historyTracker = this.$historyTracker.bind(this);\\n this.commands.on(\\\"exec\\\", this.$historyTracker);\\n\\n this.$initOperationListeners();\\n \\n this._$emitInputEvent = lang.delayedCall(function() {\\n this._signal(\\\"input\\\", {});\\n if (this.session && this.session.bgTokenizer)\\n this.session.bgTokenizer.scheduleStart();\\n }.bind(this));\\n \\n this.on(\\\"change\\\", function(_, _self) {\\n _self._$emitInputEvent.schedule(31);\\n });\\n\\n this.setSession(session || new EditSession(\\\"\\\"));\\n config.resetOptions(this);\\n config._signal(\\\"editor\\\", this);\\n};\\n\\nEditor.$uid = 0;\\n\\n(function(){\\n\\n oop.implement(this, EventEmitter);\\n\\n this.$initOperationListeners = function() {\\n function last(a) {return a[a.length - 1];}\\n\\n this.selections = [];\\n this.commands.on(\\\"exec\\\", this.startOperation.bind(this), true);\\n this.commands.on(\\\"afterExec\\\", this.endOperation.bind(this), true);\\n\\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\\n\\n this.on(\\\"change\\\", function() {\\n this.curOp || this.startOperation();\\n this.curOp.docChanged = true;\\n }.bind(this), true);\\n\\n this.on(\\\"changeSelection\\\", function() {\\n this.curOp || this.startOperation();\\n this.curOp.selectionChanged = true;\\n }.bind(this), true);\\n };\\n\\n this.curOp = null;\\n this.prevOp = {};\\n this.startOperation = function(commadEvent) {\\n if (this.curOp) {\\n if (!commadEvent || this.curOp.command)\\n return;\\n this.prevOp = this.curOp;\\n }\\n if (!commadEvent) {\\n this.previousCommand = null;\\n commadEvent = {};\\n }\\n\\n this.$opResetTimer.schedule();\\n this.curOp = {\\n command: commadEvent.command || {},\\n args: commadEvent.args,\\n scrollTop: this.renderer.scrollTop\\n };\\n if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\\n this.$blockScrolling++;\\n };\\n\\n this.endOperation = function(e) {\\n if (this.curOp) {\\n if (e && e.returnValue === false)\\n return this.curOp = null;\\n this._signal(\\\"beforeEndOperation\\\");\\n var command = this.curOp.command;\\n if (command.name && this.$blockScrolling > 0)\\n this.$blockScrolling--;\\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 \\n this.prevOp = this.curOp;\\n this.curOp = null;\\n }\\n };\\n this.$mergeableCommands = [\\\"backspace\\\", \\\"del\\\", \\\"insertstring\\\"];\\n this.$historyTracker = function(e) {\\n if (!this.$mergeUndoDeltas)\\n return;\\n\\n var prev = this.prevOp;\\n var mergeableCommands = this.$mergeableCommands;\\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\\n if (e.command.name == \\\"insertstring\\\") {\\n var text = e.args;\\n if (this.mergeNextCommand === undefined)\\n this.mergeNextCommand = true;\\n\\n shouldMerge = shouldMerge\\n && this.mergeNextCommand // previous command allows to coalesce with\\n && (!/\\\\s/.test(text) || /\\\\s/.test(prev.args)); // previous insertion was of same type\\n\\n this.mergeNextCommand = true;\\n } else {\\n shouldMerge = shouldMerge\\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\\n }\\n\\n if (\\n this.$mergeUndoDeltas != \\\"always\\\"\\n && Date.now() - this.sequenceStartTime > 2000\\n ) {\\n shouldMerge = false; // the sequence is too long\\n }\\n\\n if (shouldMerge)\\n this.session.mergeUndoDeltas = true;\\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\\n this.sequenceStartTime = Date.now();\\n };\\n this.setKeyboardHandler = function(keyboardHandler, cb) {\\n if (keyboardHandler && typeof keyboardHandler === \\\"string\\\") {\\n this.$keybindingId = keyboardHandler;\\n var _self = this;\\n config.loadModule([\\\"keybinding\\\", keyboardHandler], function(module) {\\n if (_self.$keybindingId == keyboardHandler)\\n _self.keyBinding.setKeyboardHandler(module && module.handler);\\n cb && cb();\\n });\\n } else {\\n this.$keybindingId = null;\\n this.keyBinding.setKeyboardHandler(keyboardHandler);\\n cb && cb();\\n }\\n };\\n this.getKeyboardHandler = function() {\\n return this.keyBinding.getKeyboardHandler();\\n };\\n this.setSession = function(session) {\\n if (this.session == session)\\n return;\\n 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.$blockScrolling += 1;\\n this.onCursorChange();\\n this.$blockScrolling -= 1;\\n \\n this.onScrollTopChange();\\n this.onScrollLeftChange();\\n this.onSelectionChange();\\n this.onChangeFrontMarker();\\n this.onChangeBackMarker();\\n this.onChangeBreakpoint();\\n this.onChangeAnnotation();\\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\\n this.renderer.updateFull();\\n } else {\\n this.selection = null;\\n this.renderer.setSession(session);\\n }\\n\\n this._signal(\\\"changeSession\\\", {\\n session: session,\\n oldSession: oldSession\\n });\\n \\n 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.session.$bracketHighlight) {\\n this.session.removeMarker(this.session.$bracketHighlight);\\n this.session.$bracketHighlight = null;\\n }\\n\\n if (this.$highlightPending) {\\n return;\\n }\\n var self = this;\\n this.$highlightPending = true;\\n setTimeout(function() {\\n self.$highlightPending = false;\\n var session = self.session;\\n if (!session || !session.bgTokenizer) return;\\n var pos = session.findMatchingBracket(self.getCursorPosition());\\n if (pos) {\\n var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\\n } else if (session.$mode.getMatching) {\\n var range = session.$mode.getMatching(self.session);\\n }\\n if (range)\\n session.$bracketHighlight = session.addMarker(range, \\\"ace_bracket\\\", \\\"text\\\");\\n }, 50);\\n };\\n this.$highlightTags = function() {\\n if (this.$highlightTagPending)\\n return;\\n var self = this;\\n this.$highlightTagPending = true;\\n setTimeout(function() {\\n self.$highlightTagPending = false;\\n \\n var session = self.session;\\n if (!session || !session.bgTokenizer) return;\\n \\n var pos = self.getCursorPosition();\\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\\n var token = iterator.getCurrentToken();\\n \\n if (!token || !/\\\\b(?:tag-open|tag-name)/.test(token.type)) {\\n session.removeMarker(session.$tagHighlight);\\n session.$tagHighlight = null;\\n return;\\n }\\n \\n if (token.type.indexOf(\\\"tag-open\\\") != -1) {\\n token = iterator.stepForward();\\n if (!token)\\n return;\\n }\\n \\n var tag = token.value;\\n var depth = 0;\\n var prevToken = iterator.stepBackward();\\n \\n if (prevToken.value == '<'){\\n do {\\n prevToken = token;\\n token = iterator.stepForward();\\n \\n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\\n if (prevToken.value === '<'){\\n depth++;\\n } else if (prevToken.value === '= 0);\\n } else {\\n do {\\n token = prevToken;\\n prevToken = iterator.stepBackward();\\n \\n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\\n if (prevToken.value === '<') {\\n depth++;\\n } else if (prevToken.value === ' 1))\\n highlight = false;\\n }\\n\\n if (session.$highlightLineMarker && !highlight) {\\n session.removeMarker(session.$highlightLineMarker.id);\\n session.$highlightLineMarker = null;\\n } else if (!session.$highlightLineMarker && highlight) {\\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\\n range.id = session.addMarker(range, \\\"ace_active-line\\\", \\\"screenLine\\\");\\n session.$highlightLineMarker = range;\\n } else if (highlight) {\\n session.$highlightLineMarker.start.row = highlight.row;\\n session.$highlightLineMarker.end.row = highlight.row;\\n session.$highlightLineMarker.start.column = highlight.column;\\n session._signal(\\\"changeBackMarker\\\");\\n }\\n };\\n\\n this.onSelectionChange = function(e) {\\n var session = this.session;\\n\\n if (session.$selectionMarker) {\\n session.removeMarker(session.$selectionMarker);\\n }\\n session.$selectionMarker = null;\\n\\n if (!this.selection.isEmpty()) {\\n var range = this.selection.getRange();\\n var style = this.getSelectionStyle();\\n session.$selectionMarker = session.addMarker(range, \\\"ace_selection\\\", style);\\n } else {\\n this.$updateHighlightActiveLine();\\n }\\n\\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\\n this.session.highlight(re);\\n\\n this._signal(\\\"changeSelection\\\");\\n };\\n\\n this.$getSelectionHighLightRegexp = function() {\\n var session = this.session;\\n\\n var selection = this.getSelectionRange();\\n if (selection.isEmpty() || selection.isMultiLine())\\n return;\\n\\n var startOuter = selection.start.column - 1;\\n var endOuter = selection.end.column + 1;\\n var line = session.getLine(selection.start.row);\\n var lineCols = line.length;\\n var needle = line.substring(Math.max(startOuter, 0),\\n Math.min(endOuter, lineCols));\\n if ((startOuter >= 0 && /^[\\\\w\\\\d]/.test(needle)) ||\\n (endOuter <= lineCols && /[\\\\w\\\\d]$/.test(needle)))\\n return;\\n\\n needle = line.substring(selection.start.column, selection.end.column);\\n if (!/^[\\\\w\\\\d]+$/.test(needle))\\n return;\\n\\n var re = this.$search.$assembleRegExp({\\n wholeWord: true,\\n caseSensitive: true,\\n needle: needle\\n });\\n\\n return re;\\n };\\n\\n\\n this.onChangeFrontMarker = function() {\\n this.renderer.updateFrontMarkers();\\n };\\n\\n this.onChangeBackMarker = function() {\\n this.renderer.updateBackMarkers();\\n };\\n\\n\\n this.onChangeBreakpoint = function() {\\n this.renderer.updateBreakpoints();\\n };\\n\\n this.onChangeAnnotation = function() {\\n this.renderer.setAnnotations(this.session.getAnnotations());\\n };\\n\\n\\n this.onChangeMode = function(e) {\\n this.renderer.updateText();\\n this._emit(\\\"changeMode\\\", e);\\n };\\n\\n\\n this.onChangeWrapLimit = function() {\\n this.renderer.updateFull();\\n };\\n\\n this.onChangeWrapMode = function() {\\n this.renderer.onResize(true);\\n };\\n\\n\\n this.onChangeFold = function() {\\n this.$updateHighlightActiveLine();\\n this.renderer.updateFull();\\n };\\n this.getSelectedText = function() {\\n return this.session.getTextRange(this.getSelectionRange());\\n };\\n this.getCopyText = function() {\\n var text = this.getSelectedText();\\n this._signal(\\\"copy\\\", text);\\n return text;\\n };\\n this.onCopy = function() {\\n this.commands.exec(\\\"copy\\\", this);\\n };\\n this.onCut = function() {\\n this.commands.exec(\\\"cut\\\", this);\\n };\\n this.onPaste = function(text, 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 if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\\n this.insert(text);\\n } else {\\n var lines = text.split(/\\\\r\\\\n|\\\\r|\\\\n/);\\n var ranges = this.selection.rangeList.ranges;\\n \\n if (lines.length > ranges.length || lines.length < 2 || !lines[1])\\n return this.commands.exec(\\\"insertstring\\\", this, text);\\n \\n for (var i = ranges.length; i--;) {\\n var range = ranges[i];\\n if (!range.isEmpty())\\n this.session.remove(range);\\n \\n this.session.insert(range.start, lines[i]);\\n }\\n }\\n };\\n\\n this.execCommand = function(command, args) {\\n return this.commands.exec(command, this, args);\\n };\\n this.insert = function(text, pasted) {\\n var session = this.session;\\n var mode = session.getMode();\\n var cursor = this.getCursorPosition();\\n\\n if (this.getBehavioursEnabled() && !pasted) {\\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\\n if (transform) {\\n if (text !== transform.text) {\\n this.session.mergeUndoDeltas = false;\\n this.$mergeNextCommand = false;\\n }\\n text = transform.text;\\n\\n }\\n }\\n \\n if (text == \\\"\\\\t\\\")\\n text = this.session.getTabString();\\n if (!this.selection.isEmpty()) {\\n var range = this.getSelectionRange();\\n cursor = this.session.remove(range);\\n this.clearSelection();\\n }\\n else if (this.session.getOverwrite() && 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 var end = session.insert(cursor, text);\\n\\n if (transform && transform.selection) {\\n if (transform.selection.length == 2) { // Transform relative to the current column\\n this.selection.setSelectionRange(\\n new Range(cursor.row, start + transform.selection[0],\\n cursor.row, start + transform.selection[1]));\\n } else { // Transform relative to the current row.\\n this.selection.setSelectionRange(\\n new Range(cursor.row + transform.selection[0],\\n transform.selection[1],\\n cursor.row + transform.selection[2],\\n transform.selection[3]));\\n }\\n }\\n\\n if (session.getDocument().isNewLine(text)) {\\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\\n\\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\\n }\\n if (shouldOutdent)\\n mode.autoOutdent(lineState, session, cursor.row);\\n };\\n\\n this.onTextInput = function(text) {\\n this.keyBinding.onTextInput(text);\\n };\\n\\n this.onCommandKey = function(e, hashId, keyCode) {\\n this.keyBinding.onCommandKey(e, hashId, keyCode);\\n };\\n this.setOverwrite = function(overwrite) {\\n this.session.setOverwrite(overwrite);\\n };\\n this.getOverwrite = function() {\\n return this.session.getOverwrite();\\n };\\n this.toggleOverwrite = function() {\\n this.session.toggleOverwrite();\\n };\\n this.setScrollSpeed = function(speed) {\\n this.setOption(\\\"scrollSpeed\\\", speed);\\n };\\n this.getScrollSpeed = function() {\\n return this.getOption(\\\"scrollSpeed\\\");\\n };\\n this.setDragDelay = function(dragDelay) {\\n this.setOption(\\\"dragDelay\\\", dragDelay);\\n };\\n this.getDragDelay = function() {\\n return this.getOption(\\\"dragDelay\\\");\\n };\\n this.setSelectionStyle = function(val) {\\n this.setOption(\\\"selectionStyle\\\", val);\\n };\\n this.getSelectionStyle = function() {\\n return this.getOption(\\\"selectionStyle\\\");\\n };\\n this.setHighlightActiveLine = function(shouldHighlight) {\\n this.setOption(\\\"highlightActiveLine\\\", shouldHighlight);\\n };\\n this.getHighlightActiveLine = function() {\\n return this.getOption(\\\"highlightActiveLine\\\");\\n };\\n this.setHighlightGutterLine = function(shouldHighlight) {\\n this.setOption(\\\"highlightGutterLine\\\", shouldHighlight);\\n };\\n\\n this.getHighlightGutterLine = function() {\\n return this.getOption(\\\"highlightGutterLine\\\");\\n };\\n this.setHighlightSelectedWord = function(shouldHighlight) {\\n this.setOption(\\\"highlightSelectedWord\\\", shouldHighlight);\\n };\\n this.getHighlightSelectedWord = function() {\\n return this.$highlightSelectedWord;\\n };\\n\\n this.setAnimatedScroll = function(shouldAnimate){\\n this.renderer.setAnimatedScroll(shouldAnimate);\\n };\\n\\n this.getAnimatedScroll = function(){\\n return this.renderer.getAnimatedScroll();\\n };\\n this.setShowInvisibles = function(showInvisibles) {\\n this.renderer.setShowInvisibles(showInvisibles);\\n };\\n this.getShowInvisibles = function() {\\n return this.renderer.getShowInvisibles();\\n };\\n\\n this.setDisplayIndentGuides = function(display) {\\n this.renderer.setDisplayIndentGuides(display);\\n };\\n\\n this.getDisplayIndentGuides = function() {\\n return this.renderer.getDisplayIndentGuides();\\n };\\n this.setShowPrintMargin = function(showPrintMargin) {\\n this.renderer.setShowPrintMargin(showPrintMargin);\\n };\\n this.getShowPrintMargin = function() {\\n return this.renderer.getShowPrintMargin();\\n };\\n this.setPrintMarginColumn = function(showPrintMargin) {\\n this.renderer.setPrintMarginColumn(showPrintMargin);\\n };\\n this.getPrintMarginColumn = function() {\\n return this.renderer.getPrintMarginColumn();\\n };\\n this.setReadOnly = function(readOnly) {\\n this.setOption(\\\"readOnly\\\", readOnly);\\n };\\n this.getReadOnly = function() {\\n return this.getOption(\\\"readOnly\\\");\\n };\\n this.setBehavioursEnabled = function (enabled) {\\n this.setOption(\\\"behavioursEnabled\\\", enabled);\\n };\\n this.getBehavioursEnabled = function () {\\n return this.getOption(\\\"behavioursEnabled\\\");\\n };\\n this.setWrapBehavioursEnabled = function (enabled) {\\n this.setOption(\\\"wrapBehavioursEnabled\\\", enabled);\\n };\\n this.getWrapBehavioursEnabled = function () {\\n return this.getOption(\\\"wrapBehavioursEnabled\\\");\\n };\\n this.setShowFoldWidgets = function(show) {\\n this.setOption(\\\"showFoldWidgets\\\", show);\\n\\n };\\n this.getShowFoldWidgets = function() {\\n return this.getOption(\\\"showFoldWidgets\\\");\\n };\\n\\n this.setFadeFoldWidgets = function(fade) {\\n this.setOption(\\\"fadeFoldWidgets\\\", fade);\\n };\\n\\n this.getFadeFoldWidgets = function() {\\n return this.getOption(\\\"fadeFoldWidgets\\\");\\n };\\n this.remove = function(dir) {\\n if (this.selection.isEmpty()){\\n if (dir == \\\"left\\\")\\n this.selection.selectLeft();\\n else\\n this.selection.selectRight();\\n }\\n\\n var range = this.getSelectionRange();\\n if (this.getBehavioursEnabled()) {\\n var session = this.session;\\n var state = session.getState(range.start.row);\\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\\n\\n if (range.end.column === 0) {\\n var text = session.getTextRange(range);\\n if (text[text.length - 1] == \\\"\\\\n\\\") {\\n var line = session.getLine(range.end.row);\\n if (/^\\\\s+$/.test(line)) {\\n range.end.column = line.length;\\n }\\n }\\n }\\n if (new_range)\\n range = new_range;\\n }\\n\\n this.session.remove(range);\\n this.clearSelection();\\n };\\n this.removeWordRight = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectWordRight();\\n\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n };\\n this.removeWordLeft = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectWordLeft();\\n\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n };\\n this.removeToLineStart = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectLineStart();\\n\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n };\\n this.removeToLineEnd = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectLineEnd();\\n\\n var range = this.getSelectionRange();\\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\\n range.end.column = 0;\\n range.end.row++;\\n }\\n\\n this.session.remove(range);\\n this.clearSelection();\\n };\\n this.splitLine = function() {\\n if (!this.selection.isEmpty()) {\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n }\\n\\n var cursor = this.getCursorPosition();\\n this.insert(\\\"\\\\n\\\");\\n this.moveCursorToPosition(cursor);\\n };\\n this.transposeLetters = function() {\\n if (!this.selection.isEmpty()) {\\n return;\\n }\\n\\n var cursor = this.getCursorPosition();\\n var column = cursor.column;\\n if (column === 0)\\n return;\\n\\n var line = this.session.getLine(cursor.row);\\n var swap, range;\\n if (column < line.length) {\\n swap = line.charAt(column) + line.charAt(column-1);\\n range = new Range(cursor.row, column-1, cursor.row, column+1);\\n }\\n else {\\n swap = line.charAt(column-1) + line.charAt(column-2);\\n range = new Range(cursor.row, column-2, cursor.row, column);\\n }\\n this.session.replace(range, swap);\\n 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 }\\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(text) {\\n this.renderer.showComposition(this.getCursorPosition());\\n };\\n\\n this.onCompositionUpdate = function(text) {\\n this.renderer.setCompositionText(text);\\n };\\n\\n this.onCompositionEnd = function() {\\n this.renderer.hideComposition();\\n };\\n this.getFirstVisibleRow = function() {\\n return this.renderer.getFirstVisibleRow();\\n };\\n this.getLastVisibleRow = function() {\\n return this.renderer.getLastVisibleRow();\\n };\\n this.isRowVisible = function(row) {\\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\\n };\\n this.isRowFullyVisible = function(row) {\\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\\n };\\n this.$getVisibleRowCount = function() {\\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\\n };\\n\\n this.$moveByPage = function(dir, select) {\\n var renderer = this.renderer;\\n var config = this.renderer.layerConfig;\\n var rows = dir * Math.floor(config.height / config.lineHeight);\\n\\n this.$blockScrolling++;\\n if (select === true) {\\n this.selection.$moveSelection(function(){\\n this.moveCursorBy(rows, 0);\\n });\\n } else if (select === false) {\\n this.selection.moveCursorBy(rows, 0);\\n this.selection.clearSelection();\\n }\\n this.$blockScrolling--;\\n\\n var scrollTop = renderer.scrollTop;\\n\\n renderer.scrollBy(0, rows * config.lineHeight);\\n if (select != null)\\n renderer.scrollCursorIntoView(null, 0.5);\\n\\n renderer.animateScrolling(scrollTop);\\n };\\n this.selectPageDown = function() {\\n this.$moveByPage(1, true);\\n };\\n this.selectPageUp = function() {\\n this.$moveByPage(-1, true);\\n };\\n this.gotoPageDown = function() {\\n this.$moveByPage(1, false);\\n };\\n this.gotoPageUp = function() {\\n this.$moveByPage(-1, false);\\n };\\n this.scrollPageDown = function() {\\n this.$moveByPage(1);\\n };\\n this.scrollPageUp = function() {\\n this.$moveByPage(-1);\\n };\\n this.scrollToRow = function(row) {\\n this.renderer.scrollToRow(row);\\n };\\n this.scrollToLine = function(line, center, animate, callback) {\\n this.renderer.scrollToLine(line, center, animate, callback);\\n };\\n this.centerSelection = function() {\\n var range = this.getSelectionRange();\\n var pos = {\\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\\n };\\n this.renderer.alignCursor(pos, 0.5);\\n };\\n this.getCursorPosition = function() {\\n return this.selection.getCursor();\\n };\\n this.getCursorPositionScreen = function() {\\n return this.session.documentToScreenPosition(this.getCursorPosition());\\n };\\n this.getSelectionRange = function() {\\n return this.selection.getRange();\\n };\\n this.selectAll = function() {\\n this.$blockScrolling += 1;\\n this.selection.selectAll();\\n this.$blockScrolling -= 1;\\n };\\n this.clearSelection = function() {\\n this.selection.clearSelection();\\n };\\n this.moveCursorTo = function(row, column) {\\n this.selection.moveCursorTo(row, column);\\n };\\n this.moveCursorToPosition = function(pos) {\\n this.selection.moveCursorToPosition(pos);\\n };\\n this.jumpToMatching = function(select, expand) {\\n var cursor = this.getCursorPosition();\\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\\n var prevToken = iterator.getCurrentToken();\\n var token = prevToken || iterator.stepForward();\\n\\n if (!token) return;\\n var matchType;\\n var found = false;\\n var depth = {};\\n var i = cursor.column - token.start;\\n var bracketType;\\n var brackets = {\\n \\\")\\\": \\\"(\\\",\\n \\\"(\\\": \\\"(\\\",\\n \\\"]\\\": \\\"[\\\",\\n \\\"[\\\": \\\"[\\\",\\n \\\"{\\\": \\\"{\\\",\\n \\\"}\\\": \\\"{\\\"\\n };\\n \\n do {\\n if (token.value.match(/[{}()\\\\[\\\\]]/g)) {\\n for (; i < token.value.length && !found; i++) {\\n if (!brackets[token.value[i]]) {\\n continue;\\n }\\n\\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\\\"rparen\\\", \\\"lparen\\\");\\n\\n if (isNaN(depth[bracketType])) {\\n depth[bracketType] = 0;\\n }\\n\\n switch (token.value[i]) {\\n case '(':\\n case '[':\\n case '{':\\n depth[bracketType]++;\\n break;\\n case ')':\\n case ']':\\n case '}':\\n depth[bracketType]--;\\n\\n if (depth[bracketType] === -1) {\\n matchType = 'bracket';\\n found = true;\\n }\\n break;\\n }\\n }\\n }\\n else if (token && token.type.indexOf('tag-name') !== -1) {\\n if (isNaN(depth[token.value])) {\\n depth[token.value] = 0;\\n }\\n \\n if (prevToken.value === '<') {\\n depth[token.value]++;\\n }\\n else if (prevToken.value === '= 0; --i) {\\n if(this.$tryReplace(ranges[i], replacement)) {\\n replaced++;\\n }\\n }\\n\\n this.selection.setSelectionRange(selection);\\n this.$blockScrolling -= 1;\\n\\n return replaced;\\n };\\n\\n this.$tryReplace = function(range, replacement) {\\n var input = this.session.getTextRange(range);\\n replacement = this.$search.replace(input, replacement);\\n if (replacement !== null) {\\n range.end = this.session.replace(range, replacement);\\n return range;\\n } else {\\n return null;\\n }\\n };\\n this.getLastSearchOptions = function() {\\n return this.$search.getOptions();\\n };\\n this.find = function(needle, options, animate) {\\n if (!options)\\n options = {};\\n\\n if (typeof needle == \\\"string\\\" || needle instanceof RegExp)\\n options.needle = needle;\\n else if (typeof needle == \\\"object\\\")\\n oop.mixin(options, needle);\\n\\n var range = this.selection.getRange();\\n if (options.needle == null) {\\n needle = this.session.getTextRange(range)\\n || this.$search.$options.needle;\\n if (!needle) {\\n range = this.session.getWordRange(range.start.row, range.start.column);\\n needle = this.session.getTextRange(range);\\n }\\n this.$search.set({needle: needle});\\n }\\n\\n this.$search.set(options);\\n if (!options.start)\\n this.$search.set({start: range});\\n\\n var newRange = this.$search.find(this.session);\\n if (options.preventScroll)\\n return newRange;\\n if (newRange) {\\n this.revealRange(newRange, animate);\\n return newRange;\\n }\\n if (options.backwards)\\n range.start = range.end;\\n else\\n range.end = range.start;\\n this.selection.setRange(range);\\n };\\n this.findNext = function(options, animate) {\\n this.find({skipCurrent: true, backwards: false}, options, animate);\\n };\\n this.findPrevious = function(options, animate) {\\n this.find(options, {skipCurrent: true, backwards: true}, animate);\\n };\\n\\n this.revealRange = function(range, animate) {\\n this.$blockScrolling += 1;\\n this.session.unfold(range);\\n this.selection.setSelectionRange(range);\\n this.$blockScrolling -= 1;\\n\\n var scrollTop = this.renderer.scrollTop;\\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\\n if (animate !== false)\\n this.renderer.animateScrolling(scrollTop);\\n };\\n this.undo = function() {\\n this.$blockScrolling++;\\n this.session.getUndoManager().undo();\\n this.$blockScrolling--;\\n this.renderer.scrollCursorIntoView(null, 0.5);\\n };\\n this.redo = function() {\\n this.$blockScrolling++;\\n this.session.getUndoManager().redo();\\n this.$blockScrolling--;\\n this.renderer.scrollCursorIntoView(null, 0.5);\\n };\\n this.destroy = function() {\\n this.renderer.destroy();\\n this._signal(\\\"destroy\\\", this);\\n if (this.session) {\\n this.session.destroy();\\n }\\n };\\n this.setAutoScrollEditorIntoView = function(enable) {\\n if (!enable)\\n return;\\n var rect;\\n var self = this;\\n var shouldScroll = false;\\n if (!this.$scrollAnchor)\\n this.$scrollAnchor = document.createElement(\\\"div\\\");\\n var scrollAnchor = this.$scrollAnchor;\\n scrollAnchor.style.cssText = \\\"position:absolute\\\";\\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\\n var onChangeSelection = this.on(\\\"changeSelection\\\", function() {\\n shouldScroll = true;\\n });\\n var onBeforeRender = this.renderer.on(\\\"beforeRender\\\", function() {\\n if (shouldScroll)\\n rect = self.renderer.container.getBoundingClientRect();\\n });\\n var onAfterRender = this.renderer.on(\\\"afterRender\\\", function() {\\n if (shouldScroll && rect && (self.isFocused()\\n || self.searchBox && self.searchBox.isFocused())\\n ) {\\n var renderer = self.renderer;\\n var pos = renderer.$cursorLayer.$pixelPos;\\n var config = renderer.layerConfig;\\n var top = pos.top - config.offset;\\n if (pos.top >= 0 && top + rect.top < 0) {\\n shouldScroll = true;\\n } else if (pos.top < config.height &&\\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\\n shouldScroll = false;\\n } else {\\n shouldScroll = null;\\n }\\n if (shouldScroll != null) {\\n scrollAnchor.style.top = top + \\\"px\\\";\\n scrollAnchor.style.left = pos.left + \\\"px\\\";\\n scrollAnchor.style.height = config.lineHeight + \\\"px\\\";\\n scrollAnchor.scrollIntoView(shouldScroll);\\n }\\n shouldScroll = rect = null;\\n }\\n });\\n this.setAutoScrollEditorIntoView = function(enable) {\\n if (enable)\\n return;\\n delete this.setAutoScrollEditorIntoView;\\n this.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\\n}).call(Editor.prototype);\\n\\n\\n\\nconfig.defineOptions(Editor.prototype, \\\"editor\\\", {\\n selectionStyle: {\\n set: function(style) {\\n this.onSelectionChange();\\n this._signal(\\\"changeSelectionStyle\\\", {data: style});\\n },\\n initialValue: \\\"line\\\"\\n },\\n highlightActiveLine: {\\n set: function() {this.$updateHighlightActiveLine();},\\n initialValue: true\\n },\\n highlightSelectedWord: {\\n set: function(shouldHighlight) {this.$onSelectionChange();},\\n initialValue: true\\n },\\n readOnly: {\\n set: function(readOnly) {\\n this.$resetCursorStyle(); \\n },\\n initialValue: false\\n },\\n cursorStyle: {\\n set: function(val) { this.$resetCursorStyle(); },\\n values: [\\\"ace\\\", \\\"slim\\\", \\\"smooth\\\", \\\"wide\\\"],\\n initialValue: \\\"ace\\\"\\n },\\n mergeUndoDeltas: {\\n values: [false, true, \\\"always\\\"],\\n initialValue: true\\n },\\n behavioursEnabled: {initialValue: true},\\n wrapBehavioursEnabled: {initialValue: true},\\n autoScrollEditorIntoView: {\\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\\n },\\n keyboardHandler: {\\n set: function(val) { this.setKeyboardHandler(val); },\\n get: function() { return this.keybindingId; },\\n handlesSet: true\\n },\\n\\n hScrollBarAlwaysVisible: \\\"renderer\\\",\\n vScrollBarAlwaysVisible: \\\"renderer\\\",\\n highlightGutterLine: \\\"renderer\\\",\\n animatedScroll: \\\"renderer\\\",\\n showInvisibles: \\\"renderer\\\",\\n showPrintMargin: \\\"renderer\\\",\\n printMarginColumn: \\\"renderer\\\",\\n printMargin: \\\"renderer\\\",\\n fadeFoldWidgets: \\\"renderer\\\",\\n showFoldWidgets: \\\"renderer\\\",\\n showLineNumbers: \\\"renderer\\\",\\n showGutter: \\\"renderer\\\",\\n displayIndentGuides: \\\"renderer\\\",\\n fontSize: \\\"renderer\\\",\\n fontFamily: \\\"renderer\\\",\\n maxLines: \\\"renderer\\\",\\n minLines: \\\"renderer\\\",\\n scrollPastEnd: \\\"renderer\\\",\\n fixedWidthGutter: \\\"renderer\\\",\\n theme: \\\"renderer\\\",\\n\\n scrollSpeed: \\\"$mouseHandler\\\",\\n dragDelay: \\\"$mouseHandler\\\",\\n dragEnabled: \\\"$mouseHandler\\\",\\n focusTimout: \\\"$mouseHandler\\\",\\n tooltipFollowsMouse: \\\"$mouseHandler\\\",\\n\\n firstLineNumber: \\\"session\\\",\\n overwrite: \\\"session\\\",\\n newLineMode: \\\"session\\\",\\n useWorker: \\\"session\\\",\\n useSoftTabs: \\\"session\\\",\\n tabSize: \\\"session\\\",\\n wrap: \\\"session\\\",\\n indentedSoftWrap: \\\"session\\\",\\n foldStyle: \\\"session\\\",\\n mode: \\\"session\\\"\\n});\\n\\nexports.Editor = Editor;\\n});\\n\\ndefine(\\\"ace/undomanager\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nvar UndoManager = function() {\\n this.reset();\\n};\\n\\n(function() {\\n this.execute = function(options) {\\n var deltaSets = options.args[0];\\n this.$doc = options.args[1];\\n if (options.merge && this.hasUndo()){\\n this.dirtyCounter--;\\n deltaSets = this.$undoStack.pop().concat(deltaSets);\\n }\\n this.$undoStack.push(deltaSets);\\n this.$redoStack = [];\\n if (this.dirtyCounter < 0) {\\n this.dirtyCounter = NaN;\\n }\\n this.dirtyCounter++;\\n };\\n this.undo = function(dontSelect) {\\n var deltaSets = this.$undoStack.pop();\\n var undoSelectionRange = null;\\n if (deltaSets) {\\n undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\\n this.$redoStack.push(deltaSets);\\n this.dirtyCounter--;\\n }\\n\\n return undoSelectionRange;\\n };\\n this.redo = function(dontSelect) {\\n var deltaSets = this.$redoStack.pop();\\n var redoSelectionRange = null;\\n if (deltaSets) {\\n redoSelectionRange =\\n this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\\n this.$undoStack.push(deltaSets);\\n this.dirtyCounter++;\\n }\\n return redoSelectionRange;\\n };\\n this.reset = function() {\\n this.$undoStack = [];\\n this.$redoStack = [];\\n this.dirtyCounter = 0;\\n };\\n this.hasUndo = function() {\\n return this.$undoStack.length > 0;\\n };\\n this.hasRedo = function() {\\n return this.$redoStack.length > 0;\\n };\\n this.markClean = function() {\\n this.dirtyCounter = 0;\\n };\\n this.isClean = function() {\\n return this.dirtyCounter === 0;\\n };\\n this.$serializeDeltas = function(deltaSets) {\\n return cloneDeltaSetsObj(deltaSets, $serializeDelta);\\n };\\n this.$deserializeDeltas = function(deltaSets) {\\n return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\\n };\\n \\n function $serializeDelta(delta){\\n return {\\n action: delta.action,\\n start: delta.start,\\n end: delta.end,\\n lines: delta.lines.length == 1 ? null : delta.lines,\\n text: delta.lines.length == 1 ? delta.lines[0] : null\\n };\\n }\\n \\n function $deserializeDelta(delta) {\\n return {\\n action: delta.action,\\n start: delta.start,\\n end: delta.end,\\n lines: delta.lines || [delta.text]\\n };\\n }\\n \\n function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\\n var deltaSets_new = new Array(deltaSets_old.length);\\n for (var i = 0; i < deltaSets_old.length; i++) {\\n var deltaSet_old = deltaSets_old[i];\\n var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\\n \\n for (var j = 0; j < deltaSet_old.deltas.length; j++) {\\n var delta_old = deltaSet_old.deltas[j];\\n deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\\n }\\n \\n deltaSets_new[i] = deltaSet_new;\\n }\\n return deltaSets_new;\\n }\\n \\n}).call(UndoManager.prototype);\\n\\nexports.UndoManager = UndoManager;\\n});\\n\\ndefine(\\\"ace/layer/gutter\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar oop = require(\\\"../lib/oop\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar EventEmitter = require(\\\"../lib/event_emitter\\\").EventEmitter;\\n\\nvar Gutter = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_gutter-layer\\\";\\n parentEl.appendChild(this.element);\\n this.setShowFoldWidgets(this.$showFoldWidgets);\\n \\n this.gutterWidth = 0;\\n\\n this.$annotations = [];\\n this.$updateAnnotations = this.$updateAnnotations.bind(this);\\n\\n this.$cells = [];\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n\\n this.setSession = function(session) {\\n if (this.session)\\n this.session.removeEventListener(\\\"change\\\", this.$updateAnnotations);\\n this.session = session;\\n if (session)\\n session.on(\\\"change\\\", this.$updateAnnotations);\\n };\\n\\n this.addGutterDecoration = function(row, className){\\n if (window.console)\\n console.warn && console.warn(\\\"deprecated use session.addGutterDecoration\\\");\\n this.session.addGutterDecoration(row, className);\\n };\\n\\n this.removeGutterDecoration = function(row, className){\\n if (window.console)\\n console.warn && console.warn(\\\"deprecated use session.removeGutterDecoration\\\");\\n this.session.removeGutterDecoration(row, className);\\n };\\n\\n this.setAnnotations = function(annotations) {\\n this.$annotations = [];\\n for (var i = 0; i < annotations.length; i++) {\\n var annotation = annotations[i];\\n var row = annotation.row;\\n var rowInfo = this.$annotations[row];\\n if (!rowInfo)\\n rowInfo = this.$annotations[row] = {text: []};\\n \\n var annoText = annotation.text;\\n annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \\\"\\\";\\n\\n if (rowInfo.text.indexOf(annoText) === -1)\\n rowInfo.text.push(annoText);\\n\\n var type = annotation.type;\\n if (type == \\\"error\\\")\\n rowInfo.className = \\\" ace_error\\\";\\n else if (type == \\\"warning\\\" && rowInfo.className != \\\" ace_error\\\")\\n rowInfo.className = \\\" ace_warning\\\";\\n else if (type == \\\"info\\\" && (!rowInfo.className))\\n rowInfo.className = \\\" ace_info\\\";\\n }\\n };\\n\\n this.$updateAnnotations = function (delta) {\\n if (!this.$annotations.length)\\n return;\\n var firstRow = delta.start.row;\\n var len = delta.end.row - firstRow;\\n if (len === 0) {\\n } else if (delta.action == 'remove') {\\n this.$annotations.splice(firstRow, len + 1, null);\\n } else {\\n var args = new Array(len + 1);\\n args.unshift(firstRow, 1);\\n this.$annotations.splice.apply(this.$annotations, args);\\n }\\n };\\n\\n this.update = function(config) {\\n var session = this.session;\\n var firstRow = config.firstRow;\\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\\n session.getLength() - 1);\\n var fold = session.getNextFoldLine(firstRow);\\n var foldStart = fold ? fold.start.row : Infinity;\\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\\n var breakpoints = session.$breakpoints;\\n var decorations = session.$decorations;\\n var firstLineNumber = session.$firstLineNumber;\\n var lastLineNumber = 0;\\n \\n var gutterRenderer = session.gutterRenderer || this.$renderer;\\n\\n var cell = null;\\n var index = -1;\\n var row = firstRow;\\n while (true) {\\n if (row > foldStart) {\\n row = fold.end.row + 1;\\n fold = session.getNextFoldLine(row, fold);\\n foldStart = fold ? fold.start.row : Infinity;\\n }\\n if (row > lastRow) {\\n while (this.$cells.length > index + 1) {\\n cell = this.$cells.pop();\\n this.element.removeChild(cell.element);\\n }\\n break;\\n }\\n\\n cell = this.$cells[++index];\\n if (!cell) {\\n cell = {element: null, textNode: null, foldWidget: null};\\n cell.element = dom.createElement(\\\"div\\\");\\n cell.textNode = document.createTextNode('');\\n cell.element.appendChild(cell.textNode);\\n this.element.appendChild(cell.element);\\n this.$cells[index] = cell;\\n }\\n\\n var className = \\\"ace_gutter-cell \\\";\\n if (breakpoints[row])\\n className += breakpoints[row];\\n if (decorations[row])\\n className += decorations[row];\\n if (this.$annotations[row])\\n className += this.$annotations[row].className;\\n if (cell.element.className != className)\\n cell.element.className = className;\\n\\n var height = session.getRowLength(row) * config.lineHeight + \\\"px\\\";\\n if (height != cell.element.style.height)\\n cell.element.style.height = height;\\n\\n if (foldWidgets) {\\n var c = foldWidgets[row];\\n if (c == null)\\n c = foldWidgets[row] = session.getFoldWidget(row);\\n }\\n\\n if (c) {\\n if (!cell.foldWidget) {\\n cell.foldWidget = dom.createElement(\\\"span\\\");\\n cell.element.appendChild(cell.foldWidget);\\n }\\n var className = \\\"ace_fold-widget ace_\\\" + c;\\n if (c == \\\"start\\\" && row == foldStart && row < fold.end.row)\\n className += \\\" ace_closed\\\";\\n else\\n className += \\\" ace_open\\\";\\n if (cell.foldWidget.className != className)\\n cell.foldWidget.className = className;\\n\\n var height = config.lineHeight + \\\"px\\\";\\n if (cell.foldWidget.style.height != height)\\n cell.foldWidget.style.height = height;\\n } else {\\n if (cell.foldWidget) {\\n cell.element.removeChild(cell.foldWidget);\\n cell.foldWidget = null;\\n }\\n }\\n \\n var text = lastLineNumber = gutterRenderer\\n ? gutterRenderer.getText(session, row)\\n : row + firstLineNumber;\\n if (text !== cell.textNode.data)\\n cell.textNode.data = text;\\n\\n row++;\\n }\\n\\n this.element.style.height = config.minHeight + \\\"px\\\";\\n\\n if (this.$fixedWidth || session.$useWrapMode)\\n lastLineNumber = session.getLength() + firstLineNumber;\\n\\n var gutterWidth = gutterRenderer \\n ? gutterRenderer.getWidth(session, lastLineNumber, config)\\n : lastLineNumber.toString().length * config.characterWidth;\\n \\n var padding = this.$padding || this.$computePadding();\\n gutterWidth += padding.left + padding.right;\\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\\n this.gutterWidth = gutterWidth;\\n this.element.style.width = Math.ceil(this.gutterWidth) + \\\"px\\\";\\n this._emit(\\\"changeGutterWidth\\\", gutterWidth);\\n }\\n };\\n\\n this.$fixedWidth = false;\\n \\n this.$showLineNumbers = true;\\n this.$renderer = \\\"\\\";\\n this.setShowLineNumbers = function(show) {\\n this.$renderer = !show && {\\n getWidth: function() {return \\\"\\\";},\\n getText: function() {return \\\"\\\";}\\n };\\n };\\n \\n this.getShowLineNumbers = function() {\\n return this.$showLineNumbers;\\n };\\n \\n this.$showFoldWidgets = true;\\n this.setShowFoldWidgets = function(show) {\\n if (show)\\n dom.addCssClass(this.element, \\\"ace_folding-enabled\\\");\\n else\\n dom.removeCssClass(this.element, \\\"ace_folding-enabled\\\");\\n\\n this.$showFoldWidgets = show;\\n this.$padding = null;\\n };\\n \\n this.getShowFoldWidgets = function() {\\n return this.$showFoldWidgets;\\n };\\n\\n this.$computePadding = function() {\\n if (!this.element.firstChild)\\n return {left: 0, right: 0};\\n var style = dom.computedStyle(this.element.firstChild);\\n this.$padding = {};\\n this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\\n this.$padding.right = parseInt(style.paddingRight) || 0;\\n return this.$padding;\\n };\\n\\n this.getRegion = function(point) {\\n var padding = this.$padding || this.$computePadding();\\n var rect = this.element.getBoundingClientRect();\\n if (point.x < padding.left + rect.left)\\n return \\\"markers\\\";\\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\\n return \\\"foldWidgets\\\";\\n };\\n\\n}).call(Gutter.prototype);\\n\\nexports.Gutter = Gutter;\\n\\n});\\n\\ndefine(\\\"ace/layer/marker\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/lib/dom\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../range\\\").Range;\\nvar dom = require(\\\"../lib/dom\\\");\\n\\nvar Marker = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_marker-layer\\\";\\n parentEl.appendChild(this.element);\\n};\\n\\n(function() {\\n\\n this.$padding = 0;\\n\\n this.setPadding = function(padding) {\\n this.$padding = padding;\\n };\\n this.setSession = function(session) {\\n this.session = session;\\n };\\n \\n this.setMarkers = function(markers) {\\n this.markers = markers;\\n };\\n\\n this.update = function(config) {\\n if (!config) return;\\n\\n this.config = config;\\n\\n\\n var html = [];\\n for (var key in this.markers) {\\n var marker = this.markers[key];\\n\\n if (!marker.range) {\\n marker.update(html, this, this.session, config);\\n continue;\\n }\\n\\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\\n if (range.isEmpty()) continue;\\n\\n range = range.toScreenRange(this.session);\\n if (marker.renderer) {\\n var top = this.$getTop(range.start.row, config);\\n var left = this.$padding + (this.session.$bidiHandler.isBidiRow(range.start.row)\\n ? this.session.$bidiHandler.getPosLeft(range.start.column)\\n : 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 if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\\n this.drawBidiSingleLineMarker(html, range, marker.clazz + \\\" ace_start\\\" + \\\" ace_br15\\\", config);\\n } else {\\n this.drawSingleLineMarker(html, range, marker.clazz + \\\" ace_start\\\" + \\\" ace_br15\\\", config);\\n }\\n }\\n }\\n this.element.innerHTML = html.join(\\\"\\\");\\n };\\n\\n this.$getTop = function(row, layerConfig) {\\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\\n };\\n\\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 clazzModified = null;\\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 clazzModified = clazz + (row == start ? \\\" ace_start\\\" : \\\"\\\") + \\\" ace_br\\\"\\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end);\\n \\n if (this.session.$bidiHandler.isBidiRow(row)) {\\n this.drawBidiSingleLineMarker(stringBuilder, lineRange, clazzModified, \\n layerConfig, row == end ? 0 : 1, extraStyle);\\n } else {\\n this.drawSingleLineMarker(stringBuilder, lineRange, clazzModified, \\n layerConfig, row == end ? 0 : 1, extraStyle);\\n }\\n }\\n };\\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\\n var padding = this.$padding;\\n var height, top, left;\\n extraStyle = extraStyle || \\\"\\\";\\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 height = config.lineHeight;\\n top = this.$getTop(range.start.row, config);\\n left = padding + range.start.column * config.characterWidth;\\n stringBuilder.push(\\n \\\"
\\\"\\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 var width = range.end.column * config.characterWidth;\\n height = config.lineHeight;\\n top = this.$getTop(range.end.row, config);\\n stringBuilder.push(\\n \\\"
\\\"\\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 stringBuilder.push(\\n \\\"
\\\"\\n );\\n };\\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\\n var height = config.lineHeight;\\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\\n\\n var top = this.$getTop(range.start.row, config);\\n var left = this.$padding + range.start.column * config.characterWidth;\\n\\n stringBuilder.push(\\n \\\"
\\\"\\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 stringBuilder.push(\\n \\\"
\\\"\\n );\\n });\\n };\\n\\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\\n var top = this.$getTop(range.start.row, config);\\n var height = config.lineHeight;\\n if (range.start.row != range.end.row)\\n height += this.$getTop(range.end.row, config) - top;\\n\\n stringBuilder.push(\\n \\\"
\\\"\\n );\\n };\\n \\n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\\n var top = this.$getTop(range.start.row, config);\\n var height = config.lineHeight;\\n\\n stringBuilder.push(\\n \\\"
\\\"\\n );\\n };\\n\\n}).call(Marker.prototype);\\n\\nexports.Marker = Marker;\\n\\n});\\n\\ndefine(\\\"ace/layer/text\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"../lib/oop\\\");\\nvar dom = require(\\\"../lib/dom\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\nvar EventEmitter = require(\\\"../lib/event_emitter\\\").EventEmitter;\\n\\nvar Text = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_text-layer\\\";\\n parentEl.appendChild(this.element);\\n this.$updateEolChar = this.$updateEolChar.bind(this);\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n\\n this.EOF_CHAR = \\\"\\\\xB6\\\";\\n this.EOL_CHAR_LF = \\\"\\\\xAC\\\";\\n this.EOL_CHAR_CRLF = \\\"\\\\xa4\\\";\\n this.EOL_CHAR = this.EOL_CHAR_LF;\\n this.TAB_CHAR = \\\"\\\\u2014\\\"; //\\\"\\\\u21E5\\\";\\n this.SPACE_CHAR = \\\"\\\\xB7\\\";\\n this.$padding = 0;\\n\\n this.$updateEolChar = function() {\\n var EOL_CHAR = this.session.doc.getNewLineCharacter() == \\\"\\\\n\\\"\\n ? this.EOL_CHAR_LF\\n : this.EOL_CHAR_CRLF;\\n if (this.EOL_CHAR != EOL_CHAR) {\\n this.EOL_CHAR = EOL_CHAR;\\n return true;\\n }\\n };\\n\\n this.setPadding = function(padding) {\\n this.$padding = padding;\\n this.element.style.padding = \\\"0 \\\" + padding + \\\"px\\\";\\n };\\n\\n this.getLineHeight = function() {\\n return this.$fontMetrics.$characterSize.height || 0;\\n };\\n\\n this.getCharacterWidth = function() {\\n return this.$fontMetrics.$characterSize.width || 0;\\n };\\n \\n this.$setFontMetrics = function(measure) {\\n this.$fontMetrics = measure;\\n this.$fontMetrics.on(\\\"changeCharacterSize\\\", function(e) {\\n this._signal(\\\"changeCharacterSize\\\", e);\\n }.bind(this));\\n this.$pollSizeChanges();\\n };\\n\\n this.checkForSizeChanges = function() {\\n this.$fontMetrics.checkForSizeChanges();\\n };\\n this.$pollSizeChanges = function() {\\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\\n };\\n this.setSession = function(session) {\\n this.session = session;\\n if (session)\\n this.$computeTabString();\\n };\\n\\n this.showInvisibles = false;\\n this.setShowInvisibles = function(showInvisibles) {\\n if (this.showInvisibles == showInvisibles)\\n return false;\\n\\n this.showInvisibles = showInvisibles;\\n this.$computeTabString();\\n return true;\\n };\\n\\n this.displayIndentGuides = true;\\n this.setDisplayIndentGuides = function(display) {\\n if (this.displayIndentGuides == display)\\n return false;\\n\\n this.displayIndentGuides = display;\\n this.$computeTabString();\\n return true;\\n };\\n\\n this.$tabStrings = [];\\n this.onChangeTabSize =\\n this.$computeTabString = function() {\\n var tabSize = this.session.getTabSize();\\n this.tabSize = tabSize;\\n var tabStr = this.$tabStrings = [0];\\n for (var i = 1; i < tabSize + 1; i++) {\\n if (this.showInvisibles) {\\n tabStr.push(\\\"\\\"\\n + lang.stringRepeat(this.TAB_CHAR, i)\\n + \\\"\\\");\\n } else {\\n tabStr.push(lang.stringRepeat(\\\" \\\", i));\\n }\\n }\\n if (this.displayIndentGuides) {\\n this.$indentGuideRe = /\\\\s\\\\S| \\\\t|\\\\t |\\\\s$/;\\n var className = \\\"ace_indent-guide\\\";\\n var spaceClass = \\\"\\\";\\n var tabClass = \\\"\\\";\\n if (this.showInvisibles) {\\n className += \\\" ace_invisible\\\";\\n spaceClass = \\\" ace_invisible_space\\\";\\n tabClass = \\\" ace_invisible_tab\\\";\\n var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\\n var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\\n } else{\\n var spaceContent = lang.stringRepeat(\\\" \\\", this.tabSize);\\n var tabContent = spaceContent;\\n }\\n\\n this.$tabStrings[\\\" \\\"] = \\\"\\\" + spaceContent + \\\"\\\";\\n this.$tabStrings[\\\"\\\\t\\\"] = \\\"\\\" + tabContent + \\\"\\\";\\n }\\n };\\n\\n this.updateLines = function(config, firstRow, lastRow) {\\n if (this.config.lastRow != config.lastRow ||\\n this.config.firstRow != config.firstRow) {\\n this.scrollLines(config);\\n }\\n this.config = config;\\n\\n var first = Math.max(firstRow, config.firstRow);\\n var last = Math.min(lastRow, config.lastRow);\\n\\n var lineElements = this.element.childNodes;\\n var lineElementsIdx = 0;\\n\\n for (var row = config.firstRow; row < first; row++) {\\n var foldLine = this.session.getFoldLine(row);\\n if (foldLine) {\\n if (foldLine.containsRow(first)) {\\n first = foldLine.start.row;\\n break;\\n } else {\\n row = foldLine.end.row;\\n }\\n }\\n lineElementsIdx ++;\\n }\\n\\n var row = first;\\n var foldLine = this.session.getNextFoldLine(row);\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n\\n while (true) {\\n if (row > foldStart) {\\n row = foldLine.end.row+1;\\n foldLine = this.session.getNextFoldLine(row, foldLine);\\n foldStart = foldLine ? foldLine.start.row :Infinity;\\n }\\n if (row > last)\\n break;\\n\\n var lineElement = lineElements[lineElementsIdx++];\\n if (lineElement) {\\n var html = [];\\n this.$renderLine(\\n html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\\n );\\n lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \\\"px\\\";\\n lineElement.innerHTML = html.join(\\\"\\\");\\n }\\n row++;\\n }\\n };\\n\\n this.scrollLines = function(config) {\\n var oldConfig = this.config;\\n this.config = config;\\n\\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\\n return this.update(config);\\n\\n if (config.lastRow < oldConfig.firstRow)\\n return this.update(config);\\n\\n var el = this.element;\\n if (oldConfig.firstRow < config.firstRow)\\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\\n el.removeChild(el.firstChild);\\n\\n if (oldConfig.lastRow > config.lastRow)\\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\\n el.removeChild(el.lastChild);\\n\\n if (config.firstRow < oldConfig.firstRow) {\\n var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\\n if (el.firstChild)\\n el.insertBefore(fragment, el.firstChild);\\n else\\n el.appendChild(fragment);\\n }\\n\\n if (config.lastRow > oldConfig.lastRow) {\\n var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\\n el.appendChild(fragment);\\n }\\n };\\n\\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\\n var fragment = this.element.ownerDocument.createDocumentFragment();\\n var row = firstRow;\\n var foldLine = this.session.getNextFoldLine(row);\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n\\n while (true) {\\n if (row > foldStart) {\\n row = foldLine.end.row+1;\\n foldLine = this.session.getNextFoldLine(row, foldLine);\\n foldStart = foldLine ? foldLine.start.row : Infinity;\\n }\\n if (row > lastRow)\\n break;\\n\\n var container = dom.createElement(\\\"div\\\");\\n\\n var html = [];\\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\\n container.innerHTML = html.join(\\\"\\\");\\n if (this.$useLineGroups()) {\\n container.className = 'ace_line_group';\\n fragment.appendChild(container);\\n container.style.height = config.lineHeight * this.session.getRowLength(row) + \\\"px\\\";\\n\\n } else {\\n while(container.firstChild)\\n fragment.appendChild(container.firstChild);\\n }\\n\\n row++;\\n }\\n return fragment;\\n };\\n\\n this.update = function(config) {\\n this.config = config;\\n\\n var html = [];\\n var firstRow = config.firstRow, lastRow = config.lastRow;\\n\\n var row = firstRow;\\n var foldLine = this.session.getNextFoldLine(row);\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n\\n while (true) {\\n if (row > foldStart) {\\n row = foldLine.end.row+1;\\n foldLine = this.session.getNextFoldLine(row, foldLine);\\n foldStart = foldLine ? foldLine.start.row :Infinity;\\n }\\n if (row > lastRow)\\n break;\\n\\n if (this.$useLineGroups())\\n html.push(\\\"
\\\");\\n\\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\\n\\n if (this.$useLineGroups())\\n html.push(\\\"
\\\"); // end the line group\\n\\n row++;\\n }\\n this.element.innerHTML = html.join(\\\"\\\");\\n };\\n\\n this.$textToken = {\\n \\\"text\\\": true,\\n \\\"rparen\\\": true,\\n \\\"lparen\\\": true\\n };\\n\\n this.$renderToken = function(stringBuilder, screenColumn, token, value) {\\n var self = this;\\n var replaceReg = /\\\\t|&|<|>|( +)|([\\\\x00-\\\\x1f\\\\x80-\\\\xa0\\\\xad\\\\u1680\\\\u180E\\\\u2000-\\\\u200f\\\\u2028\\\\u2029\\\\u202F\\\\u205F\\\\u3000\\\\uFEFF\\\\uFFF9-\\\\uFFFC])|[\\\\u1100-\\\\u115F\\\\u11A3-\\\\u11A7\\\\u11FA-\\\\u11FF\\\\u2329-\\\\u232A\\\\u2E80-\\\\u2E99\\\\u2E9B-\\\\u2EF3\\\\u2F00-\\\\u2FD5\\\\u2FF0-\\\\u2FFB\\\\u3000-\\\\u303E\\\\u3041-\\\\u3096\\\\u3099-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u3190-\\\\u31BA\\\\u31C0-\\\\u31E3\\\\u31F0-\\\\u321E\\\\u3220-\\\\u3247\\\\u3250-\\\\u32FE\\\\u3300-\\\\u4DBF\\\\u4E00-\\\\uA48C\\\\uA490-\\\\uA4C6\\\\uA960-\\\\uA97C\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFAFF\\\\uFE10-\\\\uFE19\\\\uFE30-\\\\uFE52\\\\uFE54-\\\\uFE66\\\\uFE68-\\\\uFE6B\\\\uFF01-\\\\uFF60\\\\uFFE0-\\\\uFFE6]|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]/g;\\n var replaceFunc = function(c, a, b, tabIdx, idx4) {\\n if (a) {\\n return self.showInvisibles\\n ? \\\"\\\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \\\"\\\"\\n : c;\\n } else if (c == \\\"&\\\") {\\n return \\\"&\\\";\\n } else if (c == \\\"<\\\") {\\n return \\\"<\\\";\\n } else if (c == \\\">\\\") {\\n return \\\">\\\";\\n } else if (c == \\\"\\\\t\\\") {\\n var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\\n screenColumn += tabSize - 1;\\n return self.$tabStrings[tabSize];\\n } else if (c == \\\"\\\\u3000\\\") {\\n var classToUse = self.showInvisibles ? \\\"ace_cjk ace_invisible ace_invisible_space\\\" : \\\"ace_cjk\\\";\\n var space = self.showInvisibles ? self.SPACE_CHAR : \\\"\\\";\\n screenColumn += 1;\\n return \\\"\\\" + space + \\\"\\\";\\n } else if (b) {\\n return \\\"\\\" + self.SPACE_CHAR + \\\"\\\";\\n } else {\\n screenColumn += 1;\\n return \\\"\\\" + c + \\\"\\\";\\n }\\n };\\n\\n var output = value.replace(replaceReg, replaceFunc);\\n\\n if (!this.$textToken[token.type]) {\\n var classes = \\\"ace_\\\" + token.type.replace(/\\\\./g, \\\" ace_\\\");\\n var style = \\\"\\\";\\n if (token.type == \\\"fold\\\")\\n style = \\\" style='width:\\\" + (token.value.length * this.config.characterWidth) + \\\"px;' \\\";\\n stringBuilder.push(\\\"\\\", output, \\\"\\\");\\n }\\n else {\\n stringBuilder.push(output);\\n }\\n return screenColumn + value.length;\\n };\\n\\n this.renderIndentGuide = function(stringBuilder, value, max) {\\n var cols = value.search(this.$indentGuideRe);\\n if (cols <= 0 || cols >= max)\\n return value;\\n if (value[0] == \\\" \\\") {\\n cols -= cols % this.tabSize;\\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\\\" \\\"], cols/this.tabSize));\\n return value.substr(cols);\\n } else if (value[0] == \\\"\\\\t\\\") {\\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\\\"\\\\t\\\"], cols));\\n return value.substr(cols);\\n }\\n return value;\\n };\\n\\n this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\\n var chars = 0;\\n var split = 0;\\n var splitChars = splits[0];\\n var screenColumn = 0;\\n\\n for (var i = 0; i < tokens.length; i++) {\\n var token = tokens[i];\\n var value = token.value;\\n if (i == 0 && this.displayIndentGuides) {\\n chars = value.length;\\n value = this.renderIndentGuide(stringBuilder, value, splitChars);\\n if (!value)\\n continue;\\n chars -= value.length;\\n }\\n\\n if (chars + value.length < splitChars) {\\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\\n chars += value.length;\\n } else {\\n while (chars + value.length >= splitChars) {\\n screenColumn = this.$renderToken(\\n stringBuilder, screenColumn,\\n token, value.substring(0, splitChars - chars)\\n );\\n value = value.substring(splitChars - chars);\\n chars = splitChars;\\n\\n if (!onlyContents) {\\n stringBuilder.push(\\\"\\\",\\n \\\"
\\\"\\n );\\n }\\n\\n stringBuilder.push(lang.stringRepeat(\\\"\\\\xa0\\\", splits.indent));\\n\\n split ++;\\n screenColumn = 0;\\n splitChars = splits[split] || Number.MAX_VALUE;\\n }\\n if (value.length != 0) {\\n chars += value.length;\\n screenColumn = this.$renderToken(\\n stringBuilder, screenColumn, token, value\\n );\\n }\\n }\\n }\\n };\\n\\n this.$renderSimpleLine = function(stringBuilder, tokens) {\\n var screenColumn = 0;\\n var token = tokens[0];\\n var value = token.value;\\n if (this.displayIndentGuides)\\n value = this.renderIndentGuide(stringBuilder, value);\\n if (value)\\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\\n for (var i = 1; i < tokens.length; i++) {\\n token = tokens[i];\\n value = token.value;\\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\\n }\\n };\\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\\n if (!foldLine && foldLine != false)\\n foldLine = this.session.getFoldLine(row);\\n\\n if (foldLine)\\n var tokens = this.$getFoldLineTokens(row, foldLine);\\n else\\n var tokens = this.session.getTokens(row);\\n\\n\\n if (!onlyContents) {\\n stringBuilder.push(\\n \\\"
\\\"\\n );\\n }\\n\\n if (tokens.length) {\\n var splits = this.session.getRowSplitData(row);\\n if (splits && splits.length)\\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\\n else\\n this.$renderSimpleLine(stringBuilder, tokens);\\n }\\n\\n if (this.showInvisibles) {\\n if (foldLine)\\n row = foldLine.end.row;\\n\\n stringBuilder.push(\\n \\\"\\\",\\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\\n \\\"\\\"\\n );\\n }\\n if (!onlyContents)\\n stringBuilder.push(\\\"
\\\");\\n };\\n\\n this.$getFoldLineTokens = function(row, foldLine) {\\n var session = this.session;\\n var renderTokens = [];\\n\\n function addTokens(tokens, from, to) {\\n var idx = 0, col = 0;\\n while ((col + tokens[idx].value.length) < from) {\\n col += tokens[idx].value.length;\\n idx++;\\n\\n if (idx == tokens.length)\\n return;\\n }\\n if (col != from) {\\n var value = tokens[idx].value.substring(from - col);\\n if (value.length > (to - from))\\n value = value.substring(0, to - from);\\n\\n renderTokens.push({\\n type: tokens[idx].type,\\n value: value\\n });\\n\\n col = from + value.length;\\n idx += 1;\\n }\\n\\n while (col < to && idx < tokens.length) {\\n var value = tokens[idx].value;\\n if (value.length + col > to) {\\n renderTokens.push({\\n type: tokens[idx].type,\\n value: value.substring(0, to - col)\\n });\\n } else\\n renderTokens.push(tokens[idx]);\\n col += value.length;\\n idx += 1;\\n }\\n }\\n\\n var tokens = session.getTokens(row);\\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\\n if (placeholder != null) {\\n renderTokens.push({\\n type: \\\"fold\\\",\\n value: placeholder\\n });\\n } else {\\n if (isNewRow)\\n tokens = session.getTokens(row);\\n\\n if (tokens.length)\\n addTokens(tokens, lastColumn, column);\\n }\\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\\n\\n return renderTokens;\\n };\\n\\n this.$useLineGroups = function() {\\n return this.session.getUseWrapMode();\\n };\\n\\n this.destroy = function() {\\n clearInterval(this.$pollSizeChangesTimer);\\n if (this.$measureNode)\\n this.$measureNode.parentNode.removeChild(this.$measureNode);\\n delete this.$measureNode;\\n };\\n\\n}).call(Text.prototype);\\n\\nexports.Text = Text;\\n\\n});\\n\\ndefine(\\\"ace/layer/cursor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar isIE8;\\n\\nvar Cursor = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_cursor-layer\\\";\\n parentEl.appendChild(this.element);\\n \\n if (isIE8 === undefined)\\n isIE8 = !(\\\"opacity\\\" in this.element.style);\\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 = (isIE8\\n ? this.$updateVisibility\\n : this.$updateOpacity).bind(this);\\n};\\n\\n(function() {\\n \\n this.$updateVisibility = function(val) {\\n var cursors = this.cursors;\\n for (var i = cursors.length; i--; )\\n cursors[i].style.visibility = val ? \\\"\\\" : \\\"hidden\\\";\\n };\\n this.$updateOpacity = function(val) {\\n var cursors = this.cursors;\\n for (var i = cursors.length; i--; )\\n cursors[i].style.opacity = val ? \\\"\\\" : \\\"0\\\";\\n };\\n \\n\\n this.$padding = 0;\\n this.setPadding = function(padding) {\\n this.$padding = padding;\\n };\\n\\n this.setSession = function(session) {\\n this.session = session;\\n };\\n\\n this.setBlinking = function(blinking) {\\n if (blinking != this.isBlinking){\\n this.isBlinking = blinking;\\n this.restartTimer();\\n }\\n };\\n\\n this.setBlinkInterval = function(blinkInterval) {\\n if (blinkInterval != this.blinkInterval){\\n this.blinkInterval = blinkInterval;\\n this.restartTimer();\\n }\\n };\\n\\n this.setSmoothBlinking = function(smoothBlinking) {\\n if (smoothBlinking != this.smoothBlinking && !isIE8) {\\n this.smoothBlinking = smoothBlinking;\\n dom.setCssClass(this.element, \\\"ace_smooth-blinking\\\", smoothBlinking);\\n this.$updateCursors(true);\\n this.$updateCursors = (this.$updateOpacity).bind(this);\\n this.restartTimer();\\n }\\n };\\n\\n this.addCursor = function() {\\n var el = dom.createElement(\\\"div\\\");\\n el.className = \\\"ace_cursor\\\";\\n this.element.appendChild(el);\\n this.cursors.push(el);\\n return el;\\n };\\n\\n this.removeCursor = function() {\\n if (this.cursors.length > 1) {\\n var el = this.cursors.pop();\\n el.parentNode.removeChild(el);\\n return el;\\n }\\n };\\n\\n this.hideCursor = function() {\\n this.isVisible = false;\\n dom.addCssClass(this.element, \\\"ace_hidden-cursors\\\");\\n this.restartTimer();\\n };\\n\\n this.showCursor = function() {\\n this.isVisible = true;\\n dom.removeCssClass(this.element, \\\"ace_hidden-cursors\\\");\\n this.restartTimer();\\n };\\n\\n this.restartTimer = function() {\\n var update = this.$updateCursors;\\n clearInterval(this.intervalId);\\n clearTimeout(this.timeoutId);\\n if (this.smoothBlinking) {\\n dom.removeCssClass(this.element, \\\"ace_smooth-blinking\\\");\\n }\\n \\n update(true);\\n\\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\\n return;\\n\\n if (this.smoothBlinking) {\\n setTimeout(function(){\\n dom.addCssClass(this.element, \\\"ace_smooth-blinking\\\");\\n }.bind(this));\\n }\\n \\n var blink = function(){\\n this.timeoutId = setTimeout(function() {\\n update(false);\\n }, 0.6 * this.blinkInterval);\\n }.bind(this);\\n\\n this.intervalId = setInterval(function() {\\n update(true);\\n blink();\\n }, this.blinkInterval);\\n\\n blink();\\n };\\n\\n this.getPixelPosition = function(position, onScreen) {\\n if (!this.config || !this.session)\\n return {left : 0, top : 0};\\n\\n if (!position)\\n position = this.session.selection.getCursor();\\n var pos = this.session.documentToScreenPosition(position);\\n var cursorLeft = this.$padding + (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.update = function(config) {\\n this.config = config;\\n\\n var selections = this.session.$selectionMarkers;\\n var i = 0, cursorIndex = 0;\\n\\n if (selections === undefined || selections.length === 0){\\n selections = [{cursor: null}];\\n }\\n\\n for (var i = 0, n = selections.length; i < n; i++) {\\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\\n if ((pixelPos.top > config.height + config.offset ||\\n pixelPos.top < 0) && i > 1) {\\n continue;\\n }\\n\\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\\n \\n if (!this.drawCursor) {\\n style.left = pixelPos.left + \\\"px\\\";\\n style.top = pixelPos.top + \\\"px\\\";\\n style.width = config.characterWidth + \\\"px\\\";\\n style.height = config.lineHeight + \\\"px\\\";\\n } else {\\n this.drawCursor(style, pixelPos, config, selections[i], this.session);\\n }\\n }\\n while (this.cursors.length > cursorIndex)\\n this.removeCursor();\\n\\n var overwrite = this.session.getOverwrite();\\n this.$setOverwrite(overwrite);\\n this.$pixelPos = pixelPos;\\n this.restartTimer();\\n };\\n \\n this.drawCursor = null;\\n\\n this.$setOverwrite = function(overwrite) {\\n if (overwrite != this.overwrite) {\\n this.overwrite = overwrite;\\n if (overwrite)\\n dom.addCssClass(this.element, \\\"ace_overwrite-cursors\\\");\\n else\\n dom.removeCssClass(this.element, \\\"ace_overwrite-cursors\\\");\\n }\\n };\\n\\n this.destroy = function() {\\n clearInterval(this.intervalId);\\n clearTimeout(this.timeoutId);\\n };\\n\\n}).call(Cursor.prototype);\\n\\nexports.Cursor = Cursor;\\n\\n});\\n\\ndefine(\\\"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.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\\ndefine(\\\"ace/renderloop\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/event\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar event = require(\\\"./lib/event\\\");\\n\\n\\nvar RenderLoop = function(onRender, win) {\\n this.onRender = onRender;\\n this.pending = false;\\n this.changes = 0;\\n this.window = win || window;\\n};\\n\\n(function() {\\n\\n\\n this.schedule = function(change) {\\n this.changes = this.changes | change;\\n if (!this.pending && this.changes) {\\n this.pending = true;\\n var _self = this;\\n event.nextFrame(function() {\\n _self.pending = false;\\n var changes;\\n while (changes = _self.changes) {\\n _self.changes = 0;\\n _self.onRender(changes);\\n }\\n }, this.window);\\n }\\n };\\n\\n}).call(RenderLoop.prototype);\\n\\nexports.RenderLoop = RenderLoop;\\n});\\n\\ndefine(\\\"ace/layer/font_metrics\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\nvar oop = require(\\\"../lib/oop\\\");\\nvar dom = require(\\\"../lib/dom\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\nvar EventEmitter = require(\\\"../lib/event_emitter\\\").EventEmitter;\\n\\nvar CHAR_COUNT = 0;\\n\\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\\n this.el = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(this.el.style, true);\\n \\n this.$main = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(this.$main.style);\\n \\n this.$measureNode = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(this.$measureNode.style);\\n \\n \\n this.el.appendChild(this.$main);\\n this.el.appendChild(this.$measureNode);\\n parentEl.appendChild(this.el);\\n \\n if (!CHAR_COUNT)\\n this.$testFractionalRect();\\n this.$measureNode.innerHTML = lang.stringRepeat(\\\"X\\\", CHAR_COUNT);\\n \\n this.$characterSize = {width: 0, height: 0};\\n this.checkForSizeChanges();\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n \\n this.$characterSize = {width: 0, height: 0};\\n \\n this.$testFractionalRect = function() {\\n var el = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(el.style);\\n el.style.width = \\\"0.2px\\\";\\n document.documentElement.appendChild(el);\\n var w = el.getBoundingClientRect().width;\\n if (w > 0 && w < 1)\\n CHAR_COUNT = 50;\\n else\\n CHAR_COUNT = 100;\\n el.parentNode.removeChild(el);\\n };\\n \\n this.$setMeasureNodeStyles = function(style, isRoot) {\\n style.width = style.height = \\\"auto\\\";\\n style.left = style.top = \\\"0px\\\";\\n style.visibility = \\\"hidden\\\";\\n style.position = \\\"absolute\\\";\\n style.whiteSpace = \\\"pre\\\";\\n\\n if (useragent.isIE < 8) {\\n style[\\\"font-family\\\"] = \\\"inherit\\\";\\n } else {\\n style.font = \\\"inherit\\\";\\n }\\n style.overflow = isRoot ? \\\"hidden\\\" : \\\"visible\\\";\\n };\\n\\n this.checkForSizeChanges = function() {\\n var size = this.$measureSizes();\\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\\n this.$measureNode.style.fontWeight = \\\"bold\\\";\\n var boldSize = this.$measureSizes();\\n this.$measureNode.style.fontWeight = \\\"\\\";\\n this.$characterSize = size;\\n this.charSizes = Object.create(null);\\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\\n this._emit(\\\"changeCharacterSize\\\", {data: size});\\n }\\n };\\n\\n this.$pollSizeChanges = function() {\\n if (this.$pollSizeChangesTimer)\\n return this.$pollSizeChangesTimer;\\n var self = this;\\n return this.$pollSizeChangesTimer = setInterval(function() {\\n self.checkForSizeChanges();\\n }, 500);\\n };\\n \\n this.setPolling = function(val) {\\n if (val) {\\n this.$pollSizeChanges();\\n } else if (this.$pollSizeChangesTimer) {\\n clearInterval(this.$pollSizeChangesTimer);\\n this.$pollSizeChangesTimer = 0;\\n }\\n };\\n\\n this.$measureSizes = function() {\\n if (CHAR_COUNT === 50) {\\n var rect = null;\\n try { \\n rect = this.$measureNode.getBoundingClientRect();\\n } catch(e) {\\n rect = {width: 0, height:0 };\\n }\\n var size = {\\n height: rect.height,\\n width: rect.width / CHAR_COUNT\\n };\\n } else {\\n var size = {\\n height: this.$measureNode.clientHeight,\\n width: this.$measureNode.clientWidth / CHAR_COUNT\\n };\\n }\\n if (size.width === 0 || size.height === 0)\\n return null;\\n return size;\\n };\\n\\n this.$measureCharWidth = function(ch) {\\n this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\\n var rect = this.$main.getBoundingClientRect();\\n return rect.width / CHAR_COUNT;\\n };\\n \\n this.getCharacterWidth = function(ch) {\\n var w = this.charSizes[ch];\\n if (w === undefined) {\\n 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.el && this.el.parentNode)\\n this.el.parentNode.removeChild(this.el);\\n };\\n\\n}).call(FontMetrics.prototype);\\n\\n});\\n\\ndefine(\\\"ace/virtual_renderer\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/config\\\",\\\"ace/lib/useragent\\\",\\\"ace/layer/gutter\\\",\\\"ace/layer/marker\\\",\\\"ace/layer/text\\\",\\\"ace/layer/cursor\\\",\\\"ace/scrollbar\\\",\\\"ace/scrollbar\\\",\\\"ace/renderloop\\\",\\\"ace/layer/font_metrics\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nvar config = require(\\\"./config\\\");\\nvar useragent = require(\\\"./lib/useragent\\\");\\nvar GutterLayer = require(\\\"./layer/gutter\\\").Gutter;\\nvar MarkerLayer = require(\\\"./layer/marker\\\").Marker;\\nvar TextLayer = require(\\\"./layer/text\\\").Text;\\nvar CursorLayer = require(\\\"./layer/cursor\\\").Cursor;\\nvar HScrollBar = require(\\\"./scrollbar\\\").HScrollBar;\\nvar VScrollBar = require(\\\"./scrollbar\\\").VScrollBar;\\nvar RenderLoop = require(\\\"./renderloop\\\").RenderLoop;\\nvar FontMetrics = require(\\\"./layer/font_metrics\\\").FontMetrics;\\nvar EventEmitter = require(\\\"./lib/event_emitter\\\").EventEmitter;\\nvar editorCss = \\\".ace_editor {\\\\\\nposition: relative;\\\\\\noverflow: hidden;\\\\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\\\\ndirection: ltr;\\\\\\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;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\nmin-width: 100%;\\\\\\n}\\\\\\n.ace_dragging .ace_scroller:before{\\\\\\nposition: absolute;\\\\\\ntop: 0;\\\\\\nleft: 0;\\\\\\nright: 0;\\\\\\nbottom: 0;\\\\\\ncontent: '';\\\\\\nbackground: rgba(250, 250, 250, 0.01);\\\\\\nz-index: 1000;\\\\\\n}\\\\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\\\\nbackground: rgba(0, 0, 0, 0.01);\\\\\\n}\\\\\\n.ace_selecting, .ace_selecting * {\\\\\\ncursor: text !important;\\\\\\n}\\\\\\n.ace_gutter {\\\\\\nposition: absolute;\\\\\\noverflow : hidden;\\\\\\nwidth: auto;\\\\\\ntop: 0;\\\\\\nbottom: 0;\\\\\\nleft: 0;\\\\\\ncursor: default;\\\\\\nz-index: 4;\\\\\\n-ms-user-select: none;\\\\\\n-moz-user-select: none;\\\\\\n-webkit-user-select: none;\\\\\\nuser-select: none;\\\\\\n}\\\\\\n.ace_gutter-active-line {\\\\\\nposition: absolute;\\\\\\nleft: 0;\\\\\\nright: 0;\\\\\\n}\\\\\\n.ace_scroller.ace_scroll-left {\\\\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\\\\n}\\\\\\n.ace_gutter-cell {\\\\\\npadding-left: 19px;\\\\\\npadding-right: 6px;\\\\\\nbackground-repeat: no-repeat;\\\\\\n}\\\\\\n.ace_gutter-cell.ace_error {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\\\\\");\\\\\\nbackground-repeat: no-repeat;\\\\\\nbackground-position: 2px center;\\\\\\n}\\\\\\n.ace_gutter-cell.ace_warning {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\\\\\");\\\\\\nbackground-position: 2px center;\\\\\\n}\\\\\\n.ace_gutter-cell.ace_info {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\\\\\");\\\\\\nbackground-position: 2px center;\\\\\\n}\\\\\\n.ace_dark .ace_gutter-cell.ace_info {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\\\\\");\\\\\\n}\\\\\\n.ace_scrollbar {\\\\\\nposition: absolute;\\\\\\nright: 0;\\\\\\nbottom: 0;\\\\\\nz-index: 6;\\\\\\n}\\\\\\n.ace_scrollbar-inner {\\\\\\nposition: absolute;\\\\\\ncursor: text;\\\\\\nleft: 0;\\\\\\ntop: 0;\\\\\\n}\\\\\\n.ace_scrollbar-v{\\\\\\noverflow-x: hidden;\\\\\\noverflow-y: scroll;\\\\\\ntop: 0;\\\\\\n}\\\\\\n.ace_scrollbar-h {\\\\\\noverflow-x: scroll;\\\\\\noverflow-y: hidden;\\\\\\nleft: 0;\\\\\\n}\\\\\\n.ace_print-margin {\\\\\\nposition: absolute;\\\\\\nheight: 100%;\\\\\\n}\\\\\\n.ace_text-input {\\\\\\nposition: absolute;\\\\\\nz-index: 0;\\\\\\nwidth: 0.5em;\\\\\\nheight: 1em;\\\\\\nopacity: 0;\\\\\\nbackground: transparent;\\\\\\n-moz-appearance: none;\\\\\\nappearance: none;\\\\\\nborder: none;\\\\\\nresize: none;\\\\\\noutline: none;\\\\\\noverflow: hidden;\\\\\\nfont: inherit;\\\\\\npadding: 0 1px;\\\\\\nmargin: 0 -1px;\\\\\\ntext-indent: -1em;\\\\\\n-ms-user-select: text;\\\\\\n-moz-user-select: text;\\\\\\n-webkit-user-select: text;\\\\\\nuser-select: text;\\\\\\nwhite-space: pre!important;\\\\\\n}\\\\\\n.ace_text-input.ace_composition {\\\\\\nbackground: inherit;\\\\\\ncolor: inherit;\\\\\\nz-index: 1000;\\\\\\nopacity: 1;\\\\\\ntext-indent: 0;\\\\\\n}\\\\\\n.ace_layer {\\\\\\nz-index: 1;\\\\\\nposition: absolute;\\\\\\noverflow: hidden;\\\\\\nword-wrap: normal;\\\\\\nwhite-space: pre;\\\\\\nheight: 100%;\\\\\\nwidth: 100%;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\npointer-events: none;\\\\\\n}\\\\\\n.ace_gutter-layer {\\\\\\nposition: relative;\\\\\\nwidth: auto;\\\\\\ntext-align: right;\\\\\\npointer-events: auto;\\\\\\n}\\\\\\n.ace_text-layer {\\\\\\nfont: inherit !important;\\\\\\n}\\\\\\n.ace_cjk {\\\\\\ndisplay: inline-block;\\\\\\ntext-align: center;\\\\\\n}\\\\\\n.ace_cursor-layer {\\\\\\nz-index: 4;\\\\\\n}\\\\\\n.ace_cursor {\\\\\\nz-index: 4;\\\\\\nposition: absolute;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\nborder-left: 2px solid;\\\\\\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_smooth-blinking .ace_cursor {\\\\\\n-webkit-transition: opacity 0.18s;\\\\\\ntransition: opacity 0.18s;\\\\\\n}\\\\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\\\\nposition: absolute;\\\\\\nz-index: 3;\\\\\\n}\\\\\\n.ace_marker-layer .ace_selection {\\\\\\nposition: absolute;\\\\\\nz-index: 5;\\\\\\n}\\\\\\n.ace_marker-layer .ace_bracket {\\\\\\nposition: absolute;\\\\\\nz-index: 6;\\\\\\n}\\\\\\n.ace_marker-layer .ace_active-line {\\\\\\nposition: absolute;\\\\\\nz-index: 2;\\\\\\n}\\\\\\n.ace_marker-layer .ace_selected-word {\\\\\\nposition: absolute;\\\\\\nz-index: 4;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\n}\\\\\\n.ace_line .ace_fold {\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\ndisplay: inline-block;\\\\\\nheight: 11px;\\\\\\nmargin-top: -2px;\\\\\\nvertical-align: middle;\\\\\\nbackground-image:\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\\\\\"),\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\\\\\");\\\\\\nbackground-repeat: no-repeat, repeat-x;\\\\\\nbackground-position: center center, top left;\\\\\\ncolor: transparent;\\\\\\nborder: 1px solid black;\\\\\\nborder-radius: 2px;\\\\\\ncursor: pointer;\\\\\\npointer-events: auto;\\\\\\n}\\\\\\n.ace_dark .ace_fold {\\\\\\n}\\\\\\n.ace_fold:hover{\\\\\\nbackground-image:\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\\\\\"),\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\\\\\");\\\\\\n}\\\\\\n.ace_tooltip {\\\\\\nbackground-color: #FFF;\\\\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\\\\nborder: 1px solid gray;\\\\\\nborder-radius: 1px;\\\\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\\\\ncolor: black;\\\\\\nmax-width: 100%;\\\\\\npadding: 3px 4px;\\\\\\nposition: fixed;\\\\\\nz-index: 999999;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\ncursor: default;\\\\\\nwhite-space: pre;\\\\\\nword-wrap: break-word;\\\\\\nline-height: normal;\\\\\\nfont-style: normal;\\\\\\nfont-weight: normal;\\\\\\nletter-spacing: normal;\\\\\\npointer-events: none;\\\\\\n}\\\\\\n.ace_folding-enabled > .ace_gutter-cell {\\\\\\npadding-right: 13px;\\\\\\n}\\\\\\n.ace_fold-widget {\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\nmargin: 0 -12px 0 1px;\\\\\\ndisplay: none;\\\\\\nwidth: 11px;\\\\\\nvertical-align: top;\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\\\\\");\\\\\\nbackground-repeat: no-repeat;\\\\\\nbackground-position: center;\\\\\\nborder-radius: 3px;\\\\\\nborder: 1px solid transparent;\\\\\\ncursor: pointer;\\\\\\n}\\\\\\n.ace_folding-enabled .ace_fold-widget {\\\\\\ndisplay: inline-block; \\\\\\n}\\\\\\n.ace_fold-widget.ace_end {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\\\\\");\\\\\\n}\\\\\\n.ace_fold-widget.ace_closed {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\\\\\");\\\\\\n}\\\\\\n.ace_fold-widget:hover {\\\\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\\\\n}\\\\\\n.ace_fold-widget:active {\\\\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\\\\\");\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget.ace_end {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\\\\\");\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget.ace_closed {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\\\\\");\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget:hover {\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget:active {\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\\\\n}\\\\\\n.ace_fold-widget.ace_invalid {\\\\\\nbackground-color: #FFB4B4;\\\\\\nborder-color: #DE5555;\\\\\\n}\\\\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\\\\ntransition: opacity 0.4s ease 0.05s;\\\\\\nopacity: 0;\\\\\\n}\\\\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\\\\ntransition: opacity 0.05s ease 0.05s;\\\\\\nopacity:1;\\\\\\n}\\\\\\n.ace_underline {\\\\\\ntext-decoration: underline;\\\\\\n}\\\\\\n.ace_bold {\\\\\\nfont-weight: bold;\\\\\\n}\\\\\\n.ace_nobold .ace_bold {\\\\\\nfont-weight: normal;\\\\\\n}\\\\\\n.ace_italic {\\\\\\nfont-style: italic;\\\\\\n}\\\\\\n.ace_error-marker {\\\\\\nbackground-color: rgba(255, 0, 0,0.2);\\\\\\nposition: absolute;\\\\\\nz-index: 9;\\\\\\n}\\\\\\n.ace_highlight-marker {\\\\\\nbackground-color: rgba(255, 255, 0,0.2);\\\\\\nposition: absolute;\\\\\\nz-index: 8;\\\\\\n}\\\\\\n.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_text-input-ios {\\\\\\nposition: absolute !important;\\\\\\ntop: -100000px !important;\\\\\\nleft: -100000px !important;\\\\\\n}\\\\\\n\\\";\\n\\ndom.importCssString(editorCss, \\\"ace_editor.css\\\");\\n\\nvar VirtualRenderer = function(container, theme) {\\n var _self = this;\\n\\n this.container = container || dom.createElement(\\\"div\\\");\\n this.$keepTextAreaAtCursor = !useragent.isOldIE;\\n\\n dom.addCssClass(this.container, \\\"ace_editor\\\");\\n\\n this.setTheme(theme);\\n\\n this.$gutter = dom.createElement(\\\"div\\\");\\n this.$gutter.className = \\\"ace_gutter\\\";\\n this.container.appendChild(this.$gutter);\\n this.$gutter.setAttribute(\\\"aria-hidden\\\", true);\\n\\n this.scroller = dom.createElement(\\\"div\\\");\\n this.scroller.className = \\\"ace_scroller\\\";\\n this.container.appendChild(this.scroller);\\n\\n this.content = dom.createElement(\\\"div\\\");\\n this.content.className = \\\"ace_content\\\";\\n this.scroller.appendChild(this.content);\\n\\n this.$gutterLayer = new GutterLayer(this.$gutter);\\n this.$gutterLayer.on(\\\"changeGutterWidth\\\", this.onGutterResize.bind(this));\\n\\n this.$markerBack = new MarkerLayer(this.content);\\n\\n var textLayer = this.$textLayer = new TextLayer(this.content);\\n this.canvas = textLayer.element;\\n\\n this.$markerFront = new MarkerLayer(this.content);\\n\\n this.$cursorLayer = new CursorLayer(this.content);\\n this.$horizScroll = false;\\n this.$vScroll = false;\\n\\n this.scrollBar = \\n this.scrollBarV = new VScrollBar(this.container, this);\\n this.scrollBarH = new HScrollBar(this.container, this);\\n this.scrollBarV.addEventListener(\\\"scroll\\\", function(e) {\\n if (!_self.$scrollAnimation)\\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\\n });\\n this.scrollBarH.addEventListener(\\\"scroll\\\", function(e) {\\n if (!_self.$scrollAnimation)\\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\\n });\\n\\n this.scrollTop = 0;\\n this.scrollLeft = 0;\\n\\n this.cursorPos = {\\n row : 0,\\n column : 0\\n };\\n\\n this.$fontMetrics = new FontMetrics(this.container);\\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\\n this.$textLayer.addEventListener(\\\"changeCharacterSize\\\", function(e) {\\n _self.updateCharacterSize();\\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\\n _self._signal(\\\"changeCharacterSize\\\", e);\\n });\\n\\n this.$size = {\\n width: 0,\\n height: 0,\\n scrollerHeight: 0,\\n scrollerWidth: 0,\\n $dirty: true\\n };\\n\\n this.layerConfig = {\\n width : 1,\\n padding : 0,\\n firstRow : 0,\\n firstRowScreen: 0,\\n lastRow : 0,\\n lineHeight : 0,\\n characterWidth : 0,\\n minHeight : 1,\\n maxHeight : 1,\\n offset : 0,\\n height : 1,\\n gutterOffset: 1\\n };\\n \\n this.scrollMargin = {\\n left: 0,\\n right: 0,\\n top: 0,\\n bottom: 0,\\n v: 0,\\n h: 0\\n };\\n\\n this.$loop = new RenderLoop(\\n this.$renderChanges.bind(this),\\n this.container.ownerDocument.defaultView\\n );\\n this.$loop.schedule(this.CHANGE_FULL);\\n\\n this.updateCharacterSize();\\n this.setPadding(4);\\n config.resetOptions(this);\\n config._emit(\\\"renderer\\\", this);\\n};\\n\\n(function() {\\n\\n this.CHANGE_CURSOR = 1;\\n this.CHANGE_MARKER = 2;\\n this.CHANGE_GUTTER = 4;\\n this.CHANGE_SCROLL = 8;\\n this.CHANGE_LINES = 16;\\n this.CHANGE_TEXT = 32;\\n this.CHANGE_SIZE = 64;\\n this.CHANGE_MARKER_BACK = 128;\\n this.CHANGE_MARKER_FRONT = 256;\\n this.CHANGE_FULL = 512;\\n this.CHANGE_H_SCROLL = 1024;\\n\\n oop.implement(this, EventEmitter);\\n\\n this.updateCharacterSize = function() {\\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\\n this.setStyle(\\\"ace_nobold\\\", !this.$allowBoldFonts);\\n }\\n\\n this.layerConfig.characterWidth =\\n this.characterWidth = this.$textLayer.getCharacterWidth();\\n this.layerConfig.lineHeight =\\n this.lineHeight = this.$textLayer.getLineHeight();\\n this.$updatePrintMargin();\\n };\\n this.setSession = function(session) {\\n if (this.session)\\n this.session.doc.off(\\\"changeNewLineMode\\\", this.onChangeNewLineMode);\\n \\n this.session = session;\\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\\n session.setScrollTop(-this.scrollMargin.top);\\n\\n this.$cursorLayer.setSession(session);\\n this.$markerBack.setSession(session);\\n this.$markerFront.setSession(session);\\n this.$gutterLayer.setSession(session);\\n this.$textLayer.setSession(session);\\n if (!session)\\n return;\\n \\n this.$loop.schedule(this.CHANGE_FULL);\\n this.session.$setFontMetrics(this.$fontMetrics);\\n 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.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\\n };\\n \\n this.$updateCachedSize = function(force, gutterWidth, width, height) {\\n height -= (this.$extraHeight || 0);\\n var changes = 0;\\n var size = this.$size;\\n var oldSize = {\\n width: size.width,\\n height: size.height,\\n scrollerHeight: size.scrollerHeight,\\n scrollerWidth: size.scrollerWidth\\n };\\n if (height && (force || size.height != height)) {\\n size.height = height;\\n changes |= this.CHANGE_SIZE;\\n\\n size.scrollerHeight = size.height;\\n if (this.$horizScroll)\\n size.scrollerHeight -= this.scrollBarH.getHeight();\\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \\\"px\\\";\\n\\n changes = changes | this.CHANGE_SCROLL;\\n }\\n\\n if (width && (force || size.width != width)) {\\n changes |= this.CHANGE_SIZE;\\n size.width = width;\\n \\n if (gutterWidth == null)\\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\\n \\n this.gutterWidth = gutterWidth;\\n \\n this.scrollBarH.element.style.left = \\n this.scroller.style.left = gutterWidth + \\\"px\\\";\\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \\n \\n this.scrollBarH.element.style.right = \\n this.scroller.style.right = this.scrollBarV.getWidth() + \\\"px\\\";\\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \\\"px\\\";\\n\\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\\n changes |= this.CHANGE_FULL;\\n }\\n \\n size.$dirty = !width || !height;\\n\\n if (changes)\\n this._signal(\\\"resize\\\", oldSize);\\n\\n return changes;\\n };\\n\\n this.onGutterResize = function() {\\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\\n if (gutterWidth != this.gutterWidth)\\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\\n\\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\\n this.$loop.schedule(this.CHANGE_FULL);\\n } else if (this.$size.$dirty) {\\n this.$loop.schedule(this.CHANGE_FULL);\\n } else {\\n this.$computeLayerConfig();\\n this.$loop.schedule(this.CHANGE_MARKER);\\n }\\n };\\n this.adjustWrapLimit = function() {\\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\\n var limit = Math.floor(availableWidth / this.characterWidth);\\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\\n };\\n this.setAnimatedScroll = function(shouldAnimate){\\n this.setOption(\\\"animatedScroll\\\", shouldAnimate);\\n };\\n this.getAnimatedScroll = function() {\\n return this.$animatedScroll;\\n };\\n this.setShowInvisibles = function(showInvisibles) {\\n this.setOption(\\\"showInvisibles\\\", showInvisibles);\\n 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.$updateGutterLineHighlight = function() {\\n var pos = this.$cursorLayer.$pixelPos;\\n var height = this.layerConfig.lineHeight;\\n if (this.session.getUseWrapMode()) {\\n var cursor = this.session.selection.getCursor();\\n cursor.column = 0;\\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\\n height *= this.session.getRowLength(cursor.row);\\n }\\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \\\"px\\\";\\n this.$gutterLineHighlight.style.height = height + \\\"px\\\";\\n };\\n\\n this.$updatePrintMargin = function() {\\n if (!this.$showPrintMargin && !this.$printMarginEl)\\n return;\\n\\n if (!this.$printMarginEl) {\\n var containerEl = dom.createElement(\\\"div\\\");\\n containerEl.className = \\\"ace_layer ace_print-margin-layer\\\";\\n this.$printMarginEl = dom.createElement(\\\"div\\\");\\n this.$printMarginEl.className = \\\"ace_print-margin\\\";\\n containerEl.appendChild(this.$printMarginEl);\\n this.content.insertBefore(containerEl, this.content.firstChild);\\n }\\n\\n var style = this.$printMarginEl.style;\\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \\\"px\\\";\\n style.visibility = this.$showPrintMargin ? \\\"visible\\\" : \\\"hidden\\\";\\n \\n if (this.session && this.session.$wrap == -1)\\n this.adjustWrapLimit();\\n };\\n this.getContainerElement = function() {\\n return this.container;\\n };\\n this.getMouseEventTarget = function() {\\n return this.scroller;\\n };\\n this.getTextAreaContainer = function() {\\n return this.container;\\n };\\n this.$moveTextAreaToCursor = function() {\\n if (!this.$keepTextAreaAtCursor)\\n return;\\n var config = this.layerConfig;\\n var posTop = this.$cursorLayer.$pixelPos.top;\\n var posLeft = this.$cursorLayer.$pixelPos.left;\\n posTop -= config.offset;\\n\\n var style = this.textarea.style;\\n var h = this.lineHeight;\\n if (posTop < 0 || posTop > config.height - h) {\\n style.top = style.left = \\\"0\\\";\\n return;\\n }\\n\\n var w = this.characterWidth;\\n if (this.$composition) {\\n var val = this.textarea.value.replace(/^\\\\x01+/, \\\"\\\");\\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\\n h += 2;\\n }\\n posLeft -= this.scrollLeft;\\n if (posLeft > this.$size.scrollerWidth - w)\\n posLeft = this.$size.scrollerWidth - w;\\n\\n posLeft += this.gutterWidth;\\n style.height = h + \\\"px\\\";\\n style.width = w + \\\"px\\\";\\n style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \\\"px\\\";\\n style.top = Math.min(posTop, this.$size.height - h) + \\\"px\\\";\\n };\\n this.getFirstVisibleRow = function() {\\n return this.layerConfig.firstRow;\\n };\\n this.getFirstFullyVisibleRow = function() {\\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\\n };\\n this.getLastFullyVisibleRow = function() {\\n var 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 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\\\");\\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();\\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\\n if (st > 0) {\\n this.scrollTop = st;\\n changes = changes | this.CHANGE_SCROLL;\\n changes |= this.$computeLayerConfig();\\n }\\n }\\n config = this.layerConfig;\\n this.$updateScrollBarV();\\n if (changes & this.CHANGE_H_SCROLL)\\n this.$updateScrollBarH();\\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \\\"px\\\";\\n this.content.style.marginTop = (-config.offset) + \\\"px\\\";\\n this.content.style.width = config.width + 2 * this.$padding + \\\"px\\\";\\n this.content.style.height = config.minHeight + \\\"px\\\";\\n }\\n if (changes & this.CHANGE_H_SCROLL) {\\n this.content.style.marginLeft = -this.scrollLeft + \\\"px\\\";\\n this.scroller.className = this.scrollLeft <= 0 ? \\\"ace_scroller\\\" : \\\"ace_scroller ace_scroll-left\\\";\\n }\\n if (changes & this.CHANGE_FULL) {\\n this.$textLayer.update(config);\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n this.$markerBack.update(config);\\n this.$markerFront.update(config);\\n this.$cursorLayer.update(config);\\n this.$moveTextAreaToCursor();\\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\\n this._signal(\\\"afterRender\\\");\\n return;\\n }\\n if (changes & this.CHANGE_SCROLL) {\\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\\n this.$textLayer.update(config);\\n else\\n this.$textLayer.scrollLines(config);\\n\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n this.$markerBack.update(config);\\n this.$markerFront.update(config);\\n this.$cursorLayer.update(config);\\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\\n this.$moveTextAreaToCursor();\\n this._signal(\\\"afterRender\\\");\\n return;\\n }\\n\\n if (changes & this.CHANGE_TEXT) {\\n this.$textLayer.update(config);\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n }\\n else if (changes & this.CHANGE_LINES) {\\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\\n this.$gutterLayer.update(config);\\n }\\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n }\\n\\n if (changes & this.CHANGE_CURSOR) {\\n this.$cursorLayer.update(config);\\n this.$moveTextAreaToCursor();\\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\\n }\\n\\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\\n this.$markerFront.update(config);\\n }\\n\\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\\n this.$markerBack.update(config);\\n }\\n\\n this._signal(\\\"afterRender\\\");\\n };\\n\\n \\n this.$autosize = function() {\\n var height = this.session.getScreenLength() * this.lineHeight;\\n var maxHeight = this.$maxLines * this.lineHeight;\\n var desiredHeight = Math.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 var vScroll = height > maxHeight;\\n \\n if (desiredHeight != this.desiredHeight ||\\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\\n if (vScroll != this.$vScroll) {\\n this.$vScroll = vScroll;\\n this.scrollBarV.setVisible(vScroll);\\n }\\n \\n var w = this.container.clientWidth;\\n this.container.style.height = desiredHeight + \\\"px\\\";\\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\\n this.desiredHeight = desiredHeight;\\n \\n this._signal(\\\"autosize\\\");\\n }\\n };\\n \\n this.$computeLayerConfig = function() {\\n 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 offset = this.scrollTop % this.lineHeight;\\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 lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\\n var lastRow = firstRow + lineCount;\\n var firstRowScreen, firstRowHeight;\\n var lineHeight = this.lineHeight;\\n firstRow = session.screenToDocumentRow(firstRow, 0);\\n var foldLine = session.getFoldLine(firstRow);\\n if (foldLine) {\\n firstRow = foldLine.start.row;\\n }\\n\\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\\n\\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\\n firstRowHeight;\\n\\n offset = this.scrollTop - firstRowScreen * lineHeight;\\n\\n var changes = 0;\\n if (this.layerConfig.width != longestLine) \\n changes = this.CHANGE_H_SCROLL;\\n if (hScrollChanged || vScrollChanged) {\\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\\n this._signal(\\\"scrollbarVisibilityChanged\\\");\\n if (vScrollChanged)\\n longestLine = this.$getLongestLine();\\n }\\n \\n this.layerConfig = {\\n width : longestLine,\\n padding : this.$padding,\\n firstRow : firstRow,\\n firstRowScreen: firstRowScreen,\\n lastRow : lastRow,\\n lineHeight : lineHeight,\\n characterWidth : this.characterWidth,\\n minHeight : minHeight,\\n maxHeight : maxHeight,\\n offset : offset,\\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\\n height : this.$size.scrollerHeight\\n };\\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 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 - this.$size.scrollerHeight);\\n }\\n\\n var scrollLeft = this.scrollLeft;\\n\\n if (scrollLeft > left) {\\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\\n left = -this.scrollMargin.left;\\n this.session.setScrollLeft(left);\\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\\n this.session.setScrollLeft(0);\\n }\\n };\\n this.getScrollTop = function() {\\n return this.session.getScrollTop();\\n };\\n this.getScrollLeft = function() {\\n return this.session.getScrollLeft();\\n };\\n this.getScrollTopRow = function() {\\n return this.scrollTop / this.lineHeight;\\n };\\n this.getScrollBottomRow = function() {\\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\\n };\\n this.scrollToRow = function(row) {\\n this.session.setScrollTop(row * this.lineHeight);\\n };\\n\\n this.alignCursor = function(cursor, alignment) {\\n if (typeof cursor == \\\"number\\\")\\n cursor = {row: cursor, column: 0};\\n\\n var pos = this.$cursorLayer.getPixelPosition(cursor);\\n var h = this.$size.scrollerHeight - this.lineHeight;\\n var offset = pos.top - h * (alignment || 0);\\n\\n this.session.setScrollTop(offset);\\n return offset;\\n };\\n\\n this.STEPS = 8;\\n this.$calcSteps = function(fromValue, toValue){\\n var i = 0;\\n var l = this.STEPS;\\n var steps = [];\\n\\n var func = function(t, x_min, dx) {\\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\\n };\\n\\n for (i = 0; i < l; ++i)\\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\\n\\n return steps;\\n };\\n this.scrollToLine = function(line, center, animate, callback) {\\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\\n var offset = pos.top;\\n if (center)\\n offset -= this.$size.scrollerHeight / 2;\\n\\n var initialScroll = this.scrollTop;\\n this.session.setScrollTop(offset);\\n if (animate !== false)\\n this.animateScrolling(initialScroll, callback);\\n };\\n\\n this.animateScrolling = function(fromValue, callback) {\\n var toValue = this.scrollTop;\\n if (!this.$animatedScroll)\\n return;\\n var _self = this;\\n \\n if (fromValue == toValue)\\n return;\\n \\n if (this.$scrollAnimation) {\\n var oldSteps = this.$scrollAnimation.steps;\\n if (oldSteps.length) {\\n fromValue = oldSteps[0];\\n if (fromValue == toValue)\\n return;\\n }\\n }\\n \\n var steps = _self.$calcSteps(fromValue, toValue);\\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\\n\\n clearInterval(this.$timer);\\n\\n _self.session.setScrollTop(steps.shift());\\n _self.session.$scrollTop = toValue;\\n this.$timer = setInterval(function() {\\n if (steps.length) {\\n _self.session.setScrollTop(steps.shift());\\n _self.session.$scrollTop = toValue;\\n } else if (toValue != null) {\\n _self.session.$scrollTop = -1;\\n _self.session.setScrollTop(toValue);\\n toValue = null;\\n } else {\\n _self.$timer = clearInterval(_self.$timer);\\n _self.$scrollAnimation = null;\\n callback && callback();\\n }\\n }, 10);\\n };\\n this.scrollToY = function(scrollTop) {\\n if (this.scrollTop !== scrollTop) {\\n this.$loop.schedule(this.CHANGE_SCROLL);\\n this.scrollTop = scrollTop;\\n }\\n };\\n this.scrollToX = function(scrollLeft) {\\n if (this.scrollLeft !== scrollLeft)\\n this.scrollLeft = scrollLeft;\\n this.$loop.schedule(this.CHANGE_H_SCROLL);\\n };\\n this.scrollTo = function(x, y) {\\n this.session.setScrollTop(y);\\n this.session.setScrollLeft(y);\\n };\\n this.scrollBy = function(deltaX, deltaY) {\\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\\n };\\n this.isScrollableBy = function(deltaX, deltaY) {\\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\\n return true;\\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\\n return true;\\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\\n return true;\\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\\n - this.layerConfig.width < -1 + this.scrollMargin.right)\\n return true;\\n };\\n\\n this.pixelToScreenCoordinates = function(x, y) {\\n var canvasPos = this.scroller.getBoundingClientRect();\\n\\n var 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 = 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 = this.scroller.getBoundingClientRect();\\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\\n \\n var col = Math.round(offsetX / this.characterWidth);\\n\\n var row = (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(position) {\\n if (!this.$composition)\\n this.$composition = {\\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\\n cssText: this.textarea.style.cssText\\n };\\n\\n this.$keepTextAreaAtCursor = true;\\n dom.addCssClass(this.textarea, \\\"ace_composition\\\");\\n this.textarea.style.cssText = \\\"\\\";\\n this.$moveTextAreaToCursor();\\n };\\n this.setCompositionText = function(text) {\\n this.$moveTextAreaToCursor();\\n };\\n this.hideComposition = function() {\\n if (!this.$composition)\\n return;\\n\\n dom.removeCssClass(this.textarea, \\\"ace_composition\\\");\\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\\n this.textarea.style.cssText = this.$composition.cssText;\\n this.$composition = null;\\n };\\n this.setTheme = function(theme, cb) {\\n var _self = this;\\n this.$themeId = theme;\\n _self._dispatchEvent('themeChange',{theme:theme});\\n\\n if (!theme || typeof theme == \\\"string\\\") {\\n var moduleName = theme || this.$options.theme.initialValue;\\n config.loadModule([\\\"theme\\\", moduleName], afterLoad);\\n } else {\\n afterLoad(theme);\\n }\\n\\n function afterLoad(module) {\\n if (_self.$themeId != theme)\\n return cb && cb();\\n if (!module || !module.cssClass)\\n throw new Error(\\\"couldn't load module \\\" + theme + \\\" or it didn't call define\\\");\\n dom.importCssString(\\n module.cssText,\\n module.cssClass,\\n _self.container.ownerDocument\\n );\\n\\n if (_self.theme)\\n dom.removeCssClass(_self.container, _self.theme.cssClass);\\n\\n var padding = \\\"padding\\\" in module ? module.padding \\n : \\\"padding\\\" in (_self.theme || {}) ? 4 : _self.$padding;\\n if (_self.$padding && padding != _self.$padding)\\n _self.setPadding(padding);\\n _self.$theme = module.cssClass;\\n\\n _self.theme = module;\\n dom.addCssClass(_self.container, module.cssClass);\\n dom.setCssClass(_self.container, \\\"ace_dark\\\", module.isDark);\\n if (_self.$size) {\\n _self.$size.width = 0;\\n _self.$updateSizeAsync();\\n }\\n\\n _self._dispatchEvent('themeLoaded', {theme:module});\\n cb && cb();\\n }\\n };\\n this.getTheme = function() {\\n return this.$themeId;\\n };\\n this.setStyle = function(style, include) {\\n dom.setCssClass(this.container, style, include !== false);\\n };\\n this.unsetStyle = function(style) {\\n dom.removeCssClass(this.container, style);\\n };\\n \\n this.setCursorStyle = function(style) {\\n if (this.scroller.style.cursor != style)\\n this.scroller.style.cursor = style;\\n };\\n this.setMouseCursor = function(cursorStyle) {\\n this.scroller.style.cursor = cursorStyle;\\n };\\n this.destroy = function() {\\n this.$textLayer.destroy();\\n this.$cursorLayer.destroy();\\n };\\n\\n}).call(VirtualRenderer.prototype);\\n\\n\\nconfig.defineOptions(VirtualRenderer.prototype, \\\"renderer\\\", {\\n animatedScroll: {initialValue: false},\\n showInvisibles: {\\n set: function(value) {\\n if (this.$textLayer.setShowInvisibles(value))\\n this.$loop.schedule(this.CHANGE_TEXT);\\n },\\n initialValue: false\\n },\\n showPrintMargin: {\\n set: function() { this.$updatePrintMargin(); },\\n initialValue: true\\n },\\n printMarginColumn: {\\n set: function() { this.$updatePrintMargin(); },\\n initialValue: 80\\n },\\n printMargin: {\\n set: function(val) {\\n if (typeof val == \\\"number\\\")\\n this.$printMarginColumn = val;\\n this.$showPrintMargin = !!val;\\n this.$updatePrintMargin();\\n },\\n get: function() {\\n return this.$showPrintMargin && this.$printMarginColumn; \\n }\\n },\\n showGutter: {\\n set: function(show){\\n this.$gutter.style.display = show ? \\\"block\\\" : \\\"none\\\";\\n this.$loop.schedule(this.CHANGE_FULL);\\n this.onGutterResize();\\n },\\n initialValue: true\\n },\\n fadeFoldWidgets: {\\n set: function(show) {\\n dom.setCssClass(this.$gutter, \\\"ace_fade-fold-widgets\\\", show);\\n },\\n initialValue: false\\n },\\n showFoldWidgets: {\\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\\n initialValue: true\\n },\\n showLineNumbers: {\\n set: function(show) {\\n this.$gutterLayer.setShowLineNumbers(show);\\n this.$loop.schedule(this.CHANGE_GUTTER);\\n },\\n initialValue: true\\n },\\n displayIndentGuides: {\\n set: function(show) {\\n if (this.$textLayer.setDisplayIndentGuides(show))\\n this.$loop.schedule(this.CHANGE_TEXT);\\n },\\n initialValue: true\\n },\\n highlightGutterLine: {\\n set: function(shouldHighlight) {\\n if (!this.$gutterLineHighlight) {\\n this.$gutterLineHighlight = dom.createElement(\\\"div\\\");\\n this.$gutterLineHighlight.className = \\\"ace_gutter-active-line\\\";\\n this.$gutter.appendChild(this.$gutterLineHighlight);\\n return;\\n }\\n\\n this.$gutterLineHighlight.style.display = shouldHighlight ? \\\"\\\" : \\\"none\\\";\\n if (this.$cursorLayer.$pixelPos)\\n this.$updateGutterLineHighlight();\\n },\\n initialValue: false,\\n value: true\\n },\\n hScrollBarAlwaysVisible: {\\n set: function(val) {\\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\\n this.$loop.schedule(this.CHANGE_SCROLL);\\n },\\n initialValue: false\\n },\\n vScrollBarAlwaysVisible: {\\n set: function(val) {\\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\\n this.$loop.schedule(this.CHANGE_SCROLL);\\n },\\n initialValue: false\\n },\\n fontSize: {\\n set: function(size) {\\n if (typeof size == \\\"number\\\")\\n size = size + \\\"px\\\";\\n this.container.style.fontSize = size;\\n this.updateFontSize();\\n },\\n initialValue: 12\\n },\\n fontFamily: {\\n set: function(name) {\\n this.container.style.fontFamily = name;\\n this.updateFontSize();\\n }\\n },\\n maxLines: {\\n set: function(val) {\\n this.updateFull();\\n }\\n },\\n minLines: {\\n set: function(val) {\\n this.updateFull();\\n }\\n },\\n 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});\\n\\nexports.VirtualRenderer = VirtualRenderer;\\n});\\n\\ndefine(\\\"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 var blob = $workerBlob(workerUrl);\\n var URL = window.URL || window.webkitURL;\\n var blobURL = URL.createObjectURL(blob);\\n return new Worker(blobURL);\\n}\\n\\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\\n this.changeListener = this.changeListener.bind(this);\\n this.onMessage = this.onMessage.bind(this);\\n if (require.nameToUrl && !require.toUrl)\\n require.toUrl = require.nameToUrl;\\n \\n if (config.get(\\\"packaged\\\") || !require.toUrl) {\\n workerUrl = workerUrl || config.moduleUrl(mod, \\\"worker\\\");\\n } else {\\n var normalizePath = this.$normalizePath;\\n workerUrl = workerUrl || normalizePath(require.toUrl(\\\"ace/worker/worker.js\\\", null, \\\"_\\\"));\\n\\n var tlns = {};\\n topLevelNamespaces.forEach(function(ns) {\\n tlns[ns] = normalizePath(require.toUrl(ns, null, \\\"_\\\").replace(/(\\\\.js)?(\\\\?.*)?$/, \\\"\\\"));\\n });\\n }\\n\\n 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\\n this.callbackId = 1;\\n this.callbacks = {};\\n\\n this.$worker.onmessage = this.onMessage;\\n};\\n\\n(function(){\\n\\n oop.implement(this, EventEmitter);\\n\\n this.onMessage = function(e) {\\n var msg = e.data;\\n switch (msg.type) {\\n case \\\"event\\\":\\n this._signal(msg.name, {data: msg.data});\\n break;\\n case \\\"call\\\":\\n var callback = this.callbacks[msg.id];\\n if (callback) {\\n callback(msg.data);\\n delete this.callbacks[msg.id];\\n }\\n break;\\n case \\\"error\\\":\\n this.reportError(msg.data);\\n break;\\n case \\\"log\\\":\\n window.console && console.log && console.log.apply(console, msg.data);\\n break;\\n }\\n };\\n \\n this.reportError = function(err) {\\n window.console && console.error && console.error(err);\\n };\\n\\n this.$normalizePath = function(path) {\\n return net.qualifyURL(path);\\n };\\n\\n this.terminate = function() {\\n this._signal(\\\"terminate\\\", {});\\n this.deltaQueue = null;\\n this.$worker.terminate();\\n this.$worker = null;\\n if (this.$doc)\\n this.$doc.off(\\\"change\\\", this.changeListener);\\n this.$doc = null;\\n };\\n\\n this.send = function(cmd, args) {\\n this.$worker.postMessage({command: cmd, args: args});\\n };\\n\\n this.call = function(cmd, args, callback) {\\n if (callback) {\\n var id = this.callbackId++;\\n this.callbacks[id] = callback;\\n args.push(id);\\n }\\n this.send(cmd, args);\\n };\\n\\n this.emit = function(event, data) {\\n try {\\n this.$worker.postMessage({event: event, data: {data: data.data}});\\n }\\n catch(ex) {\\n console.error(ex.stack);\\n }\\n };\\n\\n this.attachToDocument = function(doc) {\\n if (this.$doc)\\n this.terminate();\\n\\n this.$doc = doc;\\n this.call(\\\"setValue\\\", [doc.getValue()]);\\n doc.on(\\\"change\\\", this.changeListener);\\n };\\n\\n this.changeListener = function(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 this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\\n this.changeListener = this.changeListener.bind(this);\\n this.callbackId = 1;\\n this.callbacks = {};\\n this.messageBuffer = [];\\n\\n var main = null;\\n var emitSync = false;\\n var sender = Object.create(EventEmitter);\\n var _self = this;\\n\\n this.$worker = {};\\n this.$worker.terminate = function() {};\\n this.$worker.postMessage = function(e) {\\n _self.messageBuffer.push(e);\\n if (main) {\\n if (emitSync)\\n setTimeout(processNext);\\n else\\n processNext();\\n }\\n };\\n this.setEmitSync = function(val) { emitSync = val; };\\n\\n var processNext = function() {\\n var msg = _self.messageBuffer.shift();\\n if (msg.command)\\n main[msg.command].apply(main, msg.args);\\n else if (msg.event)\\n sender._signal(msg.event, msg.data);\\n };\\n\\n sender.postMessage = function(msg) {\\n _self.onMessage({data: msg});\\n };\\n sender.callback = function(data, callbackId) {\\n this.postMessage({type: \\\"call\\\", id: callbackId, data: data});\\n };\\n sender.emit = function(name, data) {\\n this.postMessage({type: \\\"event\\\", name: name, data: data});\\n };\\n\\n config.loadModule([\\\"worker\\\", mod], function(Main) {\\n main = new Main[classname](sender);\\n while (_self.messageBuffer.length)\\n processNext();\\n });\\n};\\n\\nUIWorkerClient.prototype = WorkerClient.prototype;\\n\\nexports.UIWorkerClient = UIWorkerClient;\\nexports.WorkerClient = WorkerClient;\\nexports.createWorker = createWorker;\\n\\n\\n});\\n\\ndefine(\\\"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.removeEventListener(\\\"change\\\", this.$onUpdate);\\n this.session.selection.removeEventListener(\\\"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(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\\ndefine(\\\"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 \\n editor.$blockScrolling++;\\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.$blockScrolling--;\\n editor.inVirtualSelectionMode = false;\\n });\\n\\n } else if (selectionMode == \\\"block\\\") {\\n e.stop();\\n editor.inVirtualSelectionMode = true; \\n var initialRange;\\n var rectSel = [];\\n var blockSelect = function() {\\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\\n\\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\\n return;\\n screenCursor = newCursor;\\n \\n editor.$blockScrolling++;\\n editor.selection.moveToPosition(cursor);\\n editor.renderer.scrollCursorIntoView();\\n\\n editor.removeSelectionMarkers(rectSel);\\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\\n rectSel.forEach(editor.addSelectionMarker, editor);\\n editor.updateSelectionMarkers();\\n editor.$blockScrolling--;\\n };\\n editor.$blockScrolling++;\\n if (isMultiSelect && !accel) {\\n selection.toSingleRange();\\n } else if (!isMultiSelect && accel) {\\n initialRange = selection.toOrientedRange();\\n editor.addSelectionMarker(initialRange);\\n }\\n \\n if (shift)\\n screenAnchor = session.documentToScreenPosition(selection.lead); \\n else\\n selection.moveToPosition(pos);\\n editor.$blockScrolling--;\\n \\n screenCursor = {row: -1, column: -1};\\n\\n var onMouseSelectionEnd = function(e) {\\n clearInterval(timerId);\\n editor.removeSelectionMarkers(rectSel);\\n if (!rectSel.length)\\n rectSel = [selection.toOrientedRange()];\\n editor.$blockScrolling++;\\n if (initialRange) {\\n editor.removeSelectionMarker(initialRange);\\n selection.toSingleRange(initialRange);\\n }\\n for (var i = 0; i < rectSel.length; i++)\\n selection.addRange(rectSel[i]);\\n editor.inVirtualSelectionMode = false;\\n editor.$mouseHandler.$clickSelection = null;\\n editor.$blockScrolling--;\\n };\\n\\n var onSelectionInterval = blockSelect;\\n\\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\\n\\n return e.preventDefault();\\n }\\n}\\n\\n\\nexports.onMouseDown = onMouseDown;\\n\\n});\\n\\ndefine(\\\"ace/commands/multi_select_commands\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/keyboard/hash_handler\\\"], function(require, exports, module) {\\nexports.defaultCommands = [{\\n name: \\\"addCursorAbove\\\",\\n exec: function(editor) { editor.selectMoreLines(-1); },\\n bindKey: {win: \\\"Ctrl-Alt-Up\\\", mac: \\\"Ctrl-Alt-Up\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"addCursorBelow\\\",\\n exec: function(editor) { editor.selectMoreLines(1); },\\n bindKey: {win: \\\"Ctrl-Alt-Down\\\", mac: \\\"Ctrl-Alt-Down\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"addCursorAboveSkipCurrent\\\",\\n exec: function(editor) { editor.selectMoreLines(-1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Up\\\", mac: \\\"Ctrl-Alt-Shift-Up\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"addCursorBelowSkipCurrent\\\",\\n exec: function(editor) { editor.selectMoreLines(1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Down\\\", mac: \\\"Ctrl-Alt-Shift-Down\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectMoreBefore\\\",\\n exec: function(editor) { editor.selectMore(-1); },\\n bindKey: {win: \\\"Ctrl-Alt-Left\\\", mac: \\\"Ctrl-Alt-Left\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectMoreAfter\\\",\\n exec: function(editor) { editor.selectMore(1); },\\n bindKey: {win: \\\"Ctrl-Alt-Right\\\", mac: \\\"Ctrl-Alt-Right\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectNextBefore\\\",\\n exec: function(editor) { editor.selectMore(-1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Left\\\", mac: \\\"Ctrl-Alt-Shift-Left\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectNextAfter\\\",\\n exec: function(editor) { editor.selectMore(1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Right\\\", mac: \\\"Ctrl-Alt-Shift-Right\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"splitIntoLines\\\",\\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\\n bindKey: {win: \\\"Ctrl-Alt-L\\\", mac: \\\"Ctrl-Alt-L\\\"},\\n readOnly: true\\n}, {\\n name: \\\"alignCursors\\\",\\n exec: function(editor) { editor.alignCursors(); },\\n bindKey: {win: \\\"Ctrl-Alt-A\\\", mac: \\\"Ctrl-Alt-A\\\"},\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"findAll\\\",\\n exec: function(editor) { editor.findAll(); },\\n bindKey: {win: \\\"Ctrl-Alt-K\\\", mac: \\\"Ctrl-Alt-G\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}];\\nexports.multiSelectCommands = [{\\n name: \\\"singleSelection\\\",\\n bindKey: \\\"esc\\\",\\n exec: function(editor) { editor.exitMultiSelectMode(); },\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true,\\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\\n}];\\n\\nvar HashHandler = require(\\\"../keyboard/hash_handler\\\").HashHandler;\\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\\n\\n});\\n\\ndefine(\\\"ace/multi_select\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range_list\\\",\\\"ace/range\\\",\\\"ace/selection\\\",\\\"ace/mouse/multi_select_handler\\\",\\\"ace/lib/event\\\",\\\"ace/lib/lang\\\",\\\"ace/commands/multi_select_commands\\\",\\\"ace/search\\\",\\\"ace/edit_session\\\",\\\"ace/editor\\\",\\\"ace/config\\\"], function(require, exports, module) {\\n\\nvar RangeList = require(\\\"./range_list\\\").RangeList;\\nvar Range = require(\\\"./range\\\").Range;\\nvar Selection = require(\\\"./selection\\\").Selection;\\nvar onMouseDown = require(\\\"./mouse/multi_select_handler\\\").onMouseDown;\\nvar event = require(\\\"./lib/event\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar commands = require(\\\"./commands/multi_select_commands\\\");\\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\\nvar Search = require(\\\"./search\\\").Search;\\nvar search = new Search();\\n\\nfunction find(session, needle, dir) {\\n search.$options.wrap = true;\\n search.$options.needle = needle;\\n search.$options.backwards = dir == -1;\\n return search.find(session);\\n}\\nvar EditSession = require(\\\"./edit_session\\\").EditSession;\\n(function() {\\n this.getSelectionMarkers = function() {\\n return this.$selectionMarkers;\\n };\\n}).call(EditSession.prototype);\\n(function() {\\n this.ranges = null;\\n this.rangeList = null;\\n this.addRange = function(range, $blockChangeEvents) {\\n if (!range)\\n return;\\n\\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\\n var oldRange = this.toOrientedRange();\\n this.rangeList.add(oldRange);\\n this.rangeList.add(range);\\n if (this.rangeList.ranges.length != 2) {\\n this.rangeList.removeAll();\\n return $blockChangeEvents || this.fromOrientedRange(range);\\n }\\n this.rangeList.removeAll();\\n this.rangeList.add(oldRange);\\n this.$onAddRange(oldRange);\\n }\\n\\n if (!range.cursor)\\n range.cursor = range.end;\\n\\n var removed = this.rangeList.add(range);\\n\\n this.$onAddRange(range);\\n\\n if (removed.length)\\n this.$onRemoveRange(removed);\\n\\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\\n this._signal(\\\"multiSelect\\\");\\n this.inMultiSelectMode = true;\\n this.session.$undoSelect = false;\\n this.rangeList.attach(this.session);\\n }\\n\\n return $blockChangeEvents || this.fromOrientedRange(range);\\n };\\n\\n this.toSingleRange = function(range) {\\n range = range || this.ranges[0];\\n var removed = this.rangeList.removeAll();\\n if (removed.length)\\n this.$onRemoveRange(removed);\\n\\n range && this.fromOrientedRange(range);\\n };\\n this.substractPoint = function(pos) {\\n var removed = this.rangeList.substractPoint(pos);\\n if (removed) {\\n this.$onRemoveRange(removed);\\n return removed[0];\\n }\\n };\\n this.mergeOverlappingRanges = function() {\\n var removed = this.rangeList.merge();\\n if (removed.length)\\n this.$onRemoveRange(removed);\\n else if(this.ranges[0])\\n this.fromOrientedRange(this.ranges[0]);\\n };\\n\\n this.$onAddRange = function(range) {\\n this.rangeCount = this.rangeList.ranges.length;\\n this.ranges.unshift(range);\\n this._signal(\\\"addRange\\\", {range: range});\\n };\\n\\n this.$onRemoveRange = function(removed) {\\n this.rangeCount = this.rangeList.ranges.length;\\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\\n var lastRange = this.rangeList.ranges.pop();\\n removed.push(lastRange);\\n this.rangeCount = 0;\\n }\\n\\n for (var i = removed.length; i--; ) {\\n var index = this.ranges.indexOf(removed[i]);\\n this.ranges.splice(index, 1);\\n }\\n\\n this._signal(\\\"removeRange\\\", {ranges: removed});\\n\\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\\n this.inMultiSelectMode = false;\\n this._signal(\\\"singleSelect\\\");\\n this.session.$undoSelect = true;\\n this.rangeList.detach(this.session);\\n }\\n\\n lastRange = lastRange || this.ranges[0];\\n if (lastRange && !lastRange.isEqual(this.getRange()))\\n this.fromOrientedRange(lastRange);\\n };\\n this.$initRangeList = function() {\\n if (this.rangeList)\\n return;\\n\\n this.rangeList = new RangeList();\\n this.ranges = [];\\n this.rangeCount = 0;\\n };\\n this.getAllRanges = function() {\\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\\n };\\n\\n this.splitIntoLines = function () {\\n if (this.rangeCount > 1) {\\n var ranges = this.rangeList.ranges;\\n var lastRange = ranges[ranges.length - 1];\\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\\n\\n this.toSingleRange();\\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\\n } else {\\n var range = this.getRange();\\n var isBackwards = this.isBackwards();\\n var startRow = range.start.row;\\n var endRow = range.end.row;\\n if (startRow == endRow) {\\n if (isBackwards)\\n var start = range.end, end = range.start;\\n else\\n var start = range.start, end = range.end;\\n \\n this.addRange(Range.fromPoints(end, end));\\n this.addRange(Range.fromPoints(start, start));\\n return;\\n }\\n\\n var rectSel = [];\\n var r = this.getLineRange(startRow, true);\\n r.start.column = range.start.column;\\n rectSel.push(r);\\n\\n for (var i = startRow + 1; i < endRow; i++)\\n rectSel.push(this.getLineRange(i, true));\\n\\n r = this.getLineRange(endRow, true);\\n r.end.column = range.end.column;\\n rectSel.push(r);\\n\\n rectSel.forEach(this.addRange, this);\\n }\\n };\\n this.toggleBlockSelection = function () {\\n if (this.rangeCount > 1) {\\n var ranges = this.rangeList.ranges;\\n var lastRange = ranges[ranges.length - 1];\\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\\n\\n this.toSingleRange();\\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\\n } else {\\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\\n\\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\\n rectSel.forEach(this.addRange, this);\\n }\\n };\\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\\n var rectSel = [];\\n\\n var xBackwards = screenCursor.column < screenAnchor.column;\\n if (xBackwards) {\\n var startColumn = screenCursor.column;\\n var endColumn = screenAnchor.column;\\n 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 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 var docEnd = range.end;\\n }\\n range.cursor = xBackwards ? range.start : range.end;\\n rectSel.push(range);\\n }\\n\\n if (yBackwards)\\n rectSel.reverse();\\n\\n if (!includeEmptyLines) {\\n var end = rectSel.length - 1;\\n while (rectSel[end].isEmpty() && end > 0)\\n end--;\\n if (end > 0) {\\n var start = 0;\\n while (rectSel[start].isEmpty())\\n start++;\\n }\\n for (var i = end; i >= start; i--) {\\n if (rectSel[i].isEmpty())\\n rectSel.splice(i, 1);\\n }\\n }\\n\\n return rectSel;\\n };\\n}).call(Selection.prototype);\\nvar Editor = require(\\\"./editor\\\").Editor;\\n(function() {\\n this.updateSelectionMarkers = function() {\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n this.addSelectionMarker = function(orientedRange) {\\n if (!orientedRange.cursor)\\n orientedRange.cursor = orientedRange.end;\\n\\n var style = this.getSelectionStyle();\\n orientedRange.marker = this.session.addMarker(orientedRange, \\\"ace_selection\\\", style);\\n\\n this.session.$selectionMarkers.push(orientedRange);\\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\\n return orientedRange;\\n };\\n this.removeSelectionMarker = function(range) {\\n if (!range.marker)\\n return;\\n this.session.removeMarker(range.marker);\\n var index = this.session.$selectionMarkers.indexOf(range);\\n if (index != -1)\\n this.session.$selectionMarkers.splice(index, 1);\\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\\n };\\n\\n this.removeSelectionMarkers = function(ranges) {\\n var markerList = this.session.$selectionMarkers;\\n for (var i = ranges.length; i--; ) {\\n var range = ranges[i];\\n if (!range.marker)\\n continue;\\n this.session.removeMarker(range.marker);\\n var index = markerList.indexOf(range);\\n if (index != -1)\\n markerList.splice(index, 1);\\n }\\n this.session.selectionMarkerCount = markerList.length;\\n };\\n\\n this.$onAddRange = function(e) {\\n this.addSelectionMarker(e.range);\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n\\n this.$onRemoveRange = function(e) {\\n this.removeSelectionMarkers(e.ranges);\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n\\n this.$onMultiSelect = function(e) {\\n if (this.inMultiSelectMode)\\n return;\\n this.inMultiSelectMode = true;\\n\\n this.setStyle(\\\"ace_multiselect\\\");\\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\\n this.commands.setDefaultHandler(\\\"exec\\\", this.$onMultiSelectExec);\\n\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n\\n this.$onSingleSelect = function(e) {\\n if (this.session.multiSelect.inVirtualMode)\\n return;\\n this.inMultiSelectMode = false;\\n\\n this.unsetStyle(\\\"ace_multiselect\\\");\\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\\n\\n this.commands.removeDefaultHandler(\\\"exec\\\", this.$onMultiSelectExec);\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n this._emit(\\\"changeSelection\\\");\\n };\\n\\n this.$onMultiSelectExec = function(e) {\\n var command = e.command;\\n var editor = e.editor;\\n if (!editor.multiSelect)\\n return;\\n if (!command.multiSelectAction) {\\n var result = command.exec(editor, e.args || {});\\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\\n editor.multiSelect.mergeOverlappingRanges();\\n } else if (command.multiSelectAction == \\\"forEach\\\") {\\n result = editor.forEachSelection(command, e.args);\\n } else if (command.multiSelectAction == \\\"forEachLine\\\") {\\n result = editor.forEachSelection(command, e.args, true);\\n } else if (command.multiSelectAction == \\\"single\\\") {\\n editor.exitMultiSelectMode();\\n result = command.exec(editor, e.args || {});\\n } else {\\n result = command.multiSelectAction(editor, e.args || {});\\n }\\n return result;\\n }; \\n this.forEachSelection = function(cmd, args, options) {\\n if (this.inVirtualSelectionMode)\\n return;\\n var keepOrder = options && options.keepOrder;\\n var $byLines = options == true || options && options.$byLines;\\n var session = this.session;\\n var selection = this.selection;\\n var rangeList = selection.rangeList;\\n var ranges = (keepOrder ? selection : rangeList).ranges;\\n var result;\\n \\n if (!ranges.length)\\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\\n \\n var reg = selection._eventRegistry;\\n selection._eventRegistry = {};\\n\\n var tmpSel = new Selection(session);\\n this.inVirtualSelectionMode = true;\\n for (var i = ranges.length; i--;) {\\n if ($byLines) {\\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\\n i--;\\n }\\n tmpSel.fromOrientedRange(ranges[i]);\\n tmpSel.index = i;\\n this.selection = session.selection = tmpSel;\\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\\n if (!result && cmdResult !== undefined)\\n result = cmdResult;\\n tmpSel.toOrientedRange(ranges[i]);\\n }\\n tmpSel.detach();\\n\\n this.selection = session.selection = selection;\\n this.inVirtualSelectionMode = false;\\n selection._eventRegistry = reg;\\n selection.mergeOverlappingRanges();\\n \\n var anim = this.renderer.$scrollAnimation;\\n this.onCursorChange();\\n this.onSelectionChange();\\n if (anim && anim.from == anim.to)\\n this.renderer.animateScrolling(anim.from);\\n \\n return result;\\n };\\n this.exitMultiSelectMode = function() {\\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\\n return;\\n this.multiSelect.toSingleRange();\\n };\\n\\n this.getSelectedText = function() {\\n var text = \\\"\\\";\\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\\n var ranges = this.multiSelect.rangeList.ranges;\\n var buf = [];\\n for (var i = 0; i < ranges.length; i++) {\\n buf.push(this.session.getTextRange(ranges[i]));\\n }\\n var nl = this.session.getDocument().getNewLineCharacter();\\n text = buf.join(nl);\\n if (text.length == (buf.length - 1) * nl.length)\\n text = \\\"\\\";\\n } else if (!this.selection.isEmpty()) {\\n text = this.session.getTextRange(this.getSelectionRange());\\n }\\n return text;\\n };\\n \\n this.$checkMultiselectChange = function(e, anchor) {\\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\\n var range = this.multiSelect.ranges[0];\\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\\n return;\\n var pos = anchor == this.multiSelect.anchor\\n ? range.cursor == range.start ? range.end : range.start\\n : range.cursor;\\n if (pos.row != anchor.row \\n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\\n }\\n };\\n this.findAll = function(needle, options, additive) {\\n options = options || {};\\n options.needle = needle || options.needle;\\n if (options.needle == undefined) {\\n var range = this.selection.isEmpty()\\n ? this.selection.getWordRange()\\n : this.selection.getRange();\\n options.needle = this.session.getTextRange(range);\\n } \\n this.$search.set(options);\\n \\n var ranges = this.$search.findAll(this.session);\\n if (!ranges.length)\\n return 0;\\n\\n this.$blockScrolling += 1;\\n var selection = this.multiSelect;\\n\\n if (!additive)\\n selection.toSingleRange(ranges[0]);\\n\\n for (var i = ranges.length; i--; )\\n selection.addRange(ranges[i], true);\\n if (range && selection.rangeList.rangeAtPoint(range.start))\\n selection.addRange(range, true);\\n \\n this.$blockScrolling -= 1;\\n\\n return ranges.length;\\n };\\n this.selectMoreLines = function(dir, skip) {\\n var range = this.selection.toOrientedRange();\\n var isBackwards = range.cursor == range.end;\\n\\n var screenLead = this.session.documentToScreenPosition(range.cursor);\\n if (this.selection.$desiredColumn)\\n screenLead.column = this.selection.$desiredColumn;\\n\\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\\n\\n if (!range.isEmpty()) {\\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\\n } else {\\n var anchor = lead;\\n }\\n\\n if (isBackwards) {\\n var newRange = Range.fromPoints(lead, anchor);\\n newRange.cursor = newRange.start;\\n } else {\\n var newRange = Range.fromPoints(anchor, lead);\\n newRange.cursor = newRange.end;\\n }\\n\\n newRange.desiredColumn = screenLead.column;\\n if (!this.selection.inMultiSelectMode) {\\n this.selection.addRange(range);\\n } else {\\n if (skip)\\n var toRemove = range.cursor;\\n }\\n\\n this.selection.addRange(newRange);\\n if (toRemove)\\n this.selection.substractPoint(toRemove);\\n };\\n this.transposeSelections = function(dir) {\\n var session = this.session;\\n var sel = session.multiSelect;\\n var all = sel.ranges;\\n\\n for (var i = all.length; i--; ) {\\n var range = all[i];\\n if (range.isEmpty()) {\\n var tmp = session.getWordRange(range.start.row, range.start.column);\\n range.start.row = tmp.start.row;\\n range.start.column = tmp.start.column;\\n range.end.row = tmp.end.row;\\n range.end.column = tmp.end.column;\\n }\\n }\\n sel.mergeOverlappingRanges();\\n\\n var words = [];\\n for (var i = all.length; i--; ) {\\n var range = all[i];\\n words.unshift(session.getTextRange(range));\\n }\\n\\n if (dir < 0)\\n words.unshift(words.pop());\\n else\\n words.push(words.shift());\\n\\n for (var i = all.length; i--; ) {\\n var range = all[i];\\n var tmp = range.clone();\\n session.replace(range, words[i]);\\n range.start.row = tmp.start.row;\\n range.start.column = tmp.start.column;\\n }\\n };\\n this.selectMore = function(dir, skip, stopAtFirst) {\\n var session = this.session;\\n var sel = session.multiSelect;\\n\\n var range = sel.toOrientedRange();\\n if (range.isEmpty()) {\\n range = session.getWordRange(range.start.row, range.start.column);\\n range.cursor = dir == -1 ? range.start : range.end;\\n this.multiSelect.addRange(range);\\n if (stopAtFirst)\\n return;\\n }\\n var needle = session.getTextRange(range);\\n\\n var newRange = find(session, needle, dir);\\n if (newRange) {\\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\\n this.$blockScrolling += 1;\\n this.session.unfold(newRange);\\n this.multiSelect.addRange(newRange);\\n this.$blockScrolling -= 1;\\n this.renderer.scrollCursorIntoView(null, 0.5);\\n }\\n if (skip)\\n this.multiSelect.substractPoint(range.cursor);\\n };\\n this.alignCursors = function() {\\n var session = this.session;\\n var sel = session.multiSelect;\\n var ranges = sel.ranges;\\n var row = -1;\\n var sameRowRanges = ranges.filter(function(r) {\\n if (r.cursor.row == row)\\n return true;\\n row = r.cursor.row;\\n });\\n \\n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\\n var range = this.selection.getRange();\\n var fr = range.start.row, lr = range.end.row;\\n var guessRange = fr == lr;\\n if (guessRange) {\\n var max = this.session.getLength();\\n var line;\\n do {\\n line = this.session.getLine(lr);\\n } while (/[=:]/.test(line) && ++lr < max);\\n do {\\n line = this.session.getLine(fr);\\n } while (/[=:]/.test(line) && --fr > 0);\\n \\n if (fr < 0) fr = 0;\\n if (lr >= max) lr = max - 1;\\n }\\n var lines = this.session.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 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 });\\n\\n event.addListener(el, \\\"keyup\\\", reset);\\n event.addListener(el, \\\"blur\\\", reset);\\n function reset(e) {\\n if (altCursor) {\\n editor.renderer.setMouseCursor(\\\"\\\");\\n altCursor = false;\\n }\\n }\\n}\\n\\nexports.MultiSelect = MultiSelect;\\n\\n\\nrequire(\\\"./config\\\").defineOptions(Editor.prototype, \\\"editor\\\", {\\n enableMultiselect: {\\n set: function(val) {\\n MultiSelect(this);\\n if (val) {\\n this.on(\\\"changeSession\\\", this.$multiselectOnSessionChange);\\n this.on(\\\"mousedown\\\", onMouseDown);\\n } else {\\n this.off(\\\"changeSession\\\", this.$multiselectOnSessionChange);\\n this.off(\\\"mousedown\\\", onMouseDown);\\n }\\n },\\n value: true\\n },\\n enableBlockSelect: {\\n set: function(val) {\\n this.$blockSelectEnabled = val;\\n },\\n value: true\\n }\\n});\\n\\n\\n\\n});\\n\\ndefine(\\\"ace/mode/folding/fold_mode\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../../range\\\").Range;\\n\\nvar FoldMode = exports.FoldMode = function() {};\\n\\n(function() {\\n\\n this.foldingStartMarker = null;\\n this.foldingStopMarker = null;\\n this.getFoldWidget = function(session, foldStyle, row) {\\n var line = session.getLine(row);\\n if (this.foldingStartMarker.test(line))\\n return \\\"start\\\";\\n if (foldStyle == \\\"markbeginend\\\"\\n && this.foldingStopMarker\\n && this.foldingStopMarker.test(line))\\n return \\\"end\\\";\\n return \\\"\\\";\\n };\\n\\n this.getFoldWidgetRange = function(session, foldStyle, row) {\\n return null;\\n };\\n\\n this.indentationBlock = function(session, row, column) {\\n var re = /\\\\S/;\\n var line = session.getLine(row);\\n var startLevel = line.search(re);\\n if (startLevel == -1)\\n return;\\n\\n var startColumn = column || line.length;\\n var maxRow = session.getLength();\\n var startRow = row;\\n var endRow = row;\\n\\n while (++row < maxRow) {\\n var level = session.getLine(row).search(re);\\n\\n if (level == -1)\\n continue;\\n\\n if (level <= startLevel)\\n break;\\n\\n endRow = row;\\n }\\n\\n if (endRow > startRow) {\\n var endColumn = session.getLine(endRow).length;\\n return new Range(startRow, startColumn, endRow, endColumn);\\n }\\n };\\n\\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\\n var start = {row: row, column: column + 1};\\n var end = session.$findClosingBracket(bracket, start, typeRe);\\n if (!end)\\n return;\\n\\n var fw = session.foldWidgets[end.row];\\n if (fw == null)\\n fw = session.getFoldWidget(end.row);\\n\\n if (fw == \\\"start\\\" && end.row > start.row) {\\n end.row --;\\n end.column = session.getLine(end.row).length;\\n }\\n return Range.fromPoints(start, end);\\n };\\n\\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\\n var end = {row: row, column: column};\\n var start = session.$findOpeningBracket(bracket, end);\\n\\n if (!start)\\n return;\\n\\n start.column++;\\n end.column--;\\n\\n return Range.fromPoints(start, end);\\n };\\n}).call(FoldMode.prototype);\\n\\n});\\n\\ndefine(\\\"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\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\ndom.importCssString(exports.cssText, exports.cssClass);\\n});\\n\\ndefine(\\\"ace/line_widgets\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nvar Range = require(\\\"./range\\\").Range;\\n\\n\\nfunction LineWidgets(session) {\\n this.session = session;\\n this.session.widgetManager = this;\\n this.session.getRowLength = this.getRowLength;\\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\\n this.updateOnChange = this.updateOnChange.bind(this);\\n this.renderWidgets = this.renderWidgets.bind(this);\\n this.measureWidgets = this.measureWidgets.bind(this);\\n this.session._changedWidgets = [];\\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\\n \\n this.session.on(\\\"change\\\", this.updateOnChange);\\n this.session.on(\\\"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 removed.forEach(function(w) {\\n w && this.removeLineWidget(w);\\n }, this);\\n this.$updateRows();\\n } else {\\n var args = new Array(len);\\n args.unshift(startRow, 0);\\n lineWidgets.splice.apply(lineWidgets, args);\\n this.$updateRows();\\n }\\n };\\n \\n this.$updateRows = function() {\\n var lineWidgets = this.session.lineWidgets;\\n if (!lineWidgets) return;\\n var noWidgets = true;\\n lineWidgets.forEach(function(w, i) {\\n if (w) {\\n noWidgets = false;\\n w.row = i;\\n 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.addLineWidget = 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 \\n w.session = this.session;\\n \\n var renderer = this.editor.renderer;\\n if (w.html && !w.el) {\\n w.el = dom.createElement(\\\"div\\\");\\n w.el.innerHTML = w.html;\\n }\\n if (w.el) {\\n dom.addCssClass(w.el, \\\"ace_lineWidgetContainer\\\");\\n w.el.style.position = \\\"absolute\\\";\\n w.el.style.zIndex = 5;\\n renderer.container.appendChild(w.el);\\n w._inDocument = true;\\n }\\n \\n if (!w.coverGutter) {\\n w.el.style.zIndex = 3;\\n }\\n if (w.pixelHeight == null) {\\n w.pixelHeight = w.el.offsetHeight;\\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\\ndefine(\\\"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\\\", \\\"\\\");\\n\\n});\\n\\ndefine(\\\"ace/ace\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/fixoldbrowsers\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/event\\\",\\\"ace/editor\\\",\\\"ace/edit_session\\\",\\\"ace/undomanager\\\",\\\"ace/virtual_renderer\\\",\\\"ace/worker/worker_client\\\",\\\"ace/keyboard/hash_handler\\\",\\\"ace/placeholder\\\",\\\"ace/multi_select\\\",\\\"ace/mode/folding/fold_mode\\\",\\\"ace/theme/textmate\\\",\\\"ace/ext/error_marker\\\",\\\"ace/config\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./lib/fixoldbrowsers\\\");\\n\\nvar dom = require(\\\"./lib/dom\\\");\\nvar event = require(\\\"./lib/event\\\");\\n\\nvar Editor = require(\\\"./editor\\\").Editor;\\nvar EditSession = require(\\\"./edit_session\\\").EditSession;\\nvar UndoManager = require(\\\"./undomanager\\\").UndoManager;\\nvar Renderer = require(\\\"./virtual_renderer\\\").VirtualRenderer;\\nrequire(\\\"./worker/worker_client\\\");\\nrequire(\\\"./keyboard/hash_handler\\\");\\nrequire(\\\"./placeholder\\\");\\nrequire(\\\"./multi_select\\\");\\nrequire(\\\"./mode/folding/fold_mode\\\");\\nrequire(\\\"./theme/textmate\\\");\\nrequire(\\\"./ext/error_marker\\\");\\n\\nexports.config = require(\\\"./config\\\");\\nexports.require = require;\\n\\nif (typeof define === \\\"function\\\")\\n exports.define = define;\\nexports.edit = function(el) {\\n if (typeof el == \\\"string\\\") {\\n var _id = el;\\n el = document.getElementById(_id);\\n if (!el)\\n throw new Error(\\\"ace.edit can't find div #\\\" + _id);\\n }\\n\\n if (el && el.env && el.env.editor instanceof Editor)\\n return el.env.editor;\\n\\n var value = \\\"\\\";\\n if (el && /input|textarea/i.test(el.tagName)) {\\n var oldNode = el;\\n value = oldNode.value;\\n el = dom.createElement(\\\"pre\\\");\\n oldNode.parentNode.replaceChild(el, oldNode);\\n } else if (el) {\\n value = dom.getInnerText(el);\\n el.innerHTML = \\\"\\\";\\n }\\n\\n var doc = exports.createEditSession(value);\\n\\n var editor = new Editor(new Renderer(el));\\n editor.setSession(doc);\\n\\n var env = {\\n document: doc,\\n editor: editor,\\n onResize: editor.resize.bind(editor, null)\\n };\\n if (oldNode) env.textarea = oldNode;\\n event.addListener(window, \\\"resize\\\", env.onResize);\\n editor.on(\\\"destroy\\\", function() {\\n event.removeListener(window, \\\"resize\\\", env.onResize);\\n env.editor.container.env = null; // prevent memory leak on old ie\\n });\\n editor.container.env = editor.env = env;\\n return editor;\\n};\\nexports.createEditSession = function(text, mode) {\\n var doc = new EditSession(text, mode);\\n doc.setUndoManager(new UndoManager());\\n return doc;\\n};\\nexports.EditSession = EditSession;\\nexports.UndoManager = UndoManager;\\nexports.version = \\\"1.2.9\\\";\\n});\\n (function() {\\n window.require([\\\"ace/ace\\\"], function(a) {\\n if (a) {\\n a.config.init(true);\\n a.define = window.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 });\\n })();\\n \"\n\n//# sourceURL=webpack:///./node_modules/ace-builds/src/ace.js?./node_modules/raw-loader"); - -/***/ }), - /***/ "./node_modules/samsam/lib/samsam.js": /*!*******************************************!*\ !*** ./node_modules/samsam/lib/samsam.js ***! @@ -220,17 +198,6 @@ eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(( true /***/ }), -/***/ "./node_modules/script-loader/addScript.js": -/*!*************************************************!*\ - !*** ./node_modules/script-loader/addScript.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\nmodule.exports = function(src) {\n\tfunction log(error) {\n\t\t(typeof console !== \"undefined\")\n\t\t&& (console.error || console.log)(\"[Script Loader]\", error);\n\t}\n\n\t// Check for IE =< 8\n\tfunction isIE() {\n\t\treturn typeof attachEvent !== \"undefined\" && typeof addEventListener === \"undefined\";\n\t}\n\n\ttry {\n\t\tif (typeof execScript !== \"undefined\" && isIE()) {\n\t\t\texecScript(src);\n\t\t} else if (typeof eval !== \"undefined\") {\n\t\t\teval.call(null, src);\n\t\t} else {\n\t\t\tlog(\"EvalError: No eval function available\");\n\t\t}\n\t} catch (error) {\n\t\tlog(error);\n\t}\n}\n\n\n//# sourceURL=webpack:///./node_modules/script-loader/addScript.js?"); - -/***/ }), - /***/ "./node_modules/setimmediate/setImmediate.js": /*!***************************************************!*\ !*** ./node_modules/setimmediate/setImmediate.js ***! @@ -891,7 +858,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/// ');\n iframeDoc.body.innerHTML = '
';\n iframeDoc.head.innerHTML = '';\n f.contentWindow.eval(\"(\" + window.__leonardo_UI_src + \")()\");\n return;\n }\n timeout = window.setTimeout(checkIframeLoaded, 100);\n}\nif (!window.Leonardo.storage.getNoUI()) {\n launcher = document.createElement('div');\n launcher.classList.add('leonardo-launcher');\n document.addEventListener('keyup', function (e) {\n if (e.ctrlKey && e.shiftKey && e.keyCode === 76) {\n return toggleLauncher();\n }\n if (f && e.ctrlKey && e.shiftKey && e.keyCode === 86) {\n return toggleView();\n }\n if (e.ctrlKey && e.shiftKey && e.keyCode === 67) {\n return Leonardo.toggleConsoleOutput(Leonardo.get);\n }\n if (f && e.keyCode === 27 && f.style.display === 'block') {\n return toggleView();\n }\n });\n launcher.addEventListener('click', function (e) {\n f && toggleView();\n e.stopPropagation();\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(launcher);\n }, false);\n //Init UI\n f = document.createElement('iframe');\n f.width = '100%';\n f.height = '100%';\n Object.assign(f.style, {\n position: 'fixed',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n border: 'none',\n display: 'none',\n overflow: 'visible',\n zIndex: 2147483646,\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(f);\n }, false);\n checkIframeLoaded();\n}\n\n\n//# sourceURL=webpack:///./src/leonardo/leonardo.ts?"); +eval("\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar configuration_srv_1 = __webpack_require__(/*! ./configuration.srv */ \"./src/leonardo/configuration.srv.ts\");\nvar storage_srv_1 = __webpack_require__(/*! ./storage.srv */ \"./src/leonardo/storage.srv.ts\");\nvar polyfills_1 = __webpack_require__(/*! ./polyfills */ \"./src/leonardo/polyfills.ts\");\nvar sinon_srv_1 = __webpack_require__(/*! ./sinon.srv */ \"./src/leonardo/sinon.srv.ts\");\n__webpack_require__(/*! ./style/app.less */ \"./src/leonardo/style/app.less\");\npolyfills_1.polifylls();\n//Init Configuration\nwindow.Leonardo = window.Leonardo || {};\nvar configuration = configuration_srv_1.leoConfiguration();\nvar storage = new storage_srv_1.Storage();\nObject.assign(window.Leonardo || {}, configuration, { storage: storage });\nLeonardo.loadSavedStates();\n// Init Sinon\nnew sinon_srv_1.Sinon();\nvar launcher;\nvar f;\nvar timeout;\nfunction toggleView() {\n if (f.style.display === 'none') {\n f.style.display = 'block';\n f.contentDocument.getElementById('app').dispatchEvent(new Event('ui-show'));\n document.body.classList.add('leonardo-launcher-active');\n }\n else {\n f.style.display = 'none';\n document.body.classList.remove('leonardo-launcher-active');\n }\n}\nfunction toggleLauncher() {\n if (launcher.style.display === 'none') {\n launcher.style.display = 'block';\n }\n else {\n launcher.style.display = 'none';\n }\n}\nfunction checkIframeLoaded() {\n var iframeDoc = f.contentDocument || f.contentWindow ? f.contentWindow.document : {};\n if (iframeDoc.readyState == 'complete' && document.readyState == 'complete') {\n clearTimeout(timeout);\n iframeDoc.write('');\n iframeDoc.body.innerHTML = '
';\n iframeDoc.head.innerHTML = '';\n f.contentWindow.eval(\"(\" + window.__leonardo_UI_src + \")()\");\n return;\n }\n timeout = window.setTimeout(checkIframeLoaded, 100);\n}\nif (!window.Leonardo.storage.getNoUI()) {\n launcher = document.createElement('div');\n launcher.classList.add('leonardo-launcher');\n document.addEventListener('keyup', function (e) {\n if (e.ctrlKey && e.shiftKey && e.keyCode === 76) {\n return toggleLauncher();\n }\n if (f && e.ctrlKey && e.shiftKey && e.keyCode === 86) {\n return toggleView();\n }\n if (e.ctrlKey && e.shiftKey && e.keyCode === 67) {\n return Leonardo.toggleConsoleOutput(Leonardo.get);\n }\n if (f && e.keyCode === 27 && f.style.display === 'block') {\n return toggleView();\n }\n });\n launcher.addEventListener('click', function (e) {\n f && toggleView();\n e.stopPropagation();\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(launcher);\n }, false);\n //Init UI\n f = document.createElement('iframe');\n f.width = '100%';\n f.height = '100%';\n Object.assign(f.style, {\n position: 'fixed',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n border: 'none',\n display: 'none',\n overflow: 'visible',\n zIndex: 2147483646,\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(f);\n }, false);\n checkIframeLoaded();\n}\n\n\n//# sourceURL=webpack:///./src/leonardo/leonardo.ts?"); /***/ }), diff --git a/dist/leonardo.js b/dist/leonardo.js index 1975fda..c3d33dd 100644 --- a/dist/leonardo.js +++ b/dist/leonardo.js @@ -87,17 +87,6 @@ /************************************************************************/ /******/ ({ -/***/ "./node_modules/ace-builds/src/ace.js": -/*!********************************************!*\ - !*** ./node_modules/ace-builds/src/ace.js ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("__webpack_require__(/*! !./node_modules/script-loader/addScript.js */ \"./node_modules/script-loader/addScript.js\")(__webpack_require__(/*! !./node_modules/raw-loader!./node_modules/ace-builds/src/ace.js */ \"./node_modules/raw-loader/index.js!./node_modules/ace-builds/src/ace.js\"))\n\n//# sourceURL=webpack:///./node_modules/ace-builds/src/ace.js?"); - -/***/ }), - /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/lib/loader.js!./src/leonardo/style/app.less": /*!********************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/lib/loader.js!./src/leonardo/style/app.less ***! @@ -199,17 +188,6 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), -/***/ "./node_modules/raw-loader/index.js!./node_modules/ace-builds/src/ace.js": -/*!**********************************************************************!*\ - !*** ./node_modules/raw-loader!./node_modules/ace-builds/src/ace.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = \"/* ***** 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 = \\\"\\\";\\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\\ndefine(\\\"ace/lib/regexp\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\n var real = {\\n exec: RegExp.prototype.exec,\\n test: RegExp.prototype.test,\\n match: String.prototype.match,\\n replace: String.prototype.replace,\\n split: String.prototype.split\\n },\\n compliantExecNpcg = real.exec.call(/()??/, \\\"\\\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\\n compliantLastIndexIncrement = function () {\\n var x = /^/g;\\n real.test.call(x, \\\"\\\");\\n return !x.lastIndex;\\n }();\\n\\n if (compliantLastIndexIncrement && compliantExecNpcg)\\n return;\\n RegExp.prototype.exec = function (str) {\\n var match = real.exec.apply(this, arguments),\\n name, r2;\\n if ( typeof(str) == 'string' && match) {\\n if (!compliantExecNpcg && match.length > 1 && indexOf(match, \\\"\\\") > -1) {\\n r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \\\"g\\\", \\\"\\\"));\\n real.replace.call(str.slice(match.index), r2, function () {\\n for (var i = 1; i < arguments.length - 2; i++) {\\n if (arguments[i] === undefined)\\n match[i] = undefined;\\n }\\n });\\n }\\n if (this._xregexp && this._xregexp.captureNames) {\\n for (var i = 1; i < match.length; i++) {\\n name = this._xregexp.captureNames[i - 1];\\n if (name)\\n match[name] = match[i];\\n }\\n }\\n if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\\n this.lastIndex--;\\n }\\n return match;\\n };\\n if (!compliantLastIndexIncrement) {\\n RegExp.prototype.test = function (str) {\\n var match = real.exec.call(this, str);\\n if (match && this.global && !match[0].length && (this.lastIndex > match.index))\\n this.lastIndex--;\\n return !!match;\\n };\\n }\\n\\n function getNativeFlags (regex) {\\n return (regex.global ? \\\"g\\\" : \\\"\\\") +\\n (regex.ignoreCase ? \\\"i\\\" : \\\"\\\") +\\n (regex.multiline ? \\\"m\\\" : \\\"\\\") +\\n (regex.extended ? \\\"x\\\" : \\\"\\\") + // Proposed for ES4; included in AS3\\n (regex.sticky ? \\\"y\\\" : \\\"\\\");\\n }\\n\\n function indexOf (array, item, from) {\\n if (Array.prototype.indexOf) // Use the native array method if available\\n return array.indexOf(item, from);\\n for (var i = from || 0; i < array.length; i++) {\\n if (array[i] === item)\\n return i;\\n }\\n return -1;\\n }\\n\\n});\\n\\ndefine(\\\"ace/lib/es5-shim\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\nfunction Empty() {}\\n\\nif (!Function.prototype.bind) {\\n Function.prototype.bind = function bind(that) { // .length is 1\\n var target = this;\\n if (typeof target != \\\"function\\\") {\\n throw new TypeError(\\\"Function.prototype.bind called on incompatible \\\" + target);\\n }\\n var args = slice.call(arguments, 1); // for normal call\\n var bound = function () {\\n\\n if (this instanceof bound) {\\n\\n var result = target.apply(\\n this,\\n args.concat(slice.call(arguments))\\n );\\n if (Object(result) === result) {\\n return result;\\n }\\n return this;\\n\\n } else {\\n return target.apply(\\n that,\\n args.concat(slice.call(arguments))\\n );\\n\\n }\\n\\n };\\n if(target.prototype) {\\n Empty.prototype = target.prototype;\\n bound.prototype = new Empty();\\n Empty.prototype = null;\\n }\\n return bound;\\n };\\n}\\nvar call = Function.prototype.call;\\nvar prototypeOfArray = Array.prototype;\\nvar prototypeOfObject = Object.prototype;\\nvar slice = prototypeOfArray.slice;\\nvar _toString = call.bind(prototypeOfObject.toString);\\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\\nvar defineGetter;\\nvar defineSetter;\\nvar lookupGetter;\\nvar lookupSetter;\\nvar supportsAccessors;\\nif ((supportsAccessors = owns(prototypeOfObject, \\\"__defineGetter__\\\"))) {\\n defineGetter = call.bind(prototypeOfObject.__defineGetter__);\\n defineSetter = call.bind(prototypeOfObject.__defineSetter__);\\n lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\\n lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\\n}\\nif ([1,2].splice(0).length != 2) {\\n if(function() { // test IE < 9 to splice bug - see issue #138\\n function makeArray(l) {\\n var a = new Array(l+2);\\n a[0] = a[1] = 0;\\n return a;\\n }\\n var array = [], lengthBefore;\\n \\n array.splice.apply(array, makeArray(20));\\n array.splice.apply(array, makeArray(26));\\n\\n lengthBefore = array.length; //46\\n array.splice(5, 0, \\\"XXX\\\"); // add one element\\n\\n lengthBefore + 1 == array.length\\n\\n if (lengthBefore + 1 == array.length) {\\n return true;// has right splice implementation without bugs\\n }\\n }()) {//IE 6/7\\n var array_splice = Array.prototype.splice;\\n Array.prototype.splice = function(start, deleteCount) {\\n if (!arguments.length) {\\n return [];\\n } else {\\n return array_splice.apply(this, [\\n start === void 0 ? 0 : start,\\n deleteCount === void 0 ? (this.length - start) : deleteCount\\n ].concat(slice.call(arguments, 2)))\\n }\\n };\\n } else {//IE8\\n Array.prototype.splice = function(pos, removeCount){\\n var length = this.length;\\n if (pos > 0) {\\n if (pos > length)\\n pos = length;\\n } else if (pos == void 0) {\\n pos = 0;\\n } else if (pos < 0) {\\n pos = Math.max(length + pos, 0);\\n }\\n\\n if (!(pos+removeCount < length))\\n removeCount = length - pos;\\n\\n var removed = this.slice(pos, pos+removeCount);\\n var insert = slice.call(arguments, 2);\\n var add = insert.length; \\n if (pos === length) {\\n if (add) {\\n this.push.apply(this, insert);\\n }\\n } else {\\n var remove = Math.min(removeCount, length - pos);\\n var tailOldPos = pos + remove;\\n var tailNewPos = tailOldPos + add - remove;\\n var tailCount = length - tailOldPos;\\n var lengthAfterRemove = length - remove;\\n\\n if (tailNewPos < tailOldPos) { // case A\\n for (var i = 0; i < tailCount; ++i) {\\n this[tailNewPos+i] = this[tailOldPos+i];\\n }\\n } else if (tailNewPos > tailOldPos) { // case B\\n for (i = tailCount; i--; ) {\\n this[tailNewPos+i] = this[tailOldPos+i];\\n }\\n } // else, add == remove (nothing to do)\\n\\n if (add && pos === lengthAfterRemove) {\\n this.length = lengthAfterRemove; // truncate array\\n this.push.apply(this, insert);\\n } else {\\n this.length = lengthAfterRemove + add; // reserves space\\n for (i = 0; i < add; ++i) {\\n this[pos+i] = insert[i];\\n }\\n }\\n }\\n return removed;\\n };\\n }\\n}\\nif (!Array.isArray) {\\n Array.isArray = function isArray(obj) {\\n return _toString(obj) == \\\"[object Array]\\\";\\n };\\n}\\nvar boxedString = Object(\\\"a\\\"),\\n splitString = boxedString[0] != \\\"a\\\" || !(0 in boxedString);\\n\\nif (!Array.prototype.forEach) {\\n Array.prototype.forEach = function forEach(fun /*, thisp*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n thisp = arguments[1],\\n i = -1,\\n length = self.length >>> 0;\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(); // TODO message\\n }\\n\\n while (++i < length) {\\n if (i in self) {\\n fun.call(thisp, self[i], i, object);\\n }\\n }\\n };\\n}\\nif (!Array.prototype.map) {\\n Array.prototype.map = function map(fun /*, thisp*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n result = Array(length),\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self)\\n result[i] = fun.call(thisp, self[i], i, object);\\n }\\n return result;\\n };\\n}\\nif (!Array.prototype.filter) {\\n Array.prototype.filter = function filter(fun /*, thisp */) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n result = [],\\n value,\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self) {\\n value = self[i];\\n if (fun.call(thisp, value, i, object)) {\\n result.push(value);\\n }\\n }\\n }\\n return result;\\n };\\n}\\nif (!Array.prototype.every) {\\n Array.prototype.every = function every(fun /*, thisp */) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self && !fun.call(thisp, self[i], i, object)) {\\n return false;\\n }\\n }\\n return true;\\n };\\n}\\nif (!Array.prototype.some) {\\n Array.prototype.some = function some(fun /*, thisp */) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0,\\n thisp = arguments[1];\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n\\n for (var i = 0; i < length; i++) {\\n if (i in self && fun.call(thisp, self[i], i, object)) {\\n return true;\\n }\\n }\\n return false;\\n };\\n}\\nif (!Array.prototype.reduce) {\\n Array.prototype.reduce = function reduce(fun /*, initial*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0;\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n if (!length && arguments.length == 1) {\\n throw new TypeError(\\\"reduce of empty array with no initial value\\\");\\n }\\n\\n var i = 0;\\n var result;\\n if (arguments.length >= 2) {\\n result = arguments[1];\\n } else {\\n do {\\n if (i in self) {\\n result = self[i++];\\n break;\\n }\\n if (++i >= length) {\\n throw new TypeError(\\\"reduce of empty array with no initial value\\\");\\n }\\n } while (true);\\n }\\n\\n for (; i < length; i++) {\\n if (i in self) {\\n result = fun.call(void 0, result, self[i], i, object);\\n }\\n }\\n\\n return result;\\n };\\n}\\nif (!Array.prototype.reduceRight) {\\n Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\\n var object = toObject(this),\\n self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n object,\\n length = self.length >>> 0;\\n if (_toString(fun) != \\\"[object Function]\\\") {\\n throw new TypeError(fun + \\\" is not a function\\\");\\n }\\n if (!length && arguments.length == 1) {\\n throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");\\n }\\n\\n var result, i = length - 1;\\n if (arguments.length >= 2) {\\n result = arguments[1];\\n } else {\\n do {\\n if (i in self) {\\n result = self[i--];\\n break;\\n }\\n if (--i < 0) {\\n throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");\\n }\\n } while (true);\\n }\\n\\n do {\\n if (i in this) {\\n result = fun.call(void 0, result, self[i], i, object);\\n }\\n } while (i--);\\n\\n return result;\\n };\\n}\\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\\n Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\\n var self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n toObject(this),\\n length = self.length >>> 0;\\n\\n if (!length) {\\n return -1;\\n }\\n\\n var i = 0;\\n if (arguments.length > 1) {\\n i = toInteger(arguments[1]);\\n }\\n i = i >= 0 ? i : Math.max(0, length + i);\\n for (; i < length; i++) {\\n if (i in self && self[i] === sought) {\\n return i;\\n }\\n }\\n return -1;\\n };\\n}\\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\\n Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\\n var self = splitString && _toString(this) == \\\"[object String]\\\" ?\\n this.split(\\\"\\\") :\\n toObject(this),\\n length = self.length >>> 0;\\n\\n if (!length) {\\n return -1;\\n }\\n var i = length - 1;\\n if (arguments.length > 1) {\\n i = Math.min(i, toInteger(arguments[1]));\\n }\\n i = i >= 0 ? i : length - Math.abs(i);\\n for (; i >= 0; i--) {\\n if (i in self && sought === self[i]) {\\n return i;\\n }\\n }\\n return -1;\\n };\\n}\\nif (!Object.getPrototypeOf) {\\n Object.getPrototypeOf = function getPrototypeOf(object) {\\n return object.__proto__ || (\\n object.constructor ?\\n object.constructor.prototype :\\n prototypeOfObject\\n );\\n };\\n}\\nif (!Object.getOwnPropertyDescriptor) {\\n var ERR_NON_OBJECT = \\\"Object.getOwnPropertyDescriptor called on a \\\" +\\n \\\"non-object: \\\";\\n Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\\n if ((typeof object != \\\"object\\\" && typeof object != \\\"function\\\") || object === null)\\n throw new TypeError(ERR_NON_OBJECT + object);\\n if (!owns(object, property))\\n return;\\n\\n var descriptor, getter, setter;\\n descriptor = { enumerable: true, configurable: true };\\n if (supportsAccessors) {\\n var prototype = object.__proto__;\\n object.__proto__ = prototypeOfObject;\\n\\n var getter = lookupGetter(object, property);\\n var setter = lookupSetter(object, property);\\n object.__proto__ = prototype;\\n\\n if (getter || setter) {\\n if (getter) descriptor.get = getter;\\n if (setter) descriptor.set = setter;\\n return descriptor;\\n }\\n }\\n descriptor.value = object[property];\\n return descriptor;\\n };\\n}\\nif (!Object.getOwnPropertyNames) {\\n Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\\n return Object.keys(object);\\n };\\n}\\nif (!Object.create) {\\n var createEmpty;\\n if (Object.prototype.__proto__ === null) {\\n createEmpty = function () {\\n return { \\\"__proto__\\\": null };\\n };\\n } else {\\n createEmpty = function () {\\n var empty = {};\\n for (var i in empty)\\n empty[i] = null;\\n empty.constructor =\\n empty.hasOwnProperty =\\n empty.propertyIsEnumerable =\\n empty.isPrototypeOf =\\n empty.toLocaleString =\\n empty.toString =\\n empty.valueOf =\\n empty.__proto__ = null;\\n return empty;\\n }\\n }\\n\\n Object.create = function create(prototype, properties) {\\n var object;\\n if (prototype === null) {\\n object = createEmpty();\\n } else {\\n if (typeof prototype != \\\"object\\\")\\n throw new TypeError(\\\"typeof prototype[\\\"+(typeof prototype)+\\\"] != 'object'\\\");\\n var Type = function () {};\\n Type.prototype = prototype;\\n object = new Type();\\n object.__proto__ = prototype;\\n }\\n if (properties !== void 0)\\n Object.defineProperties(object, properties);\\n return object;\\n };\\n}\\n\\nfunction doesDefinePropertyWork(object) {\\n try {\\n Object.defineProperty(object, \\\"sentinel\\\", {});\\n return \\\"sentinel\\\" in object;\\n } catch (exception) {\\n }\\n}\\nif (Object.defineProperty) {\\n var definePropertyWorksOnObject = doesDefinePropertyWork({});\\n var definePropertyWorksOnDom = typeof document == \\\"undefined\\\" ||\\n doesDefinePropertyWork(document.createElement(\\\"div\\\"));\\n if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\\n var definePropertyFallback = Object.defineProperty;\\n }\\n}\\n\\nif (!Object.defineProperty || definePropertyFallback) {\\n var ERR_NON_OBJECT_DESCRIPTOR = \\\"Property description must be an object: \\\";\\n var ERR_NON_OBJECT_TARGET = \\\"Object.defineProperty called on non-object: \\\"\\n var ERR_ACCESSORS_NOT_SUPPORTED = \\\"getters & setters can not be defined \\\" +\\n \\\"on this javascript engine\\\";\\n\\n Object.defineProperty = function defineProperty(object, property, descriptor) {\\n if ((typeof object != \\\"object\\\" && typeof object != \\\"function\\\") || object === null)\\n throw new TypeError(ERR_NON_OBJECT_TARGET + object);\\n if ((typeof descriptor != \\\"object\\\" && typeof descriptor != \\\"function\\\") || descriptor === null)\\n throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\\n if (definePropertyFallback) {\\n try {\\n return definePropertyFallback.call(Object, object, property, descriptor);\\n } catch (exception) {\\n }\\n }\\n if (owns(descriptor, \\\"value\\\")) {\\n\\n if (supportsAccessors && (lookupGetter(object, property) ||\\n lookupSetter(object, property)))\\n {\\n var prototype = object.__proto__;\\n object.__proto__ = prototypeOfObject;\\n delete object[property];\\n object[property] = descriptor.value;\\n object.__proto__ = prototype;\\n } else {\\n object[property] = descriptor.value;\\n }\\n } else {\\n if (!supportsAccessors)\\n throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\\n if (owns(descriptor, \\\"get\\\"))\\n defineGetter(object, property, descriptor.get);\\n if (owns(descriptor, \\\"set\\\"))\\n defineSetter(object, property, descriptor.set);\\n }\\n\\n return object;\\n };\\n}\\nif (!Object.defineProperties) {\\n Object.defineProperties = function defineProperties(object, properties) {\\n for (var property in properties) {\\n if (owns(properties, property))\\n Object.defineProperty(object, property, properties[property]);\\n }\\n return object;\\n };\\n}\\nif (!Object.seal) {\\n Object.seal = function seal(object) {\\n return object;\\n };\\n}\\nif (!Object.freeze) {\\n Object.freeze = function freeze(object) {\\n return object;\\n };\\n}\\ntry {\\n Object.freeze(function () {});\\n} catch (exception) {\\n Object.freeze = (function freeze(freezeObject) {\\n return function freeze(object) {\\n if (typeof object == \\\"function\\\") {\\n return object;\\n } else {\\n return freezeObject(object);\\n }\\n };\\n })(Object.freeze);\\n}\\nif (!Object.preventExtensions) {\\n Object.preventExtensions = function preventExtensions(object) {\\n return object;\\n };\\n}\\nif (!Object.isSealed) {\\n Object.isSealed = function isSealed(object) {\\n return false;\\n };\\n}\\nif (!Object.isFrozen) {\\n Object.isFrozen = function isFrozen(object) {\\n return false;\\n };\\n}\\nif (!Object.isExtensible) {\\n Object.isExtensible = function isExtensible(object) {\\n if (Object(object) === object) {\\n throw new TypeError(); // TODO message\\n }\\n var name = '';\\n while (owns(object, name)) {\\n name += '?';\\n }\\n object[name] = true;\\n var returnValue = owns(object, name);\\n delete object[name];\\n return returnValue;\\n };\\n}\\nif (!Object.keys) {\\n var hasDontEnumBug = true,\\n dontEnums = [\\n \\\"toString\\\",\\n \\\"toLocaleString\\\",\\n \\\"valueOf\\\",\\n \\\"hasOwnProperty\\\",\\n \\\"isPrototypeOf\\\",\\n \\\"propertyIsEnumerable\\\",\\n \\\"constructor\\\"\\n ],\\n dontEnumsLength = dontEnums.length;\\n\\n for (var key in {\\\"toString\\\": null}) {\\n hasDontEnumBug = false;\\n }\\n\\n Object.keys = function keys(object) {\\n\\n if (\\n (typeof object != \\\"object\\\" && typeof object != \\\"function\\\") ||\\n object === null\\n ) {\\n throw new TypeError(\\\"Object.keys called on a non-object\\\");\\n }\\n\\n var keys = [];\\n for (var name in object) {\\n if (owns(object, name)) {\\n keys.push(name);\\n }\\n }\\n\\n if (hasDontEnumBug) {\\n for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\\n var dontEnum = dontEnums[i];\\n if (owns(object, dontEnum)) {\\n keys.push(dontEnum);\\n }\\n }\\n }\\n return keys;\\n };\\n\\n}\\nif (!Date.now) {\\n Date.now = function now() {\\n return new Date().getTime();\\n };\\n}\\nvar ws = \\\"\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\" +\\n \\\"\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\" +\\n \\\"\\\\u2029\\\\uFEFF\\\";\\nif (!String.prototype.trim || ws.trim()) {\\n ws = \\\"[\\\" + ws + \\\"]\\\";\\n var trimBeginRegexp = new RegExp(\\\"^\\\" + ws + ws + \\\"*\\\"),\\n trimEndRegexp = new RegExp(ws + ws + \\\"*$\\\");\\n String.prototype.trim = function trim() {\\n return String(this).replace(trimBeginRegexp, \\\"\\\").replace(trimEndRegexp, \\\"\\\");\\n };\\n}\\n\\nfunction toInteger(n) {\\n n = +n;\\n if (n !== n) { // isNaN\\n n = 0;\\n } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\\n }\\n return n;\\n}\\n\\nfunction isPrimitive(input) {\\n var type = typeof input;\\n return (\\n input === null ||\\n type === \\\"undefined\\\" ||\\n type === \\\"boolean\\\" ||\\n type === \\\"number\\\" ||\\n type === \\\"string\\\"\\n );\\n}\\n\\nfunction toPrimitive(input) {\\n var val, valueOf, toString;\\n if (isPrimitive(input)) {\\n return input;\\n }\\n valueOf = input.valueOf;\\n if (typeof valueOf === \\\"function\\\") {\\n val = valueOf.call(input);\\n if (isPrimitive(val)) {\\n return val;\\n }\\n }\\n toString = input.toString;\\n if (typeof toString === \\\"function\\\") {\\n val = toString.call(input);\\n if (isPrimitive(val)) {\\n return val;\\n }\\n }\\n throw new TypeError();\\n}\\nvar toObject = function (o) {\\n if (o == null) { // this matches both null and undefined\\n throw new TypeError(\\\"can't convert \\\"+o+\\\" to object\\\");\\n }\\n return Object(o);\\n};\\n\\n});\\n\\ndefine(\\\"ace/lib/fixoldbrowsers\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/regexp\\\",\\\"ace/lib/es5-shim\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./regexp\\\");\\nrequire(\\\"./es5-shim\\\");\\n\\n});\\n\\ndefine(\\\"ace/lib/dom\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar XHTML_NS = \\\"http://www.w3.org/1999/xhtml\\\";\\n\\nexports.getDocumentHead = function(doc) {\\n if (!doc)\\n doc = document;\\n return doc.head || doc.getElementsByTagName(\\\"head\\\")[0] || doc.documentElement;\\n};\\n\\nexports.createElement = function(tag, ns) {\\n return document.createElementNS ?\\n document.createElementNS(ns || XHTML_NS, tag) :\\n document.createElement(tag);\\n};\\n\\nexports.hasCssClass = function(el, name) {\\n var classes = (el.className + \\\"\\\").split(/\\\\s+/g);\\n return classes.indexOf(name) !== -1;\\n};\\nexports.addCssClass = function(el, name) {\\n if (!exports.hasCssClass(el, name)) {\\n el.className += \\\" \\\" + name;\\n }\\n};\\nexports.removeCssClass = function(el, name) {\\n var classes = el.className.split(/\\\\s+/g);\\n while (true) {\\n var index = classes.indexOf(name);\\n if (index == -1) {\\n break;\\n }\\n classes.splice(index, 1);\\n }\\n el.className = classes.join(\\\" \\\");\\n};\\n\\nexports.toggleCssClass = function(el, name) {\\n var classes = el.className.split(/\\\\s+/g), add = true;\\n while (true) {\\n var index = classes.indexOf(name);\\n if (index == -1) {\\n break;\\n }\\n add = false;\\n classes.splice(index, 1);\\n }\\n if (add)\\n classes.push(name);\\n\\n el.className = classes.join(\\\" \\\");\\n return add;\\n};\\nexports.setCssClass = function(node, className, include) {\\n if (include) {\\n exports.addCssClass(node, className);\\n } else {\\n exports.removeCssClass(node, className);\\n }\\n};\\n\\nexports.hasCssString = function(id, doc) {\\n var index = 0, sheets;\\n doc = doc || document;\\n\\n if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\\n while (index < sheets.length)\\n if (sheets[index++].owningElement.id === id) return true;\\n } else if ((sheets = doc.getElementsByTagName(\\\"style\\\"))) {\\n while (index < sheets.length)\\n if (sheets[index++].id === id) return true;\\n }\\n\\n return false;\\n};\\n\\nexports.importCssString = function importCssString(cssText, id, doc) {\\n doc = doc || document;\\n if (id && exports.hasCssString(id, doc))\\n return null;\\n \\n var style;\\n \\n if (id)\\n cssText += \\\"\\\\n/*# sourceURL=ace/css/\\\" + id + \\\" */\\\";\\n \\n if (doc.createStyleSheet) {\\n style = doc.createStyleSheet();\\n style.cssText = cssText;\\n if (id)\\n style.owningElement.id = id;\\n } else {\\n style = exports.createElement(\\\"style\\\");\\n style.appendChild(doc.createTextNode(cssText));\\n if (id)\\n style.id = id;\\n\\n exports.getDocumentHead(doc).appendChild(style);\\n }\\n};\\n\\nexports.importCssStylsheet = function(uri, doc) {\\n if (doc.createStyleSheet) {\\n doc.createStyleSheet(uri);\\n } else {\\n var link = exports.createElement('link');\\n link.rel = 'stylesheet';\\n link.href = uri;\\n\\n exports.getDocumentHead(doc).appendChild(link);\\n }\\n};\\n\\nexports.getInnerWidth = function(element) {\\n return (\\n parseInt(exports.computedStyle(element, \\\"paddingLeft\\\"), 10) +\\n parseInt(exports.computedStyle(element, \\\"paddingRight\\\"), 10) + \\n element.clientWidth\\n );\\n};\\n\\nexports.getInnerHeight = function(element) {\\n return (\\n parseInt(exports.computedStyle(element, \\\"paddingTop\\\"), 10) +\\n parseInt(exports.computedStyle(element, \\\"paddingBottom\\\"), 10) +\\n element.clientHeight\\n );\\n};\\n\\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\\nif (typeof document == \\\"undefined\\\") {\\n exports.importCssString = function() {};\\n return;\\n}\\n\\nif (window.pageYOffset !== undefined) {\\n exports.getPageScrollTop = function() {\\n return window.pageYOffset;\\n };\\n\\n exports.getPageScrollLeft = function() {\\n return window.pageXOffset;\\n };\\n}\\nelse {\\n exports.getPageScrollTop = function() {\\n return document.body.scrollTop;\\n };\\n\\n exports.getPageScrollLeft = function() {\\n return document.body.scrollLeft;\\n };\\n}\\n\\nif (window.getComputedStyle)\\n exports.computedStyle = function(element, style) {\\n if (style)\\n return (window.getComputedStyle(element, \\\"\\\") || {})[style] || \\\"\\\";\\n return window.getComputedStyle(element, \\\"\\\") || {};\\n };\\nelse\\n exports.computedStyle = function(element, style) {\\n if (style)\\n return element.currentStyle[style];\\n return element.currentStyle;\\n };\\nexports.setInnerHtml = function(el, innerHtml) {\\n var element = el.cloneNode(false);//document.createElement(\\\"div\\\");\\n element.innerHTML = innerHtml;\\n el.parentNode.replaceChild(element, el);\\n return element;\\n};\\n\\nif (\\\"textContent\\\" in document.documentElement) {\\n exports.setInnerText = function(el, innerText) {\\n el.textContent = innerText;\\n };\\n\\n exports.getInnerText = function(el) {\\n return el.textContent;\\n };\\n}\\nelse {\\n exports.setInnerText = function(el, innerText) {\\n el.innerText = innerText;\\n };\\n\\n exports.getInnerText = function(el) {\\n return el.innerText;\\n };\\n}\\n\\nexports.getParentWindow = function(document) {\\n return document.defaultView || document.parentWindow;\\n};\\n\\n});\\n\\ndefine(\\\"ace/lib/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\\ndefine(\\\"ace/lib/keys\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/fixoldbrowsers\\\",\\\"ace/lib/oop\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./fixoldbrowsers\\\");\\n\\nvar oop = require(\\\"./oop\\\");\\nvar Keys = (function() {\\n var ret = {\\n MODIFIER_KEYS: {\\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\\n },\\n\\n KEY_MODS: {\\n \\\"ctrl\\\": 1, \\\"alt\\\": 2, \\\"option\\\" : 2, \\\"shift\\\": 4,\\n \\\"super\\\": 8, \\\"meta\\\": 8, \\\"command\\\": 8, \\\"cmd\\\": 8\\n },\\n\\n FUNCTION_KEYS : {\\n 8 : \\\"Backspace\\\",\\n 9 : \\\"Tab\\\",\\n 13 : \\\"Return\\\",\\n 19 : \\\"Pause\\\",\\n 27 : \\\"Esc\\\",\\n 32 : \\\"Space\\\",\\n 33 : \\\"PageUp\\\",\\n 34 : \\\"PageDown\\\",\\n 35 : \\\"End\\\",\\n 36 : \\\"Home\\\",\\n 37 : \\\"Left\\\",\\n 38 : \\\"Up\\\",\\n 39 : \\\"Right\\\",\\n 40 : \\\"Down\\\",\\n 44 : \\\"Print\\\",\\n 45 : \\\"Insert\\\",\\n 46 : \\\"Delete\\\",\\n 96 : \\\"Numpad0\\\",\\n 97 : \\\"Numpad1\\\",\\n 98 : \\\"Numpad2\\\",\\n 99 : \\\"Numpad3\\\",\\n 100: \\\"Numpad4\\\",\\n 101: \\\"Numpad5\\\",\\n 102: \\\"Numpad6\\\",\\n 103: \\\"Numpad7\\\",\\n 104: \\\"Numpad8\\\",\\n 105: \\\"Numpad9\\\",\\n '-13': \\\"NumpadEnter\\\",\\n 112: \\\"F1\\\",\\n 113: \\\"F2\\\",\\n 114: \\\"F3\\\",\\n 115: \\\"F4\\\",\\n 116: \\\"F5\\\",\\n 117: \\\"F6\\\",\\n 118: \\\"F7\\\",\\n 119: \\\"F8\\\",\\n 120: \\\"F9\\\",\\n 121: \\\"F10\\\",\\n 122: \\\"F11\\\",\\n 123: \\\"F12\\\",\\n 144: \\\"Numlock\\\",\\n 145: \\\"Scrolllock\\\"\\n },\\n\\n PRINTABLE_KEYS: {\\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\\n 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\\ndefine(\\\"ace/lib/useragent\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nexports.OS = {\\n LINUX: \\\"LINUX\\\",\\n MAC: \\\"MAC\\\",\\n WINDOWS: \\\"WINDOWS\\\"\\n};\\nexports.getOS = function() {\\n if (exports.isMac) {\\n return exports.OS.MAC;\\n } else if (exports.isLinux) {\\n return exports.OS.LINUX;\\n } else {\\n return exports.OS.WINDOWS;\\n }\\n};\\nif (typeof navigator != \\\"object\\\")\\n return;\\n\\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\\\"other\\\"])[0].toLowerCase();\\nvar ua = navigator.userAgent;\\nexports.isWin = (os == \\\"win\\\");\\nexports.isMac = (os == \\\"mac\\\");\\nexports.isLinux = (os == \\\"linux\\\");\\nexports.isIE = \\n (navigator.appName == \\\"Microsoft Internet Explorer\\\" || navigator.appName.indexOf(\\\"MSAppHost\\\") >= 0)\\n ? parseFloat((ua.match(/(?:MSIE |Trident\\\\/[0-9]+[\\\\.0-9]+;.*rv:)([0-9]+[\\\\.0-9]+)/)||[])[1])\\n : parseFloat((ua.match(/(?:Trident\\\\/[0-9]+[\\\\.0-9]+;.*rv:)([0-9]+[\\\\.0-9]+)/)||[])[1]); // for ie\\n \\nexports.isOldIE = exports.isIE && exports.isIE < 9;\\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \\\"Gecko\\\";\\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\\\d+)/)||[])[1], 10) < 4;\\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \\\"[object Opera]\\\";\\nexports.isWebKit = parseFloat(ua.split(\\\"WebKit/\\\")[1]) || undefined;\\n\\nexports.isChrome = parseFloat(ua.split(\\\" Chrome/\\\")[1]) || undefined;\\n\\nexports.isAIR = ua.indexOf(\\\"AdobeAIR\\\") >= 0;\\n\\nexports.isIPad = ua.indexOf(\\\"iPad\\\") >= 0;\\n\\nexports.isChromeOS = ua.indexOf(\\\" CrOS \\\") >= 0;\\n\\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\\n\\nif (exports.isIOS) exports.isMac = true;\\n\\n});\\n\\ndefine(\\\"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\\nexports.addListener = function(elem, type, callback) {\\n if (elem.addEventListener) {\\n return elem.addEventListener(type, callback, false);\\n }\\n if (elem.attachEvent) {\\n var wrapper = function() {\\n callback.call(elem, window.event);\\n };\\n callback._wrapper = wrapper;\\n elem.attachEvent(\\\"on\\\" + type, wrapper);\\n }\\n};\\n\\nexports.removeListener = function(elem, type, callback) {\\n if (elem.removeEventListener) {\\n return elem.removeEventListener(type, callback, false);\\n }\\n if (elem.detachEvent) {\\n elem.detachEvent(\\\"on\\\" + type, callback._wrapper || callback);\\n }\\n};\\nexports.stopEvent = function(e) {\\n exports.stopPropagation(e);\\n exports.preventDefault(e);\\n return false;\\n};\\n\\nexports.stopPropagation = function(e) {\\n if (e.stopPropagation)\\n e.stopPropagation();\\n else\\n e.cancelBubble = true;\\n};\\n\\nexports.preventDefault = function(e) {\\n if (e.preventDefault)\\n e.preventDefault();\\n else\\n e.returnValue = false;\\n};\\nexports.getButton = function(e) {\\n if (e.type == \\\"dblclick\\\")\\n return 0;\\n if (e.type == \\\"contextmenu\\\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\\n return 2;\\n if (e.preventDefault) {\\n return e.button;\\n }\\n else {\\n return {1:0, 2:2, 4:1}[e.button];\\n }\\n};\\n\\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\\n function onMouseUp(e) {\\n eventHandler && eventHandler(e);\\n releaseCaptureHandler && releaseCaptureHandler(e);\\n\\n exports.removeListener(document, \\\"mousemove\\\", eventHandler, true);\\n exports.removeListener(document, \\\"mouseup\\\", onMouseUp, true);\\n exports.removeListener(document, \\\"dragstart\\\", onMouseUp, true);\\n }\\n\\n exports.addListener(document, \\\"mousemove\\\", eventHandler, true);\\n exports.addListener(document, \\\"mouseup\\\", onMouseUp, true);\\n exports.addListener(document, \\\"dragstart\\\", onMouseUp, true);\\n \\n return onMouseUp;\\n};\\n\\nexports.addTouchMoveListener = function (el, callback) {\\n var startx, starty;\\n exports.addListener(el, \\\"touchstart\\\", function (e) {\\n var touches = e.touches;\\n var touchObj = touches[0];\\n startx = touchObj.clientX;\\n starty = touchObj.clientY;\\n });\\n exports.addListener(el, \\\"touchmove\\\", function (e) {\\n var touches = e.touches;\\n if (touches.length > 1) return;\\n \\n var touchObj = touches[0];\\n\\n e.wheelX = startx - touchObj.clientX;\\n e.wheelY = starty - touchObj.clientY;\\n\\n startx = touchObj.clientX;\\n starty = touchObj.clientY;\\n\\n callback(e);\\n });\\n};\\n\\nexports.addMouseWheelListener = function(el, callback) {\\n if (\\\"onmousewheel\\\" in el) {\\n exports.addListener(el, \\\"mousewheel\\\", function(e) {\\n var factor = 8;\\n if (e.wheelDeltaX !== undefined) {\\n e.wheelX = -e.wheelDeltaX / factor;\\n e.wheelY = -e.wheelDeltaY / factor;\\n } else {\\n e.wheelX = 0;\\n e.wheelY = -e.wheelDelta / factor;\\n }\\n callback(e);\\n });\\n } else if (\\\"onwheel\\\" in el) {\\n exports.addListener(el, \\\"wheel\\\", function(e) {\\n var factor = 0.35;\\n switch (e.deltaMode) {\\n case e.DOM_DELTA_PIXEL:\\n e.wheelX = e.deltaX * factor || 0;\\n e.wheelY = e.deltaY * factor || 0;\\n break;\\n case e.DOM_DELTA_LINE:\\n case e.DOM_DELTA_PAGE:\\n e.wheelX = (e.deltaX || 0) * 5;\\n e.wheelY = (e.deltaY || 0) * 5;\\n break;\\n }\\n \\n callback(e);\\n });\\n } else {\\n exports.addListener(el, \\\"DOMMouseScroll\\\", function(e) {\\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\\n e.wheelX = (e.detail || 0) * 5;\\n e.wheelY = 0;\\n } else {\\n e.wheelX = 0;\\n e.wheelY = (e.detail || 0) * 5;\\n }\\n callback(e);\\n });\\n }\\n};\\n\\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\\n var clicks = 0;\\n var startX, startY, timer; \\n var eventNames = {\\n 2: \\\"dblclick\\\",\\n 3: \\\"tripleclick\\\",\\n 4: \\\"quadclick\\\"\\n };\\n\\n 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 function onDblclick(e) {\\n clicks = 2;\\n if (timer)\\n clearTimeout(timer);\\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\\n eventHandler[callbackName](\\\"mousedown\\\", e);\\n eventHandler[callbackName](eventNames[clicks], e);\\n }\\n if (!Array.isArray(elements))\\n elements = [elements];\\n elements.forEach(function(el) {\\n exports.addListener(el, \\\"mousedown\\\", onMousedown);\\n if (useragent.isOldIE)\\n exports.addListener(el, \\\"dblclick\\\", onDblclick);\\n });\\n};\\n\\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\\\"KeyboardEvent\\\" in window)\\n ? function(e) {\\n return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\\n }\\n : function(e) {\\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\\n };\\n\\nexports.getModifierString = function(e) {\\n return keys.KEY_MODS[getModifierHash(e)];\\n};\\n\\nfunction normalizeCommandKeys(callback, e, keyCode) {\\n var hashId = getModifierHash(e);\\n\\n if (!useragent.isMac && pressedKeys) {\\n if (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 if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\\n keyCode = -1;\\n }\\n \\n if (!hashId && keyCode === 13) {\\n var location = \\\"location\\\" in e ? e.location : e.keyLocation;\\n if (location === 3) {\\n callback(e, hashId, -keyCode);\\n if (e.defaultPrevented)\\n return;\\n }\\n }\\n \\n if (useragent.isChromeOS && hashId & 8) {\\n callback(e, hashId, keyCode);\\n if (e.defaultPrevented)\\n return;\\n else\\n hashId &= ~8;\\n }\\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\\n return false;\\n }\\n \\n return callback(e, hashId, keyCode);\\n}\\n\\n\\nexports.addCommandKeyListener = function(el, callback) {\\n var addListener = exports.addListener;\\n if (useragent.isOldGecko || (useragent.isOpera && !(\\\"KeyboardEvent\\\" in window))) {\\n var lastKeyDownKeyCode = null;\\n addListener(el, \\\"keydown\\\", function(e) {\\n lastKeyDownKeyCode = e.keyCode;\\n });\\n addListener(el, \\\"keypress\\\", function(e) {\\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\\n });\\n } else {\\n var lastDefaultPrevented = null;\\n\\n addListener(el, \\\"keydown\\\", function(e) {\\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\\n var result = normalizeCommandKeys(callback, e, e.keyCode);\\n lastDefaultPrevented = e.defaultPrevented;\\n return result;\\n });\\n\\n addListener(el, \\\"keypress\\\", function(e) {\\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\\n exports.stopEvent(e);\\n lastDefaultPrevented = null;\\n }\\n });\\n\\n addListener(el, \\\"keyup\\\", function(e) {\\n pressedKeys[e.keyCode] = null;\\n });\\n\\n if (!pressedKeys) {\\n 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 exports.addListener(win, \\\"message\\\", function listener(e) {\\n if (e.data == messageName) {\\n exports.stopPropagation(e);\\n exports.removeListener(win, \\\"message\\\", listener);\\n callback();\\n }\\n });\\n win.postMessage(messageName, \\\"*\\\");\\n };\\n}\\n\\n\\nexports.nextFrame = 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\\ndefine(\\\"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 PLACEHOLDER.length)\\n data = data.substr(9);\\n else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4))\\n data = data.substr(4, data.length - PLACEHOLDER.length + 1);\\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n if (data == PLACEHOLDER.charAt(0)) {\\n } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n \\n if (data)\\n host.onTextInput(data);\\n }\\n if (copied) {\\n copied = false;\\n }\\n if (afterContextMenu)\\n afterContextMenu = false;\\n };\\n var onInput = function(e) {\\n if (inComposition)\\n return;\\n var data = text.value;\\n sendText(data);\\n resetValue();\\n };\\n \\n var handleClipboardData = function(e, data, 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 (useragent.isIOS) {\\n cut = isCut;\\n text.value = \\\"\\\\n aa\\\" + data + \\\"a a\\\\n\\\";\\n text.setSelectionRange(4, 4 + data.length);\\n copied = {\\n value: data\\n };\\n }\\n isCut ? host.onCut() : host.onCopy();\\n if (!useragent.isIOS) event.preventDefault(e);\\n } else {\\n copied = true;\\n text.value = data;\\n text.select();\\n setTimeout(function(){\\n copied = false;\\n resetValue();\\n resetSelection();\\n isCut ? host.onCut() : host.onCopy();\\n });\\n }\\n };\\n \\n var onCut = function(e) {\\n doCopy(e, true);\\n };\\n \\n var onCopy = function(e) {\\n doCopy(e, false);\\n };\\n \\n var onPaste = function(e) {\\n var data = handleClipboardData(e);\\n if (typeof data == \\\"string\\\") {\\n if (data)\\n host.onPaste(data, 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));\\n\\n event.addListener(text, \\\"select\\\", onSelect);\\n\\n event.addListener(text, \\\"input\\\", onInput);\\n\\n event.addListener(text, \\\"cut\\\", onCut);\\n event.addListener(text, \\\"copy\\\", onCopy);\\n event.addListener(text, \\\"paste\\\", onPaste);\\n var onCompositionStart = function(e) {\\n if (inComposition || !host.onCompositionStart || host.$readOnly) \\n return;\\n inComposition = {};\\n inComposition.canUndo = host.session.$undoManager;\\n host.onCompositionStart();\\n setTimeout(onCompositionUpdate, 0);\\n host.on(\\\"mousedown\\\", onCompositionEnd);\\n if (inComposition.canUndo && !host.selection.isEmpty()) {\\n host.insert(\\\"\\\");\\n host.session.markUndoGroup();\\n host.selection.clearSelection();\\n }\\n host.session.markUndoGroup();\\n };\\n\\n var onCompositionUpdate = function() {\\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\\n return;\\n var val = text.value.replace(/\\\\x01/g, \\\"\\\");\\n if (inComposition.lastValue === val) return;\\n \\n host.onCompositionUpdate(val);\\n if (inComposition.lastValue)\\n host.undo();\\n if (inComposition.canUndo)\\n inComposition.lastValue = val;\\n if (inComposition.lastValue) {\\n var r = host.selection.getRange();\\n host.insert(inComposition.lastValue);\\n host.session.markUndoGroup();\\n inComposition.range = host.selection.getRange();\\n host.selection.setRange(r);\\n host.selection.clearSelection();\\n }\\n };\\n\\n var onCompositionEnd = function(e) {\\n if (!host.onCompositionEnd || host.$readOnly) return;\\n var c = inComposition;\\n inComposition = false;\\n var timer = setTimeout(function() {\\n timer = null;\\n var str = text.value.replace(/\\\\x01/g, \\\"\\\");\\n if (inComposition)\\n return;\\n else if (str == c.lastValue)\\n resetValue();\\n else if (!c.lastValue && str) {\\n resetValue();\\n sendText(str);\\n }\\n });\\n inputHandler = function compositionInputHandler(str) {\\n if (timer)\\n clearTimeout(timer);\\n str = str.replace(/\\\\x01/g, \\\"\\\");\\n if (str == c.lastValue)\\n return \\\"\\\";\\n if (c.lastValue && timer)\\n host.undo();\\n return str;\\n };\\n host.onCompositionEnd();\\n host.removeListener(\\\"mousedown\\\", onCompositionEnd);\\n if (e.type == \\\"compositionend\\\" && c.range) {\\n host.selection.setRange(c.range);\\n }\\n var needsOnInput =\\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\\n\\n if (needsOnInput) {\\n onInput();\\n }\\n };\\n \\n \\n\\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\\n\\n event.addListener(text, \\\"compositionstart\\\", onCompositionStart);\\n if (useragent.isGecko) {\\n event.addListener(text, \\\"text\\\", function(){syncComposition.schedule();});\\n } else {\\n event.addListener(text, \\\"keyup\\\", function(){syncComposition.schedule();});\\n event.addListener(text, \\\"keydown\\\", function(){syncComposition.schedule();});\\n }\\n event.addListener(text, \\\"compositionend\\\", onCompositionEnd);\\n\\n this.getElement = function() {\\n return text;\\n };\\n\\n this.setReadOnly = function(readOnly) {\\n text.readOnly = readOnly;\\n };\\n\\n this.onContextMenu = function(e) {\\n afterContextMenu = true;\\n resetSelection(host.selection.isEmpty());\\n host._emit(\\\"nativecontextmenu\\\", {target: host, domEvent: e});\\n this.moveToMouse(e, true);\\n };\\n \\n this.moveToMouse = function(e, bringToFront) {\\n if (!tempStyle)\\n tempStyle = text.style.cssText;\\n text.style.cssText = (bringToFront ? \\\"z-index:100000;\\\" : \\\"\\\")\\n + \\\"height:\\\" + text.style.height + \\\";\\\"\\n + (useragent.isIE ? \\\"opacity:0.1;\\\" : \\\"\\\");\\n\\n var rect = host.container.getBoundingClientRect();\\n var style = dom.computedStyle(host.container);\\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\\n var maxTop = rect.bottom - top - text.clientHeight -2;\\n var move = function(e) {\\n text.style.left = e.clientX - left - 2 + \\\"px\\\";\\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \\\"px\\\";\\n }; \\n move(e);\\n\\n if (e.type != \\\"mousedown\\\")\\n return;\\n\\n if (host.renderer.$keepTextAreaAtCursor)\\n host.renderer.$keepTextAreaAtCursor = null;\\n\\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 if (host.renderer.$keepTextAreaAtCursor == null) {\\n host.renderer.$keepTextAreaAtCursor = true;\\n host.renderer.$moveTextAreaToCursor();\\n }\\n }, 0);\\n }\\n\\n var onContextMenu = function(e) {\\n host.textInput.onContextMenu(e);\\n onContextMenuClose();\\n };\\n event.addListener(text, \\\"mouseup\\\", onContextMenu);\\n event.addListener(text, \\\"mousedown\\\", function(e) {\\n e.preventDefault();\\n onContextMenuClose();\\n });\\n event.addListener(host.renderer.scroller, \\\"contextmenu\\\", onContextMenu);\\n event.addListener(text, \\\"contextmenu\\\", onContextMenu);\\n \\n if (useragent.isIOS) {\\n var typingResetTimeout = null;\\n var typing = false;\\n\\n parentNode.addEventListener(\\\"keydown\\\", function (e) {\\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\\n typing = true;\\n });\\n\\n parentNode.addEventListener(\\\"keyup\\\", function (e) {\\n typingResetTimeout = setTimeout(function () {\\n typing = false;\\n }, 100);\\n });\\n var detectArrowKeys = function(e) {\\n if (document.activeElement !== text) return;\\n if (typing) return;\\n \\n if (cut) {\\n return setTimeout(function () {\\n cut = false;\\n }, 100);\\n }\\n var selectionStart = text.selectionStart;\\n var selectionEnd = text.selectionEnd;\\n text.setSelectionRange(4, 5);\\n if (selectionStart == selectionEnd) {\\n switch (selectionStart) {\\n case 0: host.onCommandKey(null, 0, KEYS.up); break;\\n case 1: host.onCommandKey(null, 0, KEYS.home); break;\\n case 2: host.onCommandKey(null, MODS.option, KEYS.left); break;\\n case 4: host.onCommandKey(null, 0, KEYS.left); break;\\n case 5: host.onCommandKey(null, 0, KEYS.right); break;\\n case 7: host.onCommandKey(null, MODS.option, KEYS.right); break;\\n case 8: host.onCommandKey(null, 0, KEYS.end); break;\\n case 9: host.onCommandKey(null, 0, KEYS.down); break;\\n }\\n } else {\\n switch (selectionEnd) {\\n case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break;\\n case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break;\\n case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break;\\n case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break;\\n }\\n switch (selectionStart) {\\n case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break;\\n case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break;\\n case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break;\\n case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break;\\n }\\n }\\n };\\n document.addEventListener(\\\"selectionchange\\\", detectArrowKeys);\\n host.on(\\\"destroy\\\", function() {\\n document.removeEventListener(\\\"selectionchange\\\", detectArrowKeys);\\n });\\n }\\n};\\n\\nexports.TextInput = TextInput;\\n});\\n\\ndefine(\\\"ace/keyboard/textinput\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/event\\\",\\\"ace/lib/useragent\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/keyboard/textinput_ios\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar event = require(\\\"../lib/event\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\nvar dom = require(\\\"../lib/dom\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar BROKEN_SETDATA = useragent.isChrome < 18;\\nvar USE_IE_MIME_TYPE = useragent.isIE;\\n\\nvar TextInputIOS = require(\\\"./textinput_ios\\\").TextInput;\\nvar TextInput = function(parentNode, host) {\\n if (useragent.isIOS)\\n return TextInputIOS.call(this, parentNode, host);\\n \\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 PLACEHOLDER = \\\"\\\\u2028\\\\u2028\\\";\\n\\n var copied = false;\\n var pasted = false;\\n var inComposition = false;\\n var tempStyle = '';\\n var isSelectionEmpty = true;\\n try { var isFocused = document.activeElement === text; } catch(e) {}\\n \\n event.addListener(text, \\\"blur\\\", function(e) {\\n host.onBlur(e);\\n isFocused = false;\\n });\\n event.addListener(text, \\\"focus\\\", function(e) {\\n isFocused = true;\\n host.onFocus(e);\\n resetSelection();\\n });\\n this.focus = function() {\\n if (tempStyle) return text.focus();\\n var top = text.style.top;\\n text.style.position = \\\"fixed\\\";\\n text.style.top = \\\"0px\\\";\\n text.focus();\\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 var syncSelection = lang.delayedCall(function() {\\n isFocused && resetSelection(isSelectionEmpty);\\n });\\n var syncValue = lang.delayedCall(function() {\\n if (!inComposition) {\\n text.value = PLACEHOLDER;\\n isFocused && resetSelection();\\n }\\n });\\n\\n function resetSelection(isEmpty) {\\n if (inComposition)\\n return;\\n inComposition = true;\\n \\n if (inputHandler) {\\n var selectionStart = 0;\\n var selectionEnd = isEmpty ? 0 : text.value.length - 1;\\n } else {\\n var selectionStart = isEmpty ? 2 : 1;\\n var selectionEnd = 2;\\n }\\n try {\\n text.setSelectionRange(selectionStart, selectionEnd);\\n } catch(e){}\\n \\n inComposition = false;\\n }\\n\\n function resetValue() {\\n if (inComposition)\\n return;\\n text.value = PLACEHOLDER;\\n if (useragent.isWebKit)\\n syncValue.schedule();\\n }\\n\\n useragent.isWebKit || host.addEventListener('changeSelection', function() {\\n if (host.selection.isEmpty() != isSelectionEmpty) {\\n isSelectionEmpty = !isSelectionEmpty;\\n syncSelection.schedule();\\n }\\n });\\n\\n resetValue();\\n if (isFocused)\\n host.onFocus();\\n\\n\\n var isAllSelected = function(text) {\\n return text.selectionStart === 0 && text.selectionEnd === text.value.length;\\n };\\n\\n var onSelect = function(e) {\\n if (copied) {\\n copied = false;\\n } else if (isAllSelected(text)) {\\n host.selectAll();\\n resetSelection();\\n } else if (inputHandler) {\\n resetSelection(host.selection.isEmpty());\\n }\\n };\\n\\n var inputHandler = null;\\n this.setInputHandler = function(cb) {inputHandler = cb;};\\n this.getInputHandler = function() {return inputHandler;};\\n var afterContextMenu = false;\\n \\n var sendText = function(data) {\\n if (inputHandler) {\\n data = inputHandler(data);\\n inputHandler = null;\\n }\\n if (pasted) {\\n resetSelection();\\n if (data)\\n host.onPaste(data);\\n pasted = false;\\n } else if (data == PLACEHOLDER.charAt(0)) {\\n if (afterContextMenu)\\n host.execCommand(\\\"del\\\", {source: \\\"ace\\\"});\\n else // some versions of android do not fire keydown when pressing backspace\\n host.execCommand(\\\"backspace\\\", {source: \\\"ace\\\"});\\n } else {\\n if (data.substring(0, 2) == PLACEHOLDER)\\n data = data.substr(2);\\n else if (data.charAt(0) == PLACEHOLDER.charAt(0))\\n data = data.substr(1);\\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\\n data = data.slice(0, -1);\\n \\n if (data)\\n host.onTextInput(data);\\n }\\n if (afterContextMenu)\\n afterContextMenu = false;\\n };\\n var onInput = function(e) {\\n if (inComposition)\\n return;\\n var data = text.value;\\n sendText(data);\\n resetValue();\\n };\\n \\n var handleClipboardData = function(e, data, 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 isCut ? host.onCut() : host.onCopy();\\n event.preventDefault(e);\\n } else {\\n copied = true;\\n text.value = data;\\n text.select();\\n setTimeout(function(){\\n copied = false;\\n resetValue();\\n resetSelection();\\n isCut ? host.onCut() : host.onCopy();\\n });\\n }\\n };\\n \\n var onCut = function(e) {\\n doCopy(e, true);\\n };\\n \\n var onCopy = function(e) {\\n doCopy(e, false);\\n };\\n \\n var onPaste = function(e) {\\n var data = handleClipboardData(e);\\n if (typeof data == \\\"string\\\") {\\n if (data)\\n host.onPaste(data, 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));\\n\\n event.addListener(text, \\\"select\\\", onSelect);\\n\\n event.addListener(text, \\\"input\\\", onInput);\\n\\n event.addListener(text, \\\"cut\\\", onCut);\\n event.addListener(text, \\\"copy\\\", onCopy);\\n event.addListener(text, \\\"paste\\\", onPaste);\\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\\n event.addListener(parentNode, \\\"keydown\\\", function(e) {\\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\\n return;\\n\\n switch (e.keyCode) {\\n case 67:\\n onCopy(e);\\n break;\\n case 86:\\n onPaste(e);\\n break;\\n case 88:\\n onCut(e);\\n break;\\n }\\n });\\n }\\n var onCompositionStart = function(e) {\\n if (inComposition || !host.onCompositionStart || host.$readOnly) \\n return;\\n inComposition = {};\\n inComposition.canUndo = host.session.$undoManager;\\n host.onCompositionStart();\\n setTimeout(onCompositionUpdate, 0);\\n host.on(\\\"mousedown\\\", onCompositionEnd);\\n if (inComposition.canUndo && !host.selection.isEmpty()) {\\n host.insert(\\\"\\\");\\n host.session.markUndoGroup();\\n host.selection.clearSelection();\\n }\\n host.session.markUndoGroup();\\n };\\n\\n var onCompositionUpdate = function() {\\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\\n return;\\n var val = text.value.replace(/\\\\u2028/g, \\\"\\\");\\n if (inComposition.lastValue === val) return;\\n \\n host.onCompositionUpdate(val);\\n if (inComposition.lastValue)\\n host.undo();\\n if (inComposition.canUndo)\\n inComposition.lastValue = val;\\n if (inComposition.lastValue) {\\n var r = host.selection.getRange();\\n host.insert(inComposition.lastValue);\\n host.session.markUndoGroup();\\n inComposition.range = host.selection.getRange();\\n host.selection.setRange(r);\\n host.selection.clearSelection();\\n }\\n };\\n\\n var onCompositionEnd = function(e) {\\n if (!host.onCompositionEnd || host.$readOnly) return;\\n var c = inComposition;\\n inComposition = false;\\n var timer = setTimeout(function() {\\n timer = null;\\n var str = text.value.replace(/\\\\u2028/g, \\\"\\\");\\n if (inComposition)\\n return;\\n else if (str == c.lastValue)\\n resetValue();\\n else if (!c.lastValue && str) {\\n resetValue();\\n sendText(str);\\n }\\n });\\n inputHandler = function compositionInputHandler(str) {\\n if (timer)\\n clearTimeout(timer);\\n str = str.replace(/\\\\u2028/g, \\\"\\\");\\n if (str == c.lastValue)\\n return \\\"\\\";\\n if (c.lastValue && timer)\\n host.undo();\\n return str;\\n };\\n host.onCompositionEnd();\\n host.removeListener(\\\"mousedown\\\", onCompositionEnd);\\n if (e.type == \\\"compositionend\\\" && c.range) {\\n host.selection.setRange(c.range);\\n }\\n var needsOnInput =\\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\\n\\n if (needsOnInput) {\\n onInput();\\n }\\n };\\n \\n \\n\\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\\n\\n event.addListener(text, \\\"compositionstart\\\", onCompositionStart);\\n if (useragent.isGecko) {\\n event.addListener(text, \\\"text\\\", function(){syncComposition.schedule();});\\n } else {\\n event.addListener(text, \\\"keyup\\\", function(){syncComposition.schedule();});\\n event.addListener(text, \\\"keydown\\\", function(){syncComposition.schedule();});\\n }\\n event.addListener(text, \\\"compositionend\\\", onCompositionEnd);\\n\\n this.getElement = function() {\\n return text;\\n };\\n\\n this.setReadOnly = function(readOnly) {\\n text.readOnly = readOnly;\\n };\\n\\n this.onContextMenu = function(e) {\\n afterContextMenu = true;\\n resetSelection(host.selection.isEmpty());\\n host._emit(\\\"nativecontextmenu\\\", {target: host, domEvent: e});\\n this.moveToMouse(e, true);\\n };\\n \\n this.moveToMouse = function(e, bringToFront) {\\n if (!tempStyle)\\n tempStyle = text.style.cssText;\\n text.style.cssText = (bringToFront ? \\\"z-index:100000;\\\" : \\\"\\\")\\n + \\\"height:\\\" + text.style.height + \\\";\\\"\\n + (useragent.isIE ? \\\"opacity:0.1;\\\" : \\\"\\\");\\n\\n var rect = host.container.getBoundingClientRect();\\n var style = dom.computedStyle(host.container);\\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\\n var maxTop = rect.bottom - top - text.clientHeight -2;\\n var move = function(e) {\\n text.style.left = e.clientX - left - 2 + \\\"px\\\";\\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \\\"px\\\";\\n }; \\n move(e);\\n\\n if (e.type != \\\"mousedown\\\")\\n return;\\n\\n if (host.renderer.$keepTextAreaAtCursor)\\n host.renderer.$keepTextAreaAtCursor = null;\\n\\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 if (host.renderer.$keepTextAreaAtCursor == null) {\\n host.renderer.$keepTextAreaAtCursor = true;\\n host.renderer.$moveTextAreaToCursor();\\n }\\n }, 0);\\n }\\n\\n var onContextMenu = function(e) {\\n host.textInput.onContextMenu(e);\\n onContextMenuClose();\\n };\\n event.addListener(text, \\\"mouseup\\\", onContextMenu);\\n event.addListener(text, \\\"mousedown\\\", function(e) {\\n e.preventDefault();\\n onContextMenuClose();\\n });\\n event.addListener(host.renderer.scroller, \\\"contextmenu\\\", onContextMenu);\\n event.addListener(text, \\\"contextmenu\\\", onContextMenu);\\n};\\n\\nexports.TextInput = TextInput;\\n});\\n\\ndefine(\\\"ace/mouse/default_handlers\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/event\\\",\\\"ace/lib/useragent\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar event = require(\\\"../lib/event\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\n\\nvar DRAG_OFFSET = 0; // pixels\\nvar SCROLL_COOLDOWN_T = 250; // 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 editor.setDefaultHandler(\\\"touchmove\\\", this.onTouchMove.bind(mouseHandler));\\n\\n var exports = [\\\"select\\\", \\\"startSelect\\\", \\\"selectEnd\\\", \\\"selectAllEnd\\\", \\\"selectByWordsEnd\\\",\\n \\\"selectByLinesEnd\\\", \\\"dragWait\\\", \\\"dragWaitEnd\\\", \\\"focusWait\\\"];\\n\\n exports.forEach(function(x) {\\n mouseHandler[x] = this[x];\\n }, this);\\n\\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \\\"getLineRange\\\");\\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \\\"getWordRange\\\");\\n}\\n\\n(function() {\\n\\n this.onMouseDown = function(ev) {\\n var inSelection = ev.inSelection();\\n var pos = ev.getDocumentPosition();\\n this.mousedownEvent = ev;\\n var editor = this.editor;\\n\\n var button = ev.getButton();\\n if (button !== 0) {\\n var selectionRange = editor.getSelectionRange();\\n var selectionEmpty = selectionRange.isEmpty();\\n editor.$blockScrolling++;\\n if (selectionEmpty || button == 1)\\n editor.selection.moveToPosition(pos);\\n editor.$blockScrolling--;\\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.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\\n this.setState(\\\"focusWait\\\");\\n this.captureMouse(ev);\\n return;\\n }\\n }\\n\\n this.captureMouse(ev);\\n this.startSelect(pos, ev.domEvent._clicks > 1);\\n return ev.preventDefault();\\n };\\n\\n this.startSelect = function(pos, waitForClickSelection) {\\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\\n var editor = this.editor;\\n editor.$blockScrolling++;\\n if (this.mousedownEvent.getShiftKey())\\n editor.selection.selectToPosition(pos);\\n else if (!waitForClickSelection)\\n editor.selection.moveToPosition(pos);\\n if (!waitForClickSelection)\\n this.select();\\n if (editor.renderer.scroller.setCapture) {\\n editor.renderer.scroller.setCapture();\\n }\\n editor.setStyle(\\\"ace_selecting\\\");\\n this.setState(\\\"select\\\");\\n editor.$blockScrolling--;\\n };\\n\\n this.select = function() {\\n var anchor, editor = this.editor;\\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\\n editor.$blockScrolling++;\\n if (this.$clickSelection) {\\n var cmp = this.$clickSelection.comparePoint(cursor);\\n\\n if (cmp == -1) {\\n anchor = this.$clickSelection.end;\\n } else if (cmp == 1) {\\n anchor = this.$clickSelection.start;\\n } else {\\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\\n cursor = orientedRange.cursor;\\n anchor = orientedRange.anchor;\\n }\\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\\n }\\n editor.selection.selectToPosition(cursor);\\n editor.$blockScrolling--;\\n editor.renderer.scrollCursorIntoView();\\n };\\n\\n this.extendSelectionBy = function(unitName) {\\n var anchor, editor = this.editor;\\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\\n var range = editor.selection[unitName](cursor.row, cursor.column);\\n editor.$blockScrolling++;\\n if (this.$clickSelection) {\\n var cmpStart = this.$clickSelection.comparePoint(range.start);\\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\\n\\n if (cmpStart == -1 && cmpEnd <= 0) {\\n anchor = this.$clickSelection.end;\\n if (range.end.row != cursor.row || range.end.column != cursor.column)\\n cursor = range.start;\\n } else if (cmpEnd == 1 && cmpStart >= 0) {\\n anchor = this.$clickSelection.start;\\n if (range.start.row != cursor.row || range.start.column != cursor.column)\\n cursor = range.end;\\n } else if (cmpStart == -1 && cmpEnd == 1) {\\n cursor = range.end;\\n anchor = range.start;\\n } else {\\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\\n cursor = orientedRange.cursor;\\n anchor = orientedRange.anchor;\\n }\\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\\n }\\n editor.selection.selectToPosition(cursor);\\n editor.$blockScrolling--;\\n editor.renderer.scrollCursorIntoView();\\n };\\n\\n this.selectEnd =\\n this.selectAllEnd =\\n this.selectByWordsEnd =\\n this.selectByLinesEnd = function() {\\n this.$clickSelection = null;\\n this.editor.unsetStyle(\\\"ace_selecting\\\");\\n if (this.editor.renderer.scroller.releaseCapture) {\\n this.editor.renderer.scroller.releaseCapture();\\n }\\n };\\n\\n this.focusWait = function() {\\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\\n var time = Date.now();\\n\\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\\n this.startSelect(this.mousedownEvent.getDocumentPosition());\\n };\\n\\n this.onDoubleClick = function(ev) {\\n var pos = ev.getDocumentPosition();\\n var editor = this.editor;\\n var session = editor.session;\\n\\n var range = session.getBracketRange(pos);\\n if (range) {\\n if (range.isEmpty()) {\\n range.start.column--;\\n range.end.column++;\\n }\\n this.setState(\\\"select\\\");\\n } else {\\n range = editor.selection.getWordRange(pos.row, pos.column);\\n this.setState(\\\"selectByWords\\\");\\n }\\n this.$clickSelection = range;\\n this.select();\\n };\\n\\n this.onTripleClick = function(ev) {\\n var pos = ev.getDocumentPosition();\\n var editor = this.editor;\\n\\n this.setState(\\\"selectByLines\\\");\\n var range = editor.getSelectionRange();\\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\\n } else {\\n this.$clickSelection = editor.selection.getLineRange(pos.row);\\n }\\n this.select();\\n };\\n\\n this.onQuadClick = function(ev) {\\n var editor = this.editor;\\n\\n editor.selectAll();\\n this.$clickSelection = editor.getSelectionRange();\\n this.setState(\\\"selectAll\\\");\\n };\\n\\n this.onMouseWheel = function(ev) {\\n if (ev.getAccelKey())\\n return;\\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\\n ev.wheelX = ev.wheelY;\\n ev.wheelY = 0;\\n }\\n \\n var 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 = ev.wheelX / dt;\\n var vy = ev.wheelY / dt;\\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.1 * Math.abs(prevScroll.vx)\\n && Math.abs(vy) <= 1.1 * 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 this.onTouchMove = function(ev) {\\n this.editor._emit(\\\"mousewheel\\\", ev);\\n };\\n\\n}).call(DefaultHandlers.prototype);\\n\\nexports.DefaultHandlers = DefaultHandlers;\\n\\nfunction calcDistance(ax, ay, bx, by) {\\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\\n}\\n\\nfunction calcRangeOrientation(range, cursor) {\\n if (range.start.row == range.end.row)\\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\\n var cmp = cursor.column - 4;\\n else\\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\\n\\n if (cmp < 0)\\n return {cursor: range.start, anchor: range.end};\\n else\\n return {cursor: range.end, anchor: range.start};\\n}\\n\\n});\\n\\ndefine(\\\"ace/tooltip\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nfunction Tooltip (parentNode) {\\n this.isOpen = false;\\n this.$element = null;\\n this.$parentNode = parentNode;\\n}\\n\\n(function() {\\n this.$init = function() {\\n this.$element = dom.createElement(\\\"div\\\");\\n this.$element.className = \\\"ace_tooltip\\\";\\n this.$element.style.display = \\\"none\\\";\\n this.$parentNode.appendChild(this.$element);\\n return this.$element;\\n };\\n this.getElement = function() {\\n return this.$element || this.$init();\\n };\\n this.setText = function(text) {\\n dom.setInnerText(this.getElement(), text);\\n };\\n this.setHtml = function(html) {\\n this.getElement().innerHTML = html;\\n };\\n this.setPosition = function(x, y) {\\n this.getElement().style.left = x + \\\"px\\\";\\n this.getElement().style.top = y + \\\"px\\\";\\n };\\n this.setClassName = function(className) {\\n dom.addCssClass(this.getElement(), className);\\n };\\n this.show = function(text, x, y) {\\n if (text != null)\\n this.setText(text);\\n if (x != null && y != null)\\n this.setPosition(x, y);\\n if (!this.isOpen) {\\n this.getElement().style.display = \\\"block\\\";\\n this.isOpen = true;\\n }\\n };\\n\\n this.hide = function() {\\n if (this.isOpen) {\\n this.getElement().style.display = \\\"none\\\";\\n this.isOpen = false;\\n }\\n };\\n this.getHeight = function() {\\n return this.getElement().offsetHeight;\\n };\\n this.getWidth = function() {\\n return this.getElement().offsetWidth;\\n };\\n \\n 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\\ndefine(\\\"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.removeEventListener(\\\"mousewheel\\\", hideTooltip);\\n }\\n }\\n\\n function moveTooltip(e) {\\n tooltip.setPosition(e.x, e.y);\\n }\\n\\n mouseHandler.editor.setDefaultHandler(\\\"guttermousemove\\\", function(e) {\\n var target = e.domEvent.target || e.domEvent.srcElement;\\n if (dom.hasCssClass(target, \\\"ace_fold-widget\\\"))\\n return hideTooltip();\\n\\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\\n moveTooltip(e);\\n\\n mouseEvent = e;\\n if (tooltipTimeout)\\n return;\\n tooltipTimeout = setTimeout(function() {\\n tooltipTimeout = null;\\n if (mouseEvent && !mouseHandler.isMousePressed)\\n showTooltip();\\n else\\n hideTooltip();\\n }, 50);\\n });\\n\\n event.addListener(editor.renderer.$gutter, \\\"mouseout\\\", function(e) {\\n mouseEvent = null;\\n if (!tooltipAnnotation || tooltipTimeout)\\n return;\\n\\n tooltipTimeout = setTimeout(function() {\\n tooltipTimeout = null;\\n hideTooltip();\\n }, 50);\\n });\\n \\n editor.on(\\\"changeSession\\\", hideTooltip);\\n}\\n\\nfunction GutterTooltip(parentNode) {\\n Tooltip.call(this, parentNode);\\n}\\n\\noop.inherits(GutterTooltip, Tooltip);\\n\\n(function(){\\n this.setPosition = function(x, y) {\\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\\n var width = this.getWidth();\\n var height = this.getHeight();\\n x += 15;\\n y += 15;\\n if (x + width > windowWidth) {\\n x -= (x + width) - windowWidth;\\n }\\n if (y + height > windowHeight) {\\n y -= 20 + height;\\n }\\n Tooltip.prototype.setPosition.call(this, x, y);\\n };\\n\\n}).call(GutterTooltip.prototype);\\n\\n\\n\\nexports.GutterHandler = GutterHandler;\\n\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"ace/mouse/dragdrop_handler\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/event\\\",\\\"ace/lib/useragent\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar event = require(\\\"../lib/event\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\n\\nvar AUTOSCROLL_DELAY = 200;\\nvar SCROLL_CURSOR_DELAY = 200;\\nvar SCROLL_CURSOR_HYSTERESIS = 5;\\n\\nfunction DragdropHandler(mouseHandler) {\\n\\n var editor = mouseHandler.editor;\\n\\n var blankImage = dom.createElement(\\\"img\\\");\\n blankImage.src = \\\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\\\";\\n if (useragent.isOpera)\\n blankImage.style.cssText = \\\"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\\\";\\n\\n var exports = [\\\"dragWait\\\", \\\"dragWaitEnd\\\", \\\"startDrag\\\", \\\"dragReadyEnd\\\", \\\"onMouseDrag\\\"];\\n\\n exports.forEach(function(x) {\\n mouseHandler[x] = this[x];\\n }, this);\\n editor.addEventListener(\\\"mousedown\\\", this.onMouseDown.bind(mouseHandler));\\n\\n\\n var mouseTarget = editor.container;\\n var dragSelectionMarker, x, y;\\n var timerId, range;\\n var dragCursor, counter = 0;\\n var dragOperation;\\n var isInternal;\\n var autoScrollStartTime;\\n var cursorMovedTime;\\n var cursorPointOnCaretMoved;\\n\\n this.onDragStart = function(e) {\\n if (this.cancelDrag || !mouseTarget.draggable) {\\n var self = this;\\n setTimeout(function(){\\n self.startSelect();\\n self.captureMouse(e);\\n }, 0);\\n return e.preventDefault();\\n }\\n range = editor.getSelectionRange();\\n\\n var dataTransfer = e.dataTransfer;\\n dataTransfer.effectAllowed = editor.getReadOnly() ? \\\"copy\\\" : \\\"copyMove\\\";\\n if (useragent.isOpera) {\\n editor.container.appendChild(blankImage);\\n blankImage.scrollTop = 0;\\n }\\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\\n if (useragent.isOpera) {\\n editor.container.removeChild(blankImage);\\n }\\n dataTransfer.clearData();\\n dataTransfer.setData(\\\"Text\\\", editor.session.getTextRange());\\n\\n isInternal = true;\\n this.setState(\\\"drag\\\");\\n };\\n\\n this.onDragEnd = function(e) {\\n mouseTarget.draggable = false;\\n isInternal = false;\\n this.setState(null);\\n if (!editor.getReadOnly()) {\\n var dropEffect = e.dataTransfer.dropEffect;\\n if (!dragOperation && dropEffect == \\\"move\\\")\\n editor.session.remove(editor.getSelectionRange());\\n editor.renderer.$cursorLayer.setBlinking(true);\\n }\\n this.editor.unsetStyle(\\\"ace_dragging\\\");\\n this.editor.renderer.setCursorStyle(\\\"\\\");\\n };\\n\\n this.onDragEnter = function(e) {\\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\\n return;\\n x = e.clientX;\\n y = e.clientY;\\n if (!dragSelectionMarker)\\n addDragMarker();\\n counter++;\\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\\n return event.preventDefault(e);\\n };\\n\\n this.onDragOver = function(e) {\\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\\n return;\\n x = e.clientX;\\n y = e.clientY;\\n if (!dragSelectionMarker) {\\n addDragMarker();\\n counter++;\\n }\\n if (onMouseMoveTimer !== null)\\n onMouseMoveTimer = null;\\n\\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\\n return event.preventDefault(e);\\n };\\n\\n this.onDragLeave = function(e) {\\n counter--;\\n if (counter <= 0 && dragSelectionMarker) {\\n clearDragMarker();\\n dragOperation = null;\\n return event.preventDefault(e);\\n }\\n };\\n\\n this.onDrop = function(e) {\\n if (!dragCursor)\\n return;\\n var dataTransfer = e.dataTransfer;\\n if (isInternal) {\\n switch (dragOperation) {\\n case \\\"move\\\":\\n if (range.contains(dragCursor.row, dragCursor.column)) {\\n range = {\\n start: dragCursor,\\n end: dragCursor\\n };\\n } else {\\n range = editor.moveText(range, dragCursor);\\n }\\n break;\\n case \\\"copy\\\":\\n range = editor.moveText(range, dragCursor, true);\\n break;\\n }\\n } else {\\n var dropData = dataTransfer.getData('Text');\\n range = {\\n start: dragCursor,\\n end: editor.session.insert(dragCursor, dropData)\\n };\\n editor.focus();\\n dragOperation = null;\\n }\\n clearDragMarker();\\n return event.preventDefault(e);\\n };\\n\\n event.addListener(mouseTarget, \\\"dragstart\\\", this.onDragStart.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragend\\\", this.onDragEnd.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragenter\\\", this.onDragEnter.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragover\\\", this.onDragOver.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"dragleave\\\", this.onDragLeave.bind(mouseHandler));\\n event.addListener(mouseTarget, \\\"drop\\\", this.onDrop.bind(mouseHandler));\\n\\n function scrollCursorIntoView(cursor, prevCursor) {\\n var now = Date.now();\\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\\n if (!cursorMovedTime || vMovement || hMovement) {\\n editor.$blockScrolling += 1;\\n editor.moveCursorToPosition(cursor);\\n editor.$blockScrolling -= 1;\\n cursorMovedTime = now;\\n cursorPointOnCaretMoved = {x: x, y: y};\\n } else {\\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\\n cursorMovedTime = null;\\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\\n editor.renderer.scrollCursorIntoView();\\n cursorMovedTime = null;\\n }\\n }\\n }\\n\\n function autoScroll(cursor, prevCursor) {\\n var now = Date.now();\\n var lineHeight = editor.renderer.layerConfig.lineHeight;\\n var characterWidth = editor.renderer.layerConfig.characterWidth;\\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\\n var offsets = {\\n x: {\\n left: x - editorRect.left,\\n right: editorRect.right - x\\n },\\n y: {\\n top: y - editorRect.top,\\n bottom: editorRect.bottom - y\\n }\\n };\\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\\n var scrollCursor = {row: cursor.row, column: cursor.column};\\n if (nearestXOffset / characterWidth <= 2) {\\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\\n }\\n if (nearestYOffset / lineHeight <= 1) {\\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\\n }\\n var vScroll = cursor.row != scrollCursor.row;\\n var hScroll = cursor.column != scrollCursor.column;\\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\\n if (vScroll || (hScroll && !vMovement)) {\\n if (!autoScrollStartTime)\\n autoScrollStartTime = now;\\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\\n editor.renderer.scrollCursorIntoView(scrollCursor);\\n } else {\\n autoScrollStartTime = null;\\n }\\n }\\n\\n function onDragInterval() {\\n var prevCursor = dragCursor;\\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\\n scrollCursorIntoView(dragCursor, prevCursor);\\n autoScroll(dragCursor, prevCursor);\\n }\\n\\n function addDragMarker() {\\n range = editor.selection.toOrientedRange();\\n dragSelectionMarker = editor.session.addMarker(range, \\\"ace_selection\\\", editor.getSelectionStyle());\\n editor.clearSelection();\\n if (editor.isFocused())\\n editor.renderer.$cursorLayer.setBlinking(false);\\n clearInterval(timerId);\\n onDragInterval();\\n timerId = setInterval(onDragInterval, 20);\\n counter = 0;\\n event.addListener(document, \\\"mousemove\\\", onMouseMove);\\n }\\n\\n function clearDragMarker() {\\n clearInterval(timerId);\\n editor.session.removeMarker(dragSelectionMarker);\\n dragSelectionMarker = null;\\n editor.$blockScrolling += 1;\\n editor.selection.fromOrientedRange(range);\\n editor.$blockScrolling -= 1;\\n if (editor.isFocused() && !isInternal)\\n editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\\n range = null;\\n dragCursor = null;\\n counter = 0;\\n autoScrollStartTime = null;\\n cursorMovedTime = null;\\n event.removeListener(document, \\\"mousemove\\\", onMouseMove);\\n }\\n var onMouseMoveTimer = null;\\n function onMouseMove() {\\n if (onMouseMoveTimer == null) {\\n onMouseMoveTimer = setTimeout(function() {\\n if (onMouseMoveTimer != null && dragSelectionMarker)\\n clearDragMarker();\\n }, 20);\\n }\\n }\\n\\n function canAccept(dataTransfer) {\\n var types = dataTransfer.types;\\n return !types || Array.prototype.some.call(types, function(type) {\\n return type == 'text/plain' || type == 'Text';\\n });\\n }\\n\\n function getDropEffect(e) {\\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\\n\\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\\n var effectAllowed = \\\"uninitialized\\\";\\n try {\\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\\n } catch (e) {}\\n var dropEffect = \\\"none\\\";\\n\\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\\n dropEffect = \\\"copy\\\";\\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\\n dropEffect = \\\"move\\\";\\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\\n dropEffect = \\\"copy\\\";\\n\\n return dropEffect;\\n }\\n}\\n\\n(function() {\\n\\n this.dragWait = function() {\\n var interval = Date.now() - this.mousedownEvent.time;\\n if (interval > this.editor.getDragDelay())\\n this.startDrag();\\n };\\n\\n this.dragWaitEnd = function() {\\n var target = this.editor.container;\\n target.draggable = false;\\n this.startSelect(this.mousedownEvent.getDocumentPosition());\\n this.selectEnd();\\n };\\n\\n this.dragReadyEnd = function(e) {\\n this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\\n this.editor.unsetStyle(\\\"ace_dragging\\\");\\n this.editor.renderer.setCursorStyle(\\\"\\\");\\n this.dragWaitEnd();\\n };\\n\\n this.startDrag = function(){\\n this.cancelDrag = false;\\n var editor = this.editor;\\n var target = editor.container;\\n target.draggable = true;\\n editor.renderer.$cursorLayer.setBlinking(false);\\n editor.setStyle(\\\"ace_dragging\\\");\\n var cursorStyle = useragent.isWin ? \\\"default\\\" : \\\"move\\\";\\n editor.renderer.setCursorStyle(cursorStyle);\\n this.setState(\\\"dragReady\\\");\\n };\\n\\n this.onMouseDrag = function(e) {\\n var target = this.editor.container;\\n if (useragent.isIE && this.state == \\\"dragReady\\\") {\\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\\n if (distance > 3)\\n target.dragDrop();\\n }\\n if (this.state === \\\"dragWait\\\") {\\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\\n if (distance > 0) {\\n target.draggable = false;\\n this.startSelect(this.mousedownEvent.getDocumentPosition());\\n }\\n }\\n };\\n\\n this.onMouseDown = function(e) {\\n if (!this.$dragEnabled)\\n return;\\n this.mousedownEvent = e;\\n var editor = this.editor;\\n\\n var inSelection = e.inSelection();\\n var button = e.getButton();\\n var clickCount = e.domEvent.detail || 1;\\n if (clickCount === 1 && button === 0 && inSelection) {\\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\\n return;\\n this.mousedownEvent.time = Date.now();\\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\\n if (\\\"unselectable\\\" in eventTarget)\\n eventTarget.unselectable = \\\"on\\\";\\n if (editor.getDragDelay()) {\\n if (useragent.isWebKit) {\\n this.cancelDrag = true;\\n var mouseTarget = editor.container;\\n mouseTarget.draggable = true;\\n }\\n this.setState(\\\"dragWait\\\");\\n } else {\\n this.startDrag();\\n }\\n this.captureMouse(e, this.onMouseDrag.bind(this));\\n e.defaultPrevented = true;\\n }\\n };\\n\\n}).call(DragdropHandler.prototype);\\n\\n\\nfunction calcDistance(ax, ay, bx, by) {\\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\\n}\\n\\nexports.DragdropHandler = DragdropHandler;\\n\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"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 net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\\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;\\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\\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))\\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\\ndefine(\\\"ace/bidihandler\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/bidiutil\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar bidiUtil = require(\\\"./lib/bidiutil\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar useragent = require(\\\"./lib/useragent\\\");\\nvar bidiRE = /[\\\\u0590-\\\\u05f4\\\\u0600-\\\\u06ff\\\\u0700-\\\\u08ac]/;\\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.line = \\\"\\\";\\n this.wrapIndent = 0;\\n this.isLastRow = false;\\n this.EOF = \\\"\\\\xB6\\\";\\n this.seenBidi = false;\\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 }\\n\\n return splitIndex;\\n };\\n\\n this.updateRowLine = function(docRow, splitIndex) {\\n if (docRow === undefined)\\n docRow = this.getDocumentRow();\\n \\n this.wrapIndent = 0;\\n this.isLastRow = (docRow === this.session.getLength() - 1);\\n this.line = this.session.getLine(docRow);\\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.line = (splitIndex < splits.length) ?\\n this.line.substring(splits[splitIndex - 1], splits[splits.length - 1]) :\\n this.line.substring(splits[splits.length - 1]);\\n } else {\\n this.line = this.line.substring(0, splits[splitIndex]);\\n }\\n }\\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 \\n this.updateBidiMap = function() {\\n var textCharTypes = [], endOfLine = this.isLastRow ? this.EOF : this.EOL;\\n var line = this.line + (this.showInvisibles ? endOfLine : bidiUtil.DOT);\\n if (bidiUtil.hasBidiCharacters(line, textCharTypes)) {\\n this.bidiMap = bidiUtil.doBidiReorder(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.seenBidi)\\n return;\\n if (this.characterWidth === fontMetrics.$characterSize.width)\\n return;\\n\\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] = useragent.isChrome ? bidiCharWidth : bidiCharWidth * 0.45;\\n this.charWidths[bidiUtil.B] = 0;\\n\\n this.currentRow = null;\\n };\\n\\n this.getShowInvisibles = function() {\\n return this.showInvisibles;\\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.setTextDir = function(isRtlDir) {\\n this.isRtlDir = isRtlDir; \\n };\\n this.getPosLeft = function(col) {\\n col -= this.wrapIndent;\\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(col > 0 ? col - 1 : 0, this.bidiMap),\\n levels = this.bidiMap.bidiLevels, left = 0;\\n\\n if (col === 0 && 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 (col !== 0 && levels[visualIdx] % 2 === 0)\\n left += this.charWidths[levels[visualIdx]];\\n\\n if (this.wrapIndent)\\n left += this.wrapIndent * this.charWidths[bidiUtil.L];\\n\\n return left;\\n };\\n this.getSelections = function(startCol, endCol) {\\n var map = this.bidiMap, levels = map.bidiLevels, level, offset = this.wrapIndent * this.charWidths[bidiUtil.L], selections = [],\\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\\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 return selections;\\n };\\n this.offsetToCol = function(posX) {\\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.wrapIndent * this.charWidths[bidiUtil.L];\\n }\\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 return (logicalIdx + this.wrapIndent);\\n };\\n\\n}).call(BidiHandler.prototype);\\n\\nexports.BidiHandler = BidiHandler;\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"ace/selection\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar EventEmitter = require(\\\"./lib/event_emitter\\\").EventEmitter;\\nvar Range = require(\\\"./range\\\").Range;\\nvar Selection = function(session) {\\n this.session = session;\\n this.doc = session.getDocument();\\n\\n this.clearSelection();\\n this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\\n this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\\n\\n var self = this;\\n this.lead.on(\\\"change\\\", function(e) {\\n self._emit(\\\"changeCursor\\\");\\n if (!self.$isEmpty)\\n self._emit(\\\"changeSelection\\\");\\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\\n self.$desiredColumn = null;\\n });\\n\\n this.selectionAnchor.on(\\\"change\\\", function() {\\n if (!self.$isEmpty)\\n self._emit(\\\"changeSelection\\\");\\n });\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n this.isEmpty = function() {\\n return (this.$isEmpty || (\\n this.anchor.row == this.lead.row &&\\n this.anchor.column == this.lead.column\\n ));\\n };\\n this.isMultiLine = function() {\\n if (this.isEmpty()) {\\n return false;\\n }\\n\\n return this.getRange().isMultiLine();\\n };\\n this.getCursor = function() {\\n return this.lead.getPosition();\\n };\\n this.setSelectionAnchor = function(row, column) {\\n this.anchor.setPosition(row, column);\\n\\n if (this.$isEmpty) {\\n this.$isEmpty = false;\\n this._emit(\\\"changeSelection\\\");\\n }\\n };\\n this.getSelectionAnchor = function() {\\n if (this.$isEmpty)\\n return this.getSelectionLead();\\n else\\n return this.anchor.getPosition();\\n };\\n this.getSelectionLead = function() {\\n return this.lead.getPosition();\\n };\\n this.shiftSelection = function(columns) {\\n if (this.$isEmpty) {\\n this.moveCursorTo(this.lead.row, this.lead.column + columns);\\n return;\\n }\\n\\n var anchor = this.getSelectionAnchor();\\n var lead = this.getSelectionLead();\\n\\n var isBackwards = this.isBackwards();\\n\\n if (!isBackwards || anchor.column !== 0)\\n this.setSelectionAnchor(anchor.row, anchor.column + columns);\\n\\n if (isBackwards || lead.column !== 0) {\\n this.$moveSelection(function() {\\n this.moveCursorTo(lead.row, lead.column + columns);\\n });\\n }\\n };\\n this.isBackwards = function() {\\n var anchor = this.anchor;\\n var lead = this.lead;\\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\\n };\\n this.getRange = function() {\\n var anchor = this.anchor;\\n var lead = this.lead;\\n\\n if (this.isEmpty())\\n return Range.fromPoints(lead, lead);\\n\\n if (this.isBackwards()) {\\n return Range.fromPoints(lead, anchor);\\n }\\n else {\\n return Range.fromPoints(anchor, lead);\\n }\\n };\\n this.clearSelection = function() {\\n if (!this.$isEmpty) {\\n this.$isEmpty = true;\\n this._emit(\\\"changeSelection\\\");\\n }\\n };\\n this.selectAll = function() {\\n var lastRow = this.doc.getLength() - 1;\\n this.setSelectionAnchor(0, 0);\\n this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\\n };\\n this.setRange =\\n this.setSelectionRange = function(range, reverse) {\\n if (reverse) {\\n this.setSelectionAnchor(range.end.row, range.end.column);\\n this.selectTo(range.start.row, range.start.column);\\n } else {\\n this.setSelectionAnchor(range.start.row, range.start.column);\\n this.selectTo(range.end.row, range.end.column);\\n }\\n if (this.getRange().isEmpty())\\n this.$isEmpty = true;\\n this.$desiredColumn = null;\\n };\\n\\n this.$moveSelection = function(mover) {\\n var lead = this.lead;\\n if (this.$isEmpty)\\n this.setSelectionAnchor(lead.row, lead.column);\\n\\n mover.call(this);\\n };\\n this.selectTo = function(row, column) {\\n this.$moveSelection(function() {\\n this.moveCursorTo(row, column);\\n });\\n };\\n this.selectToPosition = function(pos) {\\n this.$moveSelection(function() {\\n this.moveCursorToPosition(pos);\\n });\\n };\\n this.moveTo = function(row, column) {\\n this.clearSelection();\\n this.moveCursorTo(row, column);\\n };\\n this.moveToPosition = function(pos) {\\n this.clearSelection();\\n this.moveCursorToPosition(pos);\\n };\\n this.selectUp = function() {\\n this.$moveSelection(this.moveCursorUp);\\n };\\n this.selectDown = function() {\\n this.$moveSelection(this.moveCursorDown);\\n };\\n this.selectRight = function() {\\n this.$moveSelection(this.moveCursorRight);\\n };\\n this.selectLeft = function() {\\n this.$moveSelection(this.moveCursorLeft);\\n };\\n this.selectLineStart = function() {\\n this.$moveSelection(this.moveCursorLineStart);\\n };\\n this.selectLineEnd = function() {\\n this.$moveSelection(this.moveCursorLineEnd);\\n };\\n this.selectFileEnd = function() {\\n this.$moveSelection(this.moveCursorFileEnd);\\n };\\n this.selectFileStart = function() {\\n this.$moveSelection(this.moveCursorFileStart);\\n };\\n this.selectWordRight = function() {\\n this.$moveSelection(this.moveCursorWordRight);\\n };\\n this.selectWordLeft = function() {\\n this.$moveSelection(this.moveCursorWordLeft);\\n };\\n this.getWordRange = function(row, column) {\\n if (typeof column == \\\"undefined\\\") {\\n var cursor = row || this.lead;\\n row = cursor.row;\\n column = cursor.column;\\n }\\n return this.session.getWordRange(row, column);\\n };\\n this.selectWord = function() {\\n this.setSelectionRange(this.getWordRange());\\n };\\n this.selectAWord = function() {\\n var cursor = this.getCursor();\\n var range = this.session.getAWordRange(cursor.row, cursor.column);\\n this.setSelectionRange(range);\\n };\\n\\n this.getLineRange = function(row, excludeLastChar) {\\n var rowStart = typeof row == \\\"number\\\" ? row : this.lead.row;\\n var rowEnd;\\n\\n var foldLine = this.session.getFoldLine(rowStart);\\n if (foldLine) {\\n rowStart = foldLine.start.row;\\n rowEnd = foldLine.end.row;\\n } else {\\n rowEnd = rowStart;\\n }\\n if (excludeLastChar === true)\\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\\n else\\n return new Range(rowStart, 0, rowEnd + 1, 0);\\n };\\n this.selectLine = function() {\\n this.setSelectionRange(this.getLineRange());\\n };\\n this.moveCursorUp = function() {\\n this.moveCursorBy(-1, 0);\\n };\\n this.moveCursorDown = function() {\\n this.moveCursorBy(1, 0);\\n };\\n this.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 var match;\\n this.session.nonTokenRe.lastIndex = 0;\\n this.session.tokenRe.lastIndex = 0;\\n var fold = this.session.getFoldAt(row, column, 1);\\n if (fold) {\\n this.moveCursorTo(fold.end.row, fold.end.column);\\n return;\\n }\\n if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\\n column += this.session.nonTokenRe.lastIndex;\\n this.session.nonTokenRe.lastIndex = 0;\\n rightOfCursor = line.substring(column);\\n }\\n if (column >= line.length) {\\n this.moveCursorTo(row, line.length);\\n this.moveCursorRight();\\n if (row < this.doc.getLength() - 1)\\n this.moveCursorWordRight();\\n return;\\n }\\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\\n column += this.session.tokenRe.lastIndex;\\n this.session.tokenRe.lastIndex = 0;\\n }\\n\\n this.moveCursorTo(row, column);\\n };\\n this.moveCursorLongWordLeft = function() {\\n var row = this.lead.row;\\n var column = this.lead.column;\\n var fold;\\n if (fold = this.session.getFoldAt(row, column, -1)) {\\n this.moveCursorTo(fold.start.row, fold.start.column);\\n return;\\n }\\n\\n var str = this.session.getFoldStringAt(row, column, -1);\\n if (str == null) {\\n str = this.doc.getLine(row).substring(0, column);\\n }\\n\\n var leftOfCursor = lang.stringReverse(str);\\n var match;\\n this.session.nonTokenRe.lastIndex = 0;\\n this.session.tokenRe.lastIndex = 0;\\n if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\\n column -= this.session.nonTokenRe.lastIndex;\\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\\n this.session.nonTokenRe.lastIndex = 0;\\n }\\n if (column <= 0) {\\n this.moveCursorTo(row, 0);\\n this.moveCursorLeft();\\n if (row > 0)\\n this.moveCursorWordLeft();\\n return;\\n }\\n if (match = this.session.tokenRe.exec(leftOfCursor)) {\\n column -= this.session.tokenRe.lastIndex;\\n this.session.tokenRe.lastIndex = 0;\\n }\\n\\n this.moveCursorTo(row, column);\\n };\\n\\n this.$shortWordEndIndex = function(rightOfCursor) {\\n var match, index = 0, ch;\\n var whitespaceRe = /\\\\s/;\\n var tokenRe = this.session.tokenRe;\\n\\n tokenRe.lastIndex = 0;\\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\\n index = this.session.tokenRe.lastIndex;\\n } else {\\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\\n index ++;\\n\\n if (index < 1) {\\n tokenRe.lastIndex = 0;\\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\\n tokenRe.lastIndex = 0;\\n index ++;\\n if (whitespaceRe.test(ch)) {\\n if (index > 2) {\\n index--;\\n break;\\n } else {\\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\\n index ++;\\n if (index > 2)\\n break;\\n }\\n }\\n }\\n }\\n }\\n tokenRe.lastIndex = 0;\\n\\n return index;\\n };\\n\\n this.moveCursorShortWordRight = function() {\\n var row = this.lead.row;\\n var column = this.lead.column;\\n var line = this.doc.getLine(row);\\n var rightOfCursor = line.substring(column);\\n\\n var fold = this.session.getFoldAt(row, column, 1);\\n if (fold)\\n return this.moveCursorTo(fold.end.row, fold.end.column);\\n\\n if (column == line.length) {\\n var l = this.doc.getLength();\\n do {\\n row++;\\n rightOfCursor = this.doc.getLine(row);\\n } while (row < l && /^\\\\s*$/.test(rightOfCursor));\\n\\n if (!/^\\\\s+/.test(rightOfCursor))\\n rightOfCursor = \\\"\\\";\\n column = 0;\\n }\\n\\n var index = this.$shortWordEndIndex(rightOfCursor);\\n\\n this.moveCursorTo(row, column + index);\\n };\\n\\n this.moveCursorShortWordLeft = function() {\\n var row = this.lead.row;\\n var column = this.lead.column;\\n\\n var fold;\\n if (fold = this.session.getFoldAt(row, column, -1))\\n return this.moveCursorTo(fold.start.row, fold.start.column);\\n\\n var line = this.session.getLine(row).substring(0, column);\\n if (column === 0) {\\n do {\\n row--;\\n line = this.doc.getLine(row);\\n } while (row > 0 && /^\\\\s*$/.test(line));\\n\\n column = line.length;\\n if (!/\\\\s+$/.test(line))\\n line = \\\"\\\";\\n }\\n\\n var leftOfCursor = lang.stringReverse(line);\\n var index = this.$shortWordEndIndex(leftOfCursor);\\n\\n return this.moveCursorTo(row, column - index);\\n };\\n\\n this.moveCursorWordRight = function() {\\n if (this.session.$selectLongWords)\\n this.moveCursorLongWordRight();\\n else\\n this.moveCursorShortWordRight();\\n };\\n\\n this.moveCursorWordLeft = function() {\\n if (this.session.$selectLongWords)\\n this.moveCursorLongWordLeft();\\n else\\n this.moveCursorShortWordLeft();\\n };\\n this.moveCursorBy = function(rows, chars) {\\n var screenPos = this.session.documentToScreenPosition(\\n this.lead.row,\\n this.lead.column\\n );\\n\\n 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 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 if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\\n if (docPos.row > 0 || rows > 0)\\n docPos.row++;\\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 this.session = this.doc = null;\\n };\\n\\n this.fromOrientedRange = function(range) {\\n this.setSelectionRange(range, range.cursor == range.start);\\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\\n };\\n\\n this.toOrientedRange = function(range) {\\n var r = this.getRange();\\n if (range) {\\n range.start.column = r.start.column;\\n range.start.row = r.start.row;\\n range.end.column = r.end.column;\\n range.end.row = r.end.row;\\n } else {\\n range = r;\\n }\\n\\n range.cursor = this.isBackwards() ? range.start : range.end;\\n range.desiredColumn = this.$desiredColumn;\\n return range;\\n };\\n this.getRangeOfMovements = function(func) {\\n var start = this.getCursor();\\n try {\\n func(this);\\n var end = this.getCursor();\\n return Range.fromPoints(start,end);\\n } catch(e) {\\n return Range.fromPoints(start,start);\\n } finally {\\n this.moveCursorToPosition(start);\\n }\\n };\\n\\n this.toJSON = function() {\\n if (this.rangeCount) {\\n var data = this.ranges.map(function(r) {\\n var r1 = r.clone();\\n r1.isBackwards = r.cursor == r.start;\\n return r1;\\n });\\n } else {\\n var data = this.getRange();\\n data.isBackwards = this.isBackwards();\\n }\\n return data;\\n };\\n\\n this.fromJSON = function(data) {\\n if (data.start == undefined) {\\n if (this.rangeList) {\\n this.toSingleRange(data[0]);\\n for (var i = data.length; i--; ) {\\n var r = Range.fromPoints(data[i].start, data[i].end);\\n if (data[i].isBackwards)\\n r.cursor = r.start;\\n this.addRange(r, true);\\n }\\n return;\\n } else\\n data = data[0];\\n }\\n if (this.rangeList)\\n this.toSingleRange(data);\\n this.setSelectionRange(data, data.isBackwards);\\n };\\n\\n this.isEqual = function(data) {\\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\\n return false;\\n if (!data.length || !this.ranges)\\n return this.getRange().isEqual(data);\\n\\n for (var i = this.ranges.length; i--; ) {\\n if (!this.ranges[i].isEqual(data[i]))\\n return false;\\n }\\n return true;\\n };\\n\\n}).call(Selection.prototype);\\n\\nexports.Selection = Selection;\\n});\\n\\ndefine(\\\"ace/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 += 2000),\\n type: \\\"overflow\\\"\\n };\\n }\\n currentState = \\\"start\\\";\\n stack = [];\\n break;\\n }\\n }\\n\\n if (token.type)\\n tokens.push(token);\\n \\n if (stack.length > 1) {\\n if (stack[0] !== currentState)\\n stack.unshift(\\\"#tmp\\\", currentState);\\n }\\n return {\\n tokens : tokens,\\n state : stack.length ? stack : currentState\\n };\\n };\\n \\n this.reportError = config.reportError;\\n \\n}).call(Tokenizer.prototype);\\n\\nexports.Tokenizer = Tokenizer;\\n});\\n\\ndefine(\\\"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 Object.keys(map).forEach(function(className) {\\n var a = map[className];\\n if (ignoreCase)\\n a = a.toLowerCase();\\n var list = a.split(splitChar || \\\"|\\\");\\n for (var i = list.length; i--; )\\n keywords[list[i]] = className;\\n });\\n if (Object.getPrototypeOf(keywords)) {\\n keywords.__proto__ = null;\\n }\\n this.$keywordList = Object.keys(keywords);\\n map = null;\\n return ignoreCase\\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\\n : function(value) {return keywords[value] || defaultToken; };\\n };\\n\\n this.getKeywords = function() {\\n return this.$keywords;\\n };\\n\\n}).call(TextHighlightRules.prototype);\\n\\nexports.TextHighlightRules = TextHighlightRules;\\n});\\n\\ndefine(\\\"ace/mode/behaviour\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"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\\ndefine(\\\"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\\ndefine(\\\"ace/mode/behaviour/cstyle\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/mode/behaviour\\\",\\\"ace/token_iterator\\\",\\\"ace/lib/lang\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"../../lib/oop\\\");\\nvar Behaviour = require(\\\"../behaviour\\\").Behaviour;\\nvar TokenIterator = require(\\\"../../token_iterator\\\").TokenIterator;\\nvar lang = require(\\\"../../lib/lang\\\");\\n\\nvar SAFE_INSERT_IN_TOKENS =\\n [\\\"text\\\", \\\"paren.rparen\\\", \\\"punctuation.operator\\\"];\\nvar SAFE_INSERT_BEFORE_TOKENS =\\n [\\\"text\\\", \\\"paren.rparen\\\", \\\"punctuation.operator\\\", \\\"comment\\\"];\\n\\nvar context;\\nvar contextCache = {};\\nvar 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 pair = true;\\n }\\n return {\\n text: pair ? quote + quote : \\\"\\\",\\n selection: [1,1]\\n };\\n }\\n }\\n });\\n\\n this.add(\\\"string_dquotes\\\", \\\"deletion\\\", function(state, action, editor, session, range) {\\n var selected = session.doc.getTextRange(range);\\n if (!range.isMultiLine() && (selected == '\\\"' || selected == \\\"'\\\")) {\\n initContext(editor);\\n var line = session.doc.getLine(range.start.row);\\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\\n if (rightChar == selected) {\\n range.end.column++;\\n return range;\\n }\\n }\\n });\\n\\n};\\n\\n \\nCstyleBehaviour.isSaneInsertion = function(editor, session) {\\n var cursor = editor.getCursorPosition();\\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\\n if (!this.$matchTokenType(iterator.getCurrentToken() || \\\"text\\\", SAFE_INSERT_IN_TOKENS)) {\\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \\\"text\\\", SAFE_INSERT_IN_TOKENS))\\n return false;\\n }\\n iterator.stepForward();\\n return iterator.getCurrentTokenRow() !== cursor.row ||\\n this.$matchTokenType(iterator.getCurrentToken() || \\\"text\\\", SAFE_INSERT_BEFORE_TOKENS);\\n};\\n\\nCstyleBehaviour.$matchTokenType = function(token, types) {\\n return types.indexOf(token.type || token) > -1;\\n};\\n\\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\\n var cursor = editor.getCursorPosition();\\n var line = session.doc.getLine(cursor.row);\\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\\n context.autoInsertedBrackets = 0;\\n context.autoInsertedRow = cursor.row;\\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\\n context.autoInsertedBrackets++;\\n};\\n\\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\\n var cursor = editor.getCursorPosition();\\n var line = session.doc.getLine(cursor.row);\\n if (!this.isMaybeInsertedClosing(cursor, line))\\n context.maybeInsertedBrackets = 0;\\n context.maybeInsertedRow = cursor.row;\\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\\n context.maybeInsertedLineEnd = line.substr(cursor.column);\\n context.maybeInsertedBrackets++;\\n};\\n\\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\\n return context.autoInsertedBrackets > 0 &&\\n cursor.row === context.autoInsertedRow &&\\n bracket === context.autoInsertedLineEnd[0] &&\\n line.substr(cursor.column) === context.autoInsertedLineEnd;\\n};\\n\\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\\n return context.maybeInsertedBrackets > 0 &&\\n cursor.row === context.maybeInsertedRow &&\\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\\n};\\n\\nCstyleBehaviour.popAutoInsertedClosing = function() {\\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\\n context.autoInsertedBrackets--;\\n};\\n\\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\\n if (context) {\\n context.maybeInsertedBrackets = 0;\\n context.maybeInsertedRow = -1;\\n }\\n};\\n\\n\\n\\noop.inherits(CstyleBehaviour, Behaviour);\\n\\nexports.CstyleBehaviour = CstyleBehaviour;\\n});\\n\\ndefine(\\\"ace/unicode\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nexports.packages = {};\\n\\naddUnicodePackage({\\n L: \\\"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\\\",\\n Ll: \\\"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\\\",\\n Lu: \\\"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\\\",\\n Lt: \\\"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\\\",\\n Lm: \\\"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\\\",\\n Lo: \\\"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\\\",\\n M: \\\"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\\\",\\n Mn: \\\"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\\\",\\n Mc: \\\"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\\\",\\n Me: \\\"0488048906DE20DD-20E020E2-20E4A670-A672\\\",\\n N: \\\"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\\\",\\n Nd: \\\"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\\\",\\n Nl: \\\"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\\\",\\n No: \\\"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\\\",\\n P: \\\"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\\\",\\n Pd: \\\"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\\\",\\n Ps: \\\"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\\\",\\n Pe: \\\"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\\\",\\n Pi: \\\"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\\\",\\n Pf: \\\"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\\\",\\n Pc: \\\"005F203F20402054FE33FE34FE4D-FE4FFF3F\\\",\\n Po: \\\"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\\\",\\n S: \\\"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\\\",\\n Sm: \\\"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\\\",\\n Sc: \\\"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\\\",\\n Sk: \\\"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\\\",\\n So: \\\"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\\\",\\n Z: \\\"002000A01680180E2000-200A20282029202F205F3000\\\",\\n Zs: \\\"002000A01680180E2000-200A202F205F3000\\\",\\n Zl: \\\"2028\\\",\\n Zp: \\\"2029\\\",\\n C: \\\"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\\\",\\n Cc: \\\"0000-001F007F-009F\\\",\\n Cf: \\\"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\\\",\\n Co: \\\"E000-F8FF\\\",\\n Cs: \\\"D800-DFFF\\\",\\n Cn: \\\"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\\\"\\n});\\n\\nfunction addUnicodePackage (pack) {\\n var codePoint = /\\\\w{4}/g;\\n for (var name in pack)\\n exports.packages[name] = pack[name].replace(codePoint, \\\"\\\\\\\\u$&\\\");\\n}\\n\\n});\\n\\ndefine(\\\"ace/mode/text\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"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\\\";\\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(\\\"^[\\\"\\n + unicode.packages.L\\n + unicode.packages.Mn + unicode.packages.Mc\\n + unicode.packages.Nd\\n + unicode.packages.Pc + \\\"\\\\\\\\$_]+\\\", \\\"g\\\"\\n );\\n\\n this.nonTokenRe = new RegExp(\\\"^(?:[^\\\"\\n + unicode.packages.L\\n + unicode.packages.Mn + unicode.packages.Mc\\n + unicode.packages.Nd\\n + unicode.packages.Pc + \\\"\\\\\\\\$_]|\\\\\\\\s])+\\\", \\\"g\\\"\\n );\\n\\n this.getTokenizer = function() {\\n if (!this.$tokenizer) {\\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(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 return true;\\n };\\n }\\n\\n function iter(fun) {\\n for (var i = startRow; i <= endRow; i++)\\n fun(doc.getLine(i), i);\\n }\\n\\n\\n var minEmptyLength = Infinity;\\n iter(function(line, i) {\\n var indent = line.search(/\\\\S/);\\n if (indent !== -1) {\\n if (indent < minIndent)\\n minIndent = indent;\\n if (shouldRemove && !testRemove(line, i))\\n shouldRemove = false;\\n } else if (minEmptyLength > line.length) {\\n minEmptyLength = line.length;\\n }\\n });\\n\\n if (minIndent == Infinity) {\\n minIndent = minEmptyLength;\\n ignoreBlankLines = false;\\n shouldRemove = false;\\n }\\n\\n if (insertAtTabStop && minIndent % tabSize != 0)\\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\\n\\n iter(shouldRemove ? uncomment : comment);\\n };\\n\\n this.toggleBlockComment = function(state, session, range, cursor) {\\n var comment = this.blockComment;\\n if (!comment)\\n return;\\n if (!comment.start && comment[0])\\n comment = comment[0];\\n\\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\\n var token = iterator.getCurrentToken();\\n\\n var sel = session.selection;\\n var initialRange = session.selection.toOrientedRange();\\n var startRow, colDiff;\\n\\n if (token && /comment/.test(token.type)) {\\n var startRange, endRange;\\n while (token && /comment/.test(token.type)) {\\n var i = token.value.indexOf(comment.start);\\n if (i != -1) {\\n var row = iterator.getCurrentTokenRow();\\n var column = iterator.getCurrentTokenColumn() + i;\\n startRange = new Range(row, column, row, column + comment.start.length);\\n break;\\n }\\n token = iterator.stepBackward();\\n }\\n\\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\\n var token = iterator.getCurrentToken();\\n while (token && /comment/.test(token.type)) {\\n var i = token.value.indexOf(comment.end);\\n if (i != -1) {\\n var row = iterator.getCurrentTokenRow();\\n var column = iterator.getCurrentTokenColumn() + i;\\n endRange = new Range(row, column, row, column + comment.end.length);\\n break;\\n }\\n token = iterator.stepForward();\\n }\\n if (endRange)\\n session.remove(endRange);\\n if (startRange) {\\n session.remove(startRange);\\n startRow = startRange.start.row;\\n colDiff = -comment.start.length;\\n }\\n } else {\\n colDiff = comment.start.length;\\n startRow = range.start.row;\\n session.insert(range.end, comment.end);\\n session.insert(range.start, comment.start);\\n }\\n if (initialRange.start.row == startRow)\\n initialRange.start.column += colDiff;\\n if (initialRange.end.row == startRow)\\n initialRange.end.column += colDiff;\\n session.selection.fromOrientedRange(initialRange);\\n };\\n\\n this.getNextLineIndent = function(state, line, tab) {\\n return this.$getIndent(line);\\n };\\n\\n this.checkOutdent = function(state, line, input) {\\n return false;\\n };\\n\\n this.autoOutdent = function(state, doc, row) {\\n };\\n\\n this.$getIndent = function(line) {\\n return line.match(/^\\\\s*/)[0];\\n };\\n\\n this.createWorker = function(session) {\\n return null;\\n };\\n\\n this.createModeDelegates = function (mapping) {\\n this.$embeds = [];\\n this.$modes = {};\\n for (var i in mapping) {\\n if (mapping[i]) {\\n this.$embeds.push(i);\\n this.$modes[i] = new mapping[i]();\\n }\\n }\\n\\n var delegations = [\\\"toggleBlockComment\\\", \\\"toggleCommentLines\\\", \\\"getNextLineIndent\\\", \\n \\\"checkOutdent\\\", \\\"autoOutdent\\\", \\\"transformAction\\\", \\\"getCompletions\\\"];\\n\\n for (var i = 0; i < delegations.length; i++) {\\n (function(scope) {\\n var functionName = delegations[i];\\n var defaultHandler = scope[functionName];\\n scope[delegations[i]] = function() {\\n return this.$delegator(functionName, arguments, defaultHandler);\\n };\\n }(this));\\n }\\n };\\n\\n this.$delegator = function(method, args, defaultHandler) {\\n var state = args[0];\\n if (typeof state != \\\"string\\\")\\n state = state[0];\\n for (var i = 0; i < this.$embeds.length; i++) {\\n if (!this.$modes[this.$embeds[i]]) continue;\\n\\n var split = state.split(this.$embeds[i]);\\n if (!split[0] && split[1]) {\\n args[0] = split[1];\\n var mode = this.$modes[this.$embeds[i]];\\n return mode[method].apply(mode, args);\\n }\\n }\\n var ret = defaultHandler.apply(this, args);\\n return defaultHandler ? ret : undefined;\\n };\\n\\n this.transformAction = function(state, action, editor, session, param) {\\n if (this.$behaviour) {\\n var behaviours = this.$behaviour.getBehaviours();\\n for (var key in behaviours) {\\n if (behaviours[key][action]) {\\n var ret = behaviours[key][action].apply(this, arguments);\\n if (ret) {\\n return ret;\\n }\\n }\\n }\\n }\\n };\\n \\n this.getKeywords = function(append) {\\n if (!this.completionKeywords) {\\n var rules = this.$tokenizer.rules;\\n var completionKeywords = [];\\n for (var rule in rules) {\\n var ruleItr = rules[rule];\\n for (var r = 0, l = ruleItr.length; r < l; r++) {\\n if (typeof ruleItr[r].token === \\\"string\\\") {\\n if (/keyword|support|storage/.test(ruleItr[r].token))\\n completionKeywords.push(ruleItr[r].regex);\\n }\\n else if (typeof ruleItr[r].token === \\\"object\\\") {\\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \\n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\\n var rule = ruleItr[r].regex.match(/\\\\(.+?\\\\)/g)[a];\\n completionKeywords.push(rule.substr(1, rule.length - 2));\\n }\\n }\\n }\\n }\\n }\\n this.completionKeywords = completionKeywords;\\n }\\n if (!append)\\n return this.$keywordList;\\n return completionKeywords.concat(this.$keywordList || []);\\n };\\n \\n this.$createKeywordList = function() {\\n if (!this.$highlightRules)\\n this.getTokenizer();\\n return this.$keywordList = this.$highlightRules.$keywordList || [];\\n };\\n\\n this.getCompletions = function(state, session, pos, prefix) {\\n var keywords = this.$keywordList || this.$createKeywordList();\\n return keywords.map(function(word) {\\n return {\\n name: word,\\n value: word,\\n score: 0,\\n meta: \\\"keyword\\\"\\n };\\n });\\n };\\n\\n this.$id = \\\"ace/mode/text\\\";\\n}).call(Mode.prototype);\\n\\nexports.Mode = Mode;\\n});\\n\\ndefine(\\\"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\\ndefine(\\\"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.removeEventListener(\\\"change\\\", this.$onChange);\\n };\\n this.attach = function(doc) {\\n this.document = doc || this.document;\\n this.document.on(\\\"change\\\", this.$onChange);\\n };\\n this.$clipPositionToDocument = function(row, column) {\\n var pos = {};\\n\\n if (row >= this.document.getLength()) {\\n pos.row = Math.max(0, this.document.getLength() - 1);\\n pos.column = this.document.getLine(pos.row).length;\\n }\\n else if (row < 0) {\\n pos.row = 0;\\n pos.column = 0;\\n }\\n else {\\n pos.row = row;\\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\\n }\\n\\n if (column < 0)\\n pos.column = 0;\\n\\n return pos;\\n };\\n\\n}).call(Anchor.prototype);\\n\\n});\\n\\ndefine(\\\"ace/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 applyDelta(this.$lines, delta, doNotValidate);\\n this._signal(\\\"change\\\", delta);\\n };\\n \\n this.$splitAndapplyLargeDelta = function(delta, MAX) {\\n var lines = delta.lines;\\n var l = lines.length;\\n var row = delta.start.row; \\n var column = delta.start.column;\\n var from = 0, to = 0;\\n do {\\n from = to;\\n to += MAX - 1;\\n var chunk = lines.slice(from, to);\\n if (to > l) {\\n delta.lines = chunk;\\n delta.start.row = row + from;\\n delta.start.column = column;\\n break;\\n }\\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 } while(true);\\n };\\n this.revertDelta = function(delta) {\\n this.applyDelta({\\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: lines[l-1].length};\\n };\\n this.positionToIndex = function(pos, startRow) {\\n var lines = this.$lines || this.getAllLines();\\n var newlineLength = this.getNewLineCharacter().length;\\n var index = 0;\\n var row = Math.min(pos.row, lines.length);\\n for (var i = startRow || 0; i < row; ++i)\\n index += lines[i].length + newlineLength;\\n\\n return index + pos.column;\\n };\\n\\n}).call(Document.prototype);\\n\\nexports.Document = Document;\\n});\\n\\ndefine(\\\"ace/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\\ndefine(\\\"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\\ndefine(\\\"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\\ndefine(\\\"ace/range_list\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nvar Range = require(\\\"./range\\\").Range;\\nvar comparePoints = Range.comparePoints;\\n\\nvar RangeList = function() {\\n this.ranges = [];\\n};\\n\\n(function() {\\n this.comparePoints = comparePoints;\\n\\n this.pointIndex = function(pos, excludeEdges, startIndex) {\\n var list = this.ranges;\\n\\n for (var i = startIndex || 0; i < list.length; i++) {\\n var range = list[i];\\n var cmpEnd = comparePoints(pos, range.end);\\n if (cmpEnd > 0)\\n continue;\\n var cmpStart = comparePoints(pos, range.start);\\n if (cmpEnd === 0)\\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\\n return i;\\n\\n return -i-1;\\n }\\n return -i - 1;\\n };\\n\\n this.add = function(range) {\\n var excludeEdges = !range.isEmpty();\\n var startIndex = this.pointIndex(range.start, excludeEdges);\\n if (startIndex < 0)\\n startIndex = -startIndex - 1;\\n\\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\\n\\n if (endIndex < 0)\\n endIndex = -endIndex - 1;\\n else\\n endIndex++;\\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\\n };\\n\\n this.addList = function(list) {\\n var removed = [];\\n for (var i = list.length; i--; ) {\\n removed.push.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 if (delta.action == \\\"insert\\\"){\\n var start = delta.start;\\n var end = delta.end;\\n } else {\\n var end = delta.start;\\n var start = delta.end;\\n }\\n var startRow = start.row;\\n var endRow = end.row;\\n var lineDif = endRow - startRow;\\n\\n var colDiff = -start.column + end.column;\\n var ranges = this.ranges;\\n\\n for (var i = 0, n = ranges.length; i < n; i++) {\\n var r = ranges[i];\\n if (r.end.row < startRow)\\n continue;\\n if (r.start.row > startRow)\\n break;\\n\\n if (r.start.row == startRow && r.start.column >= start.column ) {\\n if (r.start.column == start.column && this.$insertRight) {\\n } else {\\n r.start.column += colDiff;\\n r.start.row += lineDif;\\n }\\n }\\n if (r.end.row == startRow && r.end.column >= start.column) {\\n if (r.end.column == start.column && this.$insertRight) {\\n continue;\\n }\\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \\n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\\n r.end.column -= colDiff;\\n }\\n r.end.column += colDiff;\\n r.end.row += lineDif;\\n }\\n }\\n\\n if (lineDif != 0 && i < n) {\\n for (; i < n; i++) {\\n var r = ranges[i];\\n r.start.row += lineDif;\\n r.end.row += lineDif;\\n }\\n }\\n };\\n\\n}).call(RangeList.prototype);\\n\\nexports.RangeList = RangeList;\\n});\\n\\ndefine(\\\"ace/edit_session/fold\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/range_list\\\",\\\"ace/lib/oop\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../range\\\").Range;\\nvar RangeList = require(\\\"../range_list\\\").RangeList;\\nvar oop = require(\\\"../lib/oop\\\");\\nvar Fold = exports.Fold = function(range, placeholder) {\\n this.foldLine = null;\\n this.placeholder = placeholder;\\n this.range = range;\\n this.start = range.start;\\n this.end = range.end;\\n\\n this.sameRow = range.start.row == range.end.row;\\n this.subFolds = this.ranges = [];\\n};\\n\\noop.inherits(Fold, RangeList);\\n\\n(function() {\\n\\n this.toString = function() {\\n return '\\\"' + this.placeholder + '\\\" ' + this.range.toString();\\n };\\n\\n this.setFoldLine = function(foldLine) {\\n this.foldLine = foldLine;\\n this.subFolds.forEach(function(fold) {\\n fold.setFoldLine(foldLine);\\n });\\n };\\n\\n this.clone = function() {\\n var range = this.range.clone();\\n var fold = new Fold(range, this.placeholder);\\n this.subFolds.forEach(function(subFold) {\\n fold.subFolds.push(subFold.clone());\\n });\\n fold.collapseChildren = this.collapseChildren;\\n return fold;\\n };\\n\\n this.addSubFold = function(fold) {\\n if (this.range.isEqual(fold))\\n return;\\n\\n if (!this.range.containsRange(fold))\\n throw new Error(\\\"A fold can't intersect already existing fold\\\" + fold.range + this.range);\\n consumeRange(fold, this.start);\\n\\n var row = fold.start.row, column = fold.start.column;\\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\\n cmp = this.subFolds[i].range.compare(row, column);\\n if (cmp != 1)\\n break;\\n }\\n var afterStart = this.subFolds[i];\\n\\n if (cmp == 0)\\n return afterStart.addSubFold(fold);\\n var row = fold.range.end.row, column = fold.range.end.column;\\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\\n cmp = this.subFolds[j].range.compare(row, column);\\n if (cmp != 1)\\n break;\\n }\\n var afterEnd = this.subFolds[j];\\n\\n if (cmp == 0)\\n throw new Error(\\\"A fold can't intersect already existing fold\\\" + fold.range + this.range);\\n\\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\\n fold.setFoldLine(this.foldLine);\\n\\n return fold;\\n };\\n \\n this.restoreRange = function(range) {\\n return restoreRange(range, this.start);\\n };\\n\\n}).call(Fold.prototype);\\n\\nfunction consumePoint(point, anchor) {\\n point.row -= anchor.row;\\n if (point.row == 0)\\n point.column -= anchor.column;\\n}\\nfunction consumeRange(range, anchor) {\\n consumePoint(range.start, anchor);\\n consumePoint(range.end, anchor);\\n}\\nfunction restorePoint(point, anchor) {\\n if (point.row == 0)\\n point.column += anchor.column;\\n point.row += anchor.row;\\n}\\nfunction restoreRange(range, anchor) {\\n restorePoint(range.start, anchor);\\n restorePoint(range.end, anchor);\\n}\\n\\n});\\n\\ndefine(\\\"ace/edit_session/folding\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/edit_session/fold_line\\\",\\\"ace/edit_session/fold\\\",\\\"ace/token_iterator\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../range\\\").Range;\\nvar FoldLine = require(\\\"./fold_line\\\").FoldLine;\\nvar Fold = require(\\\"./fold\\\").Fold;\\nvar TokenIterator = require(\\\"../token_iterator\\\").TokenIterator;\\n\\nfunction Folding() {\\n this.getFoldAt = function(row, column, side) {\\n var foldLine = this.getFoldLine(row);\\n if (!foldLine)\\n return null;\\n\\n var folds = foldLine.folds;\\n for (var i = 0; i < folds.length; i++) {\\n var fold = folds[i];\\n if (fold.range.contains(row, column)) {\\n if (side == 1 && fold.range.isEnd(row, column)) {\\n continue;\\n } else if (side == -1 && fold.range.isStart(row, column)) {\\n continue;\\n }\\n return fold;\\n }\\n }\\n };\\n this.getFoldsInRange = function(range) {\\n var start = range.start;\\n var end = range.end;\\n var foldLines = this.$foldData;\\n var foundFolds = [];\\n\\n start.column += 1;\\n end.column -= 1;\\n\\n for (var i = 0; i < foldLines.length; i++) {\\n var cmp = foldLines[i].range.compareRange(range);\\n if (cmp == 2) {\\n continue;\\n }\\n else if (cmp == -2) {\\n break;\\n }\\n\\n var folds = foldLines[i].folds;\\n for (var j = 0; j < folds.length; j++) {\\n var fold = folds[j];\\n cmp = fold.range.compareRange(range);\\n if (cmp == -2) {\\n break;\\n } else if (cmp == 2) {\\n continue;\\n } else\\n if (cmp == 42) {\\n break;\\n }\\n foundFolds.push(fold);\\n }\\n }\\n start.column -= 1;\\n end.column += 1;\\n\\n return foundFolds;\\n };\\n\\n this.getFoldsInRangeList = function(ranges) {\\n if (Array.isArray(ranges)) {\\n var folds = [];\\n ranges.forEach(function(range) {\\n folds = folds.concat(this.getFoldsInRange(range));\\n }, this);\\n } else {\\n var folds = this.getFoldsInRange(ranges);\\n }\\n return folds;\\n };\\n this.getAllFolds = function() {\\n var folds = [];\\n var foldLines = this.$foldData;\\n \\n for (var i = 0; i < foldLines.length; i++)\\n for (var j = 0; j < foldLines[i].folds.length; j++)\\n folds.push(foldLines[i].folds[j]);\\n\\n return folds;\\n };\\n this.getFoldStringAt = function(row, column, trim, foldLine) {\\n foldLine = foldLine || this.getFoldLine(row);\\n if (!foldLine)\\n return null;\\n\\n var lastFold = {\\n end: { column: 0 }\\n };\\n var str, fold;\\n for (var i = 0; i < foldLine.folds.length; i++) {\\n fold = foldLine.folds[i];\\n var cmp = fold.range.compareEnd(row, column);\\n if (cmp == -1) {\\n str = this\\n .getLine(fold.start.row)\\n .substring(lastFold.end.column, fold.start.column);\\n break;\\n }\\n else if (cmp === 0) {\\n return null;\\n }\\n lastFold = fold;\\n }\\n if (!str)\\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\\n\\n if (trim == -1)\\n return str.substring(0, column - lastFold.end.column);\\n else if (trim == 1)\\n return str.substring(column - lastFold.end.column);\\n else\\n return str;\\n };\\n\\n this.getFoldLine = function(docRow, startFoldLine) {\\n var foldData = this.$foldData;\\n var i = 0;\\n if (startFoldLine)\\n i = foldData.indexOf(startFoldLine);\\n if (i == -1)\\n i = 0;\\n for (i; i < foldData.length; i++) {\\n var foldLine = foldData[i];\\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\\n return foldLine;\\n } else if (foldLine.end.row > docRow) {\\n return null;\\n }\\n }\\n return null;\\n };\\n this.getNextFoldLine = function(docRow, startFoldLine) {\\n var foldData = this.$foldData;\\n var i = 0;\\n if (startFoldLine)\\n i = foldData.indexOf(startFoldLine);\\n if (i == -1)\\n i = 0;\\n for (i; i < foldData.length; i++) {\\n var foldLine = foldData[i];\\n if (foldLine.end.row >= docRow) {\\n return foldLine;\\n }\\n }\\n return null;\\n };\\n\\n this.getFoldedRowCount = function(first, last) {\\n var foldData = this.$foldData, rowCount = last-first+1;\\n for (var i = 0; i < foldData.length; i++) {\\n var foldLine = foldData[i],\\n end = foldLine.end.row,\\n start = foldLine.start.row;\\n if (end >= last) {\\n if (start < last) {\\n if (start >= first)\\n rowCount -= last-start;\\n else\\n rowCount = 0; // in one fold\\n }\\n break;\\n } else if (end >= first){\\n if (start >= first) // fold inside range\\n rowCount -= end-start;\\n else\\n rowCount -= end-first+1;\\n }\\n }\\n return rowCount;\\n };\\n\\n this.$addFoldLine = function(foldLine) {\\n this.$foldData.push(foldLine);\\n this.$foldData.sort(function(a, b) {\\n return a.start.row - b.start.row;\\n });\\n return foldLine;\\n };\\n this.addFold = function(placeholder, range) {\\n var foldData = this.$foldData;\\n var added = false;\\n var fold;\\n \\n if (placeholder instanceof Fold)\\n fold = placeholder;\\n else {\\n fold = new Fold(range, placeholder);\\n fold.collapseChildren = range.collapseChildren;\\n }\\n this.$clipRangeToDocument(fold.range);\\n\\n var startRow = fold.start.row;\\n var startColumn = fold.start.column;\\n var endRow = fold.end.row;\\n var endColumn = fold.end.column;\\n if (!(startRow < endRow || \\n startRow == endRow && startColumn <= endColumn - 2))\\n throw new Error(\\\"The range has to be at least 2 characters width\\\");\\n\\n var startFold = this.getFoldAt(startRow, startColumn, 1);\\n var endFold = this.getFoldAt(endRow, endColumn, -1);\\n if (startFold && endFold == startFold)\\n return startFold.addSubFold(fold);\\n\\n if (startFold && !startFold.range.isStart(startRow, startColumn))\\n this.removeFold(startFold);\\n \\n if (endFold && !endFold.range.isEnd(endRow, endColumn))\\n this.removeFold(endFold);\\n var folds = this.getFoldsInRange(fold.range);\\n if (folds.length > 0) {\\n this.removeFolds(folds);\\n folds.forEach(function(subFold) {\\n fold.addSubFold(subFold);\\n });\\n }\\n\\n for (var i = 0; i < foldData.length; i++) {\\n var foldLine = foldData[i];\\n if (endRow == foldLine.start.row) {\\n foldLine.addFold(fold);\\n added = true;\\n break;\\n } else if (startRow == foldLine.end.row) {\\n foldLine.addFold(fold);\\n added = true;\\n if (!fold.sameRow) {\\n var foldLineNext = foldData[i + 1];\\n if (foldLineNext && foldLineNext.start.row == endRow) {\\n foldLine.merge(foldLineNext);\\n break;\\n }\\n }\\n break;\\n } else if (endRow <= foldLine.start.row) {\\n break;\\n }\\n }\\n\\n if (!added)\\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\\n\\n if (this.$useWrapMode)\\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\\n else\\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\\n this.$modified = true;\\n this._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 expandInner = true;\\n } else if (typeof location == \\\"number\\\")\\n range = new Range(location, 0, location, this.getLine(location).length);\\n else if (\\\"row\\\" in location)\\n range = Range.fromPoints(location, location);\\n else\\n range = location;\\n \\n folds = this.getFoldsInRangeList(range);\\n if (expandInner) {\\n this.removeFolds(folds);\\n } else {\\n var subFolds = folds;\\n while (subFolds.length) {\\n this.expandFolds(subFolds);\\n subFolds = this.getFoldsInRangeList(range);\\n }\\n }\\n if (folds.length)\\n return folds;\\n };\\n this.isRowFolded = function(docRow, startFoldRow) {\\n return !!this.getFoldLine(docRow, startFoldRow);\\n };\\n\\n this.getRowFoldEnd = function(docRow, startFoldRow) {\\n var foldLine = this.getFoldLine(docRow, startFoldRow);\\n return foldLine ? foldLine.end.row : docRow;\\n };\\n\\n this.getRowFoldStart = function(docRow, startFoldRow) {\\n var foldLine = this.getFoldLine(docRow, startFoldRow);\\n return foldLine ? foldLine.start.row : docRow;\\n };\\n\\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\\n if (startRow == null)\\n startRow = foldLine.start.row;\\n if (startColumn == null)\\n startColumn = 0;\\n if (endRow == null)\\n endRow = foldLine.end.row;\\n if (endColumn == null)\\n endColumn = this.getLine(endRow).length;\\n var doc = this.doc;\\n var textLine = \\\"\\\";\\n\\n foldLine.walk(function(placeholder, row, column, lastColumn) {\\n if (row < startRow)\\n return;\\n if (row == startRow) {\\n if (column < startColumn)\\n return;\\n lastColumn = Math.max(startColumn, lastColumn);\\n }\\n\\n if (placeholder != null) {\\n textLine += placeholder;\\n } else {\\n textLine += doc.getLine(row).substring(lastColumn, column);\\n }\\n }, endRow, endColumn);\\n return textLine;\\n };\\n\\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\\n var foldLine = this.getFoldLine(row);\\n\\n if (!foldLine) {\\n var line;\\n line = this.doc.getLine(row);\\n return line.substring(startColumn || 0, endColumn || line.length);\\n } else {\\n return this.getFoldDisplayLine(\\n foldLine, row, endColumn, startRow, startColumn);\\n }\\n };\\n\\n this.$cloneFoldData = function() {\\n var fd = [];\\n fd = this.$foldData.map(function(foldLine) {\\n var folds = foldLine.folds.map(function(fold) {\\n return fold.clone();\\n });\\n return new FoldLine(fd, folds);\\n });\\n\\n return fd;\\n };\\n\\n this.toggleFold = function(tryToUnfold) {\\n var selection = this.selection;\\n var range = selection.getRange();\\n var fold;\\n var bracketPos;\\n\\n if (range.isEmpty()) {\\n var cursor = range.start;\\n fold = this.getFoldAt(cursor.row, cursor.column);\\n\\n if (fold) {\\n this.expandFold(fold);\\n return;\\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\\n if (range.comparePoint(bracketPos) == 1) {\\n range.end = bracketPos;\\n } else {\\n range.start = bracketPos;\\n range.start.column++;\\n range.end.column--;\\n }\\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\\n if (range.comparePoint(bracketPos) == 1)\\n range.end = bracketPos;\\n else\\n range.start = bracketPos;\\n\\n range.start.column++;\\n } else {\\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\\n }\\n } else {\\n var folds = this.getFoldsInRange(range);\\n if (tryToUnfold && folds.length) {\\n this.expandFolds(folds);\\n return;\\n } else if (folds.length == 1 ) {\\n fold = folds[0];\\n }\\n }\\n\\n if (!fold)\\n fold = this.getFoldAt(range.start.row, range.start.column);\\n\\n if (fold && fold.range.toString() == range.toString()) {\\n this.expandFold(fold);\\n return;\\n }\\n\\n var placeholder = \\\"...\\\";\\n if (!range.isMultiLine()) {\\n placeholder = this.getTextRange(range);\\n if (placeholder.length < 4)\\n return;\\n placeholder = placeholder.trim().substring(0, 2) + \\\"..\\\";\\n }\\n\\n this.addFold(placeholder, range);\\n };\\n\\n this.getCommentFoldRange = function(row, column, dir) {\\n var iterator = new TokenIterator(this, row, column);\\n var token = iterator.getCurrentToken();\\n var type = 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) {\\n if (depth == undefined)\\n depth = 100000; // JSON.stringify doesn't hanle Infinity\\n var foldWidgets = this.foldWidgets;\\n if (!foldWidgets)\\n return; // mode doesn't support folding\\n endRow = endRow || this.getLength();\\n startRow = startRow || 0;\\n for (var row = startRow; row < endRow; row++) {\\n if (foldWidgets[row] == null)\\n foldWidgets[row] = this.getFoldWidget(row);\\n if (foldWidgets[row] != \\\"start\\\")\\n continue;\\n\\n var range = this.getFoldWidgetRange(row);\\n if (range && range.isMultiLine()\\n && range.end.row <= endRow\\n && range.start.row >= startRow\\n ) {\\n row = range.end.row;\\n try {\\n var fold = this.addFold(\\\"...\\\", range);\\n if (fold)\\n fold.collapseChildren = depth;\\n } catch(e) {}\\n }\\n }\\n };\\n this.$foldStyles = {\\n \\\"manual\\\": 1,\\n \\\"markbegin\\\": 1,\\n \\\"markbeginend\\\": 1\\n };\\n this.$foldStyle = \\\"markbegin\\\";\\n this.setFoldStyle = function(style) {\\n if (!this.$foldStyles[style])\\n throw new Error(\\\"invalid fold style: \\\" + style + \\\"[\\\" + Object.keys(this.$foldStyles).join(\\\", \\\") + \\\"]\\\");\\n \\n if (this.$foldStyle == style)\\n return;\\n\\n this.$foldStyle = style;\\n \\n if (style == \\\"manual\\\")\\n this.unfold();\\n var mode = this.$foldMode;\\n this.$setFolding(null);\\n this.$setFolding(mode);\\n };\\n\\n this.$setFolding = function(foldMode) {\\n if (this.$foldMode == foldMode)\\n return;\\n \\n this.$foldMode = foldMode;\\n \\n this.off('change', this.$updateFoldWidgets);\\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\\n this._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\\ndefine(\\\"ace/edit_session/bracket_match\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/token_iterator\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar TokenIterator = require(\\\"../token_iterator\\\").TokenIterator;\\nvar Range = require(\\\"../range\\\").Range;\\n\\n\\nfunction BracketMatch() {\\n\\n this.findMatchingBracket = function(position, chr) {\\n if (position.column == 0) return null;\\n\\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\\n if (charBeforeCursor == \\\"\\\") return null;\\n\\n var match = charBeforeCursor.match(/([\\\\(\\\\[\\\\{])|([\\\\)\\\\]\\\\}])/);\\n if (!match)\\n return null;\\n\\n if (match[1])\\n return this.$findClosingBracket(match[1], position);\\n else\\n return this.$findOpeningBracket(match[2], position);\\n };\\n \\n this.getBracketRange = function(pos) {\\n var line = this.getLine(pos.row);\\n var before = true, range;\\n\\n var chr = line.charAt(pos.column-1);\\n var match = chr && chr.match(/([\\\\(\\\\[\\\\{])|([\\\\)\\\\]\\\\}])/);\\n if (!match) {\\n chr = line.charAt(pos.column);\\n pos = {row: pos.row, column: pos.column + 1};\\n match = chr && chr.match(/([\\\\(\\\\[\\\\{])|([\\\\)\\\\]\\\\}])/);\\n before = false;\\n }\\n if (!match)\\n return null;\\n\\n if (match[1]) {\\n var bracketPos = this.$findClosingBracket(match[1], pos);\\n if (!bracketPos)\\n return null;\\n range = Range.fromPoints(pos, bracketPos);\\n if (!before) {\\n range.end.column++;\\n range.start.column--;\\n }\\n range.cursor = range.end;\\n } else {\\n var bracketPos = this.$findOpeningBracket(match[2], pos);\\n if (!bracketPos)\\n return null;\\n range = Range.fromPoints(bracketPos, pos);\\n if (!before) {\\n range.start.column++;\\n range.end.column--;\\n }\\n range.cursor = range.start;\\n }\\n \\n return range;\\n };\\n\\n this.$brackets = {\\n \\\")\\\": \\\"(\\\",\\n \\\"(\\\": \\\")\\\",\\n \\\"]\\\": \\\"[\\\",\\n \\\"[\\\": \\\"]\\\",\\n \\\"{\\\": \\\"}\\\",\\n \\\"}\\\": \\\"{\\\"\\n };\\n\\n this.$findOpeningBracket = function(bracket, position, typeRe) {\\n var openBracket = this.$brackets[bracket];\\n var depth = 1;\\n\\n var iterator = new TokenIterator(this, position.row, position.column);\\n var token = iterator.getCurrentToken();\\n if (!token)\\n token = iterator.stepForward();\\n if (!token)\\n return;\\n \\n if (!typeRe){\\n typeRe = new RegExp(\\n \\\"(\\\\\\\\.?\\\" +\\n token.type.replace(\\\".\\\", \\\"\\\\\\\\.\\\").replace(\\\"rparen\\\", \\\".paren\\\")\\n .replace(/\\\\b(?:end)\\\\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\\ndefine(\\\"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.$bidiHandler = new BidiHandler(this);\\n this.setDocument(text);\\n this.selection = new Selection(this);\\n\\n config.resetOptions(this);\\n this.setMode(mode);\\n config._signal(\\\"session\\\", this);\\n};\\n\\n\\nEditSession.$uid = 0;\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n this.setDocument = function(doc) {\\n if (this.doc)\\n this.doc.removeListener(\\\"change\\\", this.$onChange);\\n\\n this.doc = doc;\\n doc.on(\\\"change\\\", this.$onChange);\\n\\n if (this.bgTokenizer)\\n this.bgTokenizer.setDocument(this.getDocument());\\n\\n this.resetCaches();\\n };\\n this.getDocument = function() {\\n return this.doc;\\n };\\n this.$resetRowCache = function(docRow) {\\n if (!docRow) {\\n this.$docRowCache = [];\\n this.$screenRowCache = [];\\n return;\\n }\\n var l = this.$docRowCache.length;\\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\\n if (l > i) {\\n this.$docRowCache.splice(i, l);\\n this.$screenRowCache.splice(i, l);\\n }\\n };\\n\\n this.$getRowCacheIndex = function(cacheArray, val) {\\n var low = 0;\\n var hi = cacheArray.length - 1;\\n\\n while (low <= hi) {\\n var mid = (low + hi) >> 1;\\n var c = cacheArray[mid];\\n\\n if (val > c)\\n low = mid + 1;\\n else if (val < c)\\n hi = mid - 1;\\n else\\n return mid;\\n }\\n\\n return low -1;\\n };\\n\\n this.resetCaches = function() {\\n this.$modified = true;\\n this.$wrapData = [];\\n this.$rowLengthCache = [];\\n this.$resetRowCache(0);\\n if (this.bgTokenizer)\\n this.bgTokenizer.start(0);\\n };\\n\\n this.onChangeFold = function(e) {\\n var fold = e.data;\\n this.$resetRowCache(fold.start.row);\\n };\\n\\n this.onChange = function(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 && !delta.ignore) {\\n this.$deltasDoc.push(delta);\\n if (removedFolds && removedFolds.length != 0) {\\n this.$deltasFold.push({\\n action: \\\"removeFolds\\\",\\n folds: removedFolds\\n });\\n }\\n\\n this.$informUndoManager.schedule();\\n }\\n\\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\\n this._signal(\\\"change\\\", 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.$deltas = [];\\n this.$deltasDoc = [];\\n this.$deltasFold = [];\\n this.setUndoManager(this.$undoManager);\\n this.getUndoManager().reset();\\n };\\n this.getValue =\\n this.toString = function() {\\n return this.doc.getValue();\\n };\\n this.getSelection = function() {\\n return this.selection;\\n };\\n this.getState = function(row) {\\n return this.bgTokenizer.getState(row);\\n };\\n this.getTokens = function(row) {\\n return this.bgTokenizer.getTokens(row);\\n };\\n this.getTokenAt = function(row, column) {\\n var tokens = this.bgTokenizer.getTokens(row);\\n var token, c = 0;\\n if (column == null) {\\n 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 this.$deltas = [];\\n this.$deltasDoc = [];\\n this.$deltasFold = [];\\n\\n if (this.$informUndoManager)\\n this.$informUndoManager.cancel();\\n\\n if (undoManager) {\\n var self = this;\\n\\n this.$syncInformUndoManager = function() {\\n self.$informUndoManager.cancel();\\n\\n if (self.$deltasFold.length) {\\n self.$deltas.push({\\n group: \\\"fold\\\",\\n deltas: self.$deltasFold\\n });\\n self.$deltasFold = [];\\n }\\n\\n if (self.$deltasDoc.length) {\\n self.$deltas.push({\\n group: \\\"doc\\\",\\n deltas: self.$deltasDoc\\n });\\n self.$deltasDoc = [];\\n }\\n\\n if (self.$deltas.length > 0) {\\n undoManager.execute({\\n action: \\\"aceupdate\\\",\\n args: [self.$deltas, self],\\n merge: self.mergeUndoDeltas\\n });\\n }\\n self.mergeUndoDeltas = false;\\n self.$deltas = [];\\n };\\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\\n }\\n };\\n this.markUndoGroup = function() {\\n if (this.$syncInformUndoManager)\\n this.$syncInformUndoManager();\\n };\\n \\n this.$defaultUndoManager = {\\n undo: function() {},\\n redo: function() {},\\n reset: function() {}\\n };\\n this.getUndoManager = function() {\\n return this.$undoManager || this.$defaultUndoManager;\\n };\\n this.getTabString = function() {\\n if (this.getUseSoftTabs()) {\\n return lang.stringRepeat(\\\" \\\", this.getTabSize());\\n } else {\\n return \\\"\\\\t\\\";\\n }\\n };\\n this.setUseSoftTabs = function(val) {\\n this.setOption(\\\"useSoftTabs\\\", val);\\n };\\n this.getUseSoftTabs = function() {\\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\\n };\\n this.setTabSize = function(tabSize) {\\n this.setOption(\\\"tabSize\\\", tabSize);\\n };\\n this.getTabSize = function() {\\n return this.$tabSize;\\n };\\n this.isTabStop = function(position) {\\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\\n };\\n 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 = {};\\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 this.$mode = mode;\\n\\n this.$stopWorker();\\n\\n if (this.$useWorker)\\n this.$startWorker();\\n\\n var tokenizer = mode.getTokenizer();\\n\\n if(tokenizer.addEventListener !== undefined) {\\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\\n tokenizer.addEventListener(\\\"update\\\", onReloadTokenizer);\\n }\\n\\n if (!this.bgTokenizer) {\\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\\n var _self = this;\\n this.bgTokenizer.addEventListener(\\\"update\\\", function(e) {\\n _self._signal(\\\"tokenizerUpdate\\\", e);\\n });\\n } else {\\n this.bgTokenizer.setTokenizer(tokenizer);\\n }\\n\\n this.bgTokenizer.setDocument(this.getDocument());\\n\\n this.tokenRe = mode.tokenRe;\\n this.nonTokenRe = mode.nonTokenRe;\\n\\n \\n if (!$isPlaceholder) {\\n if (mode.attachToSession)\\n mode.attachToSession(this);\\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\\n this.$setFolding(mode.foldingRules);\\n this.bgTokenizer.start(0);\\n this._emit(\\\"changeMode\\\");\\n }\\n };\\n\\n this.$stopWorker = function() {\\n if (this.$worker) {\\n this.$worker.terminate();\\n this.$worker = null;\\n }\\n };\\n\\n this.$startWorker = function() {\\n try {\\n this.$worker = this.$mode.createWorker(this);\\n } catch (e) {\\n config.warn(\\\"Could not load worker\\\", e);\\n this.$worker = null;\\n }\\n };\\n this.getMode = function() {\\n return this.$mode;\\n };\\n\\n this.$scrollTop = 0;\\n this.setScrollTop = function(scrollTop) {\\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\\n return;\\n\\n this.$scrollTop = scrollTop;\\n this._signal(\\\"changeScrollTop\\\", scrollTop);\\n };\\n this.getScrollTop = function() {\\n return this.$scrollTop;\\n };\\n\\n this.$scrollLeft = 0;\\n this.setScrollLeft = function(scrollLeft) {\\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\\n return;\\n\\n this.$scrollLeft = scrollLeft;\\n this._signal(\\\"changeScrollLeft\\\", scrollLeft);\\n };\\n this.getScrollLeft = function() {\\n return this.$scrollLeft;\\n };\\n this.getScreenWidth = function() {\\n this.$computeWidth();\\n if (this.lineWidgets) \\n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\\n return this.screenWidth;\\n };\\n \\n this.getLineWidgetMaxWidth = function() {\\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\\n var width = 0;\\n this.lineWidgets.forEach(function(w) {\\n if (w && w.screenWidth > width)\\n width = w.screenWidth;\\n });\\n return this.lineWidgetWidth = width;\\n };\\n\\n this.$computeWidth = function(force) {\\n if (this.$modified || force) {\\n this.$modified = false;\\n\\n if (this.$useWrapMode)\\n return this.screenWidth = this.$wrapLimit;\\n\\n var lines = this.doc.getAllLines();\\n var cache = this.$rowLengthCache;\\n var longestScreenLine = 0;\\n var foldIndex = 0;\\n var foldLine = this.$foldData[foldIndex];\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n var len = lines.length;\\n\\n for (var i = 0; i < len; i++) {\\n if (i > foldStart) {\\n i = foldLine.end.row + 1;\\n if (i >= len)\\n break;\\n foldLine = this.$foldData[foldIndex++];\\n foldStart = foldLine ? foldLine.start.row : Infinity;\\n }\\n\\n if (cache[i] == null)\\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\\n\\n if (cache[i] > longestScreenLine)\\n longestScreenLine = cache[i];\\n }\\n this.screenWidth = longestScreenLine;\\n }\\n };\\n this.getLine = function(row) {\\n return this.doc.getLine(row);\\n };\\n this.getLines = function(firstRow, lastRow) {\\n return this.doc.getLines(firstRow, lastRow);\\n };\\n this.getLength = function() {\\n return this.doc.getLength();\\n };\\n this.getTextRange = function(range) {\\n return this.doc.getTextRange(range || this.selection.getRange());\\n };\\n this.insert = function(position, text) {\\n return this.doc.insert(position, text);\\n };\\n this.remove = function(range) {\\n return this.doc.remove(range);\\n };\\n this.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 var lastUndoRange = null;\\n for (var i = deltas.length - 1; i != -1; i--) {\\n var delta = deltas[i];\\n if (delta.group == \\\"doc\\\") {\\n this.doc.revertDeltas(delta.deltas);\\n lastUndoRange =\\n this.$getUndoSelection(delta.deltas, true, lastUndoRange);\\n } else {\\n delta.deltas.forEach(function(foldDelta) {\\n this.addFolds(foldDelta.folds);\\n }, this);\\n }\\n }\\n this.$fromUndo = false;\\n lastUndoRange &&\\n this.$undoSelect &&\\n !dontSelect &&\\n this.selection.setSelectionRange(lastUndoRange);\\n return lastUndoRange;\\n };\\n this.redoChanges = function(deltas, dontSelect) {\\n if (!deltas.length)\\n return;\\n\\n this.$fromUndo = true;\\n var lastUndoRange = null;\\n for (var i = 0; i < deltas.length; i++) {\\n var delta = deltas[i];\\n if (delta.group == \\\"doc\\\") {\\n this.doc.applyDeltas(delta.deltas);\\n lastUndoRange =\\n this.$getUndoSelection(delta.deltas, false, lastUndoRange);\\n }\\n }\\n this.$fromUndo = false;\\n lastUndoRange &&\\n this.$undoSelect &&\\n !dontSelect &&\\n this.selection.setSelectionRange(lastUndoRange);\\n return lastUndoRange;\\n };\\n this.setUndoSelect = function(enable) {\\n this.$undoSelect = enable;\\n };\\n\\n this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\\n function isInsert(delta) {\\n return isUndo ? delta.action !== \\\"insert\\\" : delta.action === \\\"insert\\\";\\n }\\n\\n var delta = deltas[0];\\n var range, point;\\n var lastDeltaIsInsert = false;\\n if (isInsert(delta)) {\\n range = Range.fromPoints(delta.start, delta.end);\\n lastDeltaIsInsert = true;\\n } else {\\n range = Range.fromPoints(delta.start, delta.start);\\n lastDeltaIsInsert = false;\\n }\\n\\n for (var i = 1; i < deltas.length; i++) {\\n delta = deltas[i];\\n if (isInsert(delta)) {\\n point = delta.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 lastDeltaIsInsert = true;\\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 lastDeltaIsInsert = false;\\n }\\n }\\n if (lastUndoRange != null) {\\n if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\\n lastUndoRange.start.column += range.end.column - range.start.column;\\n lastUndoRange.end.column += range.end.column - range.start.column;\\n }\\n\\n var cmp = lastUndoRange.compareRange(range);\\n if (cmp == 1) {\\n range.setStart(lastUndoRange.start);\\n } else if (cmp == -1) {\\n range.setEnd(lastUndoRange.end);\\n }\\n }\\n\\n return range;\\n };\\n this.replace = function(range, text) {\\n return this.doc.replace(range, text);\\n };\\n this.moveText = function(fromRange, toPosition, copy) {\\n var text = this.getTextRange(fromRange);\\n var folds = this.getFoldsInRange(fromRange);\\n\\n var toRange = Range.fromPoints(toPosition, toPosition);\\n if (!copy) {\\n this.remove(fromRange);\\n var rowDiff = fromRange.start.row - fromRange.end.row;\\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\\n if (collDiff) {\\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\\n toRange.start.column += collDiff;\\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\\n toRange.end.column += collDiff;\\n }\\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\\n toRange.start.row += rowDiff;\\n toRange.end.row += rowDiff;\\n }\\n }\\n\\n toRange.end = this.insert(toRange.start, text);\\n if (folds.length) {\\n var oldStart = fromRange.start;\\n var newStart = toRange.start;\\n var rowDiff = newStart.row - oldStart.row;\\n var collDiff = newStart.column - oldStart.column;\\n this.addFolds(folds.map(function(x) {\\n x = x.clone();\\n if (x.start.row == oldStart.row)\\n x.start.column += collDiff;\\n if (x.end.row == oldStart.row)\\n x.end.column += collDiff;\\n x.start.row += rowDiff;\\n x.end.row += rowDiff;\\n return x;\\n }));\\n }\\n\\n return toRange;\\n };\\n this.indentRows = function(startRow, endRow, indentString) {\\n indentString = indentString.replace(/\\\\t/g, this.getTabString());\\n for (var row=startRow; row<=endRow; row++)\\n this.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 displayed = tokens.slice(lastSplit, screenPos);\\n var len = displayed.length;\\n displayed.join(\\\"\\\")\\n .replace(/12/g, function() {\\n len -= 1;\\n })\\n .replace(/2/g, function() {\\n len -= 1;\\n });\\n\\n 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 if (this.lineWidgets)\\n var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\\n else \\n h = 0;\\n if (!this.$useWrapMode || !this.$wrapData[row]) {\\n return 1 + h;\\n } else {\\n return this.$wrapData[row].length + 1 + h;\\n }\\n };\\n this.getRowLineCount = function(row) {\\n if (!this.$useWrapMode || !this.$wrapData[row]) {\\n return 1;\\n } else {\\n return this.$wrapData[row].length + 1;\\n }\\n };\\n\\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;\\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 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 };\\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.$modified = true;\\n this.$resetRowCache(0);\\n this.$updateWrapData(0, this.getLength() - 1);\\n }\\n }\\n },\\n initialValue: \\\"auto\\\"\\n },\\n indentedSoftWrap: { initialValue: true },\\n firstLineNumber: {\\n set: function() {this._signal(\\\"changeBreakpoint\\\");},\\n initialValue: 1\\n },\\n useWorker: {\\n set: function(useWorker) {\\n this.$useWorker = useWorker;\\n\\n this.$stopWorker();\\n if (useWorker)\\n this.$startWorker();\\n },\\n initialValue: true\\n },\\n useSoftTabs: {initialValue: true},\\n tabSize: {\\n set: function(tabSize) {\\n if (isNaN(tabSize) || this.$tabSize === tabSize) return;\\n\\n this.$modified = true;\\n this.$rowLengthCache = [];\\n this.$tabSize = tabSize;\\n this._signal(\\\"changeTabSize\\\");\\n },\\n initialValue: 4,\\n handlesSet: true\\n },\\n navigateWithinSoftTabs: {initialValue: false},\\n overwrite: {\\n set: function(val) {this._signal(\\\"changeOverwrite\\\");},\\n initialValue: false\\n },\\n newLineMode: {\\n set: function(val) {this.doc.setNewLineMode(val);},\\n get: function() {return this.doc.getNewLineMode();},\\n handlesSet: true\\n },\\n mode: {\\n set: function(val) { this.setMode(val); },\\n get: function() { return this.$modeId; }\\n }\\n});\\n\\nexports.EditSession = EditSession;\\n});\\n\\ndefine(\\\"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) 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 m;\\n var last = startIndex;\\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\\ndefine(\\\"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\\ndefine(\\\"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 (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.removeEventListener(\\\"exec\\\", this.$addCommandToMacro);\\n\\n if (!this.macro.length)\\n this.macro = this.oldMacro;\\n\\n return this.recording = false;\\n }\\n if (!this.$addCommandToMacro) {\\n this.$addCommandToMacro = function(e) {\\n this.macro.push([e.command, e.args]);\\n }.bind(this);\\n }\\n\\n this.oldMacro = this.macro;\\n this.macro = [];\\n this.on(\\\"exec\\\", this.$addCommandToMacro);\\n return this.recording = true;\\n };\\n\\n this.replay = function(editor) {\\n if (this.$inReplay || !this.macro)\\n return;\\n\\n if (this.recording)\\n return this.toggleRecording(editor);\\n\\n try {\\n this.$inReplay = true;\\n this.macro.forEach(function(x) {\\n if (typeof x == \\\"string\\\")\\n this.exec(x, editor);\\n else\\n this.exec(x[0], editor, x[1]);\\n }, this);\\n } finally {\\n this.$inReplay = false;\\n }\\n };\\n\\n this.trimMacro = function(m) {\\n return m.map(function(x){\\n if (typeof x[0] != \\\"string\\\")\\n x[0] = x[0].name;\\n if (!x[1])\\n x = x[0];\\n return x;\\n });\\n };\\n\\n}).call(CommandManager.prototype);\\n\\nexports.CommandManager = CommandManager;\\n\\n});\\n\\ndefine(\\\"ace/commands/default_commands\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/lang\\\",\\\"ace/config\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar lang = require(\\\"../lib/lang\\\");\\nvar config = require(\\\"../config\\\");\\nvar Range = require(\\\"../range\\\").Range;\\n\\nfunction bindKey(win, mac) {\\n return {win: win, mac: mac};\\n}\\nexports.commands = [{\\n name: \\\"showSettingsMenu\\\",\\n bindKey: bindKey(\\\"Ctrl-,\\\", \\\"Command-,\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/settings_menu\\\", function(module) {\\n module.init(editor);\\n editor.showSettingsMenu();\\n });\\n },\\n readOnly: true\\n}, {\\n name: \\\"goToNextError\\\",\\n bindKey: bindKey(\\\"Alt-E\\\", \\\"F4\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/error_marker\\\", function(module) {\\n module.showErrorMarker(editor, 1);\\n });\\n },\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"goToPreviousError\\\",\\n bindKey: bindKey(\\\"Alt-Shift-E\\\", \\\"Shift-F4\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/error_marker\\\", function(module) {\\n module.showErrorMarker(editor, -1);\\n });\\n },\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectall\\\",\\n bindKey: bindKey(\\\"Ctrl-A\\\", \\\"Command-A\\\"),\\n exec: function(editor) { editor.selectAll(); },\\n readOnly: true\\n}, {\\n name: \\\"centerselection\\\",\\n bindKey: bindKey(null, \\\"Ctrl-L\\\"),\\n exec: function(editor) { editor.centerSelection(); },\\n readOnly: true\\n}, {\\n name: \\\"gotoline\\\",\\n bindKey: bindKey(\\\"Ctrl-L\\\", \\\"Command-L\\\"),\\n exec: function(editor) {\\n var line = parseInt(prompt(\\\"Enter line number:\\\"), 10);\\n if (!isNaN(line)) {\\n editor.gotoLine(line);\\n }\\n },\\n readOnly: true\\n}, {\\n name: \\\"fold\\\",\\n bindKey: bindKey(\\\"Alt-L|Ctrl-F1\\\", \\\"Command-Alt-L|Command-F1\\\"),\\n exec: function(editor) { editor.session.toggleFold(false); },\\n 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 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 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 bindKey: bindKey(null, \\\"Ctrl-Command-Option-0\\\"),\\n exec: function(editor) { editor.session.foldAll(); },\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"foldOther\\\",\\n bindKey: bindKey(\\\"Alt-0\\\", \\\"Command-Option-0\\\"),\\n exec: function(editor) { \\n editor.session.foldAll();\\n editor.session.unfold(editor.selection.getAllRanges());\\n },\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"unfoldall\\\",\\n bindKey: bindKey(\\\"Alt-Shift-0\\\", \\\"Command-Option-Shift-0\\\"),\\n exec: function(editor) { editor.session.unfold(); },\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"findnext\\\",\\n bindKey: bindKey(\\\"Ctrl-K\\\", \\\"Command-G\\\"),\\n exec: function(editor) { editor.findNext(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"findprevious\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-K\\\", \\\"Command-Shift-G\\\"),\\n exec: function(editor) { editor.findPrevious(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"center\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectOrFindNext\\\",\\n bindKey: bindKey(\\\"Alt-K\\\", \\\"Ctrl-G\\\"),\\n exec: function(editor) {\\n if (editor.selection.isEmpty())\\n editor.selection.selectWord();\\n else\\n editor.findNext(); \\n },\\n readOnly: true\\n}, {\\n name: \\\"selectOrFindPrevious\\\",\\n bindKey: bindKey(\\\"Alt-Shift-K\\\", \\\"Ctrl-Shift-G\\\"),\\n exec: function(editor) { \\n if (editor.selection.isEmpty())\\n editor.selection.selectWord();\\n else\\n editor.findPrevious();\\n },\\n readOnly: true\\n}, {\\n name: \\\"find\\\",\\n bindKey: bindKey(\\\"Ctrl-F\\\", \\\"Command-F\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/searchbox\\\", function(e) {e.Search(editor);});\\n },\\n readOnly: true\\n}, {\\n name: \\\"overwrite\\\",\\n bindKey: \\\"Insert\\\",\\n exec: function(editor) { editor.toggleOverwrite(); },\\n readOnly: true\\n}, {\\n name: \\\"selecttostart\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Home\\\", \\\"Command-Shift-Home|Command-Shift-Up\\\"),\\n exec: function(editor) { editor.getSelection().selectFileStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"gotostart\\\",\\n bindKey: bindKey(\\\"Ctrl-Home\\\", \\\"Command-Home|Command-Up\\\"),\\n exec: function(editor) { editor.navigateFileStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"selectup\\\",\\n bindKey: bindKey(\\\"Shift-Up\\\", \\\"Shift-Up|Ctrl-Shift-P\\\"),\\n exec: function(editor) { editor.getSelection().selectUp(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"golineup\\\",\\n bindKey: bindKey(\\\"Up\\\", \\\"Up|Ctrl-P\\\"),\\n exec: function(editor, args) { editor.navigateUp(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttoend\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-End\\\", \\\"Command-Shift-End|Command-Shift-Down\\\"),\\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"gotoend\\\",\\n bindKey: bindKey(\\\"Ctrl-End\\\", \\\"Command-End|Command-Down\\\"),\\n exec: function(editor) { editor.navigateFileEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true,\\n scrollIntoView: \\\"animate\\\",\\n aceCommandGroup: \\\"fileJump\\\"\\n}, {\\n name: \\\"selectdown\\\",\\n bindKey: bindKey(\\\"Shift-Down\\\", \\\"Shift-Down|Ctrl-Shift-N\\\"),\\n exec: function(editor) { editor.getSelection().selectDown(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"golinedown\\\",\\n bindKey: bindKey(\\\"Down\\\", \\\"Down|Ctrl-N\\\"),\\n exec: function(editor, args) { editor.navigateDown(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectwordleft\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Left\\\", \\\"Option-Shift-Left\\\"),\\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotowordleft\\\",\\n bindKey: bindKey(\\\"Ctrl-Left\\\", \\\"Option-Left\\\"),\\n exec: function(editor) { editor.navigateWordLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttolinestart\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Left\\\", \\\"Command-Shift-Left|Ctrl-Shift-A\\\"),\\n exec: function(editor) { editor.getSelection().selectLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotolinestart\\\",\\n bindKey: bindKey(\\\"Alt-Left|Home\\\", \\\"Command-Left|Home|Ctrl-A\\\"),\\n exec: function(editor) { editor.navigateLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectleft\\\",\\n bindKey: bindKey(\\\"Shift-Left\\\", \\\"Shift-Left|Ctrl-Shift-B\\\"),\\n exec: function(editor) { editor.getSelection().selectLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotoleft\\\",\\n bindKey: bindKey(\\\"Left\\\", \\\"Left|Ctrl-B\\\"),\\n exec: function(editor, args) { editor.navigateLeft(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectwordright\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Right\\\", \\\"Option-Shift-Right\\\"),\\n exec: function(editor) { editor.getSelection().selectWordRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotowordright\\\",\\n bindKey: bindKey(\\\"Ctrl-Right\\\", \\\"Option-Right\\\"),\\n exec: function(editor) { editor.navigateWordRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttolineend\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Right\\\", \\\"Command-Shift-Right|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 bindKey: bindKey(\\\"Alt-Right|End\\\", \\\"Command-Right|End|Ctrl-E\\\"),\\n exec: function(editor) { editor.navigateLineEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectright\\\",\\n bindKey: bindKey(\\\"Shift-Right\\\", \\\"Shift-Right\\\"),\\n exec: function(editor) { editor.getSelection().selectRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"gotoright\\\",\\n bindKey: bindKey(\\\"Right\\\", \\\"Right|Ctrl-F\\\"),\\n exec: function(editor, args) { editor.navigateRight(args.times); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectpagedown\\\",\\n bindKey: \\\"Shift-PageDown\\\",\\n exec: function(editor) { editor.selectPageDown(); },\\n readOnly: true\\n}, {\\n name: \\\"pagedown\\\",\\n bindKey: bindKey(null, \\\"Option-PageDown\\\"),\\n exec: function(editor) { editor.scrollPageDown(); },\\n readOnly: true\\n}, {\\n name: \\\"gotopagedown\\\",\\n bindKey: bindKey(\\\"PageDown\\\", \\\"PageDown|Ctrl-V\\\"),\\n exec: function(editor) { editor.gotoPageDown(); },\\n readOnly: true\\n}, {\\n name: \\\"selectpageup\\\",\\n bindKey: \\\"Shift-PageUp\\\",\\n exec: function(editor) { editor.selectPageUp(); },\\n readOnly: true\\n}, {\\n name: \\\"pageup\\\",\\n bindKey: bindKey(null, \\\"Option-PageUp\\\"),\\n exec: function(editor) { editor.scrollPageUp(); },\\n readOnly: true\\n}, {\\n name: \\\"gotopageup\\\",\\n bindKey: \\\"PageUp\\\",\\n exec: function(editor) { editor.gotoPageUp(); },\\n readOnly: true\\n}, {\\n name: \\\"scrollup\\\",\\n bindKey: bindKey(\\\"Ctrl-Up\\\", null),\\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\\n readOnly: true\\n}, {\\n name: \\\"scrolldown\\\",\\n bindKey: bindKey(\\\"Ctrl-Down\\\", null),\\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\\n readOnly: true\\n}, {\\n name: \\\"selectlinestart\\\",\\n bindKey: \\\"Shift-Home\\\",\\n exec: function(editor) { editor.getSelection().selectLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectlineend\\\",\\n bindKey: \\\"Shift-End\\\",\\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"togglerecording\\\",\\n bindKey: bindKey(\\\"Ctrl-Alt-E\\\", \\\"Command-Option-E\\\"),\\n exec: function(editor) { editor.commands.toggleRecording(editor); },\\n readOnly: true\\n}, {\\n name: \\\"replaymacro\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-E\\\", \\\"Command-Shift-E\\\"),\\n exec: function(editor) { editor.commands.replay(editor); },\\n readOnly: true\\n}, {\\n name: \\\"jumptomatching\\\",\\n bindKey: bindKey(\\\"Ctrl-P\\\", \\\"Ctrl-P\\\"),\\n exec: function(editor) { editor.jumpToMatching(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"selecttomatching\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-P\\\", \\\"Ctrl-Shift-P\\\"),\\n exec: function(editor) { editor.jumpToMatching(true); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"expandToMatching\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-M\\\", \\\"Ctrl-Shift-M\\\"),\\n exec: function(editor) { editor.jumpToMatching(true, true); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"animate\\\",\\n readOnly: true\\n}, {\\n name: \\\"passKeysToBrowser\\\",\\n bindKey: bindKey(null, null),\\n exec: function() {},\\n passEvent: true,\\n readOnly: true\\n}, {\\n name: \\\"copy\\\",\\n exec: function(editor) {\\n },\\n readOnly: true\\n},\\n{\\n name: \\\"cut\\\",\\n exec: function(editor) {\\n var range = editor.getSelectionRange();\\n editor._emit(\\\"cut\\\", range);\\n\\n if (!editor.selection.isEmpty()) {\\n editor.session.remove(range);\\n editor.clearSelection();\\n }\\n },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"paste\\\",\\n exec: function(editor, args) {\\n editor.$handlePaste(args);\\n },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removeline\\\",\\n bindKey: bindKey(\\\"Ctrl-D\\\", \\\"Command-D\\\"),\\n exec: function(editor) { editor.removeLines(); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEachLine\\\"\\n}, {\\n name: \\\"duplicateSelection\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-D\\\", \\\"Command-Shift-D\\\"),\\n exec: function(editor) { editor.duplicateSelection(); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"sortlines\\\",\\n bindKey: bindKey(\\\"Ctrl-Alt-S\\\", \\\"Command-Alt-S\\\"),\\n exec: function(editor) { editor.sortLines(); },\\n scrollIntoView: \\\"selection\\\",\\n multiSelectAction: \\\"forEachLine\\\"\\n}, {\\n name: \\\"togglecomment\\\",\\n bindKey: bindKey(\\\"Ctrl-/\\\", \\\"Command-/\\\"),\\n exec: function(editor) { editor.toggleCommentLines(); },\\n multiSelectAction: \\\"forEachLine\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"toggleBlockComment\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-/\\\", \\\"Command-Shift-/\\\"),\\n exec: function(editor) { editor.toggleBlockComment(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"modifyNumberUp\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Up\\\", \\\"Alt-Shift-Up\\\"),\\n exec: function(editor) { editor.modifyNumber(1); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"modifyNumberDown\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Down\\\", \\\"Alt-Shift-Down\\\"),\\n exec: function(editor) { editor.modifyNumber(-1); },\\n scrollIntoView: \\\"cursor\\\",\\n multiSelectAction: \\\"forEach\\\"\\n}, {\\n name: \\\"replace\\\",\\n bindKey: bindKey(\\\"Ctrl-H\\\", \\\"Command-Option-F\\\"),\\n exec: function(editor) {\\n config.loadModule(\\\"ace/ext/searchbox\\\", function(e) {e.Search(editor, true);});\\n }\\n}, {\\n name: \\\"undo\\\",\\n bindKey: bindKey(\\\"Ctrl-Z\\\", \\\"Command-Z\\\"),\\n exec: function(editor) { editor.undo(); }\\n}, {\\n name: \\\"redo\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-Z|Ctrl-Y\\\", \\\"Command-Shift-Z|Command-Y\\\"),\\n exec: function(editor) { editor.redo(); }\\n}, {\\n name: \\\"copylinesup\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Up\\\", \\\"Command-Option-Up\\\"),\\n exec: function(editor) { editor.copyLinesUp(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"movelinesup\\\",\\n bindKey: bindKey(\\\"Alt-Up\\\", \\\"Option-Up\\\"),\\n exec: function(editor) { editor.moveLinesUp(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"copylinesdown\\\",\\n bindKey: bindKey(\\\"Alt-Shift-Down\\\", \\\"Command-Option-Down\\\"),\\n exec: function(editor) { editor.copyLinesDown(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"movelinesdown\\\",\\n bindKey: bindKey(\\\"Alt-Down\\\", \\\"Option-Down\\\"),\\n exec: function(editor) { editor.moveLinesDown(); },\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"del\\\",\\n bindKey: bindKey(\\\"Delete\\\", \\\"Delete|Ctrl-D|Shift-Delete\\\"),\\n exec: function(editor) { editor.remove(\\\"right\\\"); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"backspace\\\",\\n bindKey: bindKey(\\n \\\"Shift-Backspace|Backspace\\\",\\n \\\"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\\\"\\n ),\\n exec: function(editor) { editor.remove(\\\"left\\\"); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"cut_or_delete\\\",\\n bindKey: bindKey(\\\"Shift-Delete\\\", null),\\n exec: function(editor) { \\n if (editor.selection.isEmpty()) {\\n editor.remove(\\\"left\\\");\\n } else {\\n return false;\\n }\\n },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removetolinestart\\\",\\n bindKey: bindKey(\\\"Alt-Backspace\\\", \\\"Command-Backspace\\\"),\\n exec: function(editor) { editor.removeToLineStart(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removetolineend\\\",\\n bindKey: bindKey(\\\"Alt-Delete\\\", \\\"Ctrl-K|Command-Delete\\\"),\\n exec: function(editor) { editor.removeToLineEnd(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removetolinestarthard\\\",\\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 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 bindKey: bindKey(\\\"Ctrl-Backspace\\\", \\\"Alt-Backspace|Ctrl-Alt-Backspace\\\"),\\n exec: function(editor) { editor.removeWordLeft(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"removewordright\\\",\\n bindKey: bindKey(\\\"Ctrl-Delete\\\", \\\"Alt-Delete\\\"),\\n exec: function(editor) { editor.removeWordRight(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"outdent\\\",\\n bindKey: bindKey(\\\"Shift-Tab\\\", \\\"Shift-Tab\\\"),\\n exec: function(editor) { editor.blockOutdent(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"indent\\\",\\n bindKey: bindKey(\\\"Tab\\\", \\\"Tab\\\"),\\n exec: function(editor) { editor.indent(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"blockoutdent\\\",\\n bindKey: bindKey(\\\"Ctrl-[\\\", \\\"Ctrl-[\\\"),\\n exec: function(editor) { editor.blockOutdent(); },\\n multiSelectAction: \\\"forEachLine\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"blockindent\\\",\\n bindKey: bindKey(\\\"Ctrl-]\\\", \\\"Ctrl-]\\\"),\\n exec: function(editor) { editor.blockIndent(); },\\n multiSelectAction: \\\"forEachLine\\\",\\n scrollIntoView: \\\"selectionPart\\\"\\n}, {\\n name: \\\"insertstring\\\",\\n exec: function(editor, str) { editor.insert(str); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"inserttext\\\",\\n exec: function(editor, args) {\\n editor.insert(lang.stringRepeat(args.text || \\\"\\\", args.times || 1));\\n },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"splitline\\\",\\n bindKey: bindKey(null, \\\"Ctrl-O\\\"),\\n exec: function(editor) { editor.splitLine(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"transposeletters\\\",\\n bindKey: bindKey(\\\"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 bindKey: bindKey(\\\"Ctrl-U\\\", \\\"Ctrl-U\\\"),\\n exec: function(editor) { editor.toUpperCase(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"tolowercase\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-U\\\", \\\"Ctrl-Shift-U\\\"),\\n exec: function(editor) { editor.toLowerCase(); },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"expandtoline\\\",\\n bindKey: bindKey(\\\"Ctrl-Shift-L\\\", \\\"Command-Shift-L\\\"),\\n exec: function(editor) {\\n var range = editor.selection.getRange();\\n\\n range.start.column = range.end.column = 0;\\n range.end.row++;\\n editor.selection.setRange(range, false);\\n },\\n multiSelectAction: \\\"forEach\\\",\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"joinlines\\\",\\n bindKey: bindKey(null, null),\\n exec: function(editor) {\\n var isBackwards = editor.selection.isBackwards();\\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\\n var selectedCount = selectedText.replace(/\\\\n\\\\s*/, \\\" \\\").length;\\n var insertLine = editor.session.doc.getLine(selectionStart.row);\\n\\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\\n if (curLine.length !== 0) {\\n curLine = \\\" \\\" + curLine;\\n }\\n insertLine += curLine;\\n }\\n\\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\\n insertLine += editor.session.doc.getNewLineCharacter();\\n }\\n\\n editor.clearSelection();\\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\\n\\n if (selectedCount > 0) {\\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\\n } else {\\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\\n }\\n },\\n multiSelectAction: \\\"forEach\\\",\\n readOnly: true\\n}, {\\n name: \\\"invertSelection\\\",\\n bindKey: bindKey(null, null),\\n exec: function(editor) {\\n var endRow = editor.session.doc.getLength() - 1;\\n var endCol = editor.session.doc.getLine(endRow).length;\\n var ranges = editor.selection.rangeList.ranges;\\n var newRanges = [];\\n if (ranges.length < 1) {\\n ranges = [editor.selection.getRange()];\\n }\\n\\n for (var i = 0; i < ranges.length; i++) {\\n if (i == (ranges.length - 1)) {\\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\\n }\\n }\\n\\n if (i === 0) {\\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\\n }\\n } else {\\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\\n }\\n }\\n\\n editor.exitMultiSelectMode();\\n editor.clearSelection();\\n\\n for(var i = 0; i < newRanges.length; i++) {\\n editor.selection.addRange(newRanges[i], false);\\n }\\n },\\n readOnly: true,\\n scrollIntoView: \\\"none\\\"\\n}];\\n\\n});\\n\\ndefine(\\\"ace/editor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/fixoldbrowsers\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\",\\\"ace/keyboard/textinput\\\",\\\"ace/mouse/mouse_handler\\\",\\\"ace/mouse/fold_handler\\\",\\\"ace/keyboard/keybinding\\\",\\\"ace/edit_session\\\",\\\"ace/search\\\",\\\"ace/range\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/commands/command_manager\\\",\\\"ace/commands/default_commands\\\",\\\"ace/config\\\",\\\"ace/token_iterator\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./lib/fixoldbrowsers\\\");\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar useragent = require(\\\"./lib/useragent\\\");\\nvar TextInput = require(\\\"./keyboard/textinput\\\").TextInput;\\nvar MouseHandler = require(\\\"./mouse/mouse_handler\\\").MouseHandler;\\nvar FoldHandler = require(\\\"./mouse/fold_handler\\\").FoldHandler;\\nvar KeyBinding = require(\\\"./keyboard/keybinding\\\").KeyBinding;\\nvar EditSession = require(\\\"./edit_session\\\").EditSession;\\nvar Search = require(\\\"./search\\\").Search;\\nvar Range = require(\\\"./range\\\").Range;\\nvar EventEmitter = require(\\\"./lib/event_emitter\\\").EventEmitter;\\nvar CommandManager = require(\\\"./commands/command_manager\\\").CommandManager;\\nvar defaultCommands = require(\\\"./commands/default_commands\\\").commands;\\nvar config = require(\\\"./config\\\");\\nvar TokenIterator = require(\\\"./token_iterator\\\").TokenIterator;\\nvar Editor = function(renderer, session) {\\n var container = renderer.getContainerElement();\\n this.container = container;\\n this.renderer = renderer;\\n 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.$blockScrolling = 0;\\n this.$search = new Search().set({\\n wrap: true\\n });\\n\\n this.$historyTracker = this.$historyTracker.bind(this);\\n this.commands.on(\\\"exec\\\", this.$historyTracker);\\n\\n this.$initOperationListeners();\\n \\n this._$emitInputEvent = lang.delayedCall(function() {\\n this._signal(\\\"input\\\", {});\\n if (this.session && this.session.bgTokenizer)\\n this.session.bgTokenizer.scheduleStart();\\n }.bind(this));\\n \\n this.on(\\\"change\\\", function(_, _self) {\\n _self._$emitInputEvent.schedule(31);\\n });\\n\\n this.setSession(session || new EditSession(\\\"\\\"));\\n config.resetOptions(this);\\n config._signal(\\\"editor\\\", this);\\n};\\n\\nEditor.$uid = 0;\\n\\n(function(){\\n\\n oop.implement(this, EventEmitter);\\n\\n this.$initOperationListeners = function() {\\n function last(a) {return a[a.length - 1];}\\n\\n this.selections = [];\\n this.commands.on(\\\"exec\\\", this.startOperation.bind(this), true);\\n this.commands.on(\\\"afterExec\\\", this.endOperation.bind(this), true);\\n\\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\\n\\n this.on(\\\"change\\\", function() {\\n this.curOp || this.startOperation();\\n this.curOp.docChanged = true;\\n }.bind(this), true);\\n\\n this.on(\\\"changeSelection\\\", function() {\\n this.curOp || this.startOperation();\\n this.curOp.selectionChanged = true;\\n }.bind(this), true);\\n };\\n\\n this.curOp = null;\\n this.prevOp = {};\\n this.startOperation = function(commadEvent) {\\n if (this.curOp) {\\n if (!commadEvent || this.curOp.command)\\n return;\\n this.prevOp = this.curOp;\\n }\\n if (!commadEvent) {\\n this.previousCommand = null;\\n commadEvent = {};\\n }\\n\\n this.$opResetTimer.schedule();\\n this.curOp = {\\n command: commadEvent.command || {},\\n args: commadEvent.args,\\n scrollTop: this.renderer.scrollTop\\n };\\n if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\\n this.$blockScrolling++;\\n };\\n\\n this.endOperation = function(e) {\\n if (this.curOp) {\\n if (e && e.returnValue === false)\\n return this.curOp = null;\\n this._signal(\\\"beforeEndOperation\\\");\\n var command = this.curOp.command;\\n if (command.name && this.$blockScrolling > 0)\\n this.$blockScrolling--;\\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 \\n this.prevOp = this.curOp;\\n this.curOp = null;\\n }\\n };\\n this.$mergeableCommands = [\\\"backspace\\\", \\\"del\\\", \\\"insertstring\\\"];\\n this.$historyTracker = function(e) {\\n if (!this.$mergeUndoDeltas)\\n return;\\n\\n var prev = this.prevOp;\\n var mergeableCommands = this.$mergeableCommands;\\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\\n if (e.command.name == \\\"insertstring\\\") {\\n var text = e.args;\\n if (this.mergeNextCommand === undefined)\\n this.mergeNextCommand = true;\\n\\n shouldMerge = shouldMerge\\n && this.mergeNextCommand // previous command allows to coalesce with\\n && (!/\\\\s/.test(text) || /\\\\s/.test(prev.args)); // previous insertion was of same type\\n\\n this.mergeNextCommand = true;\\n } else {\\n shouldMerge = shouldMerge\\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\\n }\\n\\n if (\\n this.$mergeUndoDeltas != \\\"always\\\"\\n && Date.now() - this.sequenceStartTime > 2000\\n ) {\\n shouldMerge = false; // the sequence is too long\\n }\\n\\n if (shouldMerge)\\n this.session.mergeUndoDeltas = true;\\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\\n this.sequenceStartTime = Date.now();\\n };\\n this.setKeyboardHandler = function(keyboardHandler, cb) {\\n if (keyboardHandler && typeof keyboardHandler === \\\"string\\\") {\\n this.$keybindingId = keyboardHandler;\\n var _self = this;\\n config.loadModule([\\\"keybinding\\\", keyboardHandler], function(module) {\\n if (_self.$keybindingId == keyboardHandler)\\n _self.keyBinding.setKeyboardHandler(module && module.handler);\\n cb && cb();\\n });\\n } else {\\n this.$keybindingId = null;\\n this.keyBinding.setKeyboardHandler(keyboardHandler);\\n cb && cb();\\n }\\n };\\n this.getKeyboardHandler = function() {\\n return this.keyBinding.getKeyboardHandler();\\n };\\n this.setSession = function(session) {\\n if (this.session == session)\\n return;\\n 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.$blockScrolling += 1;\\n this.onCursorChange();\\n this.$blockScrolling -= 1;\\n \\n this.onScrollTopChange();\\n this.onScrollLeftChange();\\n this.onSelectionChange();\\n this.onChangeFrontMarker();\\n this.onChangeBackMarker();\\n this.onChangeBreakpoint();\\n this.onChangeAnnotation();\\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\\n this.renderer.updateFull();\\n } else {\\n this.selection = null;\\n this.renderer.setSession(session);\\n }\\n\\n this._signal(\\\"changeSession\\\", {\\n session: session,\\n oldSession: oldSession\\n });\\n \\n 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.session.$bracketHighlight) {\\n this.session.removeMarker(this.session.$bracketHighlight);\\n this.session.$bracketHighlight = null;\\n }\\n\\n if (this.$highlightPending) {\\n return;\\n }\\n var self = this;\\n this.$highlightPending = true;\\n setTimeout(function() {\\n self.$highlightPending = false;\\n var session = self.session;\\n if (!session || !session.bgTokenizer) return;\\n var pos = session.findMatchingBracket(self.getCursorPosition());\\n if (pos) {\\n var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\\n } else if (session.$mode.getMatching) {\\n var range = session.$mode.getMatching(self.session);\\n }\\n if (range)\\n session.$bracketHighlight = session.addMarker(range, \\\"ace_bracket\\\", \\\"text\\\");\\n }, 50);\\n };\\n this.$highlightTags = function() {\\n if (this.$highlightTagPending)\\n return;\\n var self = this;\\n this.$highlightTagPending = true;\\n setTimeout(function() {\\n self.$highlightTagPending = false;\\n \\n var session = self.session;\\n if (!session || !session.bgTokenizer) return;\\n \\n var pos = self.getCursorPosition();\\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\\n var token = iterator.getCurrentToken();\\n \\n if (!token || !/\\\\b(?:tag-open|tag-name)/.test(token.type)) {\\n session.removeMarker(session.$tagHighlight);\\n session.$tagHighlight = null;\\n return;\\n }\\n \\n if (token.type.indexOf(\\\"tag-open\\\") != -1) {\\n token = iterator.stepForward();\\n if (!token)\\n return;\\n }\\n \\n var tag = token.value;\\n var depth = 0;\\n var prevToken = iterator.stepBackward();\\n \\n if (prevToken.value == '<'){\\n do {\\n prevToken = token;\\n token = iterator.stepForward();\\n \\n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\\n if (prevToken.value === '<'){\\n depth++;\\n } else if (prevToken.value === '= 0);\\n } else {\\n do {\\n token = prevToken;\\n prevToken = iterator.stepBackward();\\n \\n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\\n if (prevToken.value === '<') {\\n depth++;\\n } else if (prevToken.value === ' 1))\\n highlight = false;\\n }\\n\\n if (session.$highlightLineMarker && !highlight) {\\n session.removeMarker(session.$highlightLineMarker.id);\\n session.$highlightLineMarker = null;\\n } else if (!session.$highlightLineMarker && highlight) {\\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\\n range.id = session.addMarker(range, \\\"ace_active-line\\\", \\\"screenLine\\\");\\n session.$highlightLineMarker = range;\\n } else if (highlight) {\\n session.$highlightLineMarker.start.row = highlight.row;\\n session.$highlightLineMarker.end.row = highlight.row;\\n session.$highlightLineMarker.start.column = highlight.column;\\n session._signal(\\\"changeBackMarker\\\");\\n }\\n };\\n\\n this.onSelectionChange = function(e) {\\n var session = this.session;\\n\\n if (session.$selectionMarker) {\\n session.removeMarker(session.$selectionMarker);\\n }\\n session.$selectionMarker = null;\\n\\n if (!this.selection.isEmpty()) {\\n var range = this.selection.getRange();\\n var style = this.getSelectionStyle();\\n session.$selectionMarker = session.addMarker(range, \\\"ace_selection\\\", style);\\n } else {\\n this.$updateHighlightActiveLine();\\n }\\n\\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\\n this.session.highlight(re);\\n\\n this._signal(\\\"changeSelection\\\");\\n };\\n\\n this.$getSelectionHighLightRegexp = function() {\\n var session = this.session;\\n\\n var selection = this.getSelectionRange();\\n if (selection.isEmpty() || selection.isMultiLine())\\n return;\\n\\n var startOuter = selection.start.column - 1;\\n var endOuter = selection.end.column + 1;\\n var line = session.getLine(selection.start.row);\\n var lineCols = line.length;\\n var needle = line.substring(Math.max(startOuter, 0),\\n Math.min(endOuter, lineCols));\\n if ((startOuter >= 0 && /^[\\\\w\\\\d]/.test(needle)) ||\\n (endOuter <= lineCols && /[\\\\w\\\\d]$/.test(needle)))\\n return;\\n\\n needle = line.substring(selection.start.column, selection.end.column);\\n if (!/^[\\\\w\\\\d]+$/.test(needle))\\n return;\\n\\n var re = this.$search.$assembleRegExp({\\n wholeWord: true,\\n caseSensitive: true,\\n needle: needle\\n });\\n\\n return re;\\n };\\n\\n\\n this.onChangeFrontMarker = function() {\\n this.renderer.updateFrontMarkers();\\n };\\n\\n this.onChangeBackMarker = function() {\\n this.renderer.updateBackMarkers();\\n };\\n\\n\\n this.onChangeBreakpoint = function() {\\n this.renderer.updateBreakpoints();\\n };\\n\\n this.onChangeAnnotation = function() {\\n this.renderer.setAnnotations(this.session.getAnnotations());\\n };\\n\\n\\n this.onChangeMode = function(e) {\\n this.renderer.updateText();\\n this._emit(\\\"changeMode\\\", e);\\n };\\n\\n\\n this.onChangeWrapLimit = function() {\\n this.renderer.updateFull();\\n };\\n\\n this.onChangeWrapMode = function() {\\n this.renderer.onResize(true);\\n };\\n\\n\\n this.onChangeFold = function() {\\n this.$updateHighlightActiveLine();\\n this.renderer.updateFull();\\n };\\n this.getSelectedText = function() {\\n return this.session.getTextRange(this.getSelectionRange());\\n };\\n this.getCopyText = function() {\\n var text = this.getSelectedText();\\n this._signal(\\\"copy\\\", text);\\n return text;\\n };\\n this.onCopy = function() {\\n this.commands.exec(\\\"copy\\\", this);\\n };\\n this.onCut = function() {\\n this.commands.exec(\\\"cut\\\", this);\\n };\\n this.onPaste = function(text, 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 if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\\n this.insert(text);\\n } else {\\n var lines = text.split(/\\\\r\\\\n|\\\\r|\\\\n/);\\n var ranges = this.selection.rangeList.ranges;\\n \\n if (lines.length > ranges.length || lines.length < 2 || !lines[1])\\n return this.commands.exec(\\\"insertstring\\\", this, text);\\n \\n for (var i = ranges.length; i--;) {\\n var range = ranges[i];\\n if (!range.isEmpty())\\n this.session.remove(range);\\n \\n this.session.insert(range.start, lines[i]);\\n }\\n }\\n };\\n\\n this.execCommand = function(command, args) {\\n return this.commands.exec(command, this, args);\\n };\\n this.insert = function(text, pasted) {\\n var session = this.session;\\n var mode = session.getMode();\\n var cursor = this.getCursorPosition();\\n\\n if (this.getBehavioursEnabled() && !pasted) {\\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\\n if (transform) {\\n if (text !== transform.text) {\\n this.session.mergeUndoDeltas = false;\\n this.$mergeNextCommand = false;\\n }\\n text = transform.text;\\n\\n }\\n }\\n \\n if (text == \\\"\\\\t\\\")\\n text = this.session.getTabString();\\n if (!this.selection.isEmpty()) {\\n var range = this.getSelectionRange();\\n cursor = this.session.remove(range);\\n this.clearSelection();\\n }\\n else if (this.session.getOverwrite() && 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 var end = session.insert(cursor, text);\\n\\n if (transform && transform.selection) {\\n if (transform.selection.length == 2) { // Transform relative to the current column\\n this.selection.setSelectionRange(\\n new Range(cursor.row, start + transform.selection[0],\\n cursor.row, start + transform.selection[1]));\\n } else { // Transform relative to the current row.\\n this.selection.setSelectionRange(\\n new Range(cursor.row + transform.selection[0],\\n transform.selection[1],\\n cursor.row + transform.selection[2],\\n transform.selection[3]));\\n }\\n }\\n\\n if (session.getDocument().isNewLine(text)) {\\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\\n\\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\\n }\\n if (shouldOutdent)\\n mode.autoOutdent(lineState, session, cursor.row);\\n };\\n\\n this.onTextInput = function(text) {\\n this.keyBinding.onTextInput(text);\\n };\\n\\n this.onCommandKey = function(e, hashId, keyCode) {\\n this.keyBinding.onCommandKey(e, hashId, keyCode);\\n };\\n this.setOverwrite = function(overwrite) {\\n this.session.setOverwrite(overwrite);\\n };\\n this.getOverwrite = function() {\\n return this.session.getOverwrite();\\n };\\n this.toggleOverwrite = function() {\\n this.session.toggleOverwrite();\\n };\\n this.setScrollSpeed = function(speed) {\\n this.setOption(\\\"scrollSpeed\\\", speed);\\n };\\n this.getScrollSpeed = function() {\\n return this.getOption(\\\"scrollSpeed\\\");\\n };\\n this.setDragDelay = function(dragDelay) {\\n this.setOption(\\\"dragDelay\\\", dragDelay);\\n };\\n this.getDragDelay = function() {\\n return this.getOption(\\\"dragDelay\\\");\\n };\\n this.setSelectionStyle = function(val) {\\n this.setOption(\\\"selectionStyle\\\", val);\\n };\\n this.getSelectionStyle = function() {\\n return this.getOption(\\\"selectionStyle\\\");\\n };\\n this.setHighlightActiveLine = function(shouldHighlight) {\\n this.setOption(\\\"highlightActiveLine\\\", shouldHighlight);\\n };\\n this.getHighlightActiveLine = function() {\\n return this.getOption(\\\"highlightActiveLine\\\");\\n };\\n this.setHighlightGutterLine = function(shouldHighlight) {\\n this.setOption(\\\"highlightGutterLine\\\", shouldHighlight);\\n };\\n\\n this.getHighlightGutterLine = function() {\\n return this.getOption(\\\"highlightGutterLine\\\");\\n };\\n this.setHighlightSelectedWord = function(shouldHighlight) {\\n this.setOption(\\\"highlightSelectedWord\\\", shouldHighlight);\\n };\\n this.getHighlightSelectedWord = function() {\\n return this.$highlightSelectedWord;\\n };\\n\\n this.setAnimatedScroll = function(shouldAnimate){\\n this.renderer.setAnimatedScroll(shouldAnimate);\\n };\\n\\n this.getAnimatedScroll = function(){\\n return this.renderer.getAnimatedScroll();\\n };\\n this.setShowInvisibles = function(showInvisibles) {\\n this.renderer.setShowInvisibles(showInvisibles);\\n };\\n this.getShowInvisibles = function() {\\n return this.renderer.getShowInvisibles();\\n };\\n\\n this.setDisplayIndentGuides = function(display) {\\n this.renderer.setDisplayIndentGuides(display);\\n };\\n\\n this.getDisplayIndentGuides = function() {\\n return this.renderer.getDisplayIndentGuides();\\n };\\n this.setShowPrintMargin = function(showPrintMargin) {\\n this.renderer.setShowPrintMargin(showPrintMargin);\\n };\\n this.getShowPrintMargin = function() {\\n return this.renderer.getShowPrintMargin();\\n };\\n this.setPrintMarginColumn = function(showPrintMargin) {\\n this.renderer.setPrintMarginColumn(showPrintMargin);\\n };\\n this.getPrintMarginColumn = function() {\\n return this.renderer.getPrintMarginColumn();\\n };\\n this.setReadOnly = function(readOnly) {\\n this.setOption(\\\"readOnly\\\", readOnly);\\n };\\n this.getReadOnly = function() {\\n return this.getOption(\\\"readOnly\\\");\\n };\\n this.setBehavioursEnabled = function (enabled) {\\n this.setOption(\\\"behavioursEnabled\\\", enabled);\\n };\\n this.getBehavioursEnabled = function () {\\n return this.getOption(\\\"behavioursEnabled\\\");\\n };\\n this.setWrapBehavioursEnabled = function (enabled) {\\n this.setOption(\\\"wrapBehavioursEnabled\\\", enabled);\\n };\\n this.getWrapBehavioursEnabled = function () {\\n return this.getOption(\\\"wrapBehavioursEnabled\\\");\\n };\\n this.setShowFoldWidgets = function(show) {\\n this.setOption(\\\"showFoldWidgets\\\", show);\\n\\n };\\n this.getShowFoldWidgets = function() {\\n return this.getOption(\\\"showFoldWidgets\\\");\\n };\\n\\n this.setFadeFoldWidgets = function(fade) {\\n this.setOption(\\\"fadeFoldWidgets\\\", fade);\\n };\\n\\n this.getFadeFoldWidgets = function() {\\n return this.getOption(\\\"fadeFoldWidgets\\\");\\n };\\n this.remove = function(dir) {\\n if (this.selection.isEmpty()){\\n if (dir == \\\"left\\\")\\n this.selection.selectLeft();\\n else\\n this.selection.selectRight();\\n }\\n\\n var range = this.getSelectionRange();\\n if (this.getBehavioursEnabled()) {\\n var session = this.session;\\n var state = session.getState(range.start.row);\\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\\n\\n if (range.end.column === 0) {\\n var text = session.getTextRange(range);\\n if (text[text.length - 1] == \\\"\\\\n\\\") {\\n var line = session.getLine(range.end.row);\\n if (/^\\\\s+$/.test(line)) {\\n range.end.column = line.length;\\n }\\n }\\n }\\n if (new_range)\\n range = new_range;\\n }\\n\\n this.session.remove(range);\\n this.clearSelection();\\n };\\n this.removeWordRight = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectWordRight();\\n\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n };\\n this.removeWordLeft = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectWordLeft();\\n\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n };\\n this.removeToLineStart = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectLineStart();\\n\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n };\\n this.removeToLineEnd = function() {\\n if (this.selection.isEmpty())\\n this.selection.selectLineEnd();\\n\\n var range = this.getSelectionRange();\\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\\n range.end.column = 0;\\n range.end.row++;\\n }\\n\\n this.session.remove(range);\\n this.clearSelection();\\n };\\n this.splitLine = function() {\\n if (!this.selection.isEmpty()) {\\n this.session.remove(this.getSelectionRange());\\n this.clearSelection();\\n }\\n\\n var cursor = this.getCursorPosition();\\n this.insert(\\\"\\\\n\\\");\\n this.moveCursorToPosition(cursor);\\n };\\n this.transposeLetters = function() {\\n if (!this.selection.isEmpty()) {\\n return;\\n }\\n\\n var cursor = this.getCursorPosition();\\n var column = cursor.column;\\n if (column === 0)\\n return;\\n\\n var line = this.session.getLine(cursor.row);\\n var swap, range;\\n if (column < line.length) {\\n swap = line.charAt(column) + line.charAt(column-1);\\n range = new Range(cursor.row, column-1, cursor.row, column+1);\\n }\\n else {\\n swap = line.charAt(column-1) + line.charAt(column-2);\\n range = new Range(cursor.row, column-2, cursor.row, column);\\n }\\n this.session.replace(range, swap);\\n 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 }\\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(text) {\\n this.renderer.showComposition(this.getCursorPosition());\\n };\\n\\n this.onCompositionUpdate = function(text) {\\n this.renderer.setCompositionText(text);\\n };\\n\\n this.onCompositionEnd = function() {\\n this.renderer.hideComposition();\\n };\\n this.getFirstVisibleRow = function() {\\n return this.renderer.getFirstVisibleRow();\\n };\\n this.getLastVisibleRow = function() {\\n return this.renderer.getLastVisibleRow();\\n };\\n this.isRowVisible = function(row) {\\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\\n };\\n this.isRowFullyVisible = function(row) {\\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\\n };\\n this.$getVisibleRowCount = function() {\\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\\n };\\n\\n this.$moveByPage = function(dir, select) {\\n var renderer = this.renderer;\\n var config = this.renderer.layerConfig;\\n var rows = dir * Math.floor(config.height / config.lineHeight);\\n\\n this.$blockScrolling++;\\n if (select === true) {\\n this.selection.$moveSelection(function(){\\n this.moveCursorBy(rows, 0);\\n });\\n } else if (select === false) {\\n this.selection.moveCursorBy(rows, 0);\\n this.selection.clearSelection();\\n }\\n this.$blockScrolling--;\\n\\n var scrollTop = renderer.scrollTop;\\n\\n renderer.scrollBy(0, rows * config.lineHeight);\\n if (select != null)\\n renderer.scrollCursorIntoView(null, 0.5);\\n\\n renderer.animateScrolling(scrollTop);\\n };\\n this.selectPageDown = function() {\\n this.$moveByPage(1, true);\\n };\\n this.selectPageUp = function() {\\n this.$moveByPage(-1, true);\\n };\\n this.gotoPageDown = function() {\\n this.$moveByPage(1, false);\\n };\\n this.gotoPageUp = function() {\\n this.$moveByPage(-1, false);\\n };\\n this.scrollPageDown = function() {\\n this.$moveByPage(1);\\n };\\n this.scrollPageUp = function() {\\n this.$moveByPage(-1);\\n };\\n this.scrollToRow = function(row) {\\n this.renderer.scrollToRow(row);\\n };\\n this.scrollToLine = function(line, center, animate, callback) {\\n this.renderer.scrollToLine(line, center, animate, callback);\\n };\\n this.centerSelection = function() {\\n var range = this.getSelectionRange();\\n var pos = {\\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\\n };\\n this.renderer.alignCursor(pos, 0.5);\\n };\\n this.getCursorPosition = function() {\\n return this.selection.getCursor();\\n };\\n this.getCursorPositionScreen = function() {\\n return this.session.documentToScreenPosition(this.getCursorPosition());\\n };\\n this.getSelectionRange = function() {\\n return this.selection.getRange();\\n };\\n this.selectAll = function() {\\n this.$blockScrolling += 1;\\n this.selection.selectAll();\\n this.$blockScrolling -= 1;\\n };\\n this.clearSelection = function() {\\n this.selection.clearSelection();\\n };\\n this.moveCursorTo = function(row, column) {\\n this.selection.moveCursorTo(row, column);\\n };\\n this.moveCursorToPosition = function(pos) {\\n this.selection.moveCursorToPosition(pos);\\n };\\n this.jumpToMatching = function(select, expand) {\\n var cursor = this.getCursorPosition();\\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\\n var prevToken = iterator.getCurrentToken();\\n var token = prevToken || iterator.stepForward();\\n\\n if (!token) return;\\n var matchType;\\n var found = false;\\n var depth = {};\\n var i = cursor.column - token.start;\\n var bracketType;\\n var brackets = {\\n \\\")\\\": \\\"(\\\",\\n \\\"(\\\": \\\"(\\\",\\n \\\"]\\\": \\\"[\\\",\\n \\\"[\\\": \\\"[\\\",\\n \\\"{\\\": \\\"{\\\",\\n \\\"}\\\": \\\"{\\\"\\n };\\n \\n do {\\n if (token.value.match(/[{}()\\\\[\\\\]]/g)) {\\n for (; i < token.value.length && !found; i++) {\\n if (!brackets[token.value[i]]) {\\n continue;\\n }\\n\\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\\\"rparen\\\", \\\"lparen\\\");\\n\\n if (isNaN(depth[bracketType])) {\\n depth[bracketType] = 0;\\n }\\n\\n switch (token.value[i]) {\\n case '(':\\n case '[':\\n case '{':\\n depth[bracketType]++;\\n break;\\n case ')':\\n case ']':\\n case '}':\\n depth[bracketType]--;\\n\\n if (depth[bracketType] === -1) {\\n matchType = 'bracket';\\n found = true;\\n }\\n break;\\n }\\n }\\n }\\n else if (token && token.type.indexOf('tag-name') !== -1) {\\n if (isNaN(depth[token.value])) {\\n depth[token.value] = 0;\\n }\\n \\n if (prevToken.value === '<') {\\n depth[token.value]++;\\n }\\n else if (prevToken.value === '= 0; --i) {\\n if(this.$tryReplace(ranges[i], replacement)) {\\n replaced++;\\n }\\n }\\n\\n this.selection.setSelectionRange(selection);\\n this.$blockScrolling -= 1;\\n\\n return replaced;\\n };\\n\\n this.$tryReplace = function(range, replacement) {\\n var input = this.session.getTextRange(range);\\n replacement = this.$search.replace(input, replacement);\\n if (replacement !== null) {\\n range.end = this.session.replace(range, replacement);\\n return range;\\n } else {\\n return null;\\n }\\n };\\n this.getLastSearchOptions = function() {\\n return this.$search.getOptions();\\n };\\n this.find = function(needle, options, animate) {\\n if (!options)\\n options = {};\\n\\n if (typeof needle == \\\"string\\\" || needle instanceof RegExp)\\n options.needle = needle;\\n else if (typeof needle == \\\"object\\\")\\n oop.mixin(options, needle);\\n\\n var range = this.selection.getRange();\\n if (options.needle == null) {\\n needle = this.session.getTextRange(range)\\n || this.$search.$options.needle;\\n if (!needle) {\\n range = this.session.getWordRange(range.start.row, range.start.column);\\n needle = this.session.getTextRange(range);\\n }\\n this.$search.set({needle: needle});\\n }\\n\\n this.$search.set(options);\\n if (!options.start)\\n this.$search.set({start: range});\\n\\n var newRange = this.$search.find(this.session);\\n if (options.preventScroll)\\n return newRange;\\n if (newRange) {\\n this.revealRange(newRange, animate);\\n return newRange;\\n }\\n if (options.backwards)\\n range.start = range.end;\\n else\\n range.end = range.start;\\n this.selection.setRange(range);\\n };\\n this.findNext = function(options, animate) {\\n this.find({skipCurrent: true, backwards: false}, options, animate);\\n };\\n this.findPrevious = function(options, animate) {\\n this.find(options, {skipCurrent: true, backwards: true}, animate);\\n };\\n\\n this.revealRange = function(range, animate) {\\n this.$blockScrolling += 1;\\n this.session.unfold(range);\\n this.selection.setSelectionRange(range);\\n this.$blockScrolling -= 1;\\n\\n var scrollTop = this.renderer.scrollTop;\\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\\n if (animate !== false)\\n this.renderer.animateScrolling(scrollTop);\\n };\\n this.undo = function() {\\n this.$blockScrolling++;\\n this.session.getUndoManager().undo();\\n this.$blockScrolling--;\\n this.renderer.scrollCursorIntoView(null, 0.5);\\n };\\n this.redo = function() {\\n this.$blockScrolling++;\\n this.session.getUndoManager().redo();\\n this.$blockScrolling--;\\n this.renderer.scrollCursorIntoView(null, 0.5);\\n };\\n this.destroy = function() {\\n this.renderer.destroy();\\n this._signal(\\\"destroy\\\", this);\\n if (this.session) {\\n this.session.destroy();\\n }\\n };\\n this.setAutoScrollEditorIntoView = function(enable) {\\n if (!enable)\\n return;\\n var rect;\\n var self = this;\\n var shouldScroll = false;\\n if (!this.$scrollAnchor)\\n this.$scrollAnchor = document.createElement(\\\"div\\\");\\n var scrollAnchor = this.$scrollAnchor;\\n scrollAnchor.style.cssText = \\\"position:absolute\\\";\\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\\n var onChangeSelection = this.on(\\\"changeSelection\\\", function() {\\n shouldScroll = true;\\n });\\n var onBeforeRender = this.renderer.on(\\\"beforeRender\\\", function() {\\n if (shouldScroll)\\n rect = self.renderer.container.getBoundingClientRect();\\n });\\n var onAfterRender = this.renderer.on(\\\"afterRender\\\", function() {\\n if (shouldScroll && rect && (self.isFocused()\\n || self.searchBox && self.searchBox.isFocused())\\n ) {\\n var renderer = self.renderer;\\n var pos = renderer.$cursorLayer.$pixelPos;\\n var config = renderer.layerConfig;\\n var top = pos.top - config.offset;\\n if (pos.top >= 0 && top + rect.top < 0) {\\n shouldScroll = true;\\n } else if (pos.top < config.height &&\\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\\n shouldScroll = false;\\n } else {\\n shouldScroll = null;\\n }\\n if (shouldScroll != null) {\\n scrollAnchor.style.top = top + \\\"px\\\";\\n scrollAnchor.style.left = pos.left + \\\"px\\\";\\n scrollAnchor.style.height = config.lineHeight + \\\"px\\\";\\n scrollAnchor.scrollIntoView(shouldScroll);\\n }\\n shouldScroll = rect = null;\\n }\\n });\\n this.setAutoScrollEditorIntoView = function(enable) {\\n if (enable)\\n return;\\n delete this.setAutoScrollEditorIntoView;\\n this.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\\n}).call(Editor.prototype);\\n\\n\\n\\nconfig.defineOptions(Editor.prototype, \\\"editor\\\", {\\n selectionStyle: {\\n set: function(style) {\\n this.onSelectionChange();\\n this._signal(\\\"changeSelectionStyle\\\", {data: style});\\n },\\n initialValue: \\\"line\\\"\\n },\\n highlightActiveLine: {\\n set: function() {this.$updateHighlightActiveLine();},\\n initialValue: true\\n },\\n highlightSelectedWord: {\\n set: function(shouldHighlight) {this.$onSelectionChange();},\\n initialValue: true\\n },\\n readOnly: {\\n set: function(readOnly) {\\n this.$resetCursorStyle(); \\n },\\n initialValue: false\\n },\\n cursorStyle: {\\n set: function(val) { this.$resetCursorStyle(); },\\n values: [\\\"ace\\\", \\\"slim\\\", \\\"smooth\\\", \\\"wide\\\"],\\n initialValue: \\\"ace\\\"\\n },\\n mergeUndoDeltas: {\\n values: [false, true, \\\"always\\\"],\\n initialValue: true\\n },\\n behavioursEnabled: {initialValue: true},\\n wrapBehavioursEnabled: {initialValue: true},\\n autoScrollEditorIntoView: {\\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\\n },\\n keyboardHandler: {\\n set: function(val) { this.setKeyboardHandler(val); },\\n get: function() { return this.keybindingId; },\\n handlesSet: true\\n },\\n\\n hScrollBarAlwaysVisible: \\\"renderer\\\",\\n vScrollBarAlwaysVisible: \\\"renderer\\\",\\n highlightGutterLine: \\\"renderer\\\",\\n animatedScroll: \\\"renderer\\\",\\n showInvisibles: \\\"renderer\\\",\\n showPrintMargin: \\\"renderer\\\",\\n printMarginColumn: \\\"renderer\\\",\\n printMargin: \\\"renderer\\\",\\n fadeFoldWidgets: \\\"renderer\\\",\\n showFoldWidgets: \\\"renderer\\\",\\n showLineNumbers: \\\"renderer\\\",\\n showGutter: \\\"renderer\\\",\\n displayIndentGuides: \\\"renderer\\\",\\n fontSize: \\\"renderer\\\",\\n fontFamily: \\\"renderer\\\",\\n maxLines: \\\"renderer\\\",\\n minLines: \\\"renderer\\\",\\n scrollPastEnd: \\\"renderer\\\",\\n fixedWidthGutter: \\\"renderer\\\",\\n theme: \\\"renderer\\\",\\n\\n scrollSpeed: \\\"$mouseHandler\\\",\\n dragDelay: \\\"$mouseHandler\\\",\\n dragEnabled: \\\"$mouseHandler\\\",\\n focusTimout: \\\"$mouseHandler\\\",\\n tooltipFollowsMouse: \\\"$mouseHandler\\\",\\n\\n firstLineNumber: \\\"session\\\",\\n overwrite: \\\"session\\\",\\n newLineMode: \\\"session\\\",\\n useWorker: \\\"session\\\",\\n useSoftTabs: \\\"session\\\",\\n tabSize: \\\"session\\\",\\n wrap: \\\"session\\\",\\n indentedSoftWrap: \\\"session\\\",\\n foldStyle: \\\"session\\\",\\n mode: \\\"session\\\"\\n});\\n\\nexports.Editor = Editor;\\n});\\n\\ndefine(\\\"ace/undomanager\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\nvar UndoManager = function() {\\n this.reset();\\n};\\n\\n(function() {\\n this.execute = function(options) {\\n var deltaSets = options.args[0];\\n this.$doc = options.args[1];\\n if (options.merge && this.hasUndo()){\\n this.dirtyCounter--;\\n deltaSets = this.$undoStack.pop().concat(deltaSets);\\n }\\n this.$undoStack.push(deltaSets);\\n this.$redoStack = [];\\n if (this.dirtyCounter < 0) {\\n this.dirtyCounter = NaN;\\n }\\n this.dirtyCounter++;\\n };\\n this.undo = function(dontSelect) {\\n var deltaSets = this.$undoStack.pop();\\n var undoSelectionRange = null;\\n if (deltaSets) {\\n undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\\n this.$redoStack.push(deltaSets);\\n this.dirtyCounter--;\\n }\\n\\n return undoSelectionRange;\\n };\\n this.redo = function(dontSelect) {\\n var deltaSets = this.$redoStack.pop();\\n var redoSelectionRange = null;\\n if (deltaSets) {\\n redoSelectionRange =\\n this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\\n this.$undoStack.push(deltaSets);\\n this.dirtyCounter++;\\n }\\n return redoSelectionRange;\\n };\\n this.reset = function() {\\n this.$undoStack = [];\\n this.$redoStack = [];\\n this.dirtyCounter = 0;\\n };\\n this.hasUndo = function() {\\n return this.$undoStack.length > 0;\\n };\\n this.hasRedo = function() {\\n return this.$redoStack.length > 0;\\n };\\n this.markClean = function() {\\n this.dirtyCounter = 0;\\n };\\n this.isClean = function() {\\n return this.dirtyCounter === 0;\\n };\\n this.$serializeDeltas = function(deltaSets) {\\n return cloneDeltaSetsObj(deltaSets, $serializeDelta);\\n };\\n this.$deserializeDeltas = function(deltaSets) {\\n return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\\n };\\n \\n function $serializeDelta(delta){\\n return {\\n action: delta.action,\\n start: delta.start,\\n end: delta.end,\\n lines: delta.lines.length == 1 ? null : delta.lines,\\n text: delta.lines.length == 1 ? delta.lines[0] : null\\n };\\n }\\n \\n function $deserializeDelta(delta) {\\n return {\\n action: delta.action,\\n start: delta.start,\\n end: delta.end,\\n lines: delta.lines || [delta.text]\\n };\\n }\\n \\n function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\\n var deltaSets_new = new Array(deltaSets_old.length);\\n for (var i = 0; i < deltaSets_old.length; i++) {\\n var deltaSet_old = deltaSets_old[i];\\n var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\\n \\n for (var j = 0; j < deltaSet_old.deltas.length; j++) {\\n var delta_old = deltaSet_old.deltas[j];\\n deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\\n }\\n \\n deltaSets_new[i] = deltaSet_new;\\n }\\n return deltaSets_new;\\n }\\n \\n}).call(UndoManager.prototype);\\n\\nexports.UndoManager = UndoManager;\\n});\\n\\ndefine(\\\"ace/layer/gutter\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar oop = require(\\\"../lib/oop\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar EventEmitter = require(\\\"../lib/event_emitter\\\").EventEmitter;\\n\\nvar Gutter = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_gutter-layer\\\";\\n parentEl.appendChild(this.element);\\n this.setShowFoldWidgets(this.$showFoldWidgets);\\n \\n this.gutterWidth = 0;\\n\\n this.$annotations = [];\\n this.$updateAnnotations = this.$updateAnnotations.bind(this);\\n\\n this.$cells = [];\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n\\n this.setSession = function(session) {\\n if (this.session)\\n this.session.removeEventListener(\\\"change\\\", this.$updateAnnotations);\\n this.session = session;\\n if (session)\\n session.on(\\\"change\\\", this.$updateAnnotations);\\n };\\n\\n this.addGutterDecoration = function(row, className){\\n if (window.console)\\n console.warn && console.warn(\\\"deprecated use session.addGutterDecoration\\\");\\n this.session.addGutterDecoration(row, className);\\n };\\n\\n this.removeGutterDecoration = function(row, className){\\n if (window.console)\\n console.warn && console.warn(\\\"deprecated use session.removeGutterDecoration\\\");\\n this.session.removeGutterDecoration(row, className);\\n };\\n\\n this.setAnnotations = function(annotations) {\\n this.$annotations = [];\\n for (var i = 0; i < annotations.length; i++) {\\n var annotation = annotations[i];\\n var row = annotation.row;\\n var rowInfo = this.$annotations[row];\\n if (!rowInfo)\\n rowInfo = this.$annotations[row] = {text: []};\\n \\n var annoText = annotation.text;\\n annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \\\"\\\";\\n\\n if (rowInfo.text.indexOf(annoText) === -1)\\n rowInfo.text.push(annoText);\\n\\n var type = annotation.type;\\n if (type == \\\"error\\\")\\n rowInfo.className = \\\" ace_error\\\";\\n else if (type == \\\"warning\\\" && rowInfo.className != \\\" ace_error\\\")\\n rowInfo.className = \\\" ace_warning\\\";\\n else if (type == \\\"info\\\" && (!rowInfo.className))\\n rowInfo.className = \\\" ace_info\\\";\\n }\\n };\\n\\n this.$updateAnnotations = function (delta) {\\n if (!this.$annotations.length)\\n return;\\n var firstRow = delta.start.row;\\n var len = delta.end.row - firstRow;\\n if (len === 0) {\\n } else if (delta.action == 'remove') {\\n this.$annotations.splice(firstRow, len + 1, null);\\n } else {\\n var args = new Array(len + 1);\\n args.unshift(firstRow, 1);\\n this.$annotations.splice.apply(this.$annotations, args);\\n }\\n };\\n\\n this.update = function(config) {\\n var session = this.session;\\n var firstRow = config.firstRow;\\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\\n session.getLength() - 1);\\n var fold = session.getNextFoldLine(firstRow);\\n var foldStart = fold ? fold.start.row : Infinity;\\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\\n var breakpoints = session.$breakpoints;\\n var decorations = session.$decorations;\\n var firstLineNumber = session.$firstLineNumber;\\n var lastLineNumber = 0;\\n \\n var gutterRenderer = session.gutterRenderer || this.$renderer;\\n\\n var cell = null;\\n var index = -1;\\n var row = firstRow;\\n while (true) {\\n if (row > foldStart) {\\n row = fold.end.row + 1;\\n fold = session.getNextFoldLine(row, fold);\\n foldStart = fold ? fold.start.row : Infinity;\\n }\\n if (row > lastRow) {\\n while (this.$cells.length > index + 1) {\\n cell = this.$cells.pop();\\n this.element.removeChild(cell.element);\\n }\\n break;\\n }\\n\\n cell = this.$cells[++index];\\n if (!cell) {\\n cell = {element: null, textNode: null, foldWidget: null};\\n cell.element = dom.createElement(\\\"div\\\");\\n cell.textNode = document.createTextNode('');\\n cell.element.appendChild(cell.textNode);\\n this.element.appendChild(cell.element);\\n this.$cells[index] = cell;\\n }\\n\\n var className = \\\"ace_gutter-cell \\\";\\n if (breakpoints[row])\\n className += breakpoints[row];\\n if (decorations[row])\\n className += decorations[row];\\n if (this.$annotations[row])\\n className += this.$annotations[row].className;\\n if (cell.element.className != className)\\n cell.element.className = className;\\n\\n var height = session.getRowLength(row) * config.lineHeight + \\\"px\\\";\\n if (height != cell.element.style.height)\\n cell.element.style.height = height;\\n\\n if (foldWidgets) {\\n var c = foldWidgets[row];\\n if (c == null)\\n c = foldWidgets[row] = session.getFoldWidget(row);\\n }\\n\\n if (c) {\\n if (!cell.foldWidget) {\\n cell.foldWidget = dom.createElement(\\\"span\\\");\\n cell.element.appendChild(cell.foldWidget);\\n }\\n var className = \\\"ace_fold-widget ace_\\\" + c;\\n if (c == \\\"start\\\" && row == foldStart && row < fold.end.row)\\n className += \\\" ace_closed\\\";\\n else\\n className += \\\" ace_open\\\";\\n if (cell.foldWidget.className != className)\\n cell.foldWidget.className = className;\\n\\n var height = config.lineHeight + \\\"px\\\";\\n if (cell.foldWidget.style.height != height)\\n cell.foldWidget.style.height = height;\\n } else {\\n if (cell.foldWidget) {\\n cell.element.removeChild(cell.foldWidget);\\n cell.foldWidget = null;\\n }\\n }\\n \\n var text = lastLineNumber = gutterRenderer\\n ? gutterRenderer.getText(session, row)\\n : row + firstLineNumber;\\n if (text !== cell.textNode.data)\\n cell.textNode.data = text;\\n\\n row++;\\n }\\n\\n this.element.style.height = config.minHeight + \\\"px\\\";\\n\\n if (this.$fixedWidth || session.$useWrapMode)\\n lastLineNumber = session.getLength() + firstLineNumber;\\n\\n var gutterWidth = gutterRenderer \\n ? gutterRenderer.getWidth(session, lastLineNumber, config)\\n : lastLineNumber.toString().length * config.characterWidth;\\n \\n var padding = this.$padding || this.$computePadding();\\n gutterWidth += padding.left + padding.right;\\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\\n this.gutterWidth = gutterWidth;\\n this.element.style.width = Math.ceil(this.gutterWidth) + \\\"px\\\";\\n this._emit(\\\"changeGutterWidth\\\", gutterWidth);\\n }\\n };\\n\\n this.$fixedWidth = false;\\n \\n this.$showLineNumbers = true;\\n this.$renderer = \\\"\\\";\\n this.setShowLineNumbers = function(show) {\\n this.$renderer = !show && {\\n getWidth: function() {return \\\"\\\";},\\n getText: function() {return \\\"\\\";}\\n };\\n };\\n \\n this.getShowLineNumbers = function() {\\n return this.$showLineNumbers;\\n };\\n \\n this.$showFoldWidgets = true;\\n this.setShowFoldWidgets = function(show) {\\n if (show)\\n dom.addCssClass(this.element, \\\"ace_folding-enabled\\\");\\n else\\n dom.removeCssClass(this.element, \\\"ace_folding-enabled\\\");\\n\\n this.$showFoldWidgets = show;\\n this.$padding = null;\\n };\\n \\n this.getShowFoldWidgets = function() {\\n return this.$showFoldWidgets;\\n };\\n\\n this.$computePadding = function() {\\n if (!this.element.firstChild)\\n return {left: 0, right: 0};\\n var style = dom.computedStyle(this.element.firstChild);\\n this.$padding = {};\\n this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\\n this.$padding.right = parseInt(style.paddingRight) || 0;\\n return this.$padding;\\n };\\n\\n this.getRegion = function(point) {\\n var padding = this.$padding || this.$computePadding();\\n var rect = this.element.getBoundingClientRect();\\n if (point.x < padding.left + rect.left)\\n return \\\"markers\\\";\\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\\n return \\\"foldWidgets\\\";\\n };\\n\\n}).call(Gutter.prototype);\\n\\nexports.Gutter = Gutter;\\n\\n});\\n\\ndefine(\\\"ace/layer/marker\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/lib/dom\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../range\\\").Range;\\nvar dom = require(\\\"../lib/dom\\\");\\n\\nvar Marker = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_marker-layer\\\";\\n parentEl.appendChild(this.element);\\n};\\n\\n(function() {\\n\\n this.$padding = 0;\\n\\n this.setPadding = function(padding) {\\n this.$padding = padding;\\n };\\n this.setSession = function(session) {\\n this.session = session;\\n };\\n \\n this.setMarkers = function(markers) {\\n this.markers = markers;\\n };\\n\\n this.update = function(config) {\\n if (!config) return;\\n\\n this.config = config;\\n\\n\\n var html = [];\\n for (var key in this.markers) {\\n var marker = this.markers[key];\\n\\n if (!marker.range) {\\n marker.update(html, this, this.session, config);\\n continue;\\n }\\n\\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\\n if (range.isEmpty()) continue;\\n\\n range = range.toScreenRange(this.session);\\n if (marker.renderer) {\\n var top = this.$getTop(range.start.row, config);\\n var left = this.$padding + (this.session.$bidiHandler.isBidiRow(range.start.row)\\n ? this.session.$bidiHandler.getPosLeft(range.start.column)\\n : 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 if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\\n this.drawBidiSingleLineMarker(html, range, marker.clazz + \\\" ace_start\\\" + \\\" ace_br15\\\", config);\\n } else {\\n this.drawSingleLineMarker(html, range, marker.clazz + \\\" ace_start\\\" + \\\" ace_br15\\\", config);\\n }\\n }\\n }\\n this.element.innerHTML = html.join(\\\"\\\");\\n };\\n\\n this.$getTop = function(row, layerConfig) {\\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\\n };\\n\\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 clazzModified = null;\\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 clazzModified = clazz + (row == start ? \\\" ace_start\\\" : \\\"\\\") + \\\" ace_br\\\"\\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end);\\n \\n if (this.session.$bidiHandler.isBidiRow(row)) {\\n this.drawBidiSingleLineMarker(stringBuilder, lineRange, clazzModified, \\n layerConfig, row == end ? 0 : 1, extraStyle);\\n } else {\\n this.drawSingleLineMarker(stringBuilder, lineRange, clazzModified, \\n layerConfig, row == end ? 0 : 1, extraStyle);\\n }\\n }\\n };\\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\\n var padding = this.$padding;\\n var height, top, left;\\n extraStyle = extraStyle || \\\"\\\";\\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 height = config.lineHeight;\\n top = this.$getTop(range.start.row, config);\\n left = padding + range.start.column * config.characterWidth;\\n stringBuilder.push(\\n \\\"
\\\"\\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 var width = range.end.column * config.characterWidth;\\n height = config.lineHeight;\\n top = this.$getTop(range.end.row, config);\\n stringBuilder.push(\\n \\\"
\\\"\\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 stringBuilder.push(\\n \\\"
\\\"\\n );\\n };\\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\\n var height = config.lineHeight;\\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\\n\\n var top = this.$getTop(range.start.row, config);\\n var left = this.$padding + range.start.column * config.characterWidth;\\n\\n stringBuilder.push(\\n \\\"
\\\"\\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 stringBuilder.push(\\n \\\"
\\\"\\n );\\n });\\n };\\n\\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\\n var top = this.$getTop(range.start.row, config);\\n var height = config.lineHeight;\\n if (range.start.row != range.end.row)\\n height += this.$getTop(range.end.row, config) - top;\\n\\n stringBuilder.push(\\n \\\"
\\\"\\n );\\n };\\n \\n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\\n var top = this.$getTop(range.start.row, config);\\n var height = config.lineHeight;\\n\\n stringBuilder.push(\\n \\\"
\\\"\\n );\\n };\\n\\n}).call(Marker.prototype);\\n\\nexports.Marker = Marker;\\n\\n});\\n\\ndefine(\\\"ace/layer/text\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"../lib/oop\\\");\\nvar dom = require(\\\"../lib/dom\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\nvar EventEmitter = require(\\\"../lib/event_emitter\\\").EventEmitter;\\n\\nvar Text = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_text-layer\\\";\\n parentEl.appendChild(this.element);\\n this.$updateEolChar = this.$updateEolChar.bind(this);\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n\\n this.EOF_CHAR = \\\"\\\\xB6\\\";\\n this.EOL_CHAR_LF = \\\"\\\\xAC\\\";\\n this.EOL_CHAR_CRLF = \\\"\\\\xa4\\\";\\n this.EOL_CHAR = this.EOL_CHAR_LF;\\n this.TAB_CHAR = \\\"\\\\u2014\\\"; //\\\"\\\\u21E5\\\";\\n this.SPACE_CHAR = \\\"\\\\xB7\\\";\\n this.$padding = 0;\\n\\n this.$updateEolChar = function() {\\n var EOL_CHAR = this.session.doc.getNewLineCharacter() == \\\"\\\\n\\\"\\n ? this.EOL_CHAR_LF\\n : this.EOL_CHAR_CRLF;\\n if (this.EOL_CHAR != EOL_CHAR) {\\n this.EOL_CHAR = EOL_CHAR;\\n return true;\\n }\\n };\\n\\n this.setPadding = function(padding) {\\n this.$padding = padding;\\n this.element.style.padding = \\\"0 \\\" + padding + \\\"px\\\";\\n };\\n\\n this.getLineHeight = function() {\\n return this.$fontMetrics.$characterSize.height || 0;\\n };\\n\\n this.getCharacterWidth = function() {\\n return this.$fontMetrics.$characterSize.width || 0;\\n };\\n \\n this.$setFontMetrics = function(measure) {\\n this.$fontMetrics = measure;\\n this.$fontMetrics.on(\\\"changeCharacterSize\\\", function(e) {\\n this._signal(\\\"changeCharacterSize\\\", e);\\n }.bind(this));\\n this.$pollSizeChanges();\\n };\\n\\n this.checkForSizeChanges = function() {\\n this.$fontMetrics.checkForSizeChanges();\\n };\\n this.$pollSizeChanges = function() {\\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\\n };\\n this.setSession = function(session) {\\n this.session = session;\\n if (session)\\n this.$computeTabString();\\n };\\n\\n this.showInvisibles = false;\\n this.setShowInvisibles = function(showInvisibles) {\\n if (this.showInvisibles == showInvisibles)\\n return false;\\n\\n this.showInvisibles = showInvisibles;\\n this.$computeTabString();\\n return true;\\n };\\n\\n this.displayIndentGuides = true;\\n this.setDisplayIndentGuides = function(display) {\\n if (this.displayIndentGuides == display)\\n return false;\\n\\n this.displayIndentGuides = display;\\n this.$computeTabString();\\n return true;\\n };\\n\\n this.$tabStrings = [];\\n this.onChangeTabSize =\\n this.$computeTabString = function() {\\n var tabSize = this.session.getTabSize();\\n this.tabSize = tabSize;\\n var tabStr = this.$tabStrings = [0];\\n for (var i = 1; i < tabSize + 1; i++) {\\n if (this.showInvisibles) {\\n tabStr.push(\\\"\\\"\\n + lang.stringRepeat(this.TAB_CHAR, i)\\n + \\\"\\\");\\n } else {\\n tabStr.push(lang.stringRepeat(\\\" \\\", i));\\n }\\n }\\n if (this.displayIndentGuides) {\\n this.$indentGuideRe = /\\\\s\\\\S| \\\\t|\\\\t |\\\\s$/;\\n var className = \\\"ace_indent-guide\\\";\\n var spaceClass = \\\"\\\";\\n var tabClass = \\\"\\\";\\n if (this.showInvisibles) {\\n className += \\\" ace_invisible\\\";\\n spaceClass = \\\" ace_invisible_space\\\";\\n tabClass = \\\" ace_invisible_tab\\\";\\n var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\\n var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\\n } else{\\n var spaceContent = lang.stringRepeat(\\\" \\\", this.tabSize);\\n var tabContent = spaceContent;\\n }\\n\\n this.$tabStrings[\\\" \\\"] = \\\"\\\" + spaceContent + \\\"\\\";\\n this.$tabStrings[\\\"\\\\t\\\"] = \\\"\\\" + tabContent + \\\"\\\";\\n }\\n };\\n\\n this.updateLines = function(config, firstRow, lastRow) {\\n if (this.config.lastRow != config.lastRow ||\\n this.config.firstRow != config.firstRow) {\\n this.scrollLines(config);\\n }\\n this.config = config;\\n\\n var first = Math.max(firstRow, config.firstRow);\\n var last = Math.min(lastRow, config.lastRow);\\n\\n var lineElements = this.element.childNodes;\\n var lineElementsIdx = 0;\\n\\n for (var row = config.firstRow; row < first; row++) {\\n var foldLine = this.session.getFoldLine(row);\\n if (foldLine) {\\n if (foldLine.containsRow(first)) {\\n first = foldLine.start.row;\\n break;\\n } else {\\n row = foldLine.end.row;\\n }\\n }\\n lineElementsIdx ++;\\n }\\n\\n var row = first;\\n var foldLine = this.session.getNextFoldLine(row);\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n\\n while (true) {\\n if (row > foldStart) {\\n row = foldLine.end.row+1;\\n foldLine = this.session.getNextFoldLine(row, foldLine);\\n foldStart = foldLine ? foldLine.start.row :Infinity;\\n }\\n if (row > last)\\n break;\\n\\n var lineElement = lineElements[lineElementsIdx++];\\n if (lineElement) {\\n var html = [];\\n this.$renderLine(\\n html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\\n );\\n lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \\\"px\\\";\\n lineElement.innerHTML = html.join(\\\"\\\");\\n }\\n row++;\\n }\\n };\\n\\n this.scrollLines = function(config) {\\n var oldConfig = this.config;\\n this.config = config;\\n\\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\\n return this.update(config);\\n\\n if (config.lastRow < oldConfig.firstRow)\\n return this.update(config);\\n\\n var el = this.element;\\n if (oldConfig.firstRow < config.firstRow)\\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\\n el.removeChild(el.firstChild);\\n\\n if (oldConfig.lastRow > config.lastRow)\\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\\n el.removeChild(el.lastChild);\\n\\n if (config.firstRow < oldConfig.firstRow) {\\n var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\\n if (el.firstChild)\\n el.insertBefore(fragment, el.firstChild);\\n else\\n el.appendChild(fragment);\\n }\\n\\n if (config.lastRow > oldConfig.lastRow) {\\n var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\\n el.appendChild(fragment);\\n }\\n };\\n\\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\\n var fragment = this.element.ownerDocument.createDocumentFragment();\\n var row = firstRow;\\n var foldLine = this.session.getNextFoldLine(row);\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n\\n while (true) {\\n if (row > foldStart) {\\n row = foldLine.end.row+1;\\n foldLine = this.session.getNextFoldLine(row, foldLine);\\n foldStart = foldLine ? foldLine.start.row : Infinity;\\n }\\n if (row > lastRow)\\n break;\\n\\n var container = dom.createElement(\\\"div\\\");\\n\\n var html = [];\\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\\n container.innerHTML = html.join(\\\"\\\");\\n if (this.$useLineGroups()) {\\n container.className = 'ace_line_group';\\n fragment.appendChild(container);\\n container.style.height = config.lineHeight * this.session.getRowLength(row) + \\\"px\\\";\\n\\n } else {\\n while(container.firstChild)\\n fragment.appendChild(container.firstChild);\\n }\\n\\n row++;\\n }\\n return fragment;\\n };\\n\\n this.update = function(config) {\\n this.config = config;\\n\\n var html = [];\\n var firstRow = config.firstRow, lastRow = config.lastRow;\\n\\n var row = firstRow;\\n var foldLine = this.session.getNextFoldLine(row);\\n var foldStart = foldLine ? foldLine.start.row : Infinity;\\n\\n while (true) {\\n if (row > foldStart) {\\n row = foldLine.end.row+1;\\n foldLine = this.session.getNextFoldLine(row, foldLine);\\n foldStart = foldLine ? foldLine.start.row :Infinity;\\n }\\n if (row > lastRow)\\n break;\\n\\n if (this.$useLineGroups())\\n html.push(\\\"
\\\");\\n\\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\\n\\n if (this.$useLineGroups())\\n html.push(\\\"
\\\"); // end the line group\\n\\n row++;\\n }\\n this.element.innerHTML = html.join(\\\"\\\");\\n };\\n\\n this.$textToken = {\\n \\\"text\\\": true,\\n \\\"rparen\\\": true,\\n \\\"lparen\\\": true\\n };\\n\\n this.$renderToken = function(stringBuilder, screenColumn, token, value) {\\n var self = this;\\n var replaceReg = /\\\\t|&|<|>|( +)|([\\\\x00-\\\\x1f\\\\x80-\\\\xa0\\\\xad\\\\u1680\\\\u180E\\\\u2000-\\\\u200f\\\\u2028\\\\u2029\\\\u202F\\\\u205F\\\\u3000\\\\uFEFF\\\\uFFF9-\\\\uFFFC])|[\\\\u1100-\\\\u115F\\\\u11A3-\\\\u11A7\\\\u11FA-\\\\u11FF\\\\u2329-\\\\u232A\\\\u2E80-\\\\u2E99\\\\u2E9B-\\\\u2EF3\\\\u2F00-\\\\u2FD5\\\\u2FF0-\\\\u2FFB\\\\u3000-\\\\u303E\\\\u3041-\\\\u3096\\\\u3099-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u3190-\\\\u31BA\\\\u31C0-\\\\u31E3\\\\u31F0-\\\\u321E\\\\u3220-\\\\u3247\\\\u3250-\\\\u32FE\\\\u3300-\\\\u4DBF\\\\u4E00-\\\\uA48C\\\\uA490-\\\\uA4C6\\\\uA960-\\\\uA97C\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFAFF\\\\uFE10-\\\\uFE19\\\\uFE30-\\\\uFE52\\\\uFE54-\\\\uFE66\\\\uFE68-\\\\uFE6B\\\\uFF01-\\\\uFF60\\\\uFFE0-\\\\uFFE6]|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]/g;\\n var replaceFunc = function(c, a, b, tabIdx, idx4) {\\n if (a) {\\n return self.showInvisibles\\n ? \\\"\\\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \\\"\\\"\\n : c;\\n } else if (c == \\\"&\\\") {\\n return \\\"&\\\";\\n } else if (c == \\\"<\\\") {\\n return \\\"<\\\";\\n } else if (c == \\\">\\\") {\\n return \\\">\\\";\\n } else if (c == \\\"\\\\t\\\") {\\n var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\\n screenColumn += tabSize - 1;\\n return self.$tabStrings[tabSize];\\n } else if (c == \\\"\\\\u3000\\\") {\\n var classToUse = self.showInvisibles ? \\\"ace_cjk ace_invisible ace_invisible_space\\\" : \\\"ace_cjk\\\";\\n var space = self.showInvisibles ? self.SPACE_CHAR : \\\"\\\";\\n screenColumn += 1;\\n return \\\"\\\" + space + \\\"\\\";\\n } else if (b) {\\n return \\\"\\\" + self.SPACE_CHAR + \\\"\\\";\\n } else {\\n screenColumn += 1;\\n return \\\"\\\" + c + \\\"\\\";\\n }\\n };\\n\\n var output = value.replace(replaceReg, replaceFunc);\\n\\n if (!this.$textToken[token.type]) {\\n var classes = \\\"ace_\\\" + token.type.replace(/\\\\./g, \\\" ace_\\\");\\n var style = \\\"\\\";\\n if (token.type == \\\"fold\\\")\\n style = \\\" style='width:\\\" + (token.value.length * this.config.characterWidth) + \\\"px;' \\\";\\n stringBuilder.push(\\\"\\\", output, \\\"\\\");\\n }\\n else {\\n stringBuilder.push(output);\\n }\\n return screenColumn + value.length;\\n };\\n\\n this.renderIndentGuide = function(stringBuilder, value, max) {\\n var cols = value.search(this.$indentGuideRe);\\n if (cols <= 0 || cols >= max)\\n return value;\\n if (value[0] == \\\" \\\") {\\n cols -= cols % this.tabSize;\\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\\\" \\\"], cols/this.tabSize));\\n return value.substr(cols);\\n } else if (value[0] == \\\"\\\\t\\\") {\\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\\\"\\\\t\\\"], cols));\\n return value.substr(cols);\\n }\\n return value;\\n };\\n\\n this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\\n var chars = 0;\\n var split = 0;\\n var splitChars = splits[0];\\n var screenColumn = 0;\\n\\n for (var i = 0; i < tokens.length; i++) {\\n var token = tokens[i];\\n var value = token.value;\\n if (i == 0 && this.displayIndentGuides) {\\n chars = value.length;\\n value = this.renderIndentGuide(stringBuilder, value, splitChars);\\n if (!value)\\n continue;\\n chars -= value.length;\\n }\\n\\n if (chars + value.length < splitChars) {\\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\\n chars += value.length;\\n } else {\\n while (chars + value.length >= splitChars) {\\n screenColumn = this.$renderToken(\\n stringBuilder, screenColumn,\\n token, value.substring(0, splitChars - chars)\\n );\\n value = value.substring(splitChars - chars);\\n chars = splitChars;\\n\\n if (!onlyContents) {\\n stringBuilder.push(\\\"
\\\",\\n \\\"
\\\"\\n );\\n }\\n\\n stringBuilder.push(lang.stringRepeat(\\\"\\\\xa0\\\", splits.indent));\\n\\n split ++;\\n screenColumn = 0;\\n splitChars = splits[split] || Number.MAX_VALUE;\\n }\\n if (value.length != 0) {\\n chars += value.length;\\n screenColumn = this.$renderToken(\\n stringBuilder, screenColumn, token, value\\n );\\n }\\n }\\n }\\n };\\n\\n this.$renderSimpleLine = function(stringBuilder, tokens) {\\n var screenColumn = 0;\\n var token = tokens[0];\\n var value = token.value;\\n if (this.displayIndentGuides)\\n value = this.renderIndentGuide(stringBuilder, value);\\n if (value)\\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\\n for (var i = 1; i < tokens.length; i++) {\\n token = tokens[i];\\n value = token.value;\\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\\n }\\n };\\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\\n if (!foldLine && foldLine != false)\\n foldLine = this.session.getFoldLine(row);\\n\\n if (foldLine)\\n var tokens = this.$getFoldLineTokens(row, foldLine);\\n else\\n var tokens = this.session.getTokens(row);\\n\\n\\n if (!onlyContents) {\\n stringBuilder.push(\\n \\\"
\\\"\\n );\\n }\\n\\n if (tokens.length) {\\n var splits = this.session.getRowSplitData(row);\\n if (splits && splits.length)\\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\\n else\\n this.$renderSimpleLine(stringBuilder, tokens);\\n }\\n\\n if (this.showInvisibles) {\\n if (foldLine)\\n row = foldLine.end.row;\\n\\n stringBuilder.push(\\n \\\"\\\",\\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\\n \\\"\\\"\\n );\\n }\\n if (!onlyContents)\\n stringBuilder.push(\\\"
\\\");\\n };\\n\\n this.$getFoldLineTokens = function(row, foldLine) {\\n var session = this.session;\\n var renderTokens = [];\\n\\n function addTokens(tokens, from, to) {\\n var idx = 0, col = 0;\\n while ((col + tokens[idx].value.length) < from) {\\n col += tokens[idx].value.length;\\n idx++;\\n\\n if (idx == tokens.length)\\n return;\\n }\\n if (col != from) {\\n var value = tokens[idx].value.substring(from - col);\\n if (value.length > (to - from))\\n value = value.substring(0, to - from);\\n\\n renderTokens.push({\\n type: tokens[idx].type,\\n value: value\\n });\\n\\n col = from + value.length;\\n idx += 1;\\n }\\n\\n while (col < to && idx < tokens.length) {\\n var value = tokens[idx].value;\\n if (value.length + col > to) {\\n renderTokens.push({\\n type: tokens[idx].type,\\n value: value.substring(0, to - col)\\n });\\n } else\\n renderTokens.push(tokens[idx]);\\n col += value.length;\\n idx += 1;\\n }\\n }\\n\\n var tokens = session.getTokens(row);\\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\\n if (placeholder != null) {\\n renderTokens.push({\\n type: \\\"fold\\\",\\n value: placeholder\\n });\\n } else {\\n if (isNewRow)\\n tokens = session.getTokens(row);\\n\\n if (tokens.length)\\n addTokens(tokens, lastColumn, column);\\n }\\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\\n\\n return renderTokens;\\n };\\n\\n this.$useLineGroups = function() {\\n return this.session.getUseWrapMode();\\n };\\n\\n this.destroy = function() {\\n clearInterval(this.$pollSizeChangesTimer);\\n if (this.$measureNode)\\n this.$measureNode.parentNode.removeChild(this.$measureNode);\\n delete this.$measureNode;\\n };\\n\\n}).call(Text.prototype);\\n\\nexports.Text = Text;\\n\\n});\\n\\ndefine(\\\"ace/layer/cursor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/dom\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\nvar isIE8;\\n\\nvar Cursor = function(parentEl) {\\n this.element = dom.createElement(\\\"div\\\");\\n this.element.className = \\\"ace_layer ace_cursor-layer\\\";\\n parentEl.appendChild(this.element);\\n \\n if (isIE8 === undefined)\\n isIE8 = !(\\\"opacity\\\" in this.element.style);\\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 = (isIE8\\n ? this.$updateVisibility\\n : this.$updateOpacity).bind(this);\\n};\\n\\n(function() {\\n \\n this.$updateVisibility = function(val) {\\n var cursors = this.cursors;\\n for (var i = cursors.length; i--; )\\n cursors[i].style.visibility = val ? \\\"\\\" : \\\"hidden\\\";\\n };\\n this.$updateOpacity = function(val) {\\n var cursors = this.cursors;\\n for (var i = cursors.length; i--; )\\n cursors[i].style.opacity = val ? \\\"\\\" : \\\"0\\\";\\n };\\n \\n\\n this.$padding = 0;\\n this.setPadding = function(padding) {\\n this.$padding = padding;\\n };\\n\\n this.setSession = function(session) {\\n this.session = session;\\n };\\n\\n this.setBlinking = function(blinking) {\\n if (blinking != this.isBlinking){\\n this.isBlinking = blinking;\\n this.restartTimer();\\n }\\n };\\n\\n this.setBlinkInterval = function(blinkInterval) {\\n if (blinkInterval != this.blinkInterval){\\n this.blinkInterval = blinkInterval;\\n this.restartTimer();\\n }\\n };\\n\\n this.setSmoothBlinking = function(smoothBlinking) {\\n if (smoothBlinking != this.smoothBlinking && !isIE8) {\\n this.smoothBlinking = smoothBlinking;\\n dom.setCssClass(this.element, \\\"ace_smooth-blinking\\\", smoothBlinking);\\n this.$updateCursors(true);\\n this.$updateCursors = (this.$updateOpacity).bind(this);\\n this.restartTimer();\\n }\\n };\\n\\n this.addCursor = function() {\\n var el = dom.createElement(\\\"div\\\");\\n el.className = \\\"ace_cursor\\\";\\n this.element.appendChild(el);\\n this.cursors.push(el);\\n return el;\\n };\\n\\n this.removeCursor = function() {\\n if (this.cursors.length > 1) {\\n var el = this.cursors.pop();\\n el.parentNode.removeChild(el);\\n return el;\\n }\\n };\\n\\n this.hideCursor = function() {\\n this.isVisible = false;\\n dom.addCssClass(this.element, \\\"ace_hidden-cursors\\\");\\n this.restartTimer();\\n };\\n\\n this.showCursor = function() {\\n this.isVisible = true;\\n dom.removeCssClass(this.element, \\\"ace_hidden-cursors\\\");\\n this.restartTimer();\\n };\\n\\n this.restartTimer = function() {\\n var update = this.$updateCursors;\\n clearInterval(this.intervalId);\\n clearTimeout(this.timeoutId);\\n if (this.smoothBlinking) {\\n dom.removeCssClass(this.element, \\\"ace_smooth-blinking\\\");\\n }\\n \\n update(true);\\n\\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\\n return;\\n\\n if (this.smoothBlinking) {\\n setTimeout(function(){\\n dom.addCssClass(this.element, \\\"ace_smooth-blinking\\\");\\n }.bind(this));\\n }\\n \\n var blink = function(){\\n this.timeoutId = setTimeout(function() {\\n update(false);\\n }, 0.6 * this.blinkInterval);\\n }.bind(this);\\n\\n this.intervalId = setInterval(function() {\\n update(true);\\n blink();\\n }, this.blinkInterval);\\n\\n blink();\\n };\\n\\n this.getPixelPosition = function(position, onScreen) {\\n if (!this.config || !this.session)\\n return {left : 0, top : 0};\\n\\n if (!position)\\n position = this.session.selection.getCursor();\\n var pos = this.session.documentToScreenPosition(position);\\n var cursorLeft = this.$padding + (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.update = function(config) {\\n this.config = config;\\n\\n var selections = this.session.$selectionMarkers;\\n var i = 0, cursorIndex = 0;\\n\\n if (selections === undefined || selections.length === 0){\\n selections = [{cursor: null}];\\n }\\n\\n for (var i = 0, n = selections.length; i < n; i++) {\\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\\n if ((pixelPos.top > config.height + config.offset ||\\n pixelPos.top < 0) && i > 1) {\\n continue;\\n }\\n\\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\\n \\n if (!this.drawCursor) {\\n style.left = pixelPos.left + \\\"px\\\";\\n style.top = pixelPos.top + \\\"px\\\";\\n style.width = config.characterWidth + \\\"px\\\";\\n style.height = config.lineHeight + \\\"px\\\";\\n } else {\\n this.drawCursor(style, pixelPos, config, selections[i], this.session);\\n }\\n }\\n while (this.cursors.length > cursorIndex)\\n this.removeCursor();\\n\\n var overwrite = this.session.getOverwrite();\\n this.$setOverwrite(overwrite);\\n this.$pixelPos = pixelPos;\\n this.restartTimer();\\n };\\n \\n this.drawCursor = null;\\n\\n this.$setOverwrite = function(overwrite) {\\n if (overwrite != this.overwrite) {\\n this.overwrite = overwrite;\\n if (overwrite)\\n dom.addCssClass(this.element, \\\"ace_overwrite-cursors\\\");\\n else\\n dom.removeCssClass(this.element, \\\"ace_overwrite-cursors\\\");\\n }\\n };\\n\\n this.destroy = function() {\\n clearInterval(this.intervalId);\\n clearTimeout(this.timeoutId);\\n };\\n\\n}).call(Cursor.prototype);\\n\\nexports.Cursor = Cursor;\\n\\n});\\n\\ndefine(\\\"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.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\\ndefine(\\\"ace/renderloop\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/event\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar event = require(\\\"./lib/event\\\");\\n\\n\\nvar RenderLoop = function(onRender, win) {\\n this.onRender = onRender;\\n this.pending = false;\\n this.changes = 0;\\n this.window = win || window;\\n};\\n\\n(function() {\\n\\n\\n this.schedule = function(change) {\\n this.changes = this.changes | change;\\n if (!this.pending && this.changes) {\\n this.pending = true;\\n var _self = this;\\n event.nextFrame(function() {\\n _self.pending = false;\\n var changes;\\n while (changes = _self.changes) {\\n _self.changes = 0;\\n _self.onRender(changes);\\n }\\n }, this.window);\\n }\\n };\\n\\n}).call(RenderLoop.prototype);\\n\\nexports.RenderLoop = RenderLoop;\\n});\\n\\ndefine(\\\"ace/layer/font_metrics\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/lang\\\",\\\"ace/lib/useragent\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\nvar oop = require(\\\"../lib/oop\\\");\\nvar dom = require(\\\"../lib/dom\\\");\\nvar lang = require(\\\"../lib/lang\\\");\\nvar useragent = require(\\\"../lib/useragent\\\");\\nvar EventEmitter = require(\\\"../lib/event_emitter\\\").EventEmitter;\\n\\nvar CHAR_COUNT = 0;\\n\\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\\n this.el = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(this.el.style, true);\\n \\n this.$main = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(this.$main.style);\\n \\n this.$measureNode = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(this.$measureNode.style);\\n \\n \\n this.el.appendChild(this.$main);\\n this.el.appendChild(this.$measureNode);\\n parentEl.appendChild(this.el);\\n \\n if (!CHAR_COUNT)\\n this.$testFractionalRect();\\n this.$measureNode.innerHTML = lang.stringRepeat(\\\"X\\\", CHAR_COUNT);\\n \\n this.$characterSize = {width: 0, height: 0};\\n this.checkForSizeChanges();\\n};\\n\\n(function() {\\n\\n oop.implement(this, EventEmitter);\\n \\n this.$characterSize = {width: 0, height: 0};\\n \\n this.$testFractionalRect = function() {\\n var el = dom.createElement(\\\"div\\\");\\n this.$setMeasureNodeStyles(el.style);\\n el.style.width = \\\"0.2px\\\";\\n document.documentElement.appendChild(el);\\n var w = el.getBoundingClientRect().width;\\n if (w > 0 && w < 1)\\n CHAR_COUNT = 50;\\n else\\n CHAR_COUNT = 100;\\n el.parentNode.removeChild(el);\\n };\\n \\n this.$setMeasureNodeStyles = function(style, isRoot) {\\n style.width = style.height = \\\"auto\\\";\\n style.left = style.top = \\\"0px\\\";\\n style.visibility = \\\"hidden\\\";\\n style.position = \\\"absolute\\\";\\n style.whiteSpace = \\\"pre\\\";\\n\\n if (useragent.isIE < 8) {\\n style[\\\"font-family\\\"] = \\\"inherit\\\";\\n } else {\\n style.font = \\\"inherit\\\";\\n }\\n style.overflow = isRoot ? \\\"hidden\\\" : \\\"visible\\\";\\n };\\n\\n this.checkForSizeChanges = function() {\\n var size = this.$measureSizes();\\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\\n this.$measureNode.style.fontWeight = \\\"bold\\\";\\n var boldSize = this.$measureSizes();\\n this.$measureNode.style.fontWeight = \\\"\\\";\\n this.$characterSize = size;\\n this.charSizes = Object.create(null);\\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\\n this._emit(\\\"changeCharacterSize\\\", {data: size});\\n }\\n };\\n\\n this.$pollSizeChanges = function() {\\n if (this.$pollSizeChangesTimer)\\n return this.$pollSizeChangesTimer;\\n var self = this;\\n return this.$pollSizeChangesTimer = setInterval(function() {\\n self.checkForSizeChanges();\\n }, 500);\\n };\\n \\n this.setPolling = function(val) {\\n if (val) {\\n this.$pollSizeChanges();\\n } else if (this.$pollSizeChangesTimer) {\\n clearInterval(this.$pollSizeChangesTimer);\\n this.$pollSizeChangesTimer = 0;\\n }\\n };\\n\\n this.$measureSizes = function() {\\n if (CHAR_COUNT === 50) {\\n var rect = null;\\n try { \\n rect = this.$measureNode.getBoundingClientRect();\\n } catch(e) {\\n rect = {width: 0, height:0 };\\n }\\n var size = {\\n height: rect.height,\\n width: rect.width / CHAR_COUNT\\n };\\n } else {\\n var size = {\\n height: this.$measureNode.clientHeight,\\n width: this.$measureNode.clientWidth / CHAR_COUNT\\n };\\n }\\n if (size.width === 0 || size.height === 0)\\n return null;\\n return size;\\n };\\n\\n this.$measureCharWidth = function(ch) {\\n this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\\n var rect = this.$main.getBoundingClientRect();\\n return rect.width / CHAR_COUNT;\\n };\\n \\n this.getCharacterWidth = function(ch) {\\n var w = this.charSizes[ch];\\n if (w === undefined) {\\n 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.el && this.el.parentNode)\\n this.el.parentNode.removeChild(this.el);\\n };\\n\\n}).call(FontMetrics.prototype);\\n\\n});\\n\\ndefine(\\\"ace/virtual_renderer\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/config\\\",\\\"ace/lib/useragent\\\",\\\"ace/layer/gutter\\\",\\\"ace/layer/marker\\\",\\\"ace/layer/text\\\",\\\"ace/layer/cursor\\\",\\\"ace/scrollbar\\\",\\\"ace/scrollbar\\\",\\\"ace/renderloop\\\",\\\"ace/layer/font_metrics\\\",\\\"ace/lib/event_emitter\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nvar config = require(\\\"./config\\\");\\nvar useragent = require(\\\"./lib/useragent\\\");\\nvar GutterLayer = require(\\\"./layer/gutter\\\").Gutter;\\nvar MarkerLayer = require(\\\"./layer/marker\\\").Marker;\\nvar TextLayer = require(\\\"./layer/text\\\").Text;\\nvar CursorLayer = require(\\\"./layer/cursor\\\").Cursor;\\nvar HScrollBar = require(\\\"./scrollbar\\\").HScrollBar;\\nvar VScrollBar = require(\\\"./scrollbar\\\").VScrollBar;\\nvar RenderLoop = require(\\\"./renderloop\\\").RenderLoop;\\nvar FontMetrics = require(\\\"./layer/font_metrics\\\").FontMetrics;\\nvar EventEmitter = require(\\\"./lib/event_emitter\\\").EventEmitter;\\nvar editorCss = \\\".ace_editor {\\\\\\nposition: relative;\\\\\\noverflow: hidden;\\\\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\\\\ndirection: ltr;\\\\\\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;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\nmin-width: 100%;\\\\\\n}\\\\\\n.ace_dragging .ace_scroller:before{\\\\\\nposition: absolute;\\\\\\ntop: 0;\\\\\\nleft: 0;\\\\\\nright: 0;\\\\\\nbottom: 0;\\\\\\ncontent: '';\\\\\\nbackground: rgba(250, 250, 250, 0.01);\\\\\\nz-index: 1000;\\\\\\n}\\\\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\\\\nbackground: rgba(0, 0, 0, 0.01);\\\\\\n}\\\\\\n.ace_selecting, .ace_selecting * {\\\\\\ncursor: text !important;\\\\\\n}\\\\\\n.ace_gutter {\\\\\\nposition: absolute;\\\\\\noverflow : hidden;\\\\\\nwidth: auto;\\\\\\ntop: 0;\\\\\\nbottom: 0;\\\\\\nleft: 0;\\\\\\ncursor: default;\\\\\\nz-index: 4;\\\\\\n-ms-user-select: none;\\\\\\n-moz-user-select: none;\\\\\\n-webkit-user-select: none;\\\\\\nuser-select: none;\\\\\\n}\\\\\\n.ace_gutter-active-line {\\\\\\nposition: absolute;\\\\\\nleft: 0;\\\\\\nright: 0;\\\\\\n}\\\\\\n.ace_scroller.ace_scroll-left {\\\\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\\\\n}\\\\\\n.ace_gutter-cell {\\\\\\npadding-left: 19px;\\\\\\npadding-right: 6px;\\\\\\nbackground-repeat: no-repeat;\\\\\\n}\\\\\\n.ace_gutter-cell.ace_error {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\\\\\");\\\\\\nbackground-repeat: no-repeat;\\\\\\nbackground-position: 2px center;\\\\\\n}\\\\\\n.ace_gutter-cell.ace_warning {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\\\\\");\\\\\\nbackground-position: 2px center;\\\\\\n}\\\\\\n.ace_gutter-cell.ace_info {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\\\\\");\\\\\\nbackground-position: 2px center;\\\\\\n}\\\\\\n.ace_dark .ace_gutter-cell.ace_info {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\\\\\");\\\\\\n}\\\\\\n.ace_scrollbar {\\\\\\nposition: absolute;\\\\\\nright: 0;\\\\\\nbottom: 0;\\\\\\nz-index: 6;\\\\\\n}\\\\\\n.ace_scrollbar-inner {\\\\\\nposition: absolute;\\\\\\ncursor: text;\\\\\\nleft: 0;\\\\\\ntop: 0;\\\\\\n}\\\\\\n.ace_scrollbar-v{\\\\\\noverflow-x: hidden;\\\\\\noverflow-y: scroll;\\\\\\ntop: 0;\\\\\\n}\\\\\\n.ace_scrollbar-h {\\\\\\noverflow-x: scroll;\\\\\\noverflow-y: hidden;\\\\\\nleft: 0;\\\\\\n}\\\\\\n.ace_print-margin {\\\\\\nposition: absolute;\\\\\\nheight: 100%;\\\\\\n}\\\\\\n.ace_text-input {\\\\\\nposition: absolute;\\\\\\nz-index: 0;\\\\\\nwidth: 0.5em;\\\\\\nheight: 1em;\\\\\\nopacity: 0;\\\\\\nbackground: transparent;\\\\\\n-moz-appearance: none;\\\\\\nappearance: none;\\\\\\nborder: none;\\\\\\nresize: none;\\\\\\noutline: none;\\\\\\noverflow: hidden;\\\\\\nfont: inherit;\\\\\\npadding: 0 1px;\\\\\\nmargin: 0 -1px;\\\\\\ntext-indent: -1em;\\\\\\n-ms-user-select: text;\\\\\\n-moz-user-select: text;\\\\\\n-webkit-user-select: text;\\\\\\nuser-select: text;\\\\\\nwhite-space: pre!important;\\\\\\n}\\\\\\n.ace_text-input.ace_composition {\\\\\\nbackground: inherit;\\\\\\ncolor: inherit;\\\\\\nz-index: 1000;\\\\\\nopacity: 1;\\\\\\ntext-indent: 0;\\\\\\n}\\\\\\n.ace_layer {\\\\\\nz-index: 1;\\\\\\nposition: absolute;\\\\\\noverflow: hidden;\\\\\\nword-wrap: normal;\\\\\\nwhite-space: pre;\\\\\\nheight: 100%;\\\\\\nwidth: 100%;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\npointer-events: none;\\\\\\n}\\\\\\n.ace_gutter-layer {\\\\\\nposition: relative;\\\\\\nwidth: auto;\\\\\\ntext-align: right;\\\\\\npointer-events: auto;\\\\\\n}\\\\\\n.ace_text-layer {\\\\\\nfont: inherit !important;\\\\\\n}\\\\\\n.ace_cjk {\\\\\\ndisplay: inline-block;\\\\\\ntext-align: center;\\\\\\n}\\\\\\n.ace_cursor-layer {\\\\\\nz-index: 4;\\\\\\n}\\\\\\n.ace_cursor {\\\\\\nz-index: 4;\\\\\\nposition: absolute;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\nborder-left: 2px solid;\\\\\\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_smooth-blinking .ace_cursor {\\\\\\n-webkit-transition: opacity 0.18s;\\\\\\ntransition: opacity 0.18s;\\\\\\n}\\\\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\\\\nposition: absolute;\\\\\\nz-index: 3;\\\\\\n}\\\\\\n.ace_marker-layer .ace_selection {\\\\\\nposition: absolute;\\\\\\nz-index: 5;\\\\\\n}\\\\\\n.ace_marker-layer .ace_bracket {\\\\\\nposition: absolute;\\\\\\nz-index: 6;\\\\\\n}\\\\\\n.ace_marker-layer .ace_active-line {\\\\\\nposition: absolute;\\\\\\nz-index: 2;\\\\\\n}\\\\\\n.ace_marker-layer .ace_selected-word {\\\\\\nposition: absolute;\\\\\\nz-index: 4;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\n}\\\\\\n.ace_line .ace_fold {\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\ndisplay: inline-block;\\\\\\nheight: 11px;\\\\\\nmargin-top: -2px;\\\\\\nvertical-align: middle;\\\\\\nbackground-image:\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\\\\\"),\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\\\\\");\\\\\\nbackground-repeat: no-repeat, repeat-x;\\\\\\nbackground-position: center center, top left;\\\\\\ncolor: transparent;\\\\\\nborder: 1px solid black;\\\\\\nborder-radius: 2px;\\\\\\ncursor: pointer;\\\\\\npointer-events: auto;\\\\\\n}\\\\\\n.ace_dark .ace_fold {\\\\\\n}\\\\\\n.ace_fold:hover{\\\\\\nbackground-image:\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\\\\\"),\\\\\\nurl(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\\\\\");\\\\\\n}\\\\\\n.ace_tooltip {\\\\\\nbackground-color: #FFF;\\\\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\\\\nborder: 1px solid gray;\\\\\\nborder-radius: 1px;\\\\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\\\\ncolor: black;\\\\\\nmax-width: 100%;\\\\\\npadding: 3px 4px;\\\\\\nposition: fixed;\\\\\\nz-index: 999999;\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\ncursor: default;\\\\\\nwhite-space: pre;\\\\\\nword-wrap: break-word;\\\\\\nline-height: normal;\\\\\\nfont-style: normal;\\\\\\nfont-weight: normal;\\\\\\nletter-spacing: normal;\\\\\\npointer-events: none;\\\\\\n}\\\\\\n.ace_folding-enabled > .ace_gutter-cell {\\\\\\npadding-right: 13px;\\\\\\n}\\\\\\n.ace_fold-widget {\\\\\\n-moz-box-sizing: border-box;\\\\\\n-webkit-box-sizing: border-box;\\\\\\nbox-sizing: border-box;\\\\\\nmargin: 0 -12px 0 1px;\\\\\\ndisplay: none;\\\\\\nwidth: 11px;\\\\\\nvertical-align: top;\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\\\\\");\\\\\\nbackground-repeat: no-repeat;\\\\\\nbackground-position: center;\\\\\\nborder-radius: 3px;\\\\\\nborder: 1px solid transparent;\\\\\\ncursor: pointer;\\\\\\n}\\\\\\n.ace_folding-enabled .ace_fold-widget {\\\\\\ndisplay: inline-block; \\\\\\n}\\\\\\n.ace_fold-widget.ace_end {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\\\\\");\\\\\\n}\\\\\\n.ace_fold-widget.ace_closed {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\\\\\");\\\\\\n}\\\\\\n.ace_fold-widget:hover {\\\\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\\\\n}\\\\\\n.ace_fold-widget:active {\\\\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\\\\\");\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget.ace_end {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\\\\\");\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget.ace_closed {\\\\\\nbackground-image: url(\\\\\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\\\\\");\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget:hover {\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\\\\n}\\\\\\n.ace_dark .ace_fold-widget:active {\\\\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\\\\n}\\\\\\n.ace_fold-widget.ace_invalid {\\\\\\nbackground-color: #FFB4B4;\\\\\\nborder-color: #DE5555;\\\\\\n}\\\\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\\\\ntransition: opacity 0.4s ease 0.05s;\\\\\\nopacity: 0;\\\\\\n}\\\\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\\\\ntransition: opacity 0.05s ease 0.05s;\\\\\\nopacity:1;\\\\\\n}\\\\\\n.ace_underline {\\\\\\ntext-decoration: underline;\\\\\\n}\\\\\\n.ace_bold {\\\\\\nfont-weight: bold;\\\\\\n}\\\\\\n.ace_nobold .ace_bold {\\\\\\nfont-weight: normal;\\\\\\n}\\\\\\n.ace_italic {\\\\\\nfont-style: italic;\\\\\\n}\\\\\\n.ace_error-marker {\\\\\\nbackground-color: rgba(255, 0, 0,0.2);\\\\\\nposition: absolute;\\\\\\nz-index: 9;\\\\\\n}\\\\\\n.ace_highlight-marker {\\\\\\nbackground-color: rgba(255, 255, 0,0.2);\\\\\\nposition: absolute;\\\\\\nz-index: 8;\\\\\\n}\\\\\\n.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_text-input-ios {\\\\\\nposition: absolute !important;\\\\\\ntop: -100000px !important;\\\\\\nleft: -100000px !important;\\\\\\n}\\\\\\n\\\";\\n\\ndom.importCssString(editorCss, \\\"ace_editor.css\\\");\\n\\nvar VirtualRenderer = function(container, theme) {\\n var _self = this;\\n\\n this.container = container || dom.createElement(\\\"div\\\");\\n this.$keepTextAreaAtCursor = !useragent.isOldIE;\\n\\n dom.addCssClass(this.container, \\\"ace_editor\\\");\\n\\n this.setTheme(theme);\\n\\n this.$gutter = dom.createElement(\\\"div\\\");\\n this.$gutter.className = \\\"ace_gutter\\\";\\n this.container.appendChild(this.$gutter);\\n this.$gutter.setAttribute(\\\"aria-hidden\\\", true);\\n\\n this.scroller = dom.createElement(\\\"div\\\");\\n this.scroller.className = \\\"ace_scroller\\\";\\n this.container.appendChild(this.scroller);\\n\\n this.content = dom.createElement(\\\"div\\\");\\n this.content.className = \\\"ace_content\\\";\\n this.scroller.appendChild(this.content);\\n\\n this.$gutterLayer = new GutterLayer(this.$gutter);\\n this.$gutterLayer.on(\\\"changeGutterWidth\\\", this.onGutterResize.bind(this));\\n\\n this.$markerBack = new MarkerLayer(this.content);\\n\\n var textLayer = this.$textLayer = new TextLayer(this.content);\\n this.canvas = textLayer.element;\\n\\n this.$markerFront = new MarkerLayer(this.content);\\n\\n this.$cursorLayer = new CursorLayer(this.content);\\n this.$horizScroll = false;\\n this.$vScroll = false;\\n\\n this.scrollBar = \\n this.scrollBarV = new VScrollBar(this.container, this);\\n this.scrollBarH = new HScrollBar(this.container, this);\\n this.scrollBarV.addEventListener(\\\"scroll\\\", function(e) {\\n if (!_self.$scrollAnimation)\\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\\n });\\n this.scrollBarH.addEventListener(\\\"scroll\\\", function(e) {\\n if (!_self.$scrollAnimation)\\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\\n });\\n\\n this.scrollTop = 0;\\n this.scrollLeft = 0;\\n\\n this.cursorPos = {\\n row : 0,\\n column : 0\\n };\\n\\n this.$fontMetrics = new FontMetrics(this.container);\\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\\n this.$textLayer.addEventListener(\\\"changeCharacterSize\\\", function(e) {\\n _self.updateCharacterSize();\\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\\n _self._signal(\\\"changeCharacterSize\\\", e);\\n });\\n\\n this.$size = {\\n width: 0,\\n height: 0,\\n scrollerHeight: 0,\\n scrollerWidth: 0,\\n $dirty: true\\n };\\n\\n this.layerConfig = {\\n width : 1,\\n padding : 0,\\n firstRow : 0,\\n firstRowScreen: 0,\\n lastRow : 0,\\n lineHeight : 0,\\n characterWidth : 0,\\n minHeight : 1,\\n maxHeight : 1,\\n offset : 0,\\n height : 1,\\n gutterOffset: 1\\n };\\n \\n this.scrollMargin = {\\n left: 0,\\n right: 0,\\n top: 0,\\n bottom: 0,\\n v: 0,\\n h: 0\\n };\\n\\n this.$loop = new RenderLoop(\\n this.$renderChanges.bind(this),\\n this.container.ownerDocument.defaultView\\n );\\n this.$loop.schedule(this.CHANGE_FULL);\\n\\n this.updateCharacterSize();\\n this.setPadding(4);\\n config.resetOptions(this);\\n config._emit(\\\"renderer\\\", this);\\n};\\n\\n(function() {\\n\\n this.CHANGE_CURSOR = 1;\\n this.CHANGE_MARKER = 2;\\n this.CHANGE_GUTTER = 4;\\n this.CHANGE_SCROLL = 8;\\n this.CHANGE_LINES = 16;\\n this.CHANGE_TEXT = 32;\\n this.CHANGE_SIZE = 64;\\n this.CHANGE_MARKER_BACK = 128;\\n this.CHANGE_MARKER_FRONT = 256;\\n this.CHANGE_FULL = 512;\\n this.CHANGE_H_SCROLL = 1024;\\n\\n oop.implement(this, EventEmitter);\\n\\n this.updateCharacterSize = function() {\\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\\n this.setStyle(\\\"ace_nobold\\\", !this.$allowBoldFonts);\\n }\\n\\n this.layerConfig.characterWidth =\\n this.characterWidth = this.$textLayer.getCharacterWidth();\\n this.layerConfig.lineHeight =\\n this.lineHeight = this.$textLayer.getLineHeight();\\n this.$updatePrintMargin();\\n };\\n this.setSession = function(session) {\\n if (this.session)\\n this.session.doc.off(\\\"changeNewLineMode\\\", this.onChangeNewLineMode);\\n \\n this.session = session;\\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\\n session.setScrollTop(-this.scrollMargin.top);\\n\\n this.$cursorLayer.setSession(session);\\n this.$markerBack.setSession(session);\\n this.$markerFront.setSession(session);\\n this.$gutterLayer.setSession(session);\\n this.$textLayer.setSession(session);\\n if (!session)\\n return;\\n \\n this.$loop.schedule(this.CHANGE_FULL);\\n this.session.$setFontMetrics(this.$fontMetrics);\\n 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.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\\n };\\n \\n this.$updateCachedSize = function(force, gutterWidth, width, height) {\\n height -= (this.$extraHeight || 0);\\n var changes = 0;\\n var size = this.$size;\\n var oldSize = {\\n width: size.width,\\n height: size.height,\\n scrollerHeight: size.scrollerHeight,\\n scrollerWidth: size.scrollerWidth\\n };\\n if (height && (force || size.height != height)) {\\n size.height = height;\\n changes |= this.CHANGE_SIZE;\\n\\n size.scrollerHeight = size.height;\\n if (this.$horizScroll)\\n size.scrollerHeight -= this.scrollBarH.getHeight();\\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \\\"px\\\";\\n\\n changes = changes | this.CHANGE_SCROLL;\\n }\\n\\n if (width && (force || size.width != width)) {\\n changes |= this.CHANGE_SIZE;\\n size.width = width;\\n \\n if (gutterWidth == null)\\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\\n \\n this.gutterWidth = gutterWidth;\\n \\n this.scrollBarH.element.style.left = \\n this.scroller.style.left = gutterWidth + \\\"px\\\";\\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \\n \\n this.scrollBarH.element.style.right = \\n this.scroller.style.right = this.scrollBarV.getWidth() + \\\"px\\\";\\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \\\"px\\\";\\n\\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\\n changes |= this.CHANGE_FULL;\\n }\\n \\n size.$dirty = !width || !height;\\n\\n if (changes)\\n this._signal(\\\"resize\\\", oldSize);\\n\\n return changes;\\n };\\n\\n this.onGutterResize = function() {\\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\\n if (gutterWidth != this.gutterWidth)\\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\\n\\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\\n this.$loop.schedule(this.CHANGE_FULL);\\n } else if (this.$size.$dirty) {\\n this.$loop.schedule(this.CHANGE_FULL);\\n } else {\\n this.$computeLayerConfig();\\n this.$loop.schedule(this.CHANGE_MARKER);\\n }\\n };\\n this.adjustWrapLimit = function() {\\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\\n var limit = Math.floor(availableWidth / this.characterWidth);\\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\\n };\\n this.setAnimatedScroll = function(shouldAnimate){\\n this.setOption(\\\"animatedScroll\\\", shouldAnimate);\\n };\\n this.getAnimatedScroll = function() {\\n return this.$animatedScroll;\\n };\\n this.setShowInvisibles = function(showInvisibles) {\\n this.setOption(\\\"showInvisibles\\\", showInvisibles);\\n 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.$updateGutterLineHighlight = function() {\\n var pos = this.$cursorLayer.$pixelPos;\\n var height = this.layerConfig.lineHeight;\\n if (this.session.getUseWrapMode()) {\\n var cursor = this.session.selection.getCursor();\\n cursor.column = 0;\\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\\n height *= this.session.getRowLength(cursor.row);\\n }\\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \\\"px\\\";\\n this.$gutterLineHighlight.style.height = height + \\\"px\\\";\\n };\\n\\n this.$updatePrintMargin = function() {\\n if (!this.$showPrintMargin && !this.$printMarginEl)\\n return;\\n\\n if (!this.$printMarginEl) {\\n var containerEl = dom.createElement(\\\"div\\\");\\n containerEl.className = \\\"ace_layer ace_print-margin-layer\\\";\\n this.$printMarginEl = dom.createElement(\\\"div\\\");\\n this.$printMarginEl.className = \\\"ace_print-margin\\\";\\n containerEl.appendChild(this.$printMarginEl);\\n this.content.insertBefore(containerEl, this.content.firstChild);\\n }\\n\\n var style = this.$printMarginEl.style;\\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \\\"px\\\";\\n style.visibility = this.$showPrintMargin ? \\\"visible\\\" : \\\"hidden\\\";\\n \\n if (this.session && this.session.$wrap == -1)\\n this.adjustWrapLimit();\\n };\\n this.getContainerElement = function() {\\n return this.container;\\n };\\n this.getMouseEventTarget = function() {\\n return this.scroller;\\n };\\n this.getTextAreaContainer = function() {\\n return this.container;\\n };\\n this.$moveTextAreaToCursor = function() {\\n if (!this.$keepTextAreaAtCursor)\\n return;\\n var config = this.layerConfig;\\n var posTop = this.$cursorLayer.$pixelPos.top;\\n var posLeft = this.$cursorLayer.$pixelPos.left;\\n posTop -= config.offset;\\n\\n var style = this.textarea.style;\\n var h = this.lineHeight;\\n if (posTop < 0 || posTop > config.height - h) {\\n style.top = style.left = \\\"0\\\";\\n return;\\n }\\n\\n var w = this.characterWidth;\\n if (this.$composition) {\\n var val = this.textarea.value.replace(/^\\\\x01+/, \\\"\\\");\\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\\n h += 2;\\n }\\n posLeft -= this.scrollLeft;\\n if (posLeft > this.$size.scrollerWidth - w)\\n posLeft = this.$size.scrollerWidth - w;\\n\\n posLeft += this.gutterWidth;\\n style.height = h + \\\"px\\\";\\n style.width = w + \\\"px\\\";\\n style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \\\"px\\\";\\n style.top = Math.min(posTop, this.$size.height - h) + \\\"px\\\";\\n };\\n this.getFirstVisibleRow = function() {\\n return this.layerConfig.firstRow;\\n };\\n this.getFirstFullyVisibleRow = function() {\\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\\n };\\n this.getLastFullyVisibleRow = function() {\\n var 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 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\\\");\\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();\\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\\n if (st > 0) {\\n this.scrollTop = st;\\n changes = changes | this.CHANGE_SCROLL;\\n changes |= this.$computeLayerConfig();\\n }\\n }\\n config = this.layerConfig;\\n this.$updateScrollBarV();\\n if (changes & this.CHANGE_H_SCROLL)\\n this.$updateScrollBarH();\\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \\\"px\\\";\\n this.content.style.marginTop = (-config.offset) + \\\"px\\\";\\n this.content.style.width = config.width + 2 * this.$padding + \\\"px\\\";\\n this.content.style.height = config.minHeight + \\\"px\\\";\\n }\\n if (changes & this.CHANGE_H_SCROLL) {\\n this.content.style.marginLeft = -this.scrollLeft + \\\"px\\\";\\n this.scroller.className = this.scrollLeft <= 0 ? \\\"ace_scroller\\\" : \\\"ace_scroller ace_scroll-left\\\";\\n }\\n if (changes & this.CHANGE_FULL) {\\n this.$textLayer.update(config);\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n this.$markerBack.update(config);\\n this.$markerFront.update(config);\\n this.$cursorLayer.update(config);\\n this.$moveTextAreaToCursor();\\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\\n this._signal(\\\"afterRender\\\");\\n return;\\n }\\n if (changes & this.CHANGE_SCROLL) {\\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\\n this.$textLayer.update(config);\\n else\\n this.$textLayer.scrollLines(config);\\n\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n this.$markerBack.update(config);\\n this.$markerFront.update(config);\\n this.$cursorLayer.update(config);\\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\\n this.$moveTextAreaToCursor();\\n this._signal(\\\"afterRender\\\");\\n return;\\n }\\n\\n if (changes & this.CHANGE_TEXT) {\\n this.$textLayer.update(config);\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n }\\n else if (changes & this.CHANGE_LINES) {\\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\\n this.$gutterLayer.update(config);\\n }\\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\\n if (this.$showGutter)\\n this.$gutterLayer.update(config);\\n }\\n\\n if (changes & this.CHANGE_CURSOR) {\\n this.$cursorLayer.update(config);\\n this.$moveTextAreaToCursor();\\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\\n }\\n\\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\\n this.$markerFront.update(config);\\n }\\n\\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\\n this.$markerBack.update(config);\\n }\\n\\n this._signal(\\\"afterRender\\\");\\n };\\n\\n \\n this.$autosize = function() {\\n var height = this.session.getScreenLength() * this.lineHeight;\\n var maxHeight = this.$maxLines * this.lineHeight;\\n var desiredHeight = Math.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 var vScroll = height > maxHeight;\\n \\n if (desiredHeight != this.desiredHeight ||\\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\\n if (vScroll != this.$vScroll) {\\n this.$vScroll = vScroll;\\n this.scrollBarV.setVisible(vScroll);\\n }\\n \\n var w = this.container.clientWidth;\\n this.container.style.height = desiredHeight + \\\"px\\\";\\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\\n this.desiredHeight = desiredHeight;\\n \\n this._signal(\\\"autosize\\\");\\n }\\n };\\n \\n this.$computeLayerConfig = function() {\\n 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 offset = this.scrollTop % this.lineHeight;\\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 lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\\n var lastRow = firstRow + lineCount;\\n var firstRowScreen, firstRowHeight;\\n var lineHeight = this.lineHeight;\\n firstRow = session.screenToDocumentRow(firstRow, 0);\\n var foldLine = session.getFoldLine(firstRow);\\n if (foldLine) {\\n firstRow = foldLine.start.row;\\n }\\n\\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\\n\\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\\n firstRowHeight;\\n\\n offset = this.scrollTop - firstRowScreen * lineHeight;\\n\\n var changes = 0;\\n if (this.layerConfig.width != longestLine) \\n changes = this.CHANGE_H_SCROLL;\\n if (hScrollChanged || vScrollChanged) {\\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\\n this._signal(\\\"scrollbarVisibilityChanged\\\");\\n if (vScrollChanged)\\n longestLine = this.$getLongestLine();\\n }\\n \\n this.layerConfig = {\\n width : longestLine,\\n padding : this.$padding,\\n firstRow : firstRow,\\n firstRowScreen: firstRowScreen,\\n lastRow : lastRow,\\n lineHeight : lineHeight,\\n characterWidth : this.characterWidth,\\n minHeight : minHeight,\\n maxHeight : maxHeight,\\n offset : offset,\\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\\n height : this.$size.scrollerHeight\\n };\\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 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 - this.$size.scrollerHeight);\\n }\\n\\n var scrollLeft = this.scrollLeft;\\n\\n if (scrollLeft > left) {\\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\\n left = -this.scrollMargin.left;\\n this.session.setScrollLeft(left);\\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\\n this.session.setScrollLeft(0);\\n }\\n };\\n this.getScrollTop = function() {\\n return this.session.getScrollTop();\\n };\\n this.getScrollLeft = function() {\\n return this.session.getScrollLeft();\\n };\\n this.getScrollTopRow = function() {\\n return this.scrollTop / this.lineHeight;\\n };\\n this.getScrollBottomRow = function() {\\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\\n };\\n this.scrollToRow = function(row) {\\n this.session.setScrollTop(row * this.lineHeight);\\n };\\n\\n this.alignCursor = function(cursor, alignment) {\\n if (typeof cursor == \\\"number\\\")\\n cursor = {row: cursor, column: 0};\\n\\n var pos = this.$cursorLayer.getPixelPosition(cursor);\\n var h = this.$size.scrollerHeight - this.lineHeight;\\n var offset = pos.top - h * (alignment || 0);\\n\\n this.session.setScrollTop(offset);\\n return offset;\\n };\\n\\n this.STEPS = 8;\\n this.$calcSteps = function(fromValue, toValue){\\n var i = 0;\\n var l = this.STEPS;\\n var steps = [];\\n\\n var func = function(t, x_min, dx) {\\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\\n };\\n\\n for (i = 0; i < l; ++i)\\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\\n\\n return steps;\\n };\\n this.scrollToLine = function(line, center, animate, callback) {\\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\\n var offset = pos.top;\\n if (center)\\n offset -= this.$size.scrollerHeight / 2;\\n\\n var initialScroll = this.scrollTop;\\n this.session.setScrollTop(offset);\\n if (animate !== false)\\n this.animateScrolling(initialScroll, callback);\\n };\\n\\n this.animateScrolling = function(fromValue, callback) {\\n var toValue = this.scrollTop;\\n if (!this.$animatedScroll)\\n return;\\n var _self = this;\\n \\n if (fromValue == toValue)\\n return;\\n \\n if (this.$scrollAnimation) {\\n var oldSteps = this.$scrollAnimation.steps;\\n if (oldSteps.length) {\\n fromValue = oldSteps[0];\\n if (fromValue == toValue)\\n return;\\n }\\n }\\n \\n var steps = _self.$calcSteps(fromValue, toValue);\\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\\n\\n clearInterval(this.$timer);\\n\\n _self.session.setScrollTop(steps.shift());\\n _self.session.$scrollTop = toValue;\\n this.$timer = setInterval(function() {\\n if (steps.length) {\\n _self.session.setScrollTop(steps.shift());\\n _self.session.$scrollTop = toValue;\\n } else if (toValue != null) {\\n _self.session.$scrollTop = -1;\\n _self.session.setScrollTop(toValue);\\n toValue = null;\\n } else {\\n _self.$timer = clearInterval(_self.$timer);\\n _self.$scrollAnimation = null;\\n callback && callback();\\n }\\n }, 10);\\n };\\n this.scrollToY = function(scrollTop) {\\n if (this.scrollTop !== scrollTop) {\\n this.$loop.schedule(this.CHANGE_SCROLL);\\n this.scrollTop = scrollTop;\\n }\\n };\\n this.scrollToX = function(scrollLeft) {\\n if (this.scrollLeft !== scrollLeft)\\n this.scrollLeft = scrollLeft;\\n this.$loop.schedule(this.CHANGE_H_SCROLL);\\n };\\n this.scrollTo = function(x, y) {\\n this.session.setScrollTop(y);\\n this.session.setScrollLeft(y);\\n };\\n this.scrollBy = function(deltaX, deltaY) {\\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\\n };\\n this.isScrollableBy = function(deltaX, deltaY) {\\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\\n return true;\\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\\n return true;\\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\\n return true;\\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\\n - this.layerConfig.width < -1 + this.scrollMargin.right)\\n return true;\\n };\\n\\n this.pixelToScreenCoordinates = function(x, y) {\\n var canvasPos = this.scroller.getBoundingClientRect();\\n\\n var 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 = 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 = this.scroller.getBoundingClientRect();\\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\\n \\n var col = Math.round(offsetX / this.characterWidth);\\n\\n var row = (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(position) {\\n if (!this.$composition)\\n this.$composition = {\\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\\n cssText: this.textarea.style.cssText\\n };\\n\\n this.$keepTextAreaAtCursor = true;\\n dom.addCssClass(this.textarea, \\\"ace_composition\\\");\\n this.textarea.style.cssText = \\\"\\\";\\n this.$moveTextAreaToCursor();\\n };\\n this.setCompositionText = function(text) {\\n this.$moveTextAreaToCursor();\\n };\\n this.hideComposition = function() {\\n if (!this.$composition)\\n return;\\n\\n dom.removeCssClass(this.textarea, \\\"ace_composition\\\");\\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\\n this.textarea.style.cssText = this.$composition.cssText;\\n this.$composition = null;\\n };\\n this.setTheme = function(theme, cb) {\\n var _self = this;\\n this.$themeId = theme;\\n _self._dispatchEvent('themeChange',{theme:theme});\\n\\n if (!theme || typeof theme == \\\"string\\\") {\\n var moduleName = theme || this.$options.theme.initialValue;\\n config.loadModule([\\\"theme\\\", moduleName], afterLoad);\\n } else {\\n afterLoad(theme);\\n }\\n\\n function afterLoad(module) {\\n if (_self.$themeId != theme)\\n return cb && cb();\\n if (!module || !module.cssClass)\\n throw new Error(\\\"couldn't load module \\\" + theme + \\\" or it didn't call define\\\");\\n dom.importCssString(\\n module.cssText,\\n module.cssClass,\\n _self.container.ownerDocument\\n );\\n\\n if (_self.theme)\\n dom.removeCssClass(_self.container, _self.theme.cssClass);\\n\\n var padding = \\\"padding\\\" in module ? module.padding \\n : \\\"padding\\\" in (_self.theme || {}) ? 4 : _self.$padding;\\n if (_self.$padding && padding != _self.$padding)\\n _self.setPadding(padding);\\n _self.$theme = module.cssClass;\\n\\n _self.theme = module;\\n dom.addCssClass(_self.container, module.cssClass);\\n dom.setCssClass(_self.container, \\\"ace_dark\\\", module.isDark);\\n if (_self.$size) {\\n _self.$size.width = 0;\\n _self.$updateSizeAsync();\\n }\\n\\n _self._dispatchEvent('themeLoaded', {theme:module});\\n cb && cb();\\n }\\n };\\n this.getTheme = function() {\\n return this.$themeId;\\n };\\n this.setStyle = function(style, include) {\\n dom.setCssClass(this.container, style, include !== false);\\n };\\n this.unsetStyle = function(style) {\\n dom.removeCssClass(this.container, style);\\n };\\n \\n this.setCursorStyle = function(style) {\\n if (this.scroller.style.cursor != style)\\n this.scroller.style.cursor = style;\\n };\\n this.setMouseCursor = function(cursorStyle) {\\n this.scroller.style.cursor = cursorStyle;\\n };\\n this.destroy = function() {\\n this.$textLayer.destroy();\\n this.$cursorLayer.destroy();\\n };\\n\\n}).call(VirtualRenderer.prototype);\\n\\n\\nconfig.defineOptions(VirtualRenderer.prototype, \\\"renderer\\\", {\\n animatedScroll: {initialValue: false},\\n showInvisibles: {\\n set: function(value) {\\n if (this.$textLayer.setShowInvisibles(value))\\n this.$loop.schedule(this.CHANGE_TEXT);\\n },\\n initialValue: false\\n },\\n showPrintMargin: {\\n set: function() { this.$updatePrintMargin(); },\\n initialValue: true\\n },\\n printMarginColumn: {\\n set: function() { this.$updatePrintMargin(); },\\n initialValue: 80\\n },\\n printMargin: {\\n set: function(val) {\\n if (typeof val == \\\"number\\\")\\n this.$printMarginColumn = val;\\n this.$showPrintMargin = !!val;\\n this.$updatePrintMargin();\\n },\\n get: function() {\\n return this.$showPrintMargin && this.$printMarginColumn; \\n }\\n },\\n showGutter: {\\n set: function(show){\\n this.$gutter.style.display = show ? \\\"block\\\" : \\\"none\\\";\\n this.$loop.schedule(this.CHANGE_FULL);\\n this.onGutterResize();\\n },\\n initialValue: true\\n },\\n fadeFoldWidgets: {\\n set: function(show) {\\n dom.setCssClass(this.$gutter, \\\"ace_fade-fold-widgets\\\", show);\\n },\\n initialValue: false\\n },\\n showFoldWidgets: {\\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\\n initialValue: true\\n },\\n showLineNumbers: {\\n set: function(show) {\\n this.$gutterLayer.setShowLineNumbers(show);\\n this.$loop.schedule(this.CHANGE_GUTTER);\\n },\\n initialValue: true\\n },\\n displayIndentGuides: {\\n set: function(show) {\\n if (this.$textLayer.setDisplayIndentGuides(show))\\n this.$loop.schedule(this.CHANGE_TEXT);\\n },\\n initialValue: true\\n },\\n highlightGutterLine: {\\n set: function(shouldHighlight) {\\n if (!this.$gutterLineHighlight) {\\n this.$gutterLineHighlight = dom.createElement(\\\"div\\\");\\n this.$gutterLineHighlight.className = \\\"ace_gutter-active-line\\\";\\n this.$gutter.appendChild(this.$gutterLineHighlight);\\n return;\\n }\\n\\n this.$gutterLineHighlight.style.display = shouldHighlight ? \\\"\\\" : \\\"none\\\";\\n if (this.$cursorLayer.$pixelPos)\\n this.$updateGutterLineHighlight();\\n },\\n initialValue: false,\\n value: true\\n },\\n hScrollBarAlwaysVisible: {\\n set: function(val) {\\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\\n this.$loop.schedule(this.CHANGE_SCROLL);\\n },\\n initialValue: false\\n },\\n vScrollBarAlwaysVisible: {\\n set: function(val) {\\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\\n this.$loop.schedule(this.CHANGE_SCROLL);\\n },\\n initialValue: false\\n },\\n fontSize: {\\n set: function(size) {\\n if (typeof size == \\\"number\\\")\\n size = size + \\\"px\\\";\\n this.container.style.fontSize = size;\\n this.updateFontSize();\\n },\\n initialValue: 12\\n },\\n fontFamily: {\\n set: function(name) {\\n this.container.style.fontFamily = name;\\n this.updateFontSize();\\n }\\n },\\n maxLines: {\\n set: function(val) {\\n this.updateFull();\\n }\\n },\\n minLines: {\\n set: function(val) {\\n this.updateFull();\\n }\\n },\\n 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});\\n\\nexports.VirtualRenderer = VirtualRenderer;\\n});\\n\\ndefine(\\\"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 var blob = $workerBlob(workerUrl);\\n var URL = window.URL || window.webkitURL;\\n var blobURL = URL.createObjectURL(blob);\\n return new Worker(blobURL);\\n}\\n\\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\\n this.changeListener = this.changeListener.bind(this);\\n this.onMessage = this.onMessage.bind(this);\\n if (require.nameToUrl && !require.toUrl)\\n require.toUrl = require.nameToUrl;\\n \\n if (config.get(\\\"packaged\\\") || !require.toUrl) {\\n workerUrl = workerUrl || config.moduleUrl(mod, \\\"worker\\\");\\n } else {\\n var normalizePath = this.$normalizePath;\\n workerUrl = workerUrl || normalizePath(require.toUrl(\\\"ace/worker/worker.js\\\", null, \\\"_\\\"));\\n\\n var tlns = {};\\n topLevelNamespaces.forEach(function(ns) {\\n tlns[ns] = normalizePath(require.toUrl(ns, null, \\\"_\\\").replace(/(\\\\.js)?(\\\\?.*)?$/, \\\"\\\"));\\n });\\n }\\n\\n 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\\n this.callbackId = 1;\\n this.callbacks = {};\\n\\n this.$worker.onmessage = this.onMessage;\\n};\\n\\n(function(){\\n\\n oop.implement(this, EventEmitter);\\n\\n this.onMessage = function(e) {\\n var msg = e.data;\\n switch (msg.type) {\\n case \\\"event\\\":\\n this._signal(msg.name, {data: msg.data});\\n break;\\n case \\\"call\\\":\\n var callback = this.callbacks[msg.id];\\n if (callback) {\\n callback(msg.data);\\n delete this.callbacks[msg.id];\\n }\\n break;\\n case \\\"error\\\":\\n this.reportError(msg.data);\\n break;\\n case \\\"log\\\":\\n window.console && console.log && console.log.apply(console, msg.data);\\n break;\\n }\\n };\\n \\n this.reportError = function(err) {\\n window.console && console.error && console.error(err);\\n };\\n\\n this.$normalizePath = function(path) {\\n return net.qualifyURL(path);\\n };\\n\\n this.terminate = function() {\\n this._signal(\\\"terminate\\\", {});\\n this.deltaQueue = null;\\n this.$worker.terminate();\\n this.$worker = null;\\n if (this.$doc)\\n this.$doc.off(\\\"change\\\", this.changeListener);\\n this.$doc = null;\\n };\\n\\n this.send = function(cmd, args) {\\n this.$worker.postMessage({command: cmd, args: args});\\n };\\n\\n this.call = function(cmd, args, callback) {\\n if (callback) {\\n var id = this.callbackId++;\\n this.callbacks[id] = callback;\\n args.push(id);\\n }\\n this.send(cmd, args);\\n };\\n\\n this.emit = function(event, data) {\\n try {\\n this.$worker.postMessage({event: event, data: {data: data.data}});\\n }\\n catch(ex) {\\n console.error(ex.stack);\\n }\\n };\\n\\n this.attachToDocument = function(doc) {\\n if (this.$doc)\\n this.terminate();\\n\\n this.$doc = doc;\\n this.call(\\\"setValue\\\", [doc.getValue()]);\\n doc.on(\\\"change\\\", this.changeListener);\\n };\\n\\n this.changeListener = function(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 this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\\n this.changeListener = this.changeListener.bind(this);\\n this.callbackId = 1;\\n this.callbacks = {};\\n this.messageBuffer = [];\\n\\n var main = null;\\n var emitSync = false;\\n var sender = Object.create(EventEmitter);\\n var _self = this;\\n\\n this.$worker = {};\\n this.$worker.terminate = function() {};\\n this.$worker.postMessage = function(e) {\\n _self.messageBuffer.push(e);\\n if (main) {\\n if (emitSync)\\n setTimeout(processNext);\\n else\\n processNext();\\n }\\n };\\n this.setEmitSync = function(val) { emitSync = val; };\\n\\n var processNext = function() {\\n var msg = _self.messageBuffer.shift();\\n if (msg.command)\\n main[msg.command].apply(main, msg.args);\\n else if (msg.event)\\n sender._signal(msg.event, msg.data);\\n };\\n\\n sender.postMessage = function(msg) {\\n _self.onMessage({data: msg});\\n };\\n sender.callback = function(data, callbackId) {\\n this.postMessage({type: \\\"call\\\", id: callbackId, data: data});\\n };\\n sender.emit = function(name, data) {\\n this.postMessage({type: \\\"event\\\", name: name, data: data});\\n };\\n\\n config.loadModule([\\\"worker\\\", mod], function(Main) {\\n main = new Main[classname](sender);\\n while (_self.messageBuffer.length)\\n processNext();\\n });\\n};\\n\\nUIWorkerClient.prototype = WorkerClient.prototype;\\n\\nexports.UIWorkerClient = UIWorkerClient;\\nexports.WorkerClient = WorkerClient;\\nexports.createWorker = createWorker;\\n\\n\\n});\\n\\ndefine(\\\"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.removeEventListener(\\\"change\\\", this.$onUpdate);\\n this.session.selection.removeEventListener(\\\"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(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\\ndefine(\\\"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 \\n editor.$blockScrolling++;\\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.$blockScrolling--;\\n editor.inVirtualSelectionMode = false;\\n });\\n\\n } else if (selectionMode == \\\"block\\\") {\\n e.stop();\\n editor.inVirtualSelectionMode = true; \\n var initialRange;\\n var rectSel = [];\\n var blockSelect = function() {\\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\\n\\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\\n return;\\n screenCursor = newCursor;\\n \\n editor.$blockScrolling++;\\n editor.selection.moveToPosition(cursor);\\n editor.renderer.scrollCursorIntoView();\\n\\n editor.removeSelectionMarkers(rectSel);\\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\\n rectSel.forEach(editor.addSelectionMarker, editor);\\n editor.updateSelectionMarkers();\\n editor.$blockScrolling--;\\n };\\n editor.$blockScrolling++;\\n if (isMultiSelect && !accel) {\\n selection.toSingleRange();\\n } else if (!isMultiSelect && accel) {\\n initialRange = selection.toOrientedRange();\\n editor.addSelectionMarker(initialRange);\\n }\\n \\n if (shift)\\n screenAnchor = session.documentToScreenPosition(selection.lead); \\n else\\n selection.moveToPosition(pos);\\n editor.$blockScrolling--;\\n \\n screenCursor = {row: -1, column: -1};\\n\\n var onMouseSelectionEnd = function(e) {\\n clearInterval(timerId);\\n editor.removeSelectionMarkers(rectSel);\\n if (!rectSel.length)\\n rectSel = [selection.toOrientedRange()];\\n editor.$blockScrolling++;\\n if (initialRange) {\\n editor.removeSelectionMarker(initialRange);\\n selection.toSingleRange(initialRange);\\n }\\n for (var i = 0; i < rectSel.length; i++)\\n selection.addRange(rectSel[i]);\\n editor.inVirtualSelectionMode = false;\\n editor.$mouseHandler.$clickSelection = null;\\n editor.$blockScrolling--;\\n };\\n\\n var onSelectionInterval = blockSelect;\\n\\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\\n\\n return e.preventDefault();\\n }\\n}\\n\\n\\nexports.onMouseDown = onMouseDown;\\n\\n});\\n\\ndefine(\\\"ace/commands/multi_select_commands\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/keyboard/hash_handler\\\"], function(require, exports, module) {\\nexports.defaultCommands = [{\\n name: \\\"addCursorAbove\\\",\\n exec: function(editor) { editor.selectMoreLines(-1); },\\n bindKey: {win: \\\"Ctrl-Alt-Up\\\", mac: \\\"Ctrl-Alt-Up\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"addCursorBelow\\\",\\n exec: function(editor) { editor.selectMoreLines(1); },\\n bindKey: {win: \\\"Ctrl-Alt-Down\\\", mac: \\\"Ctrl-Alt-Down\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"addCursorAboveSkipCurrent\\\",\\n exec: function(editor) { editor.selectMoreLines(-1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Up\\\", mac: \\\"Ctrl-Alt-Shift-Up\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"addCursorBelowSkipCurrent\\\",\\n exec: function(editor) { editor.selectMoreLines(1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Down\\\", mac: \\\"Ctrl-Alt-Shift-Down\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectMoreBefore\\\",\\n exec: function(editor) { editor.selectMore(-1); },\\n bindKey: {win: \\\"Ctrl-Alt-Left\\\", mac: \\\"Ctrl-Alt-Left\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectMoreAfter\\\",\\n exec: function(editor) { editor.selectMore(1); },\\n bindKey: {win: \\\"Ctrl-Alt-Right\\\", mac: \\\"Ctrl-Alt-Right\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectNextBefore\\\",\\n exec: function(editor) { editor.selectMore(-1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Left\\\", mac: \\\"Ctrl-Alt-Shift-Left\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"selectNextAfter\\\",\\n exec: function(editor) { editor.selectMore(1, true); },\\n bindKey: {win: \\\"Ctrl-Alt-Shift-Right\\\", mac: \\\"Ctrl-Alt-Shift-Right\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}, {\\n name: \\\"splitIntoLines\\\",\\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\\n bindKey: {win: \\\"Ctrl-Alt-L\\\", mac: \\\"Ctrl-Alt-L\\\"},\\n readOnly: true\\n}, {\\n name: \\\"alignCursors\\\",\\n exec: function(editor) { editor.alignCursors(); },\\n bindKey: {win: \\\"Ctrl-Alt-A\\\", mac: \\\"Ctrl-Alt-A\\\"},\\n scrollIntoView: \\\"cursor\\\"\\n}, {\\n name: \\\"findAll\\\",\\n exec: function(editor) { editor.findAll(); },\\n bindKey: {win: \\\"Ctrl-Alt-K\\\", mac: \\\"Ctrl-Alt-G\\\"},\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true\\n}];\\nexports.multiSelectCommands = [{\\n name: \\\"singleSelection\\\",\\n bindKey: \\\"esc\\\",\\n exec: function(editor) { editor.exitMultiSelectMode(); },\\n scrollIntoView: \\\"cursor\\\",\\n readOnly: true,\\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\\n}];\\n\\nvar HashHandler = require(\\\"../keyboard/hash_handler\\\").HashHandler;\\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\\n\\n});\\n\\ndefine(\\\"ace/multi_select\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range_list\\\",\\\"ace/range\\\",\\\"ace/selection\\\",\\\"ace/mouse/multi_select_handler\\\",\\\"ace/lib/event\\\",\\\"ace/lib/lang\\\",\\\"ace/commands/multi_select_commands\\\",\\\"ace/search\\\",\\\"ace/edit_session\\\",\\\"ace/editor\\\",\\\"ace/config\\\"], function(require, exports, module) {\\n\\nvar RangeList = require(\\\"./range_list\\\").RangeList;\\nvar Range = require(\\\"./range\\\").Range;\\nvar Selection = require(\\\"./selection\\\").Selection;\\nvar onMouseDown = require(\\\"./mouse/multi_select_handler\\\").onMouseDown;\\nvar event = require(\\\"./lib/event\\\");\\nvar lang = require(\\\"./lib/lang\\\");\\nvar commands = require(\\\"./commands/multi_select_commands\\\");\\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\\nvar Search = require(\\\"./search\\\").Search;\\nvar search = new Search();\\n\\nfunction find(session, needle, dir) {\\n search.$options.wrap = true;\\n search.$options.needle = needle;\\n search.$options.backwards = dir == -1;\\n return search.find(session);\\n}\\nvar EditSession = require(\\\"./edit_session\\\").EditSession;\\n(function() {\\n this.getSelectionMarkers = function() {\\n return this.$selectionMarkers;\\n };\\n}).call(EditSession.prototype);\\n(function() {\\n this.ranges = null;\\n this.rangeList = null;\\n this.addRange = function(range, $blockChangeEvents) {\\n if (!range)\\n return;\\n\\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\\n var oldRange = this.toOrientedRange();\\n this.rangeList.add(oldRange);\\n this.rangeList.add(range);\\n if (this.rangeList.ranges.length != 2) {\\n this.rangeList.removeAll();\\n return $blockChangeEvents || this.fromOrientedRange(range);\\n }\\n this.rangeList.removeAll();\\n this.rangeList.add(oldRange);\\n this.$onAddRange(oldRange);\\n }\\n\\n if (!range.cursor)\\n range.cursor = range.end;\\n\\n var removed = this.rangeList.add(range);\\n\\n this.$onAddRange(range);\\n\\n if (removed.length)\\n this.$onRemoveRange(removed);\\n\\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\\n this._signal(\\\"multiSelect\\\");\\n this.inMultiSelectMode = true;\\n this.session.$undoSelect = false;\\n this.rangeList.attach(this.session);\\n }\\n\\n return $blockChangeEvents || this.fromOrientedRange(range);\\n };\\n\\n this.toSingleRange = function(range) {\\n range = range || this.ranges[0];\\n var removed = this.rangeList.removeAll();\\n if (removed.length)\\n this.$onRemoveRange(removed);\\n\\n range && this.fromOrientedRange(range);\\n };\\n this.substractPoint = function(pos) {\\n var removed = this.rangeList.substractPoint(pos);\\n if (removed) {\\n this.$onRemoveRange(removed);\\n return removed[0];\\n }\\n };\\n this.mergeOverlappingRanges = function() {\\n var removed = this.rangeList.merge();\\n if (removed.length)\\n this.$onRemoveRange(removed);\\n else if(this.ranges[0])\\n this.fromOrientedRange(this.ranges[0]);\\n };\\n\\n this.$onAddRange = function(range) {\\n this.rangeCount = this.rangeList.ranges.length;\\n this.ranges.unshift(range);\\n this._signal(\\\"addRange\\\", {range: range});\\n };\\n\\n this.$onRemoveRange = function(removed) {\\n this.rangeCount = this.rangeList.ranges.length;\\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\\n var lastRange = this.rangeList.ranges.pop();\\n removed.push(lastRange);\\n this.rangeCount = 0;\\n }\\n\\n for (var i = removed.length; i--; ) {\\n var index = this.ranges.indexOf(removed[i]);\\n this.ranges.splice(index, 1);\\n }\\n\\n this._signal(\\\"removeRange\\\", {ranges: removed});\\n\\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\\n this.inMultiSelectMode = false;\\n this._signal(\\\"singleSelect\\\");\\n this.session.$undoSelect = true;\\n this.rangeList.detach(this.session);\\n }\\n\\n lastRange = lastRange || this.ranges[0];\\n if (lastRange && !lastRange.isEqual(this.getRange()))\\n this.fromOrientedRange(lastRange);\\n };\\n this.$initRangeList = function() {\\n if (this.rangeList)\\n return;\\n\\n this.rangeList = new RangeList();\\n this.ranges = [];\\n this.rangeCount = 0;\\n };\\n this.getAllRanges = function() {\\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\\n };\\n\\n this.splitIntoLines = function () {\\n if (this.rangeCount > 1) {\\n var ranges = this.rangeList.ranges;\\n var lastRange = ranges[ranges.length - 1];\\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\\n\\n this.toSingleRange();\\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\\n } else {\\n var range = this.getRange();\\n var isBackwards = this.isBackwards();\\n var startRow = range.start.row;\\n var endRow = range.end.row;\\n if (startRow == endRow) {\\n if (isBackwards)\\n var start = range.end, end = range.start;\\n else\\n var start = range.start, end = range.end;\\n \\n this.addRange(Range.fromPoints(end, end));\\n this.addRange(Range.fromPoints(start, start));\\n return;\\n }\\n\\n var rectSel = [];\\n var r = this.getLineRange(startRow, true);\\n r.start.column = range.start.column;\\n rectSel.push(r);\\n\\n for (var i = startRow + 1; i < endRow; i++)\\n rectSel.push(this.getLineRange(i, true));\\n\\n r = this.getLineRange(endRow, true);\\n r.end.column = range.end.column;\\n rectSel.push(r);\\n\\n rectSel.forEach(this.addRange, this);\\n }\\n };\\n this.toggleBlockSelection = function () {\\n if (this.rangeCount > 1) {\\n var ranges = this.rangeList.ranges;\\n var lastRange = ranges[ranges.length - 1];\\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\\n\\n this.toSingleRange();\\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\\n } else {\\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\\n\\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\\n rectSel.forEach(this.addRange, this);\\n }\\n };\\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\\n var rectSel = [];\\n\\n var xBackwards = screenCursor.column < screenAnchor.column;\\n if (xBackwards) {\\n var startColumn = screenCursor.column;\\n var endColumn = screenAnchor.column;\\n 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 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 var docEnd = range.end;\\n }\\n range.cursor = xBackwards ? range.start : range.end;\\n rectSel.push(range);\\n }\\n\\n if (yBackwards)\\n rectSel.reverse();\\n\\n if (!includeEmptyLines) {\\n var end = rectSel.length - 1;\\n while (rectSel[end].isEmpty() && end > 0)\\n end--;\\n if (end > 0) {\\n var start = 0;\\n while (rectSel[start].isEmpty())\\n start++;\\n }\\n for (var i = end; i >= start; i--) {\\n if (rectSel[i].isEmpty())\\n rectSel.splice(i, 1);\\n }\\n }\\n\\n return rectSel;\\n };\\n}).call(Selection.prototype);\\nvar Editor = require(\\\"./editor\\\").Editor;\\n(function() {\\n this.updateSelectionMarkers = function() {\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n this.addSelectionMarker = function(orientedRange) {\\n if (!orientedRange.cursor)\\n orientedRange.cursor = orientedRange.end;\\n\\n var style = this.getSelectionStyle();\\n orientedRange.marker = this.session.addMarker(orientedRange, \\\"ace_selection\\\", style);\\n\\n this.session.$selectionMarkers.push(orientedRange);\\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\\n return orientedRange;\\n };\\n this.removeSelectionMarker = function(range) {\\n if (!range.marker)\\n return;\\n this.session.removeMarker(range.marker);\\n var index = this.session.$selectionMarkers.indexOf(range);\\n if (index != -1)\\n this.session.$selectionMarkers.splice(index, 1);\\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\\n };\\n\\n this.removeSelectionMarkers = function(ranges) {\\n var markerList = this.session.$selectionMarkers;\\n for (var i = ranges.length; i--; ) {\\n var range = ranges[i];\\n if (!range.marker)\\n continue;\\n this.session.removeMarker(range.marker);\\n var index = markerList.indexOf(range);\\n if (index != -1)\\n markerList.splice(index, 1);\\n }\\n this.session.selectionMarkerCount = markerList.length;\\n };\\n\\n this.$onAddRange = function(e) {\\n this.addSelectionMarker(e.range);\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n\\n this.$onRemoveRange = function(e) {\\n this.removeSelectionMarkers(e.ranges);\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n\\n this.$onMultiSelect = function(e) {\\n if (this.inMultiSelectMode)\\n return;\\n this.inMultiSelectMode = true;\\n\\n this.setStyle(\\\"ace_multiselect\\\");\\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\\n this.commands.setDefaultHandler(\\\"exec\\\", this.$onMultiSelectExec);\\n\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n };\\n\\n this.$onSingleSelect = function(e) {\\n if (this.session.multiSelect.inVirtualMode)\\n return;\\n this.inMultiSelectMode = false;\\n\\n this.unsetStyle(\\\"ace_multiselect\\\");\\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\\n\\n this.commands.removeDefaultHandler(\\\"exec\\\", this.$onMultiSelectExec);\\n this.renderer.updateCursor();\\n this.renderer.updateBackMarkers();\\n this._emit(\\\"changeSelection\\\");\\n };\\n\\n this.$onMultiSelectExec = function(e) {\\n var command = e.command;\\n var editor = e.editor;\\n if (!editor.multiSelect)\\n return;\\n if (!command.multiSelectAction) {\\n var result = command.exec(editor, e.args || {});\\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\\n editor.multiSelect.mergeOverlappingRanges();\\n } else if (command.multiSelectAction == \\\"forEach\\\") {\\n result = editor.forEachSelection(command, e.args);\\n } else if (command.multiSelectAction == \\\"forEachLine\\\") {\\n result = editor.forEachSelection(command, e.args, true);\\n } else if (command.multiSelectAction == \\\"single\\\") {\\n editor.exitMultiSelectMode();\\n result = command.exec(editor, e.args || {});\\n } else {\\n result = command.multiSelectAction(editor, e.args || {});\\n }\\n return result;\\n }; \\n this.forEachSelection = function(cmd, args, options) {\\n if (this.inVirtualSelectionMode)\\n return;\\n var keepOrder = options && options.keepOrder;\\n var $byLines = options == true || options && options.$byLines;\\n var session = this.session;\\n var selection = this.selection;\\n var rangeList = selection.rangeList;\\n var ranges = (keepOrder ? selection : rangeList).ranges;\\n var result;\\n \\n if (!ranges.length)\\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\\n \\n var reg = selection._eventRegistry;\\n selection._eventRegistry = {};\\n\\n var tmpSel = new Selection(session);\\n this.inVirtualSelectionMode = true;\\n for (var i = ranges.length; i--;) {\\n if ($byLines) {\\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\\n i--;\\n }\\n tmpSel.fromOrientedRange(ranges[i]);\\n tmpSel.index = i;\\n this.selection = session.selection = tmpSel;\\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\\n if (!result && cmdResult !== undefined)\\n result = cmdResult;\\n tmpSel.toOrientedRange(ranges[i]);\\n }\\n tmpSel.detach();\\n\\n this.selection = session.selection = selection;\\n this.inVirtualSelectionMode = false;\\n selection._eventRegistry = reg;\\n selection.mergeOverlappingRanges();\\n \\n var anim = this.renderer.$scrollAnimation;\\n this.onCursorChange();\\n this.onSelectionChange();\\n if (anim && anim.from == anim.to)\\n this.renderer.animateScrolling(anim.from);\\n \\n return result;\\n };\\n this.exitMultiSelectMode = function() {\\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\\n return;\\n this.multiSelect.toSingleRange();\\n };\\n\\n this.getSelectedText = function() {\\n var text = \\\"\\\";\\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\\n var ranges = this.multiSelect.rangeList.ranges;\\n var buf = [];\\n for (var i = 0; i < ranges.length; i++) {\\n buf.push(this.session.getTextRange(ranges[i]));\\n }\\n var nl = this.session.getDocument().getNewLineCharacter();\\n text = buf.join(nl);\\n if (text.length == (buf.length - 1) * nl.length)\\n text = \\\"\\\";\\n } else if (!this.selection.isEmpty()) {\\n text = this.session.getTextRange(this.getSelectionRange());\\n }\\n return text;\\n };\\n \\n this.$checkMultiselectChange = function(e, anchor) {\\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\\n var range = this.multiSelect.ranges[0];\\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\\n return;\\n var pos = anchor == this.multiSelect.anchor\\n ? range.cursor == range.start ? range.end : range.start\\n : range.cursor;\\n if (pos.row != anchor.row \\n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\\n }\\n };\\n this.findAll = function(needle, options, additive) {\\n options = options || {};\\n options.needle = needle || options.needle;\\n if (options.needle == undefined) {\\n var range = this.selection.isEmpty()\\n ? this.selection.getWordRange()\\n : this.selection.getRange();\\n options.needle = this.session.getTextRange(range);\\n } \\n this.$search.set(options);\\n \\n var ranges = this.$search.findAll(this.session);\\n if (!ranges.length)\\n return 0;\\n\\n this.$blockScrolling += 1;\\n var selection = this.multiSelect;\\n\\n if (!additive)\\n selection.toSingleRange(ranges[0]);\\n\\n for (var i = ranges.length; i--; )\\n selection.addRange(ranges[i], true);\\n if (range && selection.rangeList.rangeAtPoint(range.start))\\n selection.addRange(range, true);\\n \\n this.$blockScrolling -= 1;\\n\\n return ranges.length;\\n };\\n this.selectMoreLines = function(dir, skip) {\\n var range = this.selection.toOrientedRange();\\n var isBackwards = range.cursor == range.end;\\n\\n var screenLead = this.session.documentToScreenPosition(range.cursor);\\n if (this.selection.$desiredColumn)\\n screenLead.column = this.selection.$desiredColumn;\\n\\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\\n\\n if (!range.isEmpty()) {\\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\\n } else {\\n var anchor = lead;\\n }\\n\\n if (isBackwards) {\\n var newRange = Range.fromPoints(lead, anchor);\\n newRange.cursor = newRange.start;\\n } else {\\n var newRange = Range.fromPoints(anchor, lead);\\n newRange.cursor = newRange.end;\\n }\\n\\n newRange.desiredColumn = screenLead.column;\\n if (!this.selection.inMultiSelectMode) {\\n this.selection.addRange(range);\\n } else {\\n if (skip)\\n var toRemove = range.cursor;\\n }\\n\\n this.selection.addRange(newRange);\\n if (toRemove)\\n this.selection.substractPoint(toRemove);\\n };\\n this.transposeSelections = function(dir) {\\n var session = this.session;\\n var sel = session.multiSelect;\\n var all = sel.ranges;\\n\\n for (var i = all.length; i--; ) {\\n var range = all[i];\\n if (range.isEmpty()) {\\n var tmp = session.getWordRange(range.start.row, range.start.column);\\n range.start.row = tmp.start.row;\\n range.start.column = tmp.start.column;\\n range.end.row = tmp.end.row;\\n range.end.column = tmp.end.column;\\n }\\n }\\n sel.mergeOverlappingRanges();\\n\\n var words = [];\\n for (var i = all.length; i--; ) {\\n var range = all[i];\\n words.unshift(session.getTextRange(range));\\n }\\n\\n if (dir < 0)\\n words.unshift(words.pop());\\n else\\n words.push(words.shift());\\n\\n for (var i = all.length; i--; ) {\\n var range = all[i];\\n var tmp = range.clone();\\n session.replace(range, words[i]);\\n range.start.row = tmp.start.row;\\n range.start.column = tmp.start.column;\\n }\\n };\\n this.selectMore = function(dir, skip, stopAtFirst) {\\n var session = this.session;\\n var sel = session.multiSelect;\\n\\n var range = sel.toOrientedRange();\\n if (range.isEmpty()) {\\n range = session.getWordRange(range.start.row, range.start.column);\\n range.cursor = dir == -1 ? range.start : range.end;\\n this.multiSelect.addRange(range);\\n if (stopAtFirst)\\n return;\\n }\\n var needle = session.getTextRange(range);\\n\\n var newRange = find(session, needle, dir);\\n if (newRange) {\\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\\n this.$blockScrolling += 1;\\n this.session.unfold(newRange);\\n this.multiSelect.addRange(newRange);\\n this.$blockScrolling -= 1;\\n this.renderer.scrollCursorIntoView(null, 0.5);\\n }\\n if (skip)\\n this.multiSelect.substractPoint(range.cursor);\\n };\\n this.alignCursors = function() {\\n var session = this.session;\\n var sel = session.multiSelect;\\n var ranges = sel.ranges;\\n var row = -1;\\n var sameRowRanges = ranges.filter(function(r) {\\n if (r.cursor.row == row)\\n return true;\\n row = r.cursor.row;\\n });\\n \\n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\\n var range = this.selection.getRange();\\n var fr = range.start.row, lr = range.end.row;\\n var guessRange = fr == lr;\\n if (guessRange) {\\n var max = this.session.getLength();\\n var line;\\n do {\\n line = this.session.getLine(lr);\\n } while (/[=:]/.test(line) && ++lr < max);\\n do {\\n line = this.session.getLine(fr);\\n } while (/[=:]/.test(line) && --fr > 0);\\n \\n if (fr < 0) fr = 0;\\n if (lr >= max) lr = max - 1;\\n }\\n var lines = this.session.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 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 });\\n\\n event.addListener(el, \\\"keyup\\\", reset);\\n event.addListener(el, \\\"blur\\\", reset);\\n function reset(e) {\\n if (altCursor) {\\n editor.renderer.setMouseCursor(\\\"\\\");\\n altCursor = false;\\n }\\n }\\n}\\n\\nexports.MultiSelect = MultiSelect;\\n\\n\\nrequire(\\\"./config\\\").defineOptions(Editor.prototype, \\\"editor\\\", {\\n enableMultiselect: {\\n set: function(val) {\\n MultiSelect(this);\\n if (val) {\\n this.on(\\\"changeSession\\\", this.$multiselectOnSessionChange);\\n this.on(\\\"mousedown\\\", onMouseDown);\\n } else {\\n this.off(\\\"changeSession\\\", this.$multiselectOnSessionChange);\\n this.off(\\\"mousedown\\\", onMouseDown);\\n }\\n },\\n value: true\\n },\\n enableBlockSelect: {\\n set: function(val) {\\n this.$blockSelectEnabled = val;\\n },\\n value: true\\n }\\n});\\n\\n\\n\\n});\\n\\ndefine(\\\"ace/mode/folding/fold_mode\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar Range = require(\\\"../../range\\\").Range;\\n\\nvar FoldMode = exports.FoldMode = function() {};\\n\\n(function() {\\n\\n this.foldingStartMarker = null;\\n this.foldingStopMarker = null;\\n this.getFoldWidget = function(session, foldStyle, row) {\\n var line = session.getLine(row);\\n if (this.foldingStartMarker.test(line))\\n return \\\"start\\\";\\n if (foldStyle == \\\"markbeginend\\\"\\n && this.foldingStopMarker\\n && this.foldingStopMarker.test(line))\\n return \\\"end\\\";\\n return \\\"\\\";\\n };\\n\\n this.getFoldWidgetRange = function(session, foldStyle, row) {\\n return null;\\n };\\n\\n this.indentationBlock = function(session, row, column) {\\n var re = /\\\\S/;\\n var line = session.getLine(row);\\n var startLevel = line.search(re);\\n if (startLevel == -1)\\n return;\\n\\n var startColumn = column || line.length;\\n var maxRow = session.getLength();\\n var startRow = row;\\n var endRow = row;\\n\\n while (++row < maxRow) {\\n var level = session.getLine(row).search(re);\\n\\n if (level == -1)\\n continue;\\n\\n if (level <= startLevel)\\n break;\\n\\n endRow = row;\\n }\\n\\n if (endRow > startRow) {\\n var endColumn = session.getLine(endRow).length;\\n return new Range(startRow, startColumn, endRow, endColumn);\\n }\\n };\\n\\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\\n var start = {row: row, column: column + 1};\\n var end = session.$findClosingBracket(bracket, start, typeRe);\\n if (!end)\\n return;\\n\\n var fw = session.foldWidgets[end.row];\\n if (fw == null)\\n fw = session.getFoldWidget(end.row);\\n\\n if (fw == \\\"start\\\" && end.row > start.row) {\\n end.row --;\\n end.column = session.getLine(end.row).length;\\n }\\n return Range.fromPoints(start, end);\\n };\\n\\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\\n var end = {row: row, column: column};\\n var start = session.$findOpeningBracket(bracket, end);\\n\\n if (!start)\\n return;\\n\\n start.column++;\\n end.column--;\\n\\n return Range.fromPoints(start, end);\\n };\\n}).call(FoldMode.prototype);\\n\\n});\\n\\ndefine(\\\"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\\\";\\n\\nvar dom = require(\\\"../lib/dom\\\");\\ndom.importCssString(exports.cssText, exports.cssClass);\\n});\\n\\ndefine(\\\"ace/line_widgets\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/dom\\\",\\\"ace/range\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nvar oop = require(\\\"./lib/oop\\\");\\nvar dom = require(\\\"./lib/dom\\\");\\nvar Range = require(\\\"./range\\\").Range;\\n\\n\\nfunction LineWidgets(session) {\\n this.session = session;\\n this.session.widgetManager = this;\\n this.session.getRowLength = this.getRowLength;\\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\\n this.updateOnChange = this.updateOnChange.bind(this);\\n this.renderWidgets = this.renderWidgets.bind(this);\\n this.measureWidgets = this.measureWidgets.bind(this);\\n this.session._changedWidgets = [];\\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\\n \\n this.session.on(\\\"change\\\", this.updateOnChange);\\n this.session.on(\\\"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 removed.forEach(function(w) {\\n w && this.removeLineWidget(w);\\n }, this);\\n this.$updateRows();\\n } else {\\n var args = new Array(len);\\n args.unshift(startRow, 0);\\n lineWidgets.splice.apply(lineWidgets, args);\\n this.$updateRows();\\n }\\n };\\n \\n this.$updateRows = function() {\\n var lineWidgets = this.session.lineWidgets;\\n if (!lineWidgets) return;\\n var noWidgets = true;\\n lineWidgets.forEach(function(w, i) {\\n if (w) {\\n noWidgets = false;\\n w.row = i;\\n 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.addLineWidget = 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 \\n w.session = this.session;\\n \\n var renderer = this.editor.renderer;\\n if (w.html && !w.el) {\\n w.el = dom.createElement(\\\"div\\\");\\n w.el.innerHTML = w.html;\\n }\\n if (w.el) {\\n dom.addCssClass(w.el, \\\"ace_lineWidgetContainer\\\");\\n w.el.style.position = \\\"absolute\\\";\\n w.el.style.zIndex = 5;\\n renderer.container.appendChild(w.el);\\n w._inDocument = true;\\n }\\n \\n if (!w.coverGutter) {\\n w.el.style.zIndex = 3;\\n }\\n if (w.pixelHeight == null) {\\n w.pixelHeight = w.el.offsetHeight;\\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\\ndefine(\\\"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\\\", \\\"\\\");\\n\\n});\\n\\ndefine(\\\"ace/ace\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/fixoldbrowsers\\\",\\\"ace/lib/dom\\\",\\\"ace/lib/event\\\",\\\"ace/editor\\\",\\\"ace/edit_session\\\",\\\"ace/undomanager\\\",\\\"ace/virtual_renderer\\\",\\\"ace/worker/worker_client\\\",\\\"ace/keyboard/hash_handler\\\",\\\"ace/placeholder\\\",\\\"ace/multi_select\\\",\\\"ace/mode/folding/fold_mode\\\",\\\"ace/theme/textmate\\\",\\\"ace/ext/error_marker\\\",\\\"ace/config\\\"], function(require, exports, module) {\\n\\\"use strict\\\";\\n\\nrequire(\\\"./lib/fixoldbrowsers\\\");\\n\\nvar dom = require(\\\"./lib/dom\\\");\\nvar event = require(\\\"./lib/event\\\");\\n\\nvar Editor = require(\\\"./editor\\\").Editor;\\nvar EditSession = require(\\\"./edit_session\\\").EditSession;\\nvar UndoManager = require(\\\"./undomanager\\\").UndoManager;\\nvar Renderer = require(\\\"./virtual_renderer\\\").VirtualRenderer;\\nrequire(\\\"./worker/worker_client\\\");\\nrequire(\\\"./keyboard/hash_handler\\\");\\nrequire(\\\"./placeholder\\\");\\nrequire(\\\"./multi_select\\\");\\nrequire(\\\"./mode/folding/fold_mode\\\");\\nrequire(\\\"./theme/textmate\\\");\\nrequire(\\\"./ext/error_marker\\\");\\n\\nexports.config = require(\\\"./config\\\");\\nexports.require = require;\\n\\nif (typeof define === \\\"function\\\")\\n exports.define = define;\\nexports.edit = function(el) {\\n if (typeof el == \\\"string\\\") {\\n var _id = el;\\n el = document.getElementById(_id);\\n if (!el)\\n throw new Error(\\\"ace.edit can't find div #\\\" + _id);\\n }\\n\\n if (el && el.env && el.env.editor instanceof Editor)\\n return el.env.editor;\\n\\n var value = \\\"\\\";\\n if (el && /input|textarea/i.test(el.tagName)) {\\n var oldNode = el;\\n value = oldNode.value;\\n el = dom.createElement(\\\"pre\\\");\\n oldNode.parentNode.replaceChild(el, oldNode);\\n } else if (el) {\\n value = dom.getInnerText(el);\\n el.innerHTML = \\\"\\\";\\n }\\n\\n var doc = exports.createEditSession(value);\\n\\n var editor = new Editor(new Renderer(el));\\n editor.setSession(doc);\\n\\n var env = {\\n document: doc,\\n editor: editor,\\n onResize: editor.resize.bind(editor, null)\\n };\\n if (oldNode) env.textarea = oldNode;\\n event.addListener(window, \\\"resize\\\", env.onResize);\\n editor.on(\\\"destroy\\\", function() {\\n event.removeListener(window, \\\"resize\\\", env.onResize);\\n env.editor.container.env = null; // prevent memory leak on old ie\\n });\\n editor.container.env = editor.env = env;\\n return editor;\\n};\\nexports.createEditSession = function(text, mode) {\\n var doc = new EditSession(text, mode);\\n doc.setUndoManager(new UndoManager());\\n return doc;\\n};\\nexports.EditSession = EditSession;\\nexports.UndoManager = UndoManager;\\nexports.version = \\\"1.2.9\\\";\\n});\\n (function() {\\n window.require([\\\"ace/ace\\\"], function(a) {\\n if (a) {\\n a.config.init(true);\\n a.define = window.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 });\\n })();\\n \"\n\n//# sourceURL=webpack:///./node_modules/ace-builds/src/ace.js?./node_modules/raw-loader"); - -/***/ }), - /***/ "./node_modules/samsam/lib/samsam.js": /*!*******************************************!*\ !*** ./node_modules/samsam/lib/samsam.js ***! @@ -221,17 +199,6 @@ eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(( true /***/ }), -/***/ "./node_modules/script-loader/addScript.js": -/*!*************************************************!*\ - !*** ./node_modules/script-loader/addScript.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\nmodule.exports = function(src) {\n\tfunction log(error) {\n\t\t(typeof console !== \"undefined\")\n\t\t&& (console.error || console.log)(\"[Script Loader]\", error);\n\t}\n\n\t// Check for IE =< 8\n\tfunction isIE() {\n\t\treturn typeof attachEvent !== \"undefined\" && typeof addEventListener === \"undefined\";\n\t}\n\n\ttry {\n\t\tif (typeof execScript !== \"undefined\" && isIE()) {\n\t\t\texecScript(src);\n\t\t} else if (typeof eval !== \"undefined\") {\n\t\t\teval.call(null, src);\n\t\t} else {\n\t\t\tlog(\"EvalError: No eval function available\");\n\t\t}\n\t} catch (error) {\n\t\tlog(error);\n\t}\n}\n\n\n//# sourceURL=webpack:///./node_modules/script-loader/addScript.js?"); - -/***/ }), - /***/ "./node_modules/setimmediate/setImmediate.js": /*!***************************************************!*\ !*** ./node_modules/setimmediate/setImmediate.js ***! @@ -892,7 +859,7 @@ eval("\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/// ');\n iframeDoc.body.innerHTML = '
';\n iframeDoc.head.innerHTML = '';\n f.contentWindow.eval(\"(\" + window.__leonardo_UI_src + \")()\");\n return;\n }\n timeout = window.setTimeout(checkIframeLoaded, 100);\n}\nif (!window.Leonardo.storage.getNoUI()) {\n launcher = document.createElement('div');\n launcher.classList.add('leonardo-launcher');\n document.addEventListener('keyup', function (e) {\n if (e.ctrlKey && e.shiftKey && e.keyCode === 76) {\n return toggleLauncher();\n }\n if (f && e.ctrlKey && e.shiftKey && e.keyCode === 86) {\n return toggleView();\n }\n if (e.ctrlKey && e.shiftKey && e.keyCode === 67) {\n return Leonardo.toggleConsoleOutput(Leonardo.get);\n }\n if (f && e.keyCode === 27 && f.style.display === 'block') {\n return toggleView();\n }\n });\n launcher.addEventListener('click', function (e) {\n f && toggleView();\n e.stopPropagation();\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(launcher);\n }, false);\n //Init UI\n f = document.createElement('iframe');\n f.width = '100%';\n f.height = '100%';\n Object.assign(f.style, {\n position: 'fixed',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n border: 'none',\n display: 'none',\n overflow: 'visible',\n zIndex: 2147483646,\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(f);\n }, false);\n checkIframeLoaded();\n}\n\n\n//# sourceURL=webpack:///./src/leonardo/leonardo.ts?"); +eval("\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar configuration_srv_1 = __webpack_require__(/*! ./configuration.srv */ \"./src/leonardo/configuration.srv.ts\");\nvar storage_srv_1 = __webpack_require__(/*! ./storage.srv */ \"./src/leonardo/storage.srv.ts\");\nvar polyfills_1 = __webpack_require__(/*! ./polyfills */ \"./src/leonardo/polyfills.ts\");\nvar sinon_srv_1 = __webpack_require__(/*! ./sinon.srv */ \"./src/leonardo/sinon.srv.ts\");\n__webpack_require__(/*! ./style/app.less */ \"./src/leonardo/style/app.less\");\npolyfills_1.polifylls();\n//Init Configuration\nwindow.Leonardo = window.Leonardo || {};\nvar configuration = configuration_srv_1.leoConfiguration();\nvar storage = new storage_srv_1.Storage();\nObject.assign(window.Leonardo || {}, configuration, { storage: storage });\nLeonardo.loadSavedStates();\n// Init Sinon\nnew sinon_srv_1.Sinon();\nvar launcher;\nvar f;\nvar timeout;\nfunction toggleView() {\n if (f.style.display === 'none') {\n f.style.display = 'block';\n f.contentDocument.getElementById('app').dispatchEvent(new Event('ui-show'));\n document.body.classList.add('leonardo-launcher-active');\n }\n else {\n f.style.display = 'none';\n document.body.classList.remove('leonardo-launcher-active');\n }\n}\nfunction toggleLauncher() {\n if (launcher.style.display === 'none') {\n launcher.style.display = 'block';\n }\n else {\n launcher.style.display = 'none';\n }\n}\nfunction checkIframeLoaded() {\n var iframeDoc = f.contentDocument || f.contentWindow ? f.contentWindow.document : {};\n if (iframeDoc.readyState == 'complete' && document.readyState == 'complete') {\n clearTimeout(timeout);\n iframeDoc.write('');\n iframeDoc.body.innerHTML = '
';\n iframeDoc.head.innerHTML = '';\n f.contentWindow.eval(\"(\" + window.__leonardo_UI_src + \")()\");\n return;\n }\n timeout = window.setTimeout(checkIframeLoaded, 100);\n}\nif (!window.Leonardo.storage.getNoUI()) {\n launcher = document.createElement('div');\n launcher.classList.add('leonardo-launcher');\n document.addEventListener('keyup', function (e) {\n if (e.ctrlKey && e.shiftKey && e.keyCode === 76) {\n return toggleLauncher();\n }\n if (f && e.ctrlKey && e.shiftKey && e.keyCode === 86) {\n return toggleView();\n }\n if (e.ctrlKey && e.shiftKey && e.keyCode === 67) {\n return Leonardo.toggleConsoleOutput(Leonardo.get);\n }\n if (f && e.keyCode === 27 && f.style.display === 'block') {\n return toggleView();\n }\n });\n launcher.addEventListener('click', function (e) {\n f && toggleView();\n e.stopPropagation();\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(launcher);\n }, false);\n //Init UI\n f = document.createElement('iframe');\n f.width = '100%';\n f.height = '100%';\n Object.assign(f.style, {\n position: 'fixed',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n border: 'none',\n display: 'none',\n overflow: 'visible',\n zIndex: 2147483646,\n });\n document.addEventListener('DOMContentLoaded', function () {\n window.document.body.appendChild(f);\n }, false);\n checkIframeLoaded();\n}\n\n\n//# sourceURL=webpack:///./src/leonardo/leonardo.ts?"); /***/ }),