From d3c4c7580dabdeaeece1b7d54c678c44000386b8 Mon Sep 17 00:00:00 2001 From: Paul Biester Date: Wed, 18 Jan 2017 08:34:02 +0100 Subject: [PATCH] Major rewrite, now using es6, webpack and jsonedit > 5.0.0 --- .babelrc | 6 + .eslintrc.json | 181 ++++++++++++++++++++++++++++ bower.json | 25 ---- demo/index.html | 122 +++++++++---------- dist/angular-jsoneditor.js | 22 ++++ dist/angular-jsoneditor.js.map | 1 + ng-jsoneditor.js | 113 ----------------- ng-jsoneditor.min.js | 1 - package.js | 25 ---- package.json | 53 +++++--- src/angular-jsoneditor.directive.js | 63 ++++++++++ src/index.js | 3 + webpack.config.babel.js | 57 +++++++++ 13 files changed, 427 insertions(+), 245 deletions(-) create mode 100644 .babelrc create mode 100644 .eslintrc.json delete mode 100644 bower.json create mode 100644 dist/angular-jsoneditor.js create mode 100644 dist/angular-jsoneditor.js.map delete mode 100644 ng-jsoneditor.js delete mode 100644 ng-jsoneditor.min.js delete mode 100644 package.js create mode 100644 src/angular-jsoneditor.directive.js create mode 100644 src/index.js create mode 100644 webpack.config.babel.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..823d4af --- /dev/null +++ b/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": ["es2015"], + "plugins": [ + "add-module-exports" + ] +} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..f45ba3e --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,181 @@ +{ + "parser": "esprima", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "amd": true + }, + "globals": { + "angular": true + }, + "rules": { + "no-cond-assign": "error", + "no-console": ["warn", { "allow": ["error", "warn"] }], + "no-constant-condition": "error", + "no-control-regex": "error", + "no-debugger": "error", + "no-dupe-args": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty-character-class": "error", + "no-empty": "error", + "no-ex-assign": "error", + "no-extra-boolean-cast": "error", + "no-extra-parens": "warn", + "no-extra-semi": "error", + "no-func-assign": "error", + "no-inner-declarations": "error", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-obj-calls": "error", + "no-regex-spaces": "error", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-unexpected-multiline": "error", + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "use-isnan": "error", + "valid-typeof": "error", + // Best Practices + "accessor-pairs": "warn", + "array-callback-return": "error", + "block-scoped-var": "error", + "class-methods-use-this": "error", + "consistent-return": "error", + "curly": "error", + "default-case": "error", + "dot-notation": "error", + "eqeqeq": "error", + "guard-for-in": "error", + "no-alert": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-div-regex": "error", + "no-else-return": "error", + "no-empty-function": "error", + "no-empty-pattern": "error", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-fallthrough": "error", + "no-floating-decimal": "error", + "no-global-assign": "error", + "no-implicit-coercion": "error", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-invalid-this": "error", + "no-iterator": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-loop-func": "error", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-new-func": "error", + "no-new-wrappers": "error", + "no-new": "error", + "no-octal-escape": "error", + "no-octal": "error", + "no-param-reassign": "error", + "no-proto": "error", + "no-redeclare": "error", + "no-restricted-properties": "error", + "no-return-assign": "error", + "no-script-url": "error", + "no-self-assign": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-throw-literal": "error", + "no-unmodified-loop-condition": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-useless-call": "error", + "no-useless-concat": "error", + "no-useless-escape": "error", + "no-useless-return": "error", + "no-void": "error", + "no-warning-comments": "error", + "no-with": "error", + "radix": "error", + "vars-on-top": "error", + "wrap-iife": "error", + "yoda": ["error", "never"], + // Strict Mode + "strict": "error", + "no-undef": "error", + "no-undefined": "error", + "no-unused-vars": "error", + "no-use-before-define": "error", + // Style + "array-bracket-spacing": "error", + "block-spacing": "error", + "brace-style": "error", + "camelcase": "error", + "comma-dangle": "error", + "comma-spacing": "error", + "comma-style": "error", + "computed-property-spacing": "error", + "consistent-this": "error", + "eol-last": "error", + "func-call-spacing": "error", + "indent": ["error", 4, {"SwitchCase": 1}], + "key-spacing": "error", + "keyword-spacing": "error", + "line-comment-position": "error", + "linebreak-style": "error", + "lines-around-comment": ["error", { "beforeBlockComment": false }], + "lines-around-directive": "error", + "new-cap": "error", + "new-parens": "error", + "no-array-constructor": "error", + "no-bitwise": "error", + "no-continue": "error", + "no-lonely-if": "error", + "no-mixed-spaces-and-tabs": "error", + "no-multiple-empty-lines": "error", + "no-negated-condition": "error", + "no-new-object": "error", + "no-trailing-spaces": "error", + "no-unneeded-ternary": "error", + "no-whitespace-before-property": "error", + "one-var-declaration-per-line": "error", + "one-var": ["error", "never"], + "quotes": ["error", "single"], + "semi-spacing": "error", + "spaced-comment": "error", + "unicode-bom": "error", + // ES6 + "arrow-body-style": ["error", "as-needed"], + "arrow-parens": "error", + "arrow-spacing": "error", + "constructor-super": "error", + "generator-star-spacing": "error", + "no-class-assign": "error", + "no-const-assign": "error", + "no-dupe-class-members": "error", + "no-duplicate-imports": "error", + "no-new-symbol": "error", + "no-this-before-super": "error", + "no-useless-computed-key": "error", + "no-useless-constructor": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-arrow-callback": "error", + "prefer-const": "error", + "prefer-numeric-literals": "error", + "prefer-rest-params": "error", + "prefer-template": "warn", + "require-yield": "error", + "rest-spread-spacing": "error" + } +} diff --git a/bower.json b/bower.json deleted file mode 100644 index 0660ad3..0000000 --- a/bower.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "ng-jsoneditor", - "main": "ng-jsoneditor.min.js", - "homepage": "https://github.com/viasocket/ng-jsoneditor", - "authors": [ - "viasocket " - ], - "description": "Angular version of the insanely cool jsoneditor", - "keywords": [ - "jsoneditor" - ], - "bugs": "https://github.com/viasocket/ng-jsoneditor/issues", - "license": "The Artistic License 2.0", - "dependencies": { - "angular": "~1.x", - "jsoneditor": "https://github.com/viasocket/jsoneditor.git#5629bdb391befcd668b1f7f599f3fa3040231850" - }, - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/demo/index.html b/demo/index.html index 542aa7d..809029a 100644 --- a/demo/index.html +++ b/demo/index.html @@ -1,76 +1,72 @@ - - Demo for NG-JSONEDITOR - - - - - - + + Demo for angular-jsoneditor + + + -
-
-
-
+
+
+ +
-
+
- - - - -
{{pretty(obj.data)}}
+ + +
{{pretty(obj.data)}}
+
-
- -
+
- + $scope.changeData = function () { + $scope.obj.data = {foo: 'bar'}; + }; + $scope.changeOptions = function () { + $scope.obj.options.mode = $scope.obj.options.mode == 'tree' ? 'code' : 'tree'; + }; + $scope.pretty = function (obj) { + return obj; + }; + }); + \ No newline at end of file diff --git a/dist/angular-jsoneditor.js b/dist/angular-jsoneditor.js new file mode 100644 index 0000000..439bb50 --- /dev/null +++ b/dist/angular-jsoneditor.js @@ -0,0 +1,22 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("angular-jsoneditor",[],t):"object"==typeof exports?exports["angular-jsoneditor"]=t():e["angular-jsoneditor"]=t()}(this,function(){return function(e){function t(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var i={};return t.m=e,t.c=i,t.p="",t(0)}([function(e,t,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=i(66),o=n(r),s=angular.module("angular-jsoneditor",[]);t.default=s,s.constant("angularJsoneditorConfig",{}),s.directive("angularJsoneditor",o.default),e.exports=t.default},function(e,t){e.exports="\"data:image/svg+xml;charset=utf8,%3C?xml version='1.0' encoding='UTF-8' standalone='no'?%3E %3Csvg xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:cc='http://creativecommons.org/ns%23' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns%23' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' width='216' height='144' id='svg4136' version='1.1' inkscape:version='0.91 r' sodipodi:docname='jsoneditor-icons.svg'%3E %3Ctitle id='title6512'%3EJSON Editor Icons%3C/title%3E %3Cmetadata id='metadata4148'%3E %3Crdf:RDF%3E %3Ccc:Work rdf:about=''%3E %3Cdc:format%3Eimage/svg+xml%3C/dc:format%3E %3Cdc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage' /%3E %3Cdc:title%3EJSON Editor Icons%3C/dc:title%3E %3C/cc:Work%3E %3C/rdf:RDF%3E %3C/metadata%3E %3Cdefs id='defs4146' /%3E %3Csodipodi:namedview pagecolor='%23ffffff' bordercolor='%23666666' borderopacity='1' objecttolerance='10' gridtolerance='10' guidetolerance='10' inkscape:pageopacity='0' inkscape:pageshadow='2' inkscape:window-width='1920' inkscape:window-height='1028' id='namedview4144' showgrid='true' inkscape:zoom='4' inkscape:cx='97.217248' inkscape:cy='59.950227' inkscape:window-x='0' inkscape:window-y='0' inkscape:window-maximized='1' inkscape:current-layer='svg4136' showguides='false' borderlayer='false' inkscape:showpageshadow='true' showborder='true'%3E %3Cinkscape:grid type='xygrid' id='grid4640' empspacing='24' /%3E %3C/sodipodi:namedview%3E %3C!-- Created with SVG-edit - http://svg-edit.googlecode.com/ --%3E %3Cg id='g4394'%3E %3Crect x='4' y='4' width='16' height='16' id='svg_1' style='fill:%231aae1c;fill-opacity:1;stroke:none;stroke-width:0' /%3E %3Crect style='fill:%23ec3f29;fill-opacity:0.94117647;stroke:none;stroke-width:0' x='28.000006' y='3.999995' width='16' height='16' id='svg_1-7' /%3E %3Crect id='rect4165' height='16' width='16' y='3.999995' x='52.000004' style='fill:%234c4c4c;fill-opacity:1;stroke:none;stroke-width:0' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:1;stroke:none;stroke-width:0' x='172.00002' y='3.9999852' width='16' height='16' id='rect4175' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:1;stroke:none;stroke-width:0' x='196' y='3.999995' width='16' height='16' id='rect4175-3' /%3E %3Cg style='stroke:none' id='g4299'%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='svg_1-1' height='1.9999986' width='9.9999924' y='10.999998' x='7.0000048' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='svg_1-1-1' height='9.9999838' width='1.9999955' y='7.0000114' x='11.000005' /%3E %3C/g%3E %3Cg style='stroke:none' transform='matrix(0.70710678,-0.70710678,0.70710678,0.70710678,19.029435,12.000001)' id='g4299-3'%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='svg_1-1-0' height='1.9999986' width='9.9999924' y='10.999998' x='7.0000048' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='svg_1-1-1-9' height='9.9999838' width='1.9999955' y='7.0000114' x='11.000005' /%3E %3C/g%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='55.000004' y='7.0000048' width='6.9999909' height='6.9999905' id='svg_1-7-5' /%3E %3Crect id='rect4354' height='6.9999905' width='6.9999909' y='10.00001' x='58' style='fill:%23ffffff;fill-opacity:1;stroke:%234c4c4c;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%233c80df;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.94117647' x='58.000004' y='10.000005' width='6.9999909' height='6.9999905' id='svg_1-7-5-7' /%3E %3Cg id='g4378'%3E %3Crect id='svg_1-7-5-3' height='1.9999965' width='7.9999909' y='10.999999' x='198' style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='198' y='7.0000005' width='11.999995' height='1.9999946' id='rect4374' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='198' y='14.999996' width='3.9999928' height='1.9999995' id='rect4376' /%3E %3C/g%3E %3Cg id='g4383' transform='matrix(1,0,0,-1,-23.999995,23.999995)'%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='198' y='10.999999' width='7.9999909' height='1.9999965' id='rect4385' /%3E %3Crect id='rect4387' height='1.9999946' width='11.999995' y='7.0000005' x='198' style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3Crect id='rect4389' height='1.9999995' width='3.9999928' y='14.999996' x='198' style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3C/g%3E %3Crect y='3.9999199' x='76' height='16' width='16' id='rect3754-4' style='fill:%234c4c4c;fill-opacity:1;stroke:none' /%3E %3Cpath sodipodi:nodetypes='cccccccc' inkscape:connector-curvature='0' id='path4351' d='m 85.10447,6.0157384 -0.0156,1.4063 c 3.02669,-0.2402 0.33008,3.6507996 2.48438,4.5780996 -2.18694,1.0938 0.49191,4.9069 -2.45313,4.5781 l -0.0156,1.4219 c 5.70828,0.559 1.03264,-5.1005 4.70313,-5.2656 l 0,-1.4063 c -3.61303,-0.027 1.11893,-5.7069996 -4.70313,-5.3124996 z' style='fill:%23ffffff;fill-opacity:1;stroke:%23ffffff;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Cpath sodipodi:nodetypes='cccccccc' inkscape:connector-curvature='0' id='path4351-9' d='m 82.78125,5.9984384 0.0156,1.4063 c -3.02668,-0.2402 -0.33007,3.6506996 -2.48437,4.5780996 2.18694,1.0938 -0.49192,4.9069 2.45312,4.5781 l 0.0156,1.4219 c -5.70827,0.559 -1.03263,-5.1004 -4.70312,-5.2656 l 0,-1.4063 c 3.61303,-0.027 -1.11894,-5.7070996 4.70312,-5.3124996 z' style='fill:%23ffffff;fill-opacity:1;stroke:%23ffffff;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Crect y='3.9999199' x='100' height='16' width='16' id='rect3754-25' style='fill:%234c4c4c;fill-opacity:1;stroke:none' /%3E %3Cpath inkscape:connector-curvature='0' id='path2987' d='m 103.719,5.6719384 0,12.7187996 3.03125,0 0,-1.5313 -1.34375,0 0,-9.6249996 1.375,0 0,-1.5625 z' style='fill:%23ffffff;fill-opacity:1;stroke:none' /%3E %3Cpath inkscape:connector-curvature='0' id='path2987-1' d='m 112.2185,5.6721984 0,12.7187996 -3.03125,0 0,-1.5313 1.34375,0 0,-9.6249996 -1.375,0 0,-1.5625 z' style='fill:%23ffffff;fill-opacity:1;stroke:none' /%3E %3Crect y='3.9999199' x='124' height='16' width='16' id='rect3754-73' style='fill:%234c4c4c;fill-opacity:1;stroke:none' /%3E %3Cpath sodipodi:nodetypes='ccccccccc' inkscape:connector-curvature='0' id='path3780' d='m 126.2824,17.602938 1.78957,0 1.14143,-2.8641 5.65364,0 1.14856,2.8641 1.76565,0 -4.78687,-11.1610996 -1.91903,0 z' style='fill:%23ffffff;fill-opacity:1;stroke:none' /%3E %3Cpath inkscape:connector-curvature='0' id='path3782' d='m 129.72704,13.478838 4.60852,0.01 -2.30426,-5.5497996 z' style='fill:%234c4c4c;fill-opacity:1;stroke:none' /%3E %3Crect y='3.9999199' x='148' height='16' width='16' id='rect3754-35' style='fill:%234c4c4c;fill-opacity:1;stroke:none' /%3E %3Cpath sodipodi:nodetypes='ccccccc' inkscape:connector-curvature='0' id='path5008-2' d='m 156.47655,5.8917384 0,2.1797 0.46093,2.3983996 1.82813,0 0.39844,-2.3983996 0,-2.1797 z' style='fill:%23ffffff;fill-opacity:1;stroke:none' /%3E %3Cpath sodipodi:nodetypes='ccccccc' inkscape:connector-curvature='0' id='path5008-2-8' d='m 152.51561,5.8906384 0,2.1797 0.46094,2.3983996 1.82812,0 0.39844,-2.3983996 0,-2.1797 z' style='fill:%23ffffff;fill-opacity:1;stroke:none' /%3E %3C/g%3E %3Crect x='4' y='27.999994' width='16' height='16' id='rect4432' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0' x='28.000006' y='27.99999' width='16' height='16' id='rect4434' /%3E %3Crect id='rect4436' height='16' width='16' y='27.99999' x='52.000004' style='fill:%23d3d3d3;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3Crect style='fill:%23d3d3d3;stroke:%23000000;stroke-width:0' x='172.00002' y='27.999981' width='16' height='16' id='rect4446' /%3E %3Crect style='fill:%23d3d3d3;stroke:%23000000;stroke-width:0' x='196' y='27.99999' width='16' height='16' id='rect4448' /%3E %3Cg id='g4466' style='stroke:none' transform='translate(0,23.999995)'%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='rect4468' height='1.9999986' width='9.9999924' y='10.999998' x='7.0000048' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='rect4470' height='9.9999838' width='1.9999955' y='7.0000114' x='11.000005' /%3E %3C/g%3E %3Cg transform='matrix(0.70710678,-0.70710678,0.70710678,0.70710678,19.029435,35.999996)' id='g4472' style='stroke:none'%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='rect4474' height='1.9999986' width='9.9999924' y='10.999998' x='7.0000048' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:0' id='rect4476' height='9.9999838' width='1.9999955' y='7.0000114' x='11.000005' /%3E %3C/g%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='55.000004' y='31' width='6.9999909' height='6.9999905' id='rect4478' /%3E %3Crect id='rect4480' height='6.9999905' width='6.9999909' y='34.000008' x='58' style='fill:%23ffffff;fill-opacity:1;stroke:%23d3d3d3;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23d3d3d3;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none' x='58.000004' y='34.000004' width='6.9999909' height='6.9999905' id='rect4482' /%3E %3Cg id='g4484' transform='translate(0,23.999995)'%3E %3Crect id='rect4486' height='1.9999965' width='7.9999909' y='10.999999' x='198' style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='198' y='7.0000005' width='11.999995' height='1.9999946' id='rect4488' /%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='198' y='14.999996' width='3.9999928' height='1.9999995' id='rect4490' /%3E %3C/g%3E %3Cg id='g4492' transform='matrix(1,0,0,-1,-23.999995,47.99999)'%3E %3Crect style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' x='198' y='10.999999' width='7.9999909' height='1.9999965' id='rect4494' /%3E %3Crect id='rect4496' height='1.9999946' width='11.999995' y='7.0000005' x='198' style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3Crect id='rect4498' height='1.9999995' width='3.9999928' y='14.999996' x='198' style='fill:%23ffffff;fill-opacity:1;stroke:%23000000;stroke-width:0' /%3E %3C/g%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none' id='rect3754-8' width='16' height='16' x='76' y='27.99992' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:%23ffffff;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' d='m 85.10448,30.015537 -0.0156,1.4063 c 3.02668,-0.2402 0.33007,3.6508 2.48438,4.5781 -2.18695,1.0938 0.49191,4.90688 -2.45313,4.57808 l -0.0156,1.4219 c 5.70827,0.559 1.03263,-5.10048 4.70313,-5.26558 l 0,-1.4063 c -3.61304,-0.027 1.11893,-5.707 -4.70313,-5.3125 z' id='path4351-1' inkscape:connector-curvature='0' sodipodi:nodetypes='cccccccc' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:%23ffffff;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' d='m 82.78126,29.998237 0.0156,1.4063 c -3.02668,-0.2402 -0.33008,3.6507 -2.48438,4.5781 2.18694,1.0938 -0.49191,4.90688 2.45313,4.57808 l 0.0156,1.4219 c -5.70828,0.559 -1.03264,-5.10038 -4.70313,-5.26558 l 0,-1.4063 c 3.61303,-0.027 -1.11893,-5.7071 4.70313,-5.3125 z' id='path4351-9-5' inkscape:connector-curvature='0' sodipodi:nodetypes='cccccccc' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none' id='rect3754-65' width='16' height='16' x='100' y='27.99992' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:none' d='m 103.719,29.671937 0,12.71878 3.03125,0 0,-1.5313 -1.34375,0 0,-9.62498 1.375,0 0,-1.5625 z' id='path2987-8' inkscape:connector-curvature='0' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:none' d='m 112.2185,29.671937 0,12.71878 -3.03125,0 0,-1.5313 1.34375,0 0,-9.62498 -1.375,0 0,-1.5625 z' id='path2987-1-9' inkscape:connector-curvature='0' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none' id='rect3754-92' width='16' height='16' x='124' y='27.99992' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:none' d='m 126.2824,41.602917 1.78957,0 1.14143,-2.86408 5.65364,0 1.14856,2.86408 1.76565,0 -4.78687,-11.16108 -1.91902,0 z' id='path3780-9' inkscape:connector-curvature='0' sodipodi:nodetypes='ccccccccc' /%3E %3Cpath style='fill:%23d3d3d3;fill-opacity:1;stroke:none' d='m 129.72704,37.478837 4.60852,0.01 -2.30426,-5.5498 z' id='path3782-2' inkscape:connector-curvature='0' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none' id='rect3754-47' width='16' height='16' x='148' y='27.99992' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:none' d='m 156.47656,29.891737 0,2.1797 0.46093,2.3984 1.82813,0 0.39844,-2.3984 0,-2.1797 z' id='path5008-2-1' inkscape:connector-curvature='0' sodipodi:nodetypes='ccccccc' /%3E %3Cpath style='fill:%23ffffff;fill-opacity:1;stroke:none' d='m 152.51562,29.890637 0,2.1797 0.46094,2.3984 1.82812,0 0.39844,-2.3984 0,-2.1797 z' id='path5008-2-8-8' inkscape:connector-curvature='0' sodipodi:nodetypes='ccccccc' /%3E %3Crect id='svg_1-7-2' height='1.9999961' width='11.999996' y='64' x='54' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' /%3E %3Crect id='svg_1-7-2-2' height='2.9999905' width='2.9999907' y='52' x='80.000008' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' x='85.000008' y='52' width='2.9999907' height='2.9999905' id='rect4561' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' x='80.000008' y='58' width='2.9999907' height='2.9999905' id='rect4563' /%3E %3Crect id='rect4565' height='2.9999905' width='2.9999907' y='58' x='85.000008' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' /%3E %3Crect id='rect4567' height='2.9999905' width='2.9999907' y='64' x='80.000008' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' x='85.000008' y='64' width='2.9999907' height='2.9999905' id='rect4569' /%3E %3Ccircle style='opacity:1;fill:none;fill-opacity:1;stroke:%234c4c4c;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none' id='path4571' cx='110.06081' cy='57.939209' r='4.7438836' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' x='116.64566' y='-31.79752' width='4.229713' height='6.4053884' id='rect4563-2' transform='matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)' /%3E %3Cpath style='fill:%234c4c4c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' d='M 125,56 138.77027,56.095 132,64 Z' id='path4613' inkscape:connector-curvature='0' sodipodi:nodetypes='cccc' /%3E %3Cpath sodipodi:nodetypes='cccc' inkscape:connector-curvature='0' id='path4615' d='M 149,64 162.77027,63.905 156,56 Z' style='fill:%234c4c4c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Crect style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' x='54' y='53' width='11.999996' height='1.9999961' id='rect4638' /%3E %3Crect id='svg_1-7-2-24' height='1.9999957' width='12.99999' y='-56' x='53' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' transform='matrix(0,1,-1,0,0,0)' /%3E %3Crect transform='matrix(0,1,-1,0,0,0)' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' x='53' y='-66' width='12.99999' height='1.9999957' id='rect4657' /%3E %3Crect id='rect4659' height='0.99999291' width='11.999999' y='57' x='54' style='fill:%234c4c4c;fill-opacity:0.98431373;stroke:none;stroke-width:0' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' x='54' y='88.000122' width='11.999996' height='1.9999961' id='rect4661' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' x='80.000008' y='76.000122' width='2.9999907' height='2.9999905' id='rect4663' /%3E %3Crect id='rect4665' height='2.9999905' width='2.9999907' y='76.000122' x='85.000008' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' /%3E %3Crect id='rect4667' height='2.9999905' width='2.9999907' y='82.000122' x='80.000008' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' x='85.000008' y='82.000122' width='2.9999907' height='2.9999905' id='rect4669' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' x='80.000008' y='88.000122' width='2.9999907' height='2.9999905' id='rect4671' /%3E %3Crect id='rect4673' height='2.9999905' width='2.9999907' y='88.000122' x='85.000008' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' /%3E %3Ccircle r='4.7438836' cy='81.939331' cx='110.06081' id='circle4675' style='opacity:1;fill:none;fill-opacity:1;stroke:%23d3d3d3;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Crect transform='matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)' id='rect4677' height='6.4053884' width='4.229713' y='-14.826816' x='133.6163' style='fill:%23d3d3d3;fill-opacity:1;stroke:%23d3d3d3;stroke-width:0;stroke-opacity:1' /%3E %3Cpath sodipodi:nodetypes='cccc' inkscape:connector-curvature='0' id='path4679' d='m 125,80.000005 13.77027,0.09499 L 132,87.999992 Z' style='fill:%23d3d3d3;fill-opacity:1;fill-rule:evenodd;stroke:%23d3d3d3;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Cpath style='fill:%23d3d3d3;fill-opacity:1;fill-rule:evenodd;stroke:%23d3d3d3;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' d='M 149,88.0002 162.77027,87.9052 156,80.0002 Z' id='path4681' inkscape:connector-curvature='0' sodipodi:nodetypes='cccc' /%3E %3Crect id='rect4683' height='1.9999961' width='11.999996' y='77.000122' x='54' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' /%3E %3Crect transform='matrix(0,1,-1,0,0,0)' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' x='77.000122' y='-56' width='12.99999' height='1.9999957' id='rect4685' /%3E %3Crect id='rect4687' height='1.9999957' width='12.99999' y='-66' x='77.000122' style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' transform='matrix(0,1,-1,0,0,0)' /%3E %3Crect style='fill:%23d3d3d3;fill-opacity:1;stroke:none;stroke-width:0;stroke-opacity:1' x='54' y='81.000122' width='11.999999' height='0.99999291' id='rect4689' /%3E %3Crect id='rect4761-1' height='1.9999945' width='15.99999' y='101' x='76.000008' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Crect id='rect4761-0' height='1.9999945' width='15.99999' y='105' x='76.000008' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Crect id='rect4761-7' height='1.9999945' width='9' y='109' x='76.000008' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Crect id='rect4761-1-1' height='1.9999945' width='12' y='125' x='76.000008' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Crect id='rect4761-1-1-4' height='1.9999945' width='10' y='137' x='76.000008' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Crect id='rect4761-1-1-4-4' height='1.9999945' width='10' y='129' x='82' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Crect id='rect4761-1-1-4-4-3' height='1.9999945' width='9' y='133' x='82' style='fill:%23ffffff;fill-opacity:0.80000007;stroke:none;stroke-width:0' /%3E %3Cpath inkscape:connector-curvature='0' style='color:%23000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000000;solid-opacity:1;fill:%23ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.66157866;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' d='m 36.398438,100.0254 c -0.423362,-0.013 -0.846847,0.01 -1.265626,0.062 -1.656562,0.2196 -3.244567,0.9739 -4.507812,2.2266 L 29,100.5991 l -2.324219,7.7129 7.826172,-1.9062 -1.804687,-1.9063 c 1.597702,-1.5308 4.048706,-1.8453 5.984375,-0.7207 1.971162,1.1452 2.881954,3.3975 2.308593,5.5508 -0.573361,2.1533 -2.533865,3.6953 -4.830078,3.6953 l 0,3.0742 c 3.550756,0 6.710442,-2.4113 7.650391,-5.9414 0.939949,-3.5301 -0.618463,-7.2736 -3.710938,-9.0703 -1.159678,-0.6738 -2.431087,-1.0231 -3.701171,-1.0625 z' id='path4138' /%3E %3Cpath inkscape:connector-curvature='0' style='color:%23000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.8;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000000;solid-opacity:1;fill:%23ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.66157866;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' d='m 59.722656,99.9629 c -1.270084,0.039 -2.541493,0.3887 -3.701172,1.0625 -3.092475,1.7967 -4.650886,5.5402 -3.710937,9.0703 0.939949,3.5301 4.09768,5.9414 7.648437,5.9414 l 0,-3.0742 c -2.296214,0 -4.256717,-1.542 -4.830078,-3.6953 -0.573361,-2.1533 0.337432,-4.4056 2.308594,-5.5508 1.935731,-1.1246 4.38863,-0.8102 5.986326,0.7207 l -1.806638,1.9063 7.828128,1.9062 -2.32422,-7.7129 -1.62696,1.7168 c -1.26338,-1.2531 -2.848917,-2.0088 -4.505855,-2.2285 -0.418778,-0.055 -0.842263,-0.076 -1.265625,-0.062 z' id='path4138-1' /%3E %3Cpath inkscape:connector-curvature='0' style='opacity:0.8;fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:1.966;stroke-miterlimit:4;stroke-dasharray:none' d='m 10.5,100 0,2 -2.4999996,0 L 12,107 l 4,-5 -2.5,0 0,-2 -3,0 z' id='path3055-0-77' /%3E %3Cpath style='opacity:0.8;fill:none;stroke:%23ffffff;stroke-width:1.966;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' d='m 4.9850574,108.015 14.0298856,-0.03' id='path5244-5-0-5' inkscape:connector-curvature='0' sodipodi:nodetypes='cc' /%3E %3Cpath style='opacity:0.8;fill:none;stroke:%23ffffff;stroke-width:1.966;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' d='m 4.9849874,132.015 14.0298866,-0.03' id='path5244-5-0-5-8' inkscape:connector-curvature='0' sodipodi:nodetypes='cc' /%3E %3Cpath inkscape:connector-curvature='0' style='color:%23000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.4;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000000;solid-opacity:1;fill:%234d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.66157866;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' d='m 36.398438,123.9629 c -0.423362,-0.013 -0.846847,0.01 -1.265626,0.062 -1.656562,0.2196 -3.244567,0.9739 -4.507812,2.2266 L 29,124.5366 l -2.324219,7.7129 7.826172,-1.9062 -1.804687,-1.9063 c 1.597702,-1.5308 4.048706,-1.8453 5.984375,-0.7207 1.971162,1.1453 2.881954,3.3975 2.308593,5.5508 -0.573361,2.1533 -2.533864,3.6953 -4.830078,3.6953 l 0,3.0742 c 3.550757,0 6.710442,-2.4093 7.650391,-5.9394 0.939949,-3.5301 -0.618463,-7.2756 -3.710938,-9.0723 -1.159678,-0.6737 -2.431087,-1.0231 -3.701171,-1.0625 z' id='path4138-12' /%3E %3Cpath inkscape:connector-curvature='0' style='color:%23000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.4;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000000;solid-opacity:1;fill:%234d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.66157866;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate' d='m 59.722656,123.9629 c -1.270084,0.039 -2.541493,0.3888 -3.701172,1.0625 -3.092475,1.7967 -4.650886,5.5422 -3.710937,9.0723 0.939949,3.5301 4.09768,5.9394 7.648437,5.9394 l 0,-3.0742 c -2.296214,0 -4.256717,-1.542 -4.830078,-3.6953 -0.573361,-2.1533 0.337432,-4.4055 2.308594,-5.5508 1.935731,-1.1246 4.38863,-0.8102 5.986326,0.7207 l -1.806638,1.9063 7.828128,1.9062 -2.32422,-7.7129 -1.62696,1.7168 c -1.26338,-1.2531 -2.848917,-2.0088 -4.505855,-2.2285 -0.418778,-0.055 -0.842263,-0.076 -1.265625,-0.062 z' id='path4138-1-3' /%3E %3Cpath id='path6191' d='m 10.5,116 0,-2 -2.4999996,0 L 12,109 l 4,5 -2.5,0 0,2 -3,0 z' style='opacity:0.8;fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:1.966;stroke-miterlimit:4;stroke-dasharray:none' inkscape:connector-curvature='0' /%3E %3Cpath inkscape:connector-curvature='0' style='opacity:0.8;fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:1.966;stroke-miterlimit:4;stroke-dasharray:none' d='m 10.5,129 0,-2 -2.4999996,0 L 12,122 l 4,5 -2.5,0 0,2 -3,0 z' id='path6193' /%3E %3Cpath id='path6195' d='m 10.5,135 0,2 -2.4999996,0 L 12,142 l 4,-5 -2.5,0 0,-2 -3,0 z' style='opacity:0.8;fill:%23ffffff;fill-opacity:1;stroke:none;stroke-width:1.966;stroke-miterlimit:4;stroke-dasharray:none' inkscape:connector-curvature='0' /%3E %3Cpath sodipodi:type='star' style='fill:%234d4d4d;fill-opacity:0.90196078;stroke:%23d3d3d3;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none' id='path4500' sodipodi:sides='3' sodipodi:cx='11.55581' sodipodi:cy='60.073242' sodipodi:r1='5.1116104' sodipodi:r2='2.5558052' sodipodi:arg1='0' sodipodi:arg2='1.0471976' inkscape:flatsided='false' inkscape:rounded='0' inkscape:randomized='0' d='m 16.66742,60.073242 -3.833708,2.213392 -3.8337072,2.213393 0,-4.426785 0,-4.426784 3.8337082,2.213392 z' inkscape:transform-center-x='-1.2779026' /%3E %3Cpath inkscape:transform-center-x='1.277902' d='m -31.500004,60.073242 -3.833708,2.213392 -3.833707,2.213393 0,-4.426785 0,-4.426784 3.833707,2.213392 z' inkscape:randomized='0' inkscape:rounded='0' inkscape:flatsided='false' sodipodi:arg2='1.0471976' sodipodi:arg1='0' sodipodi:r2='2.5558052' sodipodi:r1='5.1116104' sodipodi:cy='60.073242' sodipodi:cx='-36.611614' sodipodi:sides='3' id='path4502' style='fill:%234d4d4d;fill-opacity:0.90196078;stroke:%23d3d3d3;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none' sodipodi:type='star' transform='scale(-1,1)' /%3E %3Cpath d='m 16.66742,60.073212 -3.833708,2.213392 -3.8337072,2.213392 0,-4.426784 0,-4.426785 3.8337082,2.213392 z' inkscape:randomized='0' inkscape:rounded='0' inkscape:flatsided='false' sodipodi:arg2='1.0471976' sodipodi:arg1='0' sodipodi:r2='2.5558052' sodipodi:r1='5.1116104' sodipodi:cy='60.073212' sodipodi:cx='11.55581' sodipodi:sides='3' id='path4504' style='fill:%234d4d4d;fill-opacity:0.90196078;stroke:%23d3d3d3;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none' sodipodi:type='star' transform='matrix(0,1,-1,0,72.0074,71.7877)' inkscape:transform-center-y='1.2779029' /%3E %3Cpath inkscape:transform-center-y='-1.2779026' transform='matrix(0,-1,-1,0,96,96)' sodipodi:type='star' style='fill:%234d4d4d;fill-opacity:0.90196078;stroke:%23d3d3d3;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none' id='path4506' sodipodi:sides='3' sodipodi:cx='11.55581' sodipodi:cy='60.073212' sodipodi:r1='5.1116104' sodipodi:r2='2.5558052' sodipodi:arg1='0' sodipodi:arg2='1.0471976' inkscape:flatsided='false' inkscape:rounded='0' inkscape:randomized='0' d='m 16.66742,60.073212 -3.833708,2.213392 -3.8337072,2.213392 0,-4.426784 0,-4.426785 3.8337082,2.213392 z' /%3E %3Cpath sodipodi:nodetypes='cccc' inkscape:connector-curvature='0' id='path4615-5' d='m 171.82574,65.174193 16.34854,0 -8.17427,-13.348454 z' style='fill:%23fbb917;fill-opacity:1;fill-rule:evenodd;stroke:%23fbb917;stroke-width:1.65161395;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1' /%3E %3Cpath style='opacity:1;fill:%23ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1' d='m 179,55 0,6 2,0 0,-6' id='path4300' inkscape:connector-curvature='0' sodipodi:nodetypes='cccc' /%3E %3Cpath style='opacity:1;fill:%23ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1' d='m 179,62 0,2 2,0 0,-2' id='path4300-6' inkscape:connector-curvature='0' sodipodi:nodetypes='cccc' /%3E %3C/svg%3E\""; +},function(e,t,i){"use strict";function n(e,t){t=t||{};for(var i in e)t[i]=e[i];return t}function r(e,t,i){var n=i?" !== ":" === ",r=i?" || ":" && ",o=i?"!":"",s=i?"":"!";switch(e){case"null":return t+n+"null";case"array":return o+"Array.isArray("+t+")";case"object":return"("+o+t+r+"typeof "+t+n+'"object"'+r+s+"Array.isArray("+t+"))";case"integer":return"(typeof "+t+n+'"number"'+r+s+"("+t+" % 1))";default:return"typeof "+t+n+'"'+e+'"'}}function o(e,t){switch(e.length){case 1:return r(e[0],t,!0);default:var i="",n=a(e);n.array&&n.object&&(i=n.null?"(":"(!"+t+" || ",i+="typeof "+t+' !== "object")',delete n.null,delete n.array,delete n.object),n.number&&delete n.integer;for(var o in n)i+=(i?" && ":"")+r(o,t,!0);return i}}function s(e){if(Array.isArray(e)){for(var t=[],i=0;i=55296&&t<=56319&&r=t)throw new Error("Cannot access property/index "+r+" levels up, current level is "+t);return i[t-r]}if(r>t)throw new Error("Cannot access data "+r+" levels up, current level is "+t);var s="data"+(t-r||"");if(!o)return s;for(var a=s,c=o.split("/"),h=0;h=0;){var t=c[e];if(" "!==t&&"\n"!==t&&"\r"!==t&&"\t"!==t)return t;e--}return""}function o(){for(h+=2;h=0;a--){var l=s[a];l.specified===!0&&o.removeAttribute(l.name)}t.stripFormatting(o)}},t.setEndOfContentEditable=function(e){var t,i;document.createRange&&(t=document.createRange(),t.selectNodeContents(e),t.collapse(!1),i=window.getSelection(),i.removeAllRanges(),i.addRange(t))},t.selectContentEditable=function(e){if(e&&"DIV"==e.nodeName){var t,i;window.getSelection&&document.createRange&&(i=document.createRange(),i.selectNodeContents(e),t=window.getSelection(),t.removeAllRanges(),t.addRange(i))}},t.getSelection=function(){if(window.getSelection){var e=window.getSelection();if(e.getRangeAt&&e.rangeCount)return e.getRangeAt(0)}return null},t.setSelection=function(e){if(e&&window.getSelection){var t=window.getSelection();t.removeAllRanges(),t.addRange(e)}},t.getSelectionOffset=function(){var e=t.getSelection();return e&&"startOffset"in e&&"endOffset"in e&&e.startContainer&&e.startContainer==e.endContainer?{startOffset:e.startOffset,endOffset:e.endOffset,container:e.startContainer.parentNode}:null},t.setSelectionOffset=function(e){if(document.createRange&&window.getSelection){var i=window.getSelection();if(i){var n=document.createRange();e.container.firstChild||e.container.appendChild(document.createTextNode("")),n.setStart(e.container.firstChild,e.startOffset),n.setEnd(e.container.firstChild,e.endOffset),t.setSelection(n)}}},t.getInnerText=function(e,i){var n=void 0==i;if(n&&(i={text:"",flush:function(){var e=this.text;return this.text="",e},set:function(e){this.text=e}}),e.nodeValue)return i.flush()+e.nodeValue;if(e.hasChildNodes()){for(var r=e.childNodes,o="",s=0,a=r.length;s5){var i=["("+(t.length-5)+" more...)"];t=t.slice(0,5),t.push(i)}e.message="should be equal to one of: "+t.join(", ")}}return"additionalProperties"===e.keyword&&(e.message="should NOT have additional property: "+e.params.additionalProperty),e},t.insideRect=function(e,t,i){var n=void 0!==i?i:0;return t.left-n>=e.left&&t.right+n<=e.right&&t.top-n>=e.top&&t.bottom+n<=e.bottom},t.debounce=function(e,t,i){var n;return function(){var r=this,o=arguments,s=function(){n=null,i||e.apply(r,o)},a=i&&!n;clearTimeout(n),n=setTimeout(s,t),a&&e.apply(r,o)}},t.textDiff=function(e,t){for(var i=t.length,n=0,r=e.length,o=t.length;t.charAt(n)===e.charAt(n)&&nn&&r>0;)o--,r--;return{start:n,end:o}}},function(e,t,i){"use strict";function n(e,t){function i(e,t,r){r.forEach(function(r){if("separator"==r.type){var o=document.createElement("div");o.className="jsoneditor-separator",a=document.createElement("li"),a.appendChild(o),e.appendChild(a)}else{var s={},a=document.createElement("li");e.appendChild(a);var l=document.createElement("button");if(l.type="button",l.className=r.className,s.button=l,r.title&&(l.title=r.title),r.click&&(l.onclick=function(e){e.preventDefault(),n.hide(),r.click()}),a.appendChild(l),r.submenu){var c=document.createElement("div");c.className="jsoneditor-icon",l.appendChild(c),l.appendChild(document.createTextNode(r.text));var h;if(r.click){l.className+=" jsoneditor-default";var d=document.createElement("button");d.type="button",s.buttonExpand=d,d.className="jsoneditor-expand",d.innerHTML='
',a.appendChild(d),r.submenuTitle&&(d.title=r.submenuTitle),h=d}else{var u=document.createElement("div");u.className="jsoneditor-expand",l.appendChild(u),h=l}h.onclick=function(e){e.preventDefault(),n._onExpandItem(s),h.focus()};var f=[];s.subItems=f;var p=document.createElement("ul");s.ul=p,p.className="jsoneditor-menu",p.style.height="0",a.appendChild(p),i(p,f,r.submenu)}else l.innerHTML='
'+r.text;t.push(s)}})}this.dom={};var n=this,r=this.dom;this.anchor=void 0,this.items=e,this.eventListeners={},this.selection=void 0,this.onClose=t?t.close:void 0;var o=document.createElement("div");o.className="jsoneditor-contextmenu-root",r.root=o;var s=document.createElement("div");s.className="jsoneditor-contextmenu",r.menu=s,o.appendChild(s);var a=document.createElement("ul");a.className="jsoneditor-menu",s.appendChild(a),r.list=a,r.items=[];var l=document.createElement("button");l.type="button",r.focusButton=l;var c=document.createElement("li");c.style.overflow="hidden",c.style.height="0",c.appendChild(l),a.appendChild(c),i(a,this.dom.items,e),this.maxHeight=0,e.forEach(function(t){var i=24*(e.length+(t.submenu?t.submenu.length:0));n.maxHeight=Math.max(n.maxHeight,i)})}var r=i(3);n.prototype._getVisibleButtons=function(){var e=[],t=this;return this.dom.items.forEach(function(i){e.push(i.button),i.buttonExpand&&e.push(i.buttonExpand),i.subItems&&i==t.expandedItem&&i.subItems.forEach(function(t){e.push(t.button),t.buttonExpand&&e.push(t.buttonExpand)})}),e},n.visibleMenu=void 0,n.prototype.show=function(e,t){this.hide();var i=!0;if(t){var o=e.getBoundingClientRect(),s=t.getBoundingClientRect();o.bottom+this.maxHeights.top&&(i=!1)}if(i){var a=e.offsetHeight;this.dom.menu.style.left="0px",this.dom.menu.style.top=a+"px",this.dom.menu.style.bottom=""}else this.dom.menu.style.left="0px",this.dom.menu.style.top="",this.dom.menu.style.bottom="0px";var l=e.parentNode;l.insertBefore(this.dom.root,l.firstChild);var c=this,h=this.dom.list;this.eventListeners.mousedown=r.addEventListener(window,"mousedown",function(e){var t=e.target;t==h||c._isChildOf(t,h)||(c.hide(),e.stopPropagation(),e.preventDefault())}),this.eventListeners.keydown=r.addEventListener(window,"keydown",function(e){c._onKeyDown(e)}),this.selection=r.getSelection(),this.anchor=e,setTimeout(function(){c.dom.focusButton.focus()},0),n.visibleMenu&&n.visibleMenu.hide(),n.visibleMenu=this},n.prototype.hide=function(){this.dom.root.parentNode&&(this.dom.root.parentNode.removeChild(this.dom.root),this.onClose&&this.onClose());for(var e in this.eventListeners)if(this.eventListeners.hasOwnProperty(e)){var t=this.eventListeners[e];t&&r.removeEventListener(window,e,t),delete this.eventListeners[e]}n.visibleMenu==this&&(n.visibleMenu=void 0)},n.prototype._onExpandItem=function(e){var t=this,i=e==this.expandedItem,n=this.expandedItem;if(n&&(n.ul.style.height="0",n.ul.style.padding="",setTimeout(function(){t.expandedItem!=n&&(n.ul.style.display="",r.removeClassName(n.ul.parentNode,"jsoneditor-selected"))},300),this.expandedItem=void 0),!i){var o=e.ul;o.style.display="block",o.clientHeight,setTimeout(function(){t.expandedItem==e&&(o.style.height=24*o.childNodes.length+"px",o.style.padding="5px 10px")},0),r.addClassName(o.parentNode,"jsoneditor-selected"),this.expandedItem=e}},n.prototype._onKeyDown=function(e){var t,i,n,o,s=e.target,a=e.which,l=!1;27==a?(this.selection&&r.setSelection(this.selection),this.anchor&&this.anchor.focus(),this.hide(),l=!0):9==a?e.shiftKey?(t=this._getVisibleButtons(),i=t.indexOf(s),0==i&&(t[t.length-1].focus(),l=!0)):(t=this._getVisibleButtons(),i=t.indexOf(s),i==t.length-1&&(t[0].focus(),l=!0)):37==a?("jsoneditor-expand"==s.className&&(t=this._getVisibleButtons(),i=t.indexOf(s),n=t[i-1],n&&n.focus()),l=!0):38==a?(t=this._getVisibleButtons(),i=t.indexOf(s),n=t[i-1],n&&"jsoneditor-expand"==n.className&&(n=t[i-2]),n||(n=t[t.length-1]),n&&n.focus(),l=!0):39==a?(t=this._getVisibleButtons(),i=t.indexOf(s),o=t[i+1],o&&"jsoneditor-expand"==o.className&&o.focus(),l=!0):40==a&&(t=this._getVisibleButtons(),i=t.indexOf(s),o=t[i+1],o&&"jsoneditor-expand"==o.className&&(o=t[i+2]),o||(o=t[0]),o&&(o.focus(),l=!0),l=!0),l&&(e.stopPropagation(),e.preventDefault())},n.prototype._isChildOf=function(e,t){for(var i=e.parentNode;i;){if(i==t)return!0;i=i.parentNode}return!1},e.exports=n},function(e,t,i){var n="undefined"!=typeof JSON?JSON:i(63);e.exports=function(e,t){t||(t={}),"function"==typeof t&&(t={cmp:t});var i=t.space||"";"number"==typeof i&&(i=Array(i+1).join(" "));var s="boolean"==typeof t.cycles&&t.cycles,a=t.replacer||function(e,t){return t},l=t.cmp&&function(e){return function(t){return function(i,n){var r={key:i,value:t[i]},o={key:n,value:t[n]};return e(r,o)}}}(t.cmp),c=[];return function e(t,h,d,u){var f=i?"\n"+new Array(u+1).join(i):"",p=i?": ":":";if(d&&d.toJSON&&"function"==typeof d.toJSON&&(d=d.toJSON()),d=a.call(t,h,d),void 0!==d){if("object"!=typeof d||null===d)return n.stringify(d);if(r(d)){for(var m=[],g=0;g",y=f?">":"<";if(g){var w=e.util.getData(m.$data,o,e.dataPathArr),b="exclusive"+r,A="op"+r,C="' + "+A+" + '";n+=" var schemaExcl"+r+" = "+w+"; ",w="schemaExcl"+r,n+=" var exclusive"+r+"; if (typeof "+w+" != 'boolean' && typeof "+w+" != 'undefined') { ";var i=p,E=E||[];E.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(n+=" , message: '"+p+" should be boolean' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var x=n;n=E.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else if( ",d&&(n+=" ("+u+" !== undefined && typeof "+u+" != 'number') || "),n+=" ((exclusive"+r+" = "+w+" === true) ? "+h+" "+y+"= "+u+" : "+h+" "+y+" "+u+")) { var op"+r+" = exclusive"+r+" ? '"+v+"' : '"+v+"=';"}else{var b=m===!0,C=v;b||(C+="=");var A="'"+C+"'";n+=" if ( ",d&&(n+=" ("+u+" !== undefined && typeof "+u+" != 'number') || "),n+=" "+h+" "+y,b&&(n+="="),n+=" "+u+") {"}var i=t,E=E||[];E.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { comparison: '+A+", limit: "+u+", exclusive: "+b+" } ",e.opts.messages!==!1&&(n+=" , message: 'should be "+C+" ",n+=d?"' + "+u:""+s+"'"),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+a:""+s,n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var x=n;return n=E.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",c&&(n+=" else { "),n}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d=e.opts.v5&&s.$data,u=d?e.util.getData(s.$data,o,e.dataPathArr):s;d&&(n+=" var schema"+r+" = "+u+"; ",u="schema"+r);var f="maxItems"==t?">":"<";n+="if ( ",d&&(n+=" ("+u+" !== undefined && typeof "+u+" != 'number') || "),n+=" "+h+".length "+f+" "+u+") { ";var i=t,p=p||[];p.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+u+" } ",e.opts.messages!==!1&&(n+=" , message: 'should NOT have ",n+="maxItems"==t?"more":"less",n+=" than ",n+=d?"' + "+u+" + '":""+s,n+=" items' "),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+a:""+s,n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var m=n;return n=p.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+="} ",c&&(n+=" else { "),n}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d=e.opts.v5&&s.$data,u=d?e.util.getData(s.$data,o,e.dataPathArr):s;d&&(n+=" var schema"+r+" = "+u+"; ",u="schema"+r);var f="maxLength"==t?">":"<";n+="if ( ",d&&(n+=" ("+u+" !== undefined && typeof "+u+" != 'number') || "),n+=e.opts.unicode===!1?" "+h+".length ":" ucs2length("+h+") ",n+=" "+f+" "+u+") { ";var i=t,p=p||[];p.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+u+" } ",e.opts.messages!==!1&&(n+=" , message: 'should NOT be ",n+="maxLength"==t?"longer":"shorter",n+=" than ",n+=d?"' + "+u+" + '":""+s,n+=" characters' "),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+a:""+s,n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var m=n;return n=p.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+="} ",c&&(n+=" else { "),n}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d=e.opts.v5&&s.$data,u=d?e.util.getData(s.$data,o,e.dataPathArr):s;d&&(n+=" var schema"+r+" = "+u+"; ",u="schema"+r);var f="maxProperties"==t?">":"<";n+="if ( ",d&&(n+=" ("+u+" !== undefined && typeof "+u+" != 'number') || "),n+=" Object.keys("+h+").length "+f+" "+u+") { ";var i=t,p=p||[];p.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+u+" } ",e.opts.messages!==!1&&(n+=" , message: 'should NOT have ",n+="maxProperties"==t?"more":"less",n+=" than ",n+=d?"' + "+u+" + '":""+s,n+=" properties' "),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+a:""+s,n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var m=n;return n=p.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+="} ",c&&(n+=" else { "),n}},function(e,t){"use strict";e.exports=function(e,t){function i(e){for(var t=0;t2&&(t=d.call(arguments,1)),void i(t))})})}function o(e){return Promise.all(e.map(n,this))}function s(e){function t(e,t){i[t]=void 0,o.push(e.then(function(e){i[t]=e}))}for(var i=new e.constructor,r=Object.keys(e),o=[],s=0;s=1&&i<=12&&n>=1&&n<=m[i]}function o(e,t){var i=e.match(g);if(!i)return!1;var n=i[1],r=i[2],o=i[3],s=i[5];return n<=23&&r<=59&&o<=59&&(!t||s)}function s(e){var t=e.split(C);return r(t[0])&&o(t[1],!0)}function a(e){return e.length<=255&&v.test(e)}function l(e){return E.test(e)&&y.test(e)}function c(e){try{return new RegExp(e),!0}catch(e){return!1}}function h(e,t){if(e&&t)return e>t?1:et?1:e",E="result"+r,x=e.opts.v5&&s.$data,F=x?e.util.getData(s.$data,o,e.dataPathArr):s;if(x&&(n+=" var schema"+r+" = "+F+"; ",F="schema"+r),A){var k=e.util.getData(b.$data,o,e.dataPathArr),S="exclusive"+r,$="op"+r,D="' + "+$+" + '";n+=" var schemaExcl"+r+" = "+k+"; ",k="schemaExcl"+r,n+=" if (typeof "+k+" != 'boolean' && "+k+" !== undefined) { "+d+" = false; ";var i=w,B=B||[];B.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_exclusiveFormatLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(n+=" , message: '"+w+" should be boolean' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var _=n;n=B.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+_+"]); ":" validate.errors = ["+_+"]; return false; ":" var err = "+_+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",c&&(p+="}",n+=" else { "),x&&(n+=" if ("+F+" === undefined) "+d+" = true; else if (typeof "+F+" != 'string') "+d+" = false; else { ",p+="}"),f&&(n+=" if (!"+v+") "+d+" = true; else { ",p+="}"),n+=" var "+E+" = "+v+"("+h+", ",n+=x?""+F:""+e.util.toQuotedString(s),n+=" ); if ("+E+" === undefined) "+d+" = false; var exclusive"+r+" = "+k+" === true; if ("+d+" === undefined) { "+d+" = exclusive"+r+" ? "+E+" "+C+" 0 : "+E+" "+C+"= 0; } if (!"+d+") var op"+r+" = exclusive"+r+" ? '"+C+"' : '"+C+"=';"}else{var S=b===!0,D=C;S||(D+="=");var $="'"+D+"'";x&&(n+=" if ("+F+" === undefined) "+d+" = true; else if (typeof "+F+" != 'string') "+d+" = false; else { ",p+="}"),f&&(n+=" if (!"+v+") "+d+" = true; else { ",p+="}"),n+=" var "+E+" = "+v+"("+h+", ",n+=x?""+F:""+e.util.toQuotedString(s),n+=" ); if ("+E+" === undefined) "+d+" = false; if ("+d+" === undefined) "+d+" = "+E+" "+C,S||(n+="="),n+=" 0;"}n+=""+p+"if (!"+d+") { ";var i=t,B=B||[];B.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"_formatLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: ',n+=x?""+F:""+e.util.toQuotedString(s),n+=" } ",e.opts.messages!==!1&&(n+=" , message: 'should be "+D+' "',n+=x?"' + "+F+" + '":""+e.util.escapeQuotes(s),n+="\"' "),e.opts.verbose&&(n+=" , schema: ",n+=x?"validate.schema"+a:""+e.util.toQuotedString(s),n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var _=n;return n=B.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+_+"]); ":" validate.errors = ["+_+"]; return false; ":" var err = "+_+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+="}"}},function(e,t){"use strict";e.exports=function(e,t){var i=" ",n=e.schema[t],r=e.schemaPath+"."+t,o=e.errSchemaPath+"/"+t,s=!e.opts.allErrors,a=e.util.copy(e),l="";a.level++;var c=n;if(c)for(var h,d=-1,u=c.length-1;d "+E+") { ";var F=h+"["+E+"]";f.schema=C,f.schemaPath=a+"["+E+"]",f.errSchemaPath=l+"/"+E,f.errorPath=e.util.getPathExpr(e.errorPath,E,e.opts.jsonPointers,!0),f.dataPathArr[m]=E;var k=e.validate(f);n+=e.util.varOccurences(k,g)<2?" "+e.util.varReplace(k,g,F)+" ":" var "+g+" = "+F+"; "+k+" ",n+=" } ",c&&(n+=" if (valid"+f.level+") { ",p+="}")}if("object"==typeof v&&e.util.schemaHasRules(v,e.RULES.all)){f.schema=v,f.schemaPath=e.schemaPath+".additionalItems",f.errSchemaPath=e.errSchemaPath+"/additionalItems",n+=" valid"+f.level+" = true; if ("+h+".length > "+s.length+") { for (var i"+r+" = "+s.length+"; i"+r+" < "+h+".length; i"+r+"++) { ",f.errorPath=e.util.getPathExpr(e.errorPath,"i"+r,e.opts.jsonPointers,!0);var F=h+"[i"+r+"]";f.dataPathArr[m]="i"+r;var k=e.validate(f);n+=e.util.varOccurences(k,g)<2?" "+e.util.varReplace(k,g,F)+" ":" var "+g+" = "+F+"; "+k+" ",c&&(n+=" if (!valid"+f.level+") break; "),n+=" } } ",c&&(n+=" if (valid"+f.level+") { ",p+="}")}}else if(e.util.schemaHasRules(s,e.RULES.all)){f.schema=s,f.schemaPath=a,f.errSchemaPath=l,n+=" for (var i"+r+" = 0; i"+r+" < "+h+".length; i"+r+"++) { ",f.errorPath=e.util.getPathExpr(e.errorPath,"i"+r,e.opts.jsonPointers,!0);var F=h+"[i"+r+"]";f.dataPathArr[m]="i"+r;var k=e.validate(f);n+=e.util.varOccurences(k,g)<2?" "+e.util.varReplace(k,g,F)+" ":" var "+g+" = "+F+"; "+k+" ",c&&(n+=" if (!valid"+f.level+") break; "),n+=" } ",c&&(n+=" if (valid"+f.level+") { ",p+="}")}return c&&(n+=" "+p+" if ("+u+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d=e.opts.v5&&s.$data,u=d?e.util.getData(s.$data,o,e.dataPathArr):s;d&&(n+=" var schema"+r+" = "+u+"; ",u="schema"+r),n+="var division"+r+";if (",d&&(n+=" "+u+" !== undefined && ( typeof "+u+" != 'number' || "),n+=" (division"+r+" = "+h+" / "+u+", ",n+=e.opts.multipleOfPrecision?" Math.abs(Math.round(division"+r+") - division"+r+") > 1e-"+e.opts.multipleOfPrecision+" ":" division"+r+" !== parseInt(division"+r+") ",n+=" ) ",d&&(n+=" ) "),n+=" ) { ";var f=f||[];f.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"multipleOf")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { multipleOf: '+u+" } ",e.opts.messages!==!1&&(n+=" , message: 'should be multiple of ",n+=d?"' + "+u:""+s+"'"),e.opts.verbose&&(n+=" , schema: ",n+=d?"validate.schema"+a:""+s,n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var p=n;return n=f.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+="} ",c&&(n+=" else { "),n}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d="errs__"+r,u=e.util.copy(e);if(u.level++,e.util.schemaHasRules(s,e.RULES.all)){u.schema=s,u.schemaPath=a,u.errSchemaPath=l,n+=" var "+d+" = errors; ";var f=e.compositeRule;e.compositeRule=u.compositeRule=!0,u.createErrors=!1;var p;u.opts.allErrors&&(p=u.opts.allErrors,u.opts.allErrors=!1),n+=" "+e.validate(u)+" ",u.createErrors=!0,p&&(u.opts.allErrors=p),e.compositeRule=u.compositeRule=f,n+=" if (valid"+u.level+") { ";var m=m||[];m.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"not")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(n+=" , message: 'should NOT be valid' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var g=n;n=m.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+g+"]); ":" validate.errors = ["+g+"]; return false; ":" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; } ",e.opts.allErrors&&(n+=" } ")}else n+=" var err = ",e.createErrors!==!1?(n+=" { keyword: '"+(i||"not")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(n+=" , message: 'should NOT be valid' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ",n+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c&&(n+=" if (false) { ");return n}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d="valid"+r,u="errs__"+r,f=e.util.copy(e),p="";f.level++,n+="var "+u+" = errors;var prevValid"+r+" = false;var "+d+" = false; ";var m=e.compositeRule;e.compositeRule=f.compositeRule=!0;var g=s;if(g)for(var v,y=-1,w=g.length-1;y5)n+=" || validate.schema"+a+"[key"+r+"] ";else{var B=v;if(B)for(var _,L=-1,R=B.length-1;L= "+de+"; ",l=e.errSchemaPath+"/patternGroups/minimum",n+=" if (!"+d+") { ";var V=V||[];V.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"patternGroups")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { reason: '"+pe+"', limit: "+fe+", pattern: '"+e.util.escapeQuotes(N)+"' } ",e.opts.messages!==!1&&(n+=" , message: 'should NOT have "+me+" than "+fe+' properties matching pattern "'+e.util.escapeQuotes(N)+"\"' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var U=n;n=V.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+U+"]); ":" validate.errors = ["+U+"]; return false; ":" var err = "+U+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",void 0!==ue&&(n+=" else ")}if(void 0!==ue){var fe=ue,pe="maximum",me="more";n+=" "+d+" = pgPropCount"+r+" <= "+ue+"; ",l=e.errSchemaPath+"/patternGroups/maximum",n+=" if (!"+d+") { ";var V=V||[];V.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"patternGroups")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { reason: '"+pe+"', limit: "+fe+", pattern: '"+e.util.escapeQuotes(N)+"' } ",e.opts.messages!==!1&&(n+=" , message: 'should NOT have "+me+" than "+fe+' properties matching pattern "'+e.util.escapeQuotes(N)+"\"' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var U=n;n=V.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+U+"]); ":" validate.errors = ["+U+"]; return false; ":" var err = "+U+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } "}l=z,c&&(n+=" if ("+d+") { ",p+="}")}}}}return c&&(n+=" "+p+" if ("+u+" == errors) {"),n=e.util.cleanUpCode(n)}},function(e,t){"use strict";e.exports=function(e,t){var i,n,r,o=" ",s=e.level,a=e.dataLevel,l=e.schema[t],c=e.errSchemaPath+"/"+t,h=!e.opts.allErrors,d="data"+(a||""),u="valid"+s;if("#"==l||"#/"==l)e.isRoot?(n=e.async,r="validate"):(n=e.root.schema.$async===!0,r="root.refVal[0]");else{var f=e.resolveRef(e.baseId,l,e.isRoot);if(void 0===f){var p="can't resolve reference "+l+" from id "+e.baseId;if("fail"==e.opts.missingRefs){console.log(p);var m=m||[];m.push(o),o="",e.createErrors!==!1?(o+=" { keyword: '"+(i||"$ref")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+c+"\" , params: { ref: '"+e.util.escapeQuotes(l)+"' } ",e.opts.messages!==!1&&(o+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(l)+"' "),e.opts.verbose&&(o+=" , schema: "+e.util.toQuotedString(l)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+d+" "),o+=" } "):o+=" {} ";var g=o;o=m.pop(),o+=!e.compositeRule&&h?e.async?" throw new ValidationError(["+g+"]); ":" validate.errors = ["+g+"]; return false; ":" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",h&&(o+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs){var v=new Error(p);throw v.missingRef=e.resolve.url(e.baseId,l),v.missingSchema=e.resolve.normalizeId(e.resolve.fullPath(v.missingRef)),v}console.log(p),h&&(o+=" if (true) { ")}}else if(f.inline){var y=e.util.copy(e);y.level++,y.schema=f.schema,y.schemaPath="",y.errSchemaPath=l;var w=e.validate(y).replace(/validate\.schema/g,f.code);o+=" "+w+" ",h&&(o+=" if (valid"+y.level+") { ")}else n=f.async,r=f.code}if(r){var m=m||[];m.push(o),o="",o+=e.opts.passContext?" "+r+".call(this, ":" "+r+"( ",o+=" "+d+", (dataPath || '')",'""'!=e.errorPath&&(o+=" + "+e.errorPath),o+=a?" , data"+(a-1||"")+" , "+e.dataPathArr[a]+" ":" , parentData , parentDataProperty ",o+=") ";var b=o;if(o=m.pop(),n){if(!e.async)throw new Error("async schema referenced by sync schema");o+=" try { ",h&&(o+="var "+u+" ="),o+=" "+e.yieldAwait+" "+b+"; } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; } ",h&&(o+=" if ("+u+") { ")}else o+=" if (!"+b+") { if (vErrors === null) vErrors = "+r+".errors; else vErrors = vErrors.concat("+r+".errors); errors = vErrors.length; } ",h&&(o+=" else { ")}return o}},function(e,t){"use strict";e.exports=function(e,t){var i,n=" ",r=e.level,o=e.dataLevel,s=e.schema[t],a=e.schemaPath+"."+t,l=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,h="data"+(o||""),d="valid"+r,u=e.opts.v5&&s.$data,f=u?e.util.getData(s.$data,o,e.dataPathArr):s;if(u&&(n+=" var schema"+r+" = "+f+"; ",f="schema"+r),!u)if(s.length=e.opts.loopRequired;if(c)if(n+=" var missing"+r+"; ",A){u||(n+=" var schema"+r+" = validate.schema"+a+"; ");var C="i"+r,E="schema"+r+"["+C+"]",x="' + "+E+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(b,E,e.opts.jsonPointers)),n+=" var "+d+" = true; ",u&&(n+=" if (schema"+r+" === undefined) "+d+" = true; else if (!Array.isArray(schema"+r+")) "+d+" = false; else {"),n+=" for (var "+C+" = 0; "+C+" < schema"+r+".length; "+C+"++) { "+d+" = "+h+"[schema"+r+"["+C+"]] !== undefined; if (!"+d+") break; } ",u&&(n+=" } "),n+=" if (!"+d+") { ";var F=F||[];F.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+x+"' } ",e.opts.messages!==!1&&(n+=" , message: '",n+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+x+"\\'",n+="' "),e.opts.verbose&&(n+=" , schema: validate.schema"+a+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var k=n;n=F.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+k+"]); ":" validate.errors = ["+k+"]; return false; ":" var err = "+k+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } else { "}else{n+=" if ( ";var S=p;if(S)for(var $,C=-1,D=S.length-1;C 1) { var i = "+h+".length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal("+h+"[i], "+h+"[j])) { "+d+" = false; break outer; } } } } ",u&&(n+=" } "),n+=" if (!"+d+") { ";var p=p||[];p.push(n),n="",e.createErrors!==!1?(n+=" { keyword: '"+(i||"uniqueItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { i: i, j: j } ',e.opts.messages!==!1&&(n+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(n+=" , schema: ",n+=u?"validate.schema"+a:""+s,n+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+h+" "),n+=" } "):n+=" {} ";var m=n;n=p.pop(),n+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n+=" } ",c&&(n+=" else { ")}else c&&(n+=" if (true) { ");return n}},function(e,t){"use strict";var i=/^[a-z_$][a-z0-9_$]*$/i;e.exports=function(e,t){function n(e,t,i){for(var n,r=0;r\s+/g,">"),h=function(e,t,i){var r=n.createElement("div");r.innerHTML=c,this.element=r.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOptions=e.querySelector(".ace_search_options"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;o.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),o.stopPropagation(e)}),o.addListener(e,"click",function(e){var i=e.target||e.srcElement,n=i.getAttribute("action");n&&t[n]?t[n]():t.$searchBarKb.commands[n]&&t.$searchBarKb.commands[n].exec(t),o.stopPropagation(e)}),o.addCommandKeyListener(e,function(e,i,n){var r=l.keyCodeToString(n),s=t.$searchBarKb.findKeyCommand(i,r);s&&s.exec&&(s.exec(t),o.stopEvent(e))}),this.$onChange=r.delayedCall(function(){t.find(!1,!1)}),o.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),o.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),o.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new a([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new a,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceBox.style.display="",e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){n.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),n.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),n.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,i){var r=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:i}),o=!r&&this.searchInput.value;n.setCssClass(this.searchBox,"ace_nomatch",o),this.editor._emit("findSearchBox",{match:!o}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;n.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display="",this.replaceBox.style.display=t?"":"none",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(h.prototype),t.SearchBox=h,t.Search=function(e,t){var i=e.searchBox||new h(e);i.show(e.session.getTextRange(),t)}}),function(){ace.acequire(["ace/ext/searchbox"],function(){})}()},function(e,t,i){!function(){function e(e){var t=i;e&&(i[e]||(i[e]={}),t=i[e]),t.define&&t.define.packaged||(n.original=t.define,t.define=n,t.define.packaged=!0),t.acequire&&t.acequire.packaged||(o.original=t.acequire,t.acequire=o,t.acequire.packaged=!0)}var t="ace",i=function(){return this}();if(i||"undefined"==typeof window||(i=window),t||"undefined"==typeof acequirejs){var n=function(e,t,i){return"string"!=typeof e?void(n.original?n.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace())):(2==arguments.length&&(i=t),void(n.modules[e]||(n.payloads[e]=i,n.modules[e]=null)))};n.modules={},n.payloads={};var r=function(e,t,i){if("string"==typeof t){var n=a(e,t);if(void 0!=n)return i&&i(),n}else if("[object Array]"===Object.prototype.toString.call(t)){for(var r=[],s=0,l=t.length;s1&&r(l,"")>-1&&(i=RegExp(this.source,o.replace.call(n(this),"g","")),o.replace.call(e.slice(l.index),i,function(){for(var e=1;el.index&&this.lastIndex--}return l},a||(RegExp.prototype.test=function(e){var t=o.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t}))}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,i){function n(){}function r(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(e){}}function o(e){return e=+e,e!==e?e=0:0!==e&&e!==1/0&&e!==-(1/0)&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError("Function.prototype.bind called on incompatible "+t);var i=p.call(arguments,1),r=function(){if(this instanceof r){var n=t.apply(this,i.concat(p.call(arguments)));return Object(n)===n?n:this}return t.apply(e,i.concat(p.call(arguments)))};return t.prototype&&(n.prototype=t.prototype,r.prototype=new n,n.prototype=null),r});var s,a,l,c,h,d=Function.prototype.call,u=Array.prototype,f=Object.prototype,p=u.slice,m=d.bind(f.toString),g=d.bind(f.hasOwnProperty);if((h=g(f,"__defineGetter__"))&&(s=d.bind(f.__defineGetter__),a=d.bind(f.__defineSetter__),l=d.bind(f.__lookupGetter__),c=d.bind(f.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t,i=[];if(i.splice.apply(i,e(20)),i.splice.apply(i,e(26)),t=i.length,i.splice(5,0,"XXX"),t+1==i.length,t+1==i.length)return!0}()){var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[void 0===e?0:e,void 0===t?this.length-e:t].concat(p.call(arguments,2))):[]}}else Array.prototype.splice=function(e,t){var i=this.length;e>0?e>i&&(e=i):void 0==e?e=0:e<0&&(e=Math.max(i+e,0)),e+ta)for(d=c;d--;)this[l+d]=this[a+d];if(o&&e===h)this.length=h,this.push.apply(this,r);else for(this.length=h+o,d=0;d>>0;if("[object Function]"!=m(e))throw new TypeError;for(;++r>>0,r=Array(n),o=arguments[1];if("[object Function]"!=m(e))throw new TypeError(e+" is not a function");for(var s=0;s>>0,o=[],s=arguments[1];if("[object Function]"!=m(e))throw new TypeError(e+" is not a function");for(var a=0;a>>0,r=arguments[1];if("[object Function]"!=m(e))throw new TypeError(e+" is not a function");for(var o=0;o>>0,r=arguments[1];if("[object Function]"!=m(e))throw new TypeError(e+" is not a function");for(var o=0;o>>0;if("[object Function]"!=m(e))throw new TypeError(e+" is not a function");if(!n&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var r,o=0;if(arguments.length>=2)r=arguments[1];else for(;;){if(o in i){r=i[o++];break}if(++o>=n)throw new TypeError("reduce of empty array with no initial value")}for(;o>>0;if("[object Function]"!=m(e))throw new TypeError(e+" is not a function");if(!n&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var r,o=n-1;if(arguments.length>=2)r=arguments[1];else for(;;){if(o in i){r=i[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}do o in this&&(r=e.call(void 0,r,i[o],o,t));while(o--);return r}),Array.prototype.indexOf&&[0,1].indexOf(1,2)==-1||(Array.prototype.indexOf=function(e){var t=w&&"[object String]"==m(this)?this.split(""):T(this),i=t.length>>>0;if(!i)return-1;var n=0;for(arguments.length>1&&(n=o(arguments[1])),n=n>=0?n:Math.max(0,i+n);n>>0;if(!i)return-1;var n=i-1;for(arguments.length>1&&(n=Math.min(n,o(arguments[1]))),n=n>=0?n:i-Math.abs(n);n>=0;n--)if(n in t&&e===t[n])return n;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(e){return e.__proto__||(e.constructor?e.constructor.prototype:f)}),!Object.getOwnPropertyDescriptor){var b="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(e,t){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError(b+e);if(g(e,t)){var i,n,r;if(i={enumerable:!0,configurable:!0},h){var o=e.__proto__;e.__proto__=f;var n=l(e,t),r=c(e,t);if(e.__proto__=o,n||r)return n&&(i.get=n),r&&(i.set=r),i}return i.value=e[t],i}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(e){return Object.keys(e)}),!Object.create){var A;A=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(e,t){var i;if(null===e)i=A();else{if("object"!=typeof e)throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var n=function(){};n.prototype=e,i=new n,i.__proto__=e}return void 0!==t&&Object.defineProperties(i,t),i}}if(Object.defineProperty){var C=r({}),E="undefined"==typeof document||r(document.createElement("div"));if(!C||!E)var x=Object.defineProperty}if(!Object.defineProperty||x){var F="Property description must be an object: ",k="Object.defineProperty called on non-object: ",S="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(e,t,i){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError(k+e);if("object"!=typeof i&&"function"!=typeof i||null===i)throw new TypeError(F+i);if(x)try{return x.call(Object,e,t,i)}catch(e){}if(g(i,"value"))if(h&&(l(e,t)||c(e,t))){var n=e.__proto__;e.__proto__=f,delete e[t],e[t]=i.value,e.__proto__=n}else e[t]=i.value;else{if(!h)throw new TypeError(S);g(i,"get")&&s(e,t,i.get),g(i,"set")&&a(e,t,i.set)}return e}}Object.defineProperties||(Object.defineProperties=function(e,t){for(var i in t)g(t,i)&&Object.defineProperty(e,i,t[i]);return e}),Object.seal||(Object.seal=function(e){return e}),Object.freeze||(Object.freeze=function(e){return e});try{Object.freeze(function(){})}catch(e){Object.freeze=function(e){return function(t){return"function"==typeof t?t:e(t)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(e){return e}),Object.isSealed||(Object.isSealed=function(e){return!1}),Object.isFrozen||(Object.isFrozen=function(e){return!1}),Object.isExtensible||(Object.isExtensible=function(e){if(Object(e)===e)throw new TypeError;for(var t="";g(e,t);)t+="?";e[t]=!0;var i=g(e,t);return delete e[t],i}),!Object.keys){var $=!0,D=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],B=D.length;for(var _ in{toString:null})$=!1;Object.keys=function e(t){if("object"!=typeof t&&"function"!=typeof t||null===t)throw new TypeError("Object.keys called on a non-object");var e=[];for(var i in t)g(t,i)&&e.push(i);if($)for(var n=0,r=B;n=0?parseFloat((r.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((r.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&"Gecko"===window.navigator.product,t.isOldGecko=t.isGecko&&parseInt((r.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&"[object Opera]"==Object.prototype.toString.call(window.opera),t.isWebKit=parseFloat(r.split("WebKit/")[1])||void 0,t.isChrome=parseFloat(r.split(" Chrome/")[1])||void 0,t.isAIR=r.indexOf("AdobeAIR")>=0,t.isIPad=r.indexOf("iPad")>=0,t.isTouchPad=r.indexOf("TouchPad")>=0,t.isChromeOS=r.indexOf(" CrOS ")>=0}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,i){"use strict";function n(e,t,i){var n=c(t);if(!s.isMac&&a){if(a.OSKey&&(n|=8),a.altGr){if(3==(3&n))return;a.altGr=0}if(18===i||17===i){var r="location"in t?t.location:t.keyLocation;if(17===i&&1===r)1==a[i]&&(l=t.timeStamp);else if(18===i&&3===n&&2===r){var h=t.timeStamp-l;h<50&&(a.altGr=!0)}}}if(i in o.MODIFIER_KEYS&&(i=-1),8&n&&i>=91&&i<=93&&(i=-1),!n&&13===i){var r="location"in t?t.location:t.keyLocation;if(3===r&&(e(t,n,-i),t.defaultPrevented))return}if(s.isChromeOS&&8&n){if(e(t,n,i),t.defaultPrevented)return;n&=-9}return!!(n||i in o.FUNCTION_KEYS||i in o.PRINTABLE_KEYS)&&e(t,n,i)}function r(){a=Object.create(null),a.count=0,a.lastT=0}var o=e("./keys"),s=e("./useragent"),a=null,l=0;t.addListener=function(e,t,i){if(e.addEventListener)return e.addEventListener(t,i,!1);if(e.attachEvent){var n=function(){i.call(e,window.event)};i._wrapper=n,e.attachEvent("on"+t,n)}},t.removeListener=function(e,t,i){return e.removeEventListener?e.removeEventListener(t,i,!1):void(e.detachEvent&&e.detachEvent("on"+t,i._wrapper||i))},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return"dblclick"==e.type?0:"contextmenu"==e.type||s.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,i,n){function r(e){i&&i(e),n&&n(e),t.removeListener(document,"mousemove",i,!0),t.removeListener(document,"mouseup",r,!0),t.removeListener(document,"dragstart",r,!0)}return t.addListener(document,"mousemove",i,!0),t.addListener(document,"mouseup",r,!0),t.addListener(document,"dragstart",r,!0),r},t.addTouchMoveListener=function(e,i){if("ontouchmove"in e){var n,r;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];n=t.clientX,r=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,o=e.changedTouches[0];e.wheelX=-(o.clientX-n)/t,e.wheelY=-(o.clientY-r)/t,n=o.clientX,r=o.clientY,i(e)})}},t.addMouseWheelListener=function(e,i){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;void 0!==e.wheelDeltaX?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),i(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=5*(e.deltaX||0),e.wheelY=5*(e.deltaY||0)}i(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=5*(e.detail||0),e.wheelY=0):(e.wheelX=0,e.wheelY=5*(e.detail||0)),i(e)})},t.addMultiMouseDownListener=function(e,i,n,r){function o(e){if(0!==t.getButton(e)?d=0:e.detail>1?(d++,d>4&&(d=1)):d=1,s.isIE){var o=Math.abs(e.clientX-l)>5||Math.abs(e.clientY-c)>5;h&&!o||(d=1),h&&clearTimeout(h),h=setTimeout(function(){h=null},i[d-1]||600),1==d&&(l=e.clientX,c=e.clientY)}if(e._clicks=d,n[r]("mousedown",e),d>4)d=0;else if(d>1)return n[r](u[d],e)}function a(e){d=2,h&&clearTimeout(h),h=setTimeout(function(){h=null},i[d-1]||600),n[r]("mousedown",e),n[r](u[d],e)}var l,c,h,d=0,u={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",o),s.isOldIE&&t.addListener(e,"dblclick",a)})};var c=!s.isMac||!s.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};if(t.getModifierString=function(e){return o.KEY_MODS[c(e)]},t.addCommandKeyListener=function(e,i){var o=t.addListener;if(s.isOldGecko||s.isOpera&&!("KeyboardEvent"in window)){var l=null;o(e,"keydown",function(e){l=e.keyCode}),o(e,"keypress",function(e){return n(i,e,l)})}else{var c=null;o(e,"keydown",function(e){var t=e.keyCode;a[t]=(a[t]||0)+1,91==t||92==t?a.OSKey=!0:a.OSKey&&e.timeStamp-a.lastT>200&&1==a.count&&r(),1==a[t]&&a.count++,a.lastT=e.timeStamp;var o=n(i,e,t);return c=e.defaultPrevented,o}),o(e,"keypress",function(e){c&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),c=null)}),o(e,"keyup",function(e){var t=e.keyCode;a[t]?a.count=Math.max(a.count-1,0):r(),91!=t&&92!=t||(a.OSKey=!1),a[t]=null}),a||(r(),o(window,"focus",r))}},"object"==typeof window&&window.postMessage&&!s.isOldIE){var h=1;t.nextTick=function(e,i){i=i||window;var n="zero-timeout-message-"+h;t.addListener(i,"message",function r(o){o.data==n&&(t.stopPropagation(o),t.removeListener(i,"message",r),e())}),i.postMessage(n,"*")}}t.nextFrame="object"==typeof window&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,i){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){for(var i="";t>0;)1&t&&(i+=e),(t>>=1)&&(e+=e);return i};var n=/^\s\s*/,r=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(n,"")},t.stringTrimRight=function(e){return e.replace(r,"")},t.copyObject=function(e){var t={};for(var i in e)t[i]=e[i];return t},t.copyArray=function(e){for(var t=[],i=0,n=e.length;i1),e.preventDefault()):(this.setState("focusWait"),void this.captureMouse(e))},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var i=this.editor;i.$blockScrolling++,this.mousedownEvent.getShiftKey()?i.selection.selectToPosition(e):t||i.selection.moveToPosition(e),t||this.select(),i.renderer.scroller.setCapture&&i.renderer.scroller.setCapture(),i.setStyle("ace_selecting"),this.setState("select"),i.$blockScrolling--},this.select=function(){var e,t=this.editor,i=t.renderer.screenToTextCoordinates(this.x,this.y);if(t.$blockScrolling++,this.$clickSelection){var n=this.$clickSelection.comparePoint(i);if(n==-1)e=this.$clickSelection.end;else if(1==n)e=this.$clickSelection.start;else{var r=o(this.$clickSelection,i);i=r.cursor,e=r.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(i),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,i=this.editor,n=i.renderer.screenToTextCoordinates(this.x,this.y),r=i.selection[e](n.row,n.column);if(i.$blockScrolling++,this.$clickSelection){var s=this.$clickSelection.comparePoint(r.start),a=this.$clickSelection.comparePoint(r.end);if(s==-1&&a<=0)t=this.$clickSelection.end,r.end.row==n.row&&r.end.column==n.column||(n=r.start);else if(1==a&&s>=0)t=this.$clickSelection.start,r.start.row==n.row&&r.start.column==n.column||(n=r.end);else if(s==-1&&1==a)n=r.end,t=r.start;else{var l=o(this.$clickSelection,n);n=l.cursor,t=l.anchor}i.selection.setSelectionAnchor(t.row,t.column)}i.selection.selectToPosition(n),i.$blockScrolling--,i.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=r(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>s||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),i=this.editor,n=i.session,r=n.getBracketRange(t);r?(r.isEmpty()&&(r.start.column--,r.end.column++),this.setState("select")):(r=i.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=r,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),i=this.editor;this.setState("selectByLines");var n=i.getSelectionRange();n.isMultiLine()&&n.contains(t.row,t.column)?(this.$clickSelection=i.selection.getLineRange(n.start.row),this.$clickSelection.end=i.selection.getLineRange(n.end.row).end):this.$clickSelection=i.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(!e.getAccelKey()){e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,i=t-(this.$lastScrollTime||0),n=this.editor,r=n.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);return r||i<200?(this.$lastScrollTime=t,n.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()):void 0}},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,i=t-(this.$lastScrollTime||0),n=this.editor,r=n.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(r||i<200)return this.$lastScrollTime=t,n.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(n.prototype),t.DefaultHandlers=n}),ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,i){"use strict";function n(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=(e("./lib/oop"),e("./lib/dom"));(function(){this.$init=function(){return this.$element=r.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){r.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){r.addCssClass(this.getElement(),e)},this.show=function(e,t,i){null!=e&&this.setText(e),null!=t&&null!=i&&this.setPosition(t,i),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(n.prototype),t.Tooltip=n}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,i){"use strict";function n(e){function t(){var t=d.getDocumentPosition().row,r=l.$annotations[t];if(!r)return i();var o=s.session.getLength();if(t==o){var a=s.renderer.pixelToScreenCoordinates(0,d.y).row,h=d.$pos;if(a>s.session.documentToScreenRow(h.row,h.column))return i()}if(u!=r)if(u=r.text.join("
"),c.setHtml(u),c.show(),s.on("mousewheel",i),e.$tooltipFollowsMouse)n(d);else{var f=d.domEvent.target,p=f.getBoundingClientRect(),m=c.getElement().style;m.left=p.right+"px",m.top=p.bottom+"px"}}function i(){h&&(h=clearTimeout(h)),u&&(c.hide(),u=null,s.removeEventListener("mousewheel",i))}function n(e){c.setPosition(e.x,e.y)}var s=e.editor,l=s.renderer.$gutterLayer,c=new r(s.container);e.editor.setDefaultHandler("guttermousedown",function(t){if(s.isFocused()&&0==t.getButton()){var i=l.getRegion(t);if("foldWidgets"!=i){var n=t.getDocumentPosition().row,r=s.session.selection;if(t.getShiftKey())r.selectTo(n,0);else{if(2==t.domEvent.detail)return s.selectAll(),t.preventDefault();e.$clickSelection=s.selection.getLineRange(n)}return e.setState("selectByLines"),e.captureMouse(t),t.preventDefault()}}});var h,d,u;e.editor.setDefaultHandler("guttermousemove",function(r){var s=r.domEvent.target||r.domEvent.srcElement;return o.hasCssClass(s,"ace_fold-widget")?i():(u&&e.$tooltipFollowsMouse&&n(r),d=r,void(h||(h=setTimeout(function(){h=null,d&&!e.isMousePressed?t():i()},50))))}),a.addListener(s.renderer.$gutter,"mouseout",function(e){d=null,u&&!h&&(h=setTimeout(function(){h=null,i()},50))}),s.on("changeSession",i)}function r(e){l.call(this,e)}var o=e("../lib/dom"),s=e("../lib/oop"),a=e("../lib/event"),l=e("../tooltip").Tooltip;s.inherits(r,l),function(){this.setPosition=function(e,t){var i=window.innerWidth||document.documentElement.clientWidth,n=window.innerHeight||document.documentElement.clientHeight,r=this.getWidth(),o=this.getHeight();e+=15,t+=15,e+r>i&&(e-=e+r-i),t+o>n&&(t-=20+o),l.prototype.setPosition.call(this,e,t)}}.call(r.prototype),t.GutterHandler=n}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,i){"use strict";var n=e("../lib/event"),r=e("../lib/useragent"),o=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){n.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){n.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var i=this.getDocumentPosition();this.$inSelection=t.contains(i.row,i.column)}return this.$inSelection},this.getButton=function(){return n.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=r.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(o.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,i){"use strict";function n(e){function t(e,t){var i=Date.now(),n=!t||e.row!=t.row,o=!t||e.column!=t.column;if(!$||n||o)g.$blockScrolling+=1,g.moveCursorToPosition(e),g.$blockScrolling-=1,$=i,D={x:b,y:A};else{var s=r(D.x,D.y,b,A);s>h?$=null:i-$>=c&&(g.renderer.scrollCursorIntoView(),$=null)}}function i(e,t){var i=Date.now(),n=g.renderer.layerConfig.lineHeight,r=g.renderer.layerConfig.characterWidth,o=g.renderer.scroller.getBoundingClientRect(),s={x:{left:b-o.left,right:o.right-b},y:{top:A-o.top,bottom:o.bottom-A}},a=Math.min(s.x.left,s.x.right),c=Math.min(s.y.top,s.y.bottom),h={row:e.row,column:e.column};a/r<=2&&(h.column+=s.x.left=l&&g.renderer.scrollCursorIntoView(h):S=i:S=null}function n(){var e=x;x=g.renderer.screenToTextCoordinates(b,A),t(x,e),i(x,e)}function d(){E=g.selection.toOrientedRange(),w=g.session.addMarker(E,"ace_selection",g.getSelectionStyle()),g.clearSelection(),g.isFocused()&&g.renderer.$cursorLayer.setBlinking(!1),clearInterval(C),n(),C=setInterval(n,20),_=0,s.addListener(document,"mousemove",f)}function u(){clearInterval(C),g.session.removeMarker(w),w=null,g.$blockScrolling+=1,g.selection.fromOrientedRange(E),g.$blockScrolling-=1,g.isFocused()&&!k&&g.renderer.$cursorLayer.setBlinking(!g.getReadOnly()),E=null,x=null,_=0,S=null,$=null,s.removeListener(document,"mousemove",f)}function f(){null==L&&(L=setTimeout(function(){null!=L&&w&&u()},20))}function p(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return"text/plain"==e||"Text"==e})}function m(e){var t=["copy","copymove","all","uninitialized"],i=["move","copymove","linkmove","all","uninitialized"],n=a.isMac?e.altKey:e.ctrlKey,r="uninitialized";try{r=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return n&&t.indexOf(r)>=0?o="copy":i.indexOf(r)>=0?o="move":t.indexOf(r)>=0&&(o="copy"),o}var g=e.editor,v=o.createElement("img");v.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",a.isOpera&&(v.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var y=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];y.forEach(function(t){e[t]=this[t]},this),g.addEventListener("mousedown",this.onMouseDown.bind(e));var w,b,A,C,E,x,F,k,S,$,D,B=g.container,_=0;this.onDragStart=function(e){if(this.cancelDrag||!B.draggable){var t=this;return setTimeout(function(){t.startSelect(),t.captureMouse(e)},0),e.preventDefault()}E=g.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=g.getReadOnly()?"copy":"copyMove",a.isOpera&&(g.container.appendChild(v),v.scrollTop=0),i.setDragImage&&i.setDragImage(v,0,0),a.isOpera&&g.container.removeChild(v),i.clearData(),i.setData("Text",g.session.getTextRange()),k=!0,this.setState("drag")},this.onDragEnd=function(e){if(B.draggable=!1,k=!1,this.setState(null),!g.getReadOnly()){var t=e.dataTransfer.dropEffect;F||"move"!=t||g.session.remove(g.getSelectionRange()),g.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(!g.getReadOnly()&&p(e.dataTransfer))return b=e.clientX,A=e.clientY,w||d(),_++,e.dataTransfer.dropEffect=F=m(e),s.preventDefault(e)},this.onDragOver=function(e){if(!g.getReadOnly()&&p(e.dataTransfer))return b=e.clientX,A=e.clientY,w||(d(),_++),null!==L&&(L=null),e.dataTransfer.dropEffect=F=m(e),s.preventDefault(e)},this.onDragLeave=function(e){if(_--,_<=0&&w)return u(),F=null,s.preventDefault(e)},this.onDrop=function(e){if(x){var t=e.dataTransfer;if(k)switch(F){case"move":E=E.contains(x.row,x.column)?{start:x,end:x}:g.moveText(E,x);break;case"copy":E=g.moveText(E,x,!0)}else{var i=t.getData("Text");E={start:x,end:g.session.insert(x,i)},g.focus(),F=null}return u(),s.preventDefault(e)}},s.addListener(B,"dragstart",this.onDragStart.bind(e)),s.addListener(B,"dragend",this.onDragEnd.bind(e)),s.addListener(B,"dragenter",this.onDragEnter.bind(e)),s.addListener(B,"dragover",this.onDragOver.bind(e)),s.addListener(B,"dragleave",this.onDragLeave.bind(e)),s.addListener(B,"drop",this.onDrop.bind(e));var L=null}function r(e,t,i,n){return Math.sqrt(Math.pow(i-e,2)+Math.pow(n-t,2))}var o=e("../lib/dom"),s=e("../lib/event"),a=e("../lib/useragent"),l=200,c=200,h=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var i=a.isWin?"default":"move";e.renderer.setCursorStyle(i),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(a.isIE&&"dragReady"==this.state){var i=r(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);i>3&&t.dragDrop()}if("dragWait"===this.state){var i=r(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);i>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){ +if(this.$dragEnabled){this.mousedownEvent=e;var t=this.editor,i=e.inSelection(),n=e.getButton(),r=e.domEvent.detail||1;if(1===r&&0===n&&i){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;if("unselectable"in o&&(o.unselectable="on"),t.getDragDelay()){if(a.isWebKit){this.cancelDrag=!0;var s=t.container;s.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}}).call(n.prototype),t.DragdropHandler=n}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";var n=e("./dom");t.get=function(e,t){var i=new XMLHttpRequest;i.open("GET",e,!0),i.onreadystatechange=function(){4===i.readyState&&t(i.responseText)},i.send(null)},t.loadScript=function(e,t){var i=n.getDocumentHead(),r=document.createElement("script");r.src=e,i.appendChild(r),r.onload=r.onreadystatechange=function(e,i){!i&&r.readyState&&"loaded"!=r.readyState&&"complete"!=r.readyState||(r=r.onload=r.onreadystatechange=null,i||t())}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,i){"use strict";var n={},r=function(){this.propagationStopped=!0},o=function(){this.defaultPrevented=!0};n._emit=n._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var i=this._eventRegistry[e]||[],n=this._defaultHandlers[e];if(i.length||n){"object"==typeof t&&t||(t={}),t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=r),t.preventDefault||(t.preventDefault=o),i=i.slice();for(var s=0;s1&&(r=i[i.length-2]);var s=h[t+"Path"];return null==s?s=h.basePath:"/"==n&&(t=n=""),s&&"/"!=s.slice(-1)&&(s+="/"),s+t+n+r+this.get("suffix")},t.setModuleUrl=function(e,t){return h.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(i,n){var r,o;Array.isArray(i)&&(o=i[0],i=i[1]);try{r=e(i)}catch(e){}if(r&&!t.$loading[i])return n&&n(r);if(t.$loading[i]||(t.$loading[i]=[]),t.$loading[i].push(n),!(t.$loading[i].length>1)){var s=function(){e([i],function(e){t._emit("load.module",{name:i,module:e});var n=t.$loading[i];t.$loading[i]=null,n.forEach(function(t){t&&t(e)})})};return t.get("packaged")?void a.loadScript(t.moduleUrl(i,o),s):s()}},r(!0),t.init=r}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,i){"use strict";var n=e("../lib/event"),r=e("../lib/useragent"),o=e("./default_handlers").DefaultHandlers,s=e("./default_gutter_handler").GutterHandler,a=e("./mouse_event").MouseEvent,l=e("./dragdrop_handler").DragdropHandler,c=e("../config"),h=function(e){var t=this;this.editor=e,new o(this),new s(this),new l(this);var i=function(t){var i=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());i&&window.focus(),e.focus()},a=e.renderer.getMouseEventTarget();n.addListener(a,"click",this.onMouseEvent.bind(this,"click")),n.addListener(a,"mousemove",this.onMouseMove.bind(this,"mousemove")),n.addMultiMouseDownListener([a,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),n.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),n.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var c=e.renderer.$gutter;n.addListener(c,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),n.addListener(c,"click",this.onMouseEvent.bind(this,"gutterclick")),n.addListener(c,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),n.addListener(c,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),n.addListener(a,"mousedown",i),n.addListener(c,"mousedown",i),r.isIE&&e.renderer.scrollBarV&&(n.addListener(e.renderer.scrollBarV.element,"mousedown",i),n.addListener(e.renderer.scrollBarH.element,"mousedown",i)),e.on("mousemove",function(i){if(!t.state&&!t.$dragDelay&&t.$dragEnabled){var n=e.renderer.screenToTextCoordinates(i.x,i.y),r=e.session.selection.getRange(),o=e.renderer;!r.isEmpty()&&r.insideStart(n.row,n.column)?o.setCursorStyle("default"):o.setCursorStyle("")}})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new a(t,this.editor))},this.onMouseMove=function(e,t){var i=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;i&&i.length&&this.editor._emit(e,new a(t,this.editor))},this.onMouseWheel=function(e,t){var i=new a(t,this.editor);i.speed=2*this.$scrollSpeed,i.wheelX=t.wheelX,i.wheelY=t.wheelY,this.editor._emit(e,i)},this.onTouchMove=function(e,t){var i=new a(t,this.editor);i.speed=1,i.wheelX=t.wheelX,i.wheelY=t.wheelY,this.editor._emit(e,i)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var i=this.editor.renderer;i.$keepTextAreaAtCursor&&(i.$keepTextAreaAtCursor=null);var o=this,s=function(e){if(e){if(r.isWebKit&&!e.which&&o.releaseMouse)return o.releaseMouse();o.x=e.clientX,o.y=e.clientY,t&&t(e),o.mouseEvent=new a(e,o.editor),o.$mouseMoved=!0}},l=function(e){clearInterval(h),c(),o[o.state+"End"]&&o[o.state+"End"](e),o.state="",null==i.$keepTextAreaAtCursor&&(i.$keepTextAreaAtCursor=!0,i.$moveTextAreaToCursor()),o.isMousePressed=!1,o.$onCaptureMouseMove=o.releaseMouse=null,e&&o.onMouseEvent("mouseup",e)},c=function(){o[o.state]&&o[o.state](),o.$mouseMoved=!1};if(r.isOldIE&&"dblclick"==e.domEvent.type)return setTimeout(function(){l(e)});o.$onCaptureMouseMove=s,o.releaseMouse=n.capture(this.editor.container,s,l);var h=setInterval(c,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){t&&t.domEvent&&"contextmenu"!=t.domEvent.type||(this.editor.off("nativecontextmenu",e),t&&t.domEvent&&n.stopEvent(t.domEvent))}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(h.prototype),c.defineOptions(h.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:r.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=h}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,i){"use strict";function n(e){e.on("click",function(t){var i=t.getDocumentPosition(),n=e.session,r=n.getFoldAt(i.row,i.column,1);r&&(t.getAccelKey()?n.removeFold(r):n.expandFold(r),t.stop())}),e.on("gutterclick",function(t){var i=e.renderer.$gutterLayer.getRegion(t);if("foldWidgets"==i){var n=t.getDocumentPosition().row,r=e.session;r.foldWidgets&&r.foldWidgets[n]&&e.session.onFoldWidgetClick(n,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var i=e.renderer.$gutterLayer.getRegion(t);if("foldWidgets"==i){var n=t.getDocumentPosition().row,r=e.session,o=r.getParentFoldRangeData(n,!0),s=o.range||o.firstRange;if(s){n=s.start.row;var a=r.getFoldAt(n,r.getLine(n).length,1);a?r.removeFold(a):(r.addFold("...",s),e.renderer.scrollCursorIntoView({row:s.start.row,column:0}))}t.stop()}})}t.FoldHandler=n}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,i){"use strict";var n=e("../lib/keys"),r=e("../lib/event"),o=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]!=e){for(;t[t.length-1]&&t[t.length-1]!=this.$defaultHandler;)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)}},this.addKeyboardHandler=function(e,t){if(e){"function"!=typeof e||e.handleKeyboard||(e.handleKeyboard=e);var i=this.$handlers.indexOf(e);i!=-1&&this.$handlers.splice(i,1),void 0==t?this.$handlers.push(e):this.$handlers.splice(t,0,e),i==-1&&e.attach&&e.attach(this.$editor)}},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t!=-1&&(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(i){return i.getStatusText&&i.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,i,n){for(var o,s=!1,a=this.$editor.commands,l=this.$handlers.length;l--&&(o=this.$handlers[l].handleKeyboard(this.$data,e,t,i,n),!(o&&o.command&&(s="null"==o.command||a.exec(o.command,this.$editor,o.args,n),s&&n&&e!=-1&&1!=o.passEvent&&1!=o.command.passEvent&&r.stopEvent(n),s))););return s||e!=-1||(o={command:"insertstring"},s=a.exec("insertstring",this.$editor,t)),s&&this.$editor._signal("keyboardActivity",o),s},this.onCommandKey=function(e,t,i){var r=n.keyCodeToString(i);this.$callKeyboardHandlers(t,r,i,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(o.prototype),t.KeyBinding=o}),ace.define("ace/range",["require","exports","module"],function(e,t,i){"use strict";var n=function(e,t){return e.row-t.row||e.column-t.column},r=function(e,t,i,n){this.start={row:e,column:t},this.end={row:i,column:n}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return 0==this.compare(e,t)},this.compareRange=function(e){var t,i=e.end,n=e.start;return t=this.compare(i.row,i.column),1==t?(t=this.compare(n.row,n.column),1==t?2:0==t?1:0):t==-1?-2:(t=this.compare(n.row,n.column),t==-1?-1:1==t?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return 0==this.comparePoint(e.start)&&0==this.comparePoint(e.end)},this.intersects=function(e){var t=this.compareRange(e);return t==-1||0==t||1==t},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){"object"==typeof e?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){"object"==typeof e?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return 0==this.compare(e,t)&&!this.isEnd(e,t)&&!this.isStart(e,t)},this.insideStart=function(e,t){return 0==this.compare(e,t)&&!this.isEnd(e,t)},this.insideEnd=function(e,t){return 0==this.compare(e,t)&&!this.isStart(e,t)},this.compare=function(e,t){return this.isMultiLine()||e!==this.start.row?ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0:tthis.end.column?1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var i={row:t+1,column:0};else if(this.end.rowt)var n={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?s.fromPoints(t,t):this.isBackwards()?s.fromPoints(t,e):s.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if("undefined"==typeof t){var i=e||this.lead;e=i.row,t=i.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var i,n="number"==typeof e?e:this.lead.row,r=this.session.getFoldLine(n);return r?(n=r.start.row,i=r.end.row):i=n,t===!0?new s(n,0,i,this.session.getLine(i).length):new s(n,0,i+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e,t=this.lead.getPosition();if(e=this.session.getFoldAt(t.row,t.column,-1))this.moveCursorTo(e.start.row,e.start.column);else if(0===t.column)t.row>0&&this.moveCursorTo(t.row-1,this.doc.getLine(t.row-1).length);else{var i=this.session.getTabSize();this.session.isTabStop(t)&&this.doc.getLine(t.row).slice(t.column-i,t.column).split(" ").length-1==i?this.moveCursorBy(0,-i):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e,t=this.lead.getPosition();if(e=this.session.getFoldAt(t.row,t.column,1))this.moveCursorTo(e.end.row,e.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=n)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e,t=this.lead.row,i=this.lead.column,n=this.doc.getLine(t),r=n.substring(i);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var o=this.session.getFoldAt(t,i,1);return o?void this.moveCursorTo(o.end.row,o.end.column):((e=this.session.nonTokenRe.exec(r))&&(i+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(i)),i>=n.length?(this.moveCursorTo(t,n.length),this.moveCursorRight(),void(t0&&this.moveCursorWordLeft())):((o=this.session.tokenRe.exec(s))&&(i-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),void this.moveCursorTo(t,i))},this.$shortWordEndIndex=function(e){var t,i,n=0,r=/\s/,o=this.session.tokenRe;if(o.lastIndex=0,t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{for(;(i=e[n])&&r.test(i);)n++;if(n<1)for(o.lastIndex=0;(i=e[n])&&!o.test(i);)if(o.lastIndex=0,n++,r.test(i)){if(n>2){n--;break}for(;(i=e[n])&&r.test(i);)n++;if(n>2)break}}return o.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,i=this.doc.getLine(e),n=i.substring(t),r=this.session.getFoldAt(e,t,1);if(r)return this.moveCursorTo(r.end.row,r.end.column);if(t==i.length){var o=this.doc.getLength();do e++,n=this.doc.getLine(e);while(e0&&/^\s*$/.test(n));i=n.length,/\s+$/.test(n)||(n="")}var o=r.stringReverse(n),s=this.$shortWordEndIndex(o);return this.moveCursorTo(t,i-s)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var i=this.session.documentToScreenPosition(this.lead.row,this.lead.column);0===t&&(this.$desiredColumn?i.column=this.$desiredColumn:this.$desiredColumn=i.column);var n=this.session.screenToDocumentPosition(i.row+e,i.column);0!==e&&0===t&&n.row===this.lead.row&&n.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[n.row]&&(n.row>0||e>0)&&n.row++,this.moveCursorTo(n.row,n.column+t,0===t)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,i){var n=this.session.getFoldAt(e,t,1);n&&(e=n.start.row,t=n.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,i||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,i){var n=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(n.row,n.column,i)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var i=this.getCursor();return s.fromPoints(t,i)}catch(e){return s.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(void 0==e.start){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var i=s.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(i.cursor=i.start),this.addRange(i,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(a.prototype),t.Selection=a}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,i){"use strict";var n=e("./config"),r=2e3,o=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){for(var i=this.states[t],n=[],r=0,o=this.matchMappings[t]={defaultToken:"text"},s="g",a=[],l=0;l1?c.onMatch=this.$applyToken:c.onMatch=c.token),d>1&&(/\\\d/.test(c.regex)?h=c.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+r+1)}):(d=1,h=this.removeCapturingGroups(c.regex)),c.splitRegex||"string"==typeof c.token||a.push(c)),o[r]=l,r+=d,n.push(h),c.onMatch||(c.onMatch=null)}}n.length||(o[0]=0,n.push("$")),a.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,s)},this),this.regExps[t]=new RegExp("("+n.join(")|(")+")|($)",s)}};(function(){this.$setMaxTokenCount=function(e){r=0|e},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),i=this.token.apply(this,t);if("string"==typeof i)return[{type:i,value:e}];for(var n=[],r=0,o=i.length;rh){var v=e.substring(h,g-m.length);u.type==f?u.value+=v:(u.type&&c.push(u),u={type:f,value:v})}for(var y=0;yr){for(d>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});h1&&i[0]!==n&&i.unshift("#tmp",n),{tokens:c,state:i.length?i:n}},this.reportError=n.reportError}).call(o.prototype),t.Tokenizer=o}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,i){"use strict";var n=e("../lib/lang"),r=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(t)for(var i in e){for(var n=e[i],r=0;r=this.$rowTokens.length;){if(this.$row+=1,e||(e=this.$session.getLength()),this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,i=e[t].start;if(void 0!==i)return i;for(i=0;t>0;)t-=1,i+=e[t].value.length;return i},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(n.prototype),t.TokenIterator=n}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,i){"use strict";var n=e("../tokenizer").Tokenizer,r=e("./text_highlight_rules").TextHighlightRules,o=e("./behaviour").Behaviour,s=e("../unicode"),a=e("../lib/lang"),l=e("../token_iterator").TokenIterator,c=e("../range").Range,h=function(){this.HighlightRules=r,this.$behaviour=new o};(function(){this.tokenRe=new RegExp("^["+s.packages.L+s.packages.Mn+s.packages.Mc+s.packages.Nd+s.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+s.packages.L+s.packages.Mn+s.packages.Mc+s.packages.Nd+s.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules,this.$tokenizer=new n(this.$highlightRules.getRules())), +this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,i,n){function r(e){for(var t=i;t<=n;t++)e(o.getLine(t),t)}var o=t.doc,s=!0,l=!0,c=1/0,h=t.getTabSize(),d=!1;if(this.lineCommentStart){if(Array.isArray(this.lineCommentStart))var u=this.lineCommentStart.map(a.escapeRegExp).join("|"),f=this.lineCommentStart[0];else var u=a.escapeRegExp(this.lineCommentStart),f=this.lineCommentStart;u=new RegExp("^(\\s*)(?:"+u+") ?"),d=t.getUseSoftTabs();var p=function(e,t){var i=e.match(u);if(i){var n=i[1].length,r=i[0].length;y(e,n,r)||" "!=i[0][r-1]||r--,o.removeInLine(t,n,r)}},m=f+" ",g=function(e,t){s&&!/\S/.test(e)||(y(e,c,c)?o.insertInLine({row:t,column:c},m):o.insertInLine({row:t,column:c},f))},v=function(e,t){return u.test(e)},y=function(e,t,i){for(var n=0;t--&&" "==e.charAt(t);)n++;if(n%h!=0)return!1;for(var n=0;" "==e.charAt(i++);)n++;return h>2?n%h!=h-1:n%h==0}}else{if(!this.blockComment)return!1;var f=this.blockComment.start,w=this.blockComment.end,u=new RegExp("^(\\s*)(?:"+a.escapeRegExp(f)+")"),b=new RegExp("(?:"+a.escapeRegExp(w)+")\\s*$"),g=function(e,t){v(e,t)||s&&!/\S/.test(e)||(o.insertInLine({row:t,column:e.length},w),o.insertInLine({row:t,column:c},f))},p=function(e,t){var i;(i=e.match(b))&&o.removeInLine(t,e.length-i[0].length,e.length),(i=e.match(u))&&o.removeInLine(t,i[1].length,i[0].length)},v=function(e,i){if(u.test(e))return!0;for(var n=t.getTokens(i),r=0;re.length&&(A=e.length)}),c==1/0&&(c=A,s=!1,l=!1),d&&c%h!=0&&(c=Math.floor(c/h)*h),r(l?p:g)},this.toggleBlockComment=function(e,t,i,n){var r=this.blockComment;if(r){!r.start&&r[0]&&(r=r[0]);var o,s,a=new l(t,n.row,n.column),h=a.getCurrentToken(),d=(t.selection,t.selection.toOrientedRange());if(h&&/comment/.test(h.type)){for(var u,f;h&&/comment/.test(h.type);){var p=h.value.indexOf(r.start);if(p!=-1){var m=a.getCurrentTokenRow(),g=a.getCurrentTokenColumn()+p;u=new c(m,g,m,g+r.start.length);break}h=a.stepBackward()}for(var a=new l(t,n.row,n.column),h=a.getCurrentToken();h&&/comment/.test(h.type);){var p=h.value.indexOf(r.end);if(p!=-1){var m=a.getCurrentTokenRow(),g=a.getCurrentTokenColumn()+p;f=new c(m,g,m,g+r.end.length);break}h=a.stepForward()}f&&t.remove(f),u&&(t.remove(u),o=u.start.row,s=-r.start.length)}else s=r.start.length,o=i.start.row,t.insert(i.end,r.end),t.insert(i.start,r.start);d.start.row==o&&(d.start.column+=s),d.end.row==o&&(d.end.column+=s),t.selection.fromOrientedRange(d)}},this.getNextLineIndent=function(e,t,i){return this.$getIndent(t)},this.checkOutdent=function(e,t,i){return!1},this.autoOutdent=function(e,t,i){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);for(var i=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"],t=0;tthis.row)){var i=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(i.row,i.column,!0)}},this.setPosition=function(e,t,i){var n;if(n=i?{row:e,column:t}:this.$clipPositionToDocument(e,t),this.row!=n.row||this.column!=n.column){var r={row:this.row,column:this.column};this.row=n.row,this.column=n.column,this._signal("change",{old:r,value:n})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var i={};return e>=this.document.getLength()?(i.row=Math.max(0,this.document.getLength()-1),i.column=this.document.getLine(i.row).length):e<0?(i.row=0,i.column=0):(i.row=e,i.column=Math.min(this.document.getLine(i.row).length,Math.max(0,t))),t<0&&(i.column=0),i}}).call(o.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./apply_delta").applyDelta,o=e("./lib/event_emitter").EventEmitter,s=e("./range").Range,a=e("./anchor").Anchor,l=function(e){this.$lines=[""],0===e.length?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){n.implement(this,o),this.setValue=function(e){var t=this.getLength()-1;this.remove(new s(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new a(this,e,t)},0==="aaa".split(/a/).length?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){this.$newLineMode!==e&&(this.$newLineMode=e,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return"\r\n"==e||"\r"==e||"\n"==e},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var i=t.length-1;e.end.row-e.start.row==i&&(t[i]=t[i].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var i=this.clippedPos(e.row,e.column),n=this.pos(e.row,e.column+t.length);return this.applyDelta({start:i,end:n,action:"insert",lines:[t]},!0),this.clonePos(n)},this.clippedPos=function(e,t){var i=this.getLength();void 0===e?e=i:e<0?e=0:e>=i&&(e=i-1,t=void 0);var n=this.getLine(e);return void 0==t&&(t=n.length),t=Math.min(Math.max(t,0),n.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var i=0;e0,n=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){if(e instanceof s||(e=s.fromPoints(e.start,e.end)),0===t.length&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var i;return i=t?this.insert(e.start,t):e.start},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var i="insert"==e.action;(i?e.lines.length<=1&&!e.lines[0]:!s.comparePoints(e.start,e.end))||(i&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),r(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){for(var i=e.lines,n=i.length,r=e.start.row,o=e.start.column,s=0,a=0;;){s=a,a+=t-1;var l=i.slice(s,a);if(a>n){e.lines=l,e.start.row=r+s,e.start.column=o;break}l.push(""),this.applyDelta({start:this.pos(r+s,o),end:this.pos(r+a,o=0),action:e.action,lines:l},!0)}},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:"insert"==e.action?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){for(var i=this.$lines||this.getAllLines(),n=this.getNewLineCharacter().length,r=t||0,o=i.length;r20){i.running=setTimeout(i.$worker,20);break}}i.currentLine=t,o<=n&&i.fireUpdateEvent(o,n)}}};(function(){n.implement(this,r),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var i={first:e,last:t};this._signal("update",{data:i})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,i=e.end.row-t;if(0===i)this.lines[t]=null;else if("remove"==e.action)this.lines.splice(t,i+1,null),this.states.splice(t,i+1,null);else{var n=Array(i+1);n.unshift(t,1),this.lines.splice.apply(this.lines,n),this.states.splice.apply(this.states,n)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),i=this.states[e-1],n=this.tokenizer.getLineTokens(t,i,e);return this.states[e]+""!=n.state+""?(this.states[e]=n.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=n.tokens}}).call(o.prototype),t.BackgroundTokenizer=o}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,i){"use strict";var n=e("./lib/lang"),r=(e("./lib/oop"),e("./range").Range),o=function(e,t,i){this.setRegexp(e),this.clazz=t,this.type=i||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){this.regExp+""!=e+""&&(this.regExp=e,this.cache=[])},this.update=function(e,t,i,o){if(this.regExp)for(var s=o.firstRow,a=o.lastRow,l=s;l<=a;l++){var c=this.cache[l];null==c&&(c=n.getMatchOffsets(i.getLine(l),this.regExp),c.length>this.MAX_RANGES&&(c=c.slice(0,this.MAX_RANGES)),c=c.map(function(e){return new r(l,e.offset,l,e.offset+e.length)}),this.cache[l]=c.length?c:"");for(var h=c.length;h--;)t.drawSingleLineMarker(e,c[h].toScreenRange(i),this.clazz,o)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,i){"use strict";function n(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var i=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,i.end.row,i.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,i){var n,r,o,s=0,a=this.folds,l=!0;null==t&&(t=this.end.row,i=this.end.column);for(var c=0;c0)){var l=r(e,s.start);return 0===a?t&&0!==l?-o-2:o:l>0||0===l&&!t?o:-o-1}}return-o-1},this.add=function(e){var t=!e.isEmpty(),i=this.pointIndex(e.start,t);i<0&&(i=-i-1);var n=this.pointIndex(e.end,t,i);return n<0?n=-n-1:n++,this.ranges.splice(i,n-i,e)},this.addList=function(e){for(var t=[],i=e.length;i--;)t.push.apply(t,this.add(e[i]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return r(e.start,t.start)});for(var i,n=t[0],o=1;o=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var i=this.ranges;if(i[0].start.row>t||i[i.length-1].start.rown)break;if(h.start.row==n&&h.start.column>=t.column&&(h.start.column==t.column&&this.$insertRight||(h.start.column+=s,h.start.row+=o)),h.end.row==n&&h.end.column>=t.column){if(h.end.column==t.column&&this.$insertRight)continue;h.end.column==t.column&&s>0&&lh.start.column&&h.end.column==a[l+1].start.column&&(h.end.column-=s),h.end.column+=s,h.end.row+=o}}}if(0!=o&&l=e)return r;if(r.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var i=this.$foldData,n=0;for(t&&(n=i.indexOf(t)),n==-1&&(n=0),n;n=e)return r}return null},this.getFoldedRowCount=function(e,t){for(var i=this.$foldData,n=t-e+1,r=0;r=t){a=e?n-=t-a:n=0);break}s>=e&&(n-=a>=e?s-a:s-e+1)}return n},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var i,n=this.$foldData,r=!1;e instanceof s?i=e:(i=new s(t,e),i.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(i.range);var a=i.start.row,l=i.start.column,c=i.end.row,h=i.end.column;if(!(a0&&(this.removeFolds(f),f.forEach(function(e){i.addSubFold(e)}));for(var p=0;p0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var i,n;if(null==e?(i=new r(0,0,this.getLength(),0),t=!0):i="number"==typeof e?new r(e,0,e,this.getLine(e).length):"row"in e?r.fromPoints(e,e):e,n=this.getFoldsInRangeList(i),t)this.removeFolds(n);else for(var o=n;o.length;)this.expandFolds(o),o=this.getFoldsInRangeList(i);if(n.length)return n},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var i=this.getFoldLine(e,t);return i?i.end.row:e},this.getRowFoldStart=function(e,t){var i=this.getFoldLine(e,t);return i?i.start.row:e},this.getFoldDisplayLine=function(e,t,i,n,r){null==n&&(n=e.start.row),null==r&&(r=0),null==t&&(t=e.end.row),null==i&&(i=this.getLine(t).length);var o=this.doc,s="";return e.walk(function(e,t,i,a){if(!(t=e){r=o.end.row;try{var s=this.addFold("...",o);s&&(s.collapseChildren=i)}catch(e){}}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle!=e){this.$foldStyle=e,"manual"==e&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)}},this.$setFolding=function(e){if(this.$foldMode!=e){if(this.$foldMode=e,this.off("change",this.$updateFoldWidgets), +this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation"),!e||"manual"==this.$foldStyle)return void(this.foldWidgets=null);this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)}},this.getParentFoldRangeData=function(e,t){var i=this.foldWidgets;if(!i||t&&i[e])return{};for(var n,r=e-1;r>=0;){var o=i[r];if(null==o&&(o=i[r]=this.getFoldWidget(r)),"start"==o){var s=this.getFoldWidgetRange(r);if(n||(n=s),s&&s.end.row>=e)break}r--}return{range:r!==-1&&s,firstRange:n}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var i={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},n=this.$toggleFoldWidget(e,i);if(!n){var r=t.target||t.srcElement;r&&/ace_fold-widget/.test(r.className)&&(r.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(this.getFoldWidget){var i=this.getFoldWidget(e),n=this.getLine(e),r="end"===i?-1:1,o=this.getFoldAt(e,r===-1?0:n.length,r);if(o)return void(t.children||t.all?this.removeFold(o):this.expandFold(o));var s=this.getFoldWidgetRange(e,!0);if(s&&!s.isMultiLine()&&(o=this.getFoldAt(s.start.row,s.start.column,1),o&&s.isEqual(o.range)))return void this.removeFold(o);if(t.siblings){var a=this.getParentFoldRangeData(e);if(a.range)var l=a.range.start.row+1,c=a.range.end.row;this.foldAll(l,c,t.all?1e4:0)}else t.children?(c=s?s.end.row:this.getLength(),this.foldAll(e+1,c,t.all?1e4:0)):s&&(t.all&&(s.collapseChildren=1e4),this.addFold("...",s));return s}},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var i=this.$toggleFoldWidget(t,{});if(!i){var n=this.getParentFoldRangeData(t,!0);if(i=n.range||n.firstRange){t=i.start.row;var r=this.getFoldAt(t,this.getLine(t).length,1);r?this.removeFold(r):this.addFold("...",i)}}},this.updateFoldWidgets=function(e){var t=e.start.row,i=e.end.row-t;if(0===i)this.foldWidgets[t]=null;else if("remove"==e.action)this.foldWidgets.splice(t,i+1,null);else{var n=Array(i+1);n.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,n)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,o=e("./fold_line").FoldLine,s=e("./fold").Fold,a=e("../token_iterator").TokenIterator;t.Folding=n}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,i){"use strict";function n(){this.findMatchingBracket=function(e,t){if(0==e.column)return null;var i=t||this.getLine(e.row).charAt(e.column-1);if(""==i)return null;var n=i.match(/([\(\[\{])|([\)\]\}])/);return n?n[1]?this.$findClosingBracket(n[1],e):this.$findOpeningBracket(n[2],e):null},this.getBracketRange=function(e){var t,i=this.getLine(e.row),n=!0,r=i.charAt(e.column-1),s=r&&r.match(/([\(\[\{])|([\)\]\}])/);if(s||(r=i.charAt(e.column),e={row:e.row,column:e.column+1},s=r&&r.match(/([\(\[\{])|([\)\]\}])/),n=!1),!s)return null;if(s[1]){var a=this.$findClosingBracket(s[1],e);if(!a)return null;t=o.fromPoints(e,a),n||(t.end.column++,t.start.column--),t.cursor=t.end}else{var a=this.$findOpeningBracket(s[2],e);if(!a)return null;t=o.fromPoints(a,e),n||(t.start.column++,t.end.column--),t.cursor=t.start}return t},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,i){var n=this.$brackets[e],o=1,s=new r(this,t.row,t.column),a=s.getCurrentToken();if(a||(a=s.stepForward()),a){i||(i=new RegExp("(\\.?"+a.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));for(var l=t.column-s.getCurrentTokenColumn()-2,c=a.value;;){for(;l>=0;){var h=c.charAt(l);if(h==n){if(o-=1,0==o)return{row:s.getCurrentTokenRow(),column:l+s.getCurrentTokenColumn()}}else h==e&&(o+=1);l-=1}do a=s.stepBackward();while(a&&!i.test(a.type));if(null==a)break;c=a.value,l=c.length-1}return null}},this.$findClosingBracket=function(e,t,i){var n=this.$brackets[e],o=1,s=new r(this,t.row,t.column),a=s.getCurrentToken();if(a||(a=s.stepForward()),a){i||(i=new RegExp("(\\.?"+a.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));for(var l=t.column-s.getCurrentTokenColumn();;){for(var c=a.value,h=c.length;l=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510)}n.implement(this,s),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e)return this.$docRowCache=[],void(this.$screenRowCache=[]);var t=this.$docRowCache.length,i=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>i&&(this.$docRowCache.splice(i,t),this.$screenRowCache.splice(i,t))},this.$getRowCacheIndex=function(e,t){for(var i=0,n=e.length-1;i<=n;){var r=i+n>>1,o=e[r];if(t>o)i=r+1;else{if(!(t=t));o++);return(i=n[o])?(i.index=o,i.start=r-i.value.length,i):null},this.setUndoManager=function(e){if(this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel(),e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=r.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?r.stringRepeat(" ",this.getTabSize()):"\t"},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(n=!!i.charAt(t-1).match(this.tokenRe)),n||(n=!!i.charAt(t).match(this.tokenRe)),n)var r=this.tokenRe;else if(/^\s+$/.test(i.slice(t-1,t+1)))var r=/\s/;else var r=this.nonTokenRe;var o=t;if(o>0){do o--;while(o>=0&&i.charAt(o).match(r));o++}for(var s=t;se&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){if(this.$modified=!1,this.$useWrapMode)return this.screenWidth=this.$wrapLimit;for(var t=this.doc.getAllLines(),i=this.$rowLengthCache,n=0,r=0,o=this.$foldData[r],s=o?o.start.row:1/0,a=t.length,l=0;ls){if(l=o.end.row+1,l>=a)break;o=this.$foldData[r++],s=o?o.start.row:1/0}null==i[l]&&(i[l]=this.$getStringScreenWidth(t[l])[0]),i[l]>n&&(n=i[l])}this.screenWidth=n}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var i=null,n=e.length-1;n!=-1;n--){var r=e[n];"doc"==r.group?(this.doc.revertDeltas(r.deltas),i=this.$getUndoSelection(r.deltas,!0,i)):r.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,i&&this.$undoSelect&&!t&&this.selection.setSelectionRange(i),i}},this.redoChanges=function(e,t){if(e.length){this.$fromUndo=!0;for(var i=null,n=0;ne.end.column&&(o.start.column+=a),o.end.row==e.end.row&&o.end.column>e.end.column&&(o.end.column+=a)),s&&o.start.row>=e.end.row&&(o.start.row+=s,o.end.row+=s)}if(o.end=this.insert(o.start,n),r.length){var l=e.start,h=o.start,s=h.row-l.row,a=h.column-l.column;this.addFolds(r.map(function(e){return e=e.clone(),e.start.row==l.row&&(e.start.column+=a),e.end.row==l.row&&(e.end.column+=a),e.start.row+=s,e.end.row+=s,e}))}return o},this.indentRows=function(e,t,i){i=i.replace(/\t/g,this.getTabString());for(var n=e;n<=t;n++)this.doc.insertInLine({row:n,column:0},i)},this.outdentRows=function(e){for(var t=e.collapseRows(),i=new c(0,0,0,0),n=this.getTabSize(),r=t.start.row;r<=t.end.row;++r){var o=this.getLine(r);i.start.row=r,i.end.row=r;for(var s=0;s0){var n=this.getRowFoldEnd(t+i);if(n>this.doc.getLength()-1)return 0;var r=n-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var r=t-e+1}var o=new c(e,0,t,Number.MAX_VALUE),s=this.getFoldsInRange(o).map(function(e){return e=e.clone(),e.start.row+=r,e.end.row+=r,e}),a=0==i?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+r,a),s.length&&this.addFolds(s),r},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){if(t=Math.max(0,t),e<0)e=0,t=0;else{var i=this.doc.getLength();e>=i?(e=i-1,t=this.doc.getLine(i-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){if(this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0),e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){this.$wrapLimitRange.min===e&&this.$wrapLimitRange.max===t||(this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode"))},this.adjustWrapLimit=function(e,t){var i=this.$wrapLimitRange;i.max<0&&(i={min:t,max:t});var n=this.$constrainWrapLimit(e,i.min,i.max);return n!=this.$wrapLimit&&n>1&&(this.$wrapLimit=n,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0)},this.$constrainWrapLimit=function(e,t,i){return t&&(e=Math.max(t,e)),i&&(e=Math.min(i,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,i=e.action,n=e.start,r=e.end,o=n.row,s=r.row,a=s-o,l=null;if(this.$updating=!0,0!=a)if("remove"===i){this[t?"$wrapData":"$rowLengthCache"].splice(o,a);var c=this.$foldData;l=this.getFoldsInRange(e),this.removeFolds(l);var h=this.getFoldLine(r.row),d=0;if(h){h.addRemoveChars(r.row,r.column,n.column-r.column),h.shiftRow(-a);var u=this.getFoldLine(o);u&&u!==h&&(u.merge(h),h=u),d=c.indexOf(h)+1}for(d;d=r.row&&h.shiftRow(-a)}s=o}else{var f=Array(a);f.unshift(o,0);var p=t?this.$wrapData:this.$rowLengthCache;p.splice.apply(p,f);var c=this.$foldData,h=this.getFoldLine(o),d=0;if(h){var m=h.range.compareInside(n.row,n.column);0==m?(h=h.split(n.row,n.column),h&&(h.shiftRow(a),h.addRemoveChars(s,0,r.column-n.column))):m==-1&&(h.addRemoveChars(o,0,r.column-n.column),h.shiftRow(a)),d=c.indexOf(h)+1}for(d;d=o&&h.shiftRow(a)}}else{a=Math.abs(e.start.column-e.end.column),"remove"===i&&(l=this.getFoldsInRange(e),this.removeFolds(l),a=-a);var h=this.getFoldLine(o);h&&h.addRemoveChars(o,n.column,a)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(o,s):this.$updateRowLengthCache(o,s),l},this.$updateRowLengthCache=function(e,t,i){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var i,n,r=this.doc.getAllLines(),o=this.getTabSize(),s=this.$wrapData,l=this.$wrapLimit,c=e;for(t=Math.min(t,r.length-1);c<=t;)n=this.getFoldLine(c,n),n?(i=[],n.walk(function(e,t,n,o){var s;if(null!=e){s=this.$getDisplayTokens(e,i.length),s[0]=a;for(var l=1;lt-w;){var b=c+t-w;if(e[b-1]>=p&&e[b]>=p)o(b);else if(e[b]!=a&&e[b]!=h){for(var A=Math.max(b-(t-(t>>2)),c-1);b>A&&e[b]A&&e[b]A&&e[b]==f;)b--}else for(;b>A&&e[b]A?o(++b):(b=c+t,e[b]==i&&b--,o(b-w))}else{for(b;b!=c-1&&e[b]!=a;b--);if(b>c){o(b);continue}for(b=c+t;b39&&l<48||l>57&&l<64?s.push(f):l>=4352&&e(l)?s.push(t,i):s.push(t)}return s},this.$getStringScreenWidth=function(t,i,n){if(0==i)return[0,0];null==i&&(i=1/0),n=n||0;var r,o;for(o=0;o=4352&&e(r)?2:1,!(n>i));o++);return[n,o]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.getRowLineCount=function(e){return this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1:1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),i=this.$wrapData[t.row];return i.length&&i[0]=0)var s=l[c],r=this.$docRowCache[c],d=e>l[h-1];else var d=!h;for(var u=this.getLength()-1,f=this.getNextFoldLine(r),p=f?f.start.row:1/0;s<=e&&(a=this.getRowLength(r),!(s+a>e||r>=u));)s+=a,r++,r>p&&(r=f.end.row+1,f=this.getNextFoldLine(r,f),p=f?f.start.row:1/0),d&&(this.$docRowCache.push(r),this.$screenRowCache.push(s));if(f&&f.start.row<=r)i=this.getFoldDisplayLine(f),r=f.start.row;else{if(s+a<=e||r>u)return{row:u,column:this.getLine(u).length};i=this.getLine(r),f=null}var m=0;if(this.$useWrapMode){var g=this.$wrapData[r];if(g){var v=Math.floor(e-s);n=g[v],v>0&&g.length&&(m=g.indent,o=g[v-1]||g[g.length-1],i=i.substring(o))}}return o+=this.$getStringScreenWidth(i,t-m)[1],this.$useWrapMode&&o>=n&&(o=n-1),f?f.idxToPosition(o):{row:r,column:o}},this.documentToScreenPosition=function(e,t){if("undefined"==typeof t)var i=this.$clipPositionToDocument(e.row,e.column);else i=this.$clipPositionToDocument(e,t);e=i.row,t=i.column;var n=0,r=null,o=null;o=this.getFoldAt(e,t,1),o&&(e=o.start.row,t=o.start.column);var s,a=0,l=this.$docRowCache,c=this.$getRowCacheIndex(l,e),h=l.length;if(h&&c>=0)var a=l[c],n=this.$screenRowCache[c],d=e>l[h-1];else var d=!h;for(var u=this.getNextFoldLine(a),f=u?u.start.row:1/0;a=f){if(s=u.end.row+1,s>e)break;u=this.getNextFoldLine(s,u),f=u?u.start.row:1/0}else s=a+1;n+=this.getRowLength(a),a=s,d&&(this.$docRowCache.push(a),this.$screenRowCache.push(n))}var p="";u&&a>=f?(p=this.getFoldDisplayLine(u,e,t),r=u.start.row):(p=this.getLine(e).substring(0,t),r=e);var m=0;if(this.$useWrapMode){var g=this.$wrapData[r];if(g){for(var v=0;p.length>=g[v];)n++,v++;p=p.substring(g[v-1]||0,p.length),m=v>0?g.indent:0}}return{row:n,column:m+this.$getStringScreenWidth(p)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(this.$useWrapMode)for(var i=this.$wrapData.length,n=0,r=0,t=this.$foldData[r++],o=t?t.start.row:1/0;no&&(n=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:1/0)}else{e=this.getLength();for(var a=this.$foldData,r=0;ri));o++);return[n,o]})},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(f.prototype),e("./edit_session/folding").Folding.call(f.prototype),e("./edit_session/bracket_match").BracketMatch.call(f.prototype),o.defineOptions(f.prototype,"session",{wrap:{set:function(e){if(e&&"off"!=e?"free"==e?e=!0:"printMargin"==e?e=-1:"string"==typeof e&&(e=parseInt(e,10)||!1):e=!1,this.$wrap!=e)if(this.$wrap=e,e){var t="number"==typeof e?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}else this.setUseWrapMode(!1)},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e="auto"==e?"text"!=this.$mode.type:"text"!=e,e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){isNaN(e)||this.$tabSize===e||(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=f}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,i){"use strict";var n=e("./lib/lang"),r=e("./lib/oop"),o=e("./range").Range,s=function(){this.$options={}};(function(){this.set=function(e){return r.mixin(this.$options,e),this},this.getOptions=function(){return n.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,i=this.$matchIterator(e,t);if(!i)return!1;var n=null;return i.forEach(function(e,i,r){if(e.start)n=e;else{var s=e.offset+(r||0);if(n=new o(i,s,i,s+e.length),!e.length&&t.start&&t.start.start&&0!=t.skipCurrent&&n.isEqual(t.start))return n=null,!1}return!0}),n},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var i=t.range,r=i?e.getLines(i.start.row,i.end.row):e.doc.getAllLines(),s=[],a=t.re;if(t.$isMultiLine){var l,c=a.length,h=r.length-c;e:for(var d=a.offset||0;d<=h;d++){for(var u=0;um||(s.push(l=new o(d,m,d+c-1,g)),c>2&&(d=d+c-2))}}else for(var v=0;vA&&s[u].end.row==i.end.row;)u--;for(s=s.slice(v,u+1),v=0,u=s.length;v=0;a--)if(r(s[a],t,o))return!0};else var a=function(e,t,o){for(var s=n.getMatchOffsets(e,i),a=0;a=s;n--)if(i(e.getLine(n),n))return;if(0!=t.wrap)for(n=a,s=o.row;n>=s;n--)if(i(e.getLine(n),n))return}}:function(i){var n=o.row,r=e.getLine(n).substr(o.column);if(!i(r,n,o.column)){for(n+=1;n<=a;n++)if(i(e.getLine(n),n))return;if(0!=t.wrap)for(n=s,a=o.row;n<=a;n++)if(i(e.getLine(n),n))return}};return{forEach:l}}}).call(s.prototype),t.Search=s}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,i){"use strict";function n(e,t){this.platform=t||(s.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function r(e,t){n.call(this,e,t),this.$singleCommand=!1}var o=e("../lib/keys"),s=e("../lib/useragent"),a=o.KEY_MODS;r.prototype=n.prototype,function(){function e(e){return"object"==typeof e&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var i=e&&("string"==typeof e?e:e.name);e=this.commands[i],t||delete this.commands[i];var n=this.commandKeyBinding;for(var r in n){var o=n[r];if(o==e)delete n[r];else if(Array.isArray(o)){var s=o.indexOf(e);s!=-1&&(o.splice(s,1),1==o.length&&(n[r]=o[0]))}}},this.bindKey=function(e,t,i){if("object"==typeof e&&e&&(void 0==i&&(i=e.position),e=e[this.platform]),e)return"function"==typeof t?this.addCommand({exec:t,bindKey:e,name:t.name||e}):void e.split("|").forEach(function(e){var n="";if(e.indexOf(" ")!=-1){var r=e.split(/\s+/);e=r.pop(),r.forEach(function(e){var t=this.parseKeys(e),i=a[t.hashId]+t.key;n+=(n?" ":"")+i,this._addCommandToBinding(n,"chainKeys")},this),n+=" "}var o=this.parseKeys(e),s=a[o.hashId]+o.key;this._addCommandToBinding(n+s,t,i)},this)},this._addCommandToBinding=function(t,i,n){var r,o=this.commandKeyBinding;if(i)if(!o[t]||this.$singleCommand)o[t]=i;else{Array.isArray(o[t])?(r=o[t].indexOf(i))!=-1&&o[t].splice(r,1):o[t]=[o[t]],"number"!=typeof n&&(n=n||i.isDefault?-100:e(i));var s=o[t];for(r=0;rn)break}s.splice(r,0,i)}else delete o[t]},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var i=e[t];if(i){if("string"==typeof i)return this.bindKey(i,t);"function"==typeof i&&(i={exec:i}),"object"==typeof i&&(i.name||(i.name=t),this.addCommand(i))}},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),i=t.pop(),n=o[i];if(o.FUNCTION_KEYS[n])i=o.FUNCTION_KEYS[n].toLowerCase();else{if(!t.length)return{key:i,hashId:-1};if(1==t.length&&"shift"==t[0])return{key:i.toUpperCase(),hashId:-1}}for(var r=0,s=t.length;s--;){var a=o.KEY_MODS[t[s]];if(null==a)return"undefined"!=typeof console&&console.error("invalid modifier "+t[s]+" in "+e),!1;r|=a}return{key:i,hashId:r}},this.findKeyCommand=function(e,t){var i=a[e]+t;return this.commandKeyBinding[i]},this.handleKeyboard=function(e,t,i,n){if(!(n<0)){var r=a[t]+i,o=this.commandKeyBinding[r];return e.$keyChain&&(e.$keyChain+=" "+r,o=this.commandKeyBinding[e.$keyChain]||o),!o||"chainKeys"!=o&&"chainKeys"!=o[o.length-1]?(e.$keyChain&&(t&&4!=t||1!=i.length?(t==-1||n>0)&&(e.$keyChain=""):e.$keyChain=e.$keyChain.slice(0,-r.length-1)),{command:o}):(e.$keyChain=e.$keyChain||r,{command:"null"})}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(n.prototype),t.HashHandler=n,t.MultiHashHandler=r}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("../lib/oop"),r=e("../keyboard/hash_handler").MultiHashHandler,o=e("../lib/event_emitter").EventEmitter,s=function(e,t){r.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};n.inherits(s,r),function(){n.implement(this,o),this.exec=function(e,t,i){if(Array.isArray(e)){for(var n=e.length;n--;)if(this.exec(e[n],t,i))return!0;return!1}if("string"==typeof e&&(e=this.commands[e]),!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var r={editor:t,command:e,args:i};return r.returnValue=this._emit("exec",r),this._signal("afterExec",r),r.returnValue!==!1},this.toggleRecording=function(e){if(!this.$inReplay)return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(!this.$inReplay&&this.macro){if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){"string"==typeof t?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}}},this.trimMacro=function(e){return e.map(function(e){return"string"!=typeof e[0]&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(s.prototype),t.CommandManager=s}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,i){"use strict";function n(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),o=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:n("Ctrl-,","Command-,"),exec:function(e){o.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:n("Alt-E","Ctrl-E"),exec:function(e){o.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:n("Alt-Shift-E","Ctrl-Shift-E"),exec:function(e){o.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:n("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:n(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:n("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:n("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:n("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:n("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:n("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:n(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:n("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:n("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:n("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:n("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:n("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:n("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:n("Ctrl-F","Command-F"),exec:function(e){o.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:n("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:n("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:n("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:n("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:n("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:n("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:n("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:n("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:n("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:n("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:n("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:n("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:n("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:n("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:n("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:n("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:n("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:n("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:n("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:n("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:n(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:n("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:n(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:n("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:n("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:n("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:n("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:n("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:n("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:n("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:n(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:n("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:n("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:n("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:n("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:n("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:n("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:n("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:n("Ctrl-H","Command-Option-F"),exec:function(e){o.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:n("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:n("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:n("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:n("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:n("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:n("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:n("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:n("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:n("Shift-Delete",null),exec:function(e){return!!e.selection.isEmpty()&&void e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:n("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:n("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:n("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:n("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:n("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:n("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:n("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:n("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:n(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:n("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:n("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:n("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:n("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:n(null,null),exec:function(e){for(var t=e.selection.isBackwards(),i=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),n=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(i.row).length,a=e.session.doc.getTextRange(e.selection.getRange()),l=a.replace(/\n\s*/," ").length,c=e.session.doc.getLine(i.row),h=i.row+1;h<=n.row+1;h++){var d=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(h)));0!==d.length&&(d=" "+d),c+=d}n.row+10?(e.selection.moveCursorTo(i.row,i.column),e.selection.selectTo(i.row,i.column+l)):(o=e.session.doc.getLine(i.row).length>o?o+1:o,e.selection.moveCursorTo(i.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:n(null,null),exec:function(e){var t=e.session.doc.getLength()-1,i=e.session.doc.getLine(t).length,n=e.selection.rangeList.ranges,r=[];n.length<1&&(n=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var i=t&&t.scrollIntoView;if(i){switch(i){case"center-animate":i="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var n=this.selection.getRange(),r=this.renderer.layerConfig;(n.start.row>=r.lastRow||n.end.row<=r.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead)}"animate"==i&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(this.$mergeUndoDeltas){var t=this.prevOp,i=this.$mergeableCommands,n=t.command&&e.command.name==t.command.name;if("insertstring"==e.command.name){var r=e.args;void 0===this.mergeNextCommand&&(this.mergeNextCommand=!0),n=n&&this.mergeNextCommand&&(!/\s/.test(r)||/\s/.test(t.args)),this.mergeNextCommand=!0}else n=n&&i.indexOf(e.command.name)!==-1;"always"!=this.$mergeUndoDeltas&&Date.now()-this.sequenceStartTime>2e3&&(n=!1),n?this.session.mergeUndoDeltas=!0:i.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())}},this.setKeyboardHandler=function(e,t){if(e&&"string"==typeof e){this.$keybindingId=e;var i=this;v.loadModule(["keybinding",e],function(n){i.$keybindingId==e&&i.keyBinding.setKeyboardHandler(n&&n.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session!=e){this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var i=this.session.getSelection();i.off("changeCursor",this.$onCursorChange),i.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})}},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?1==t?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||r.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){if(this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null),!this.$highlightPending){var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(t&&t.bgTokenizer){ +var i=t.findMatchingBracket(e.getCursorPosition());if(i)var n=new f(i.row,i.column,i.row,i.column+1);else if(t.$mode.getMatching)var n=t.$mode.getMatching(e.session);n&&(t.$bracketHighlight=t.addMarker(n,"ace_bracket","text"))}},50)}},this.$highlightTags=function(){if(!this.$highlightTagPending){var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(t&&t.bgTokenizer){var i=e.getCursorPosition(),n=new y(e.session,i.row,i.column),r=n.getCurrentToken();if(!r||!/\b(?:tag-open|tag-name)/.test(r.type))return t.removeMarker(t.$tagHighlight),void(t.$tagHighlight=null);if(r.type.indexOf("tag-open")==-1||(r=n.stepForward())){var o=r.value,s=0,a=n.stepBackward();if("<"==a.value){do a=r,r=n.stepForward(),r&&r.value===o&&r.type.indexOf("tag-name")!==-1&&("<"===a.value?s++:"=0)}else{do r=a,a=n.stepBackward(),r&&r.value===o&&r.type.indexOf("tag-name")!==-1&&("<"===a.value?s++:"1||(e=!1)),t.$highlightLineMarker&&!e)t.removeMarker(t.$highlightLineMarker.id),t.$highlightLineMarker=null;else if(!t.$highlightLineMarker&&e){var i=new f(e.row,e.column,e.row,1/0);i.id=t.addMarker(i,"ace_active-line","screenLine"),t.$highlightLineMarker=i}else e&&(t.$highlightLineMarker.start.row=e.row,t.$highlightLineMarker.end.row=e.row,t.$highlightLineMarker.start.column=e.column,t._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;if(t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null,this.selection.isEmpty())this.$updateHighlightActiveLine();else{var i=this.selection.getRange(),n=this.getSelectionStyle();t.$selectionMarker=t.addMarker(i,"ace_selection",n)}var r=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(r),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(!t.isEmpty()&&!t.isMultiLine()){var i=t.start.column-1,n=t.end.column+1,r=e.getLine(t.start.row),o=r.length,s=r.substring(Math.max(i,0),Math.min(n,o));if(!(i>=0&&/^[\w\d]/.test(s)||n<=o&&/[\w\d]$/.test(s))&&(s=r.substring(t.start.column,t.end.column),/^[\w\d]+$/.test(s))){var a=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s});return a}}},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var i={text:e,event:t};this.commands.exec("paste",this,i)},this.$handlePaste=function(e){"string"==typeof e&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var i=t.split(/\r\n|\r|\n/),n=this.selection.rangeList.ranges;if(i.length>n.length||i.length<2||!i[1])return this.commands.exec("insertstring",this,t);for(var r=n.length;r--;){var o=n[r];o.isEmpty()||this.session.remove(o),this.session.insert(o.start,i[r])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var i=this.session,n=i.getMode(),r=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var o=n.transformAction(i.getState(r.row),"insertion",this,i,e);o&&(e!==o.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=o.text)}if("\t"==e&&(e=this.session.getTabString()),this.selection.isEmpty()){if(this.session.getOverwrite()){var s=new f.fromPoints(r,r);s.end.column+=e.length,this.session.remove(s)}}else{var s=this.getSelectionRange();r=this.session.remove(s),this.clearSelection()}if("\n"==e||"\r\n"==e){var a=i.getLine(r.row);if(r.column>a.search(/\S|$/)){var l=a.substr(r.column).search(/\S|$/);i.doc.removeInLine(r.row,r.column,r.column+l)}}this.clearSelection();var c=r.column,h=i.getState(r.row),a=i.getLine(r.row),d=n.checkOutdent(h,a,e);if(i.insert(r,e),o&&o.selection&&(2==o.selection.length?this.selection.setSelectionRange(new f(r.row,c+o.selection[0],r.row,c+o.selection[1])):this.selection.setSelectionRange(new f(r.row+o.selection[0],o.selection[1],r.row+o.selection[2],o.selection[3]))),i.getDocument().isNewLine(e)){var u=n.getNextLineIndent(h,a.slice(0,r.column),i.getTabString());i.insert({row:r.row+1,column:0},u)}d&&n.autoOutdent(h,i,r.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,i){this.keyBinding.onCommandKey(e,t,i)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&("left"==e?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var i=this.session,n=i.getState(t.start.row),r=i.getMode().transformAction(n,"deletion",this,i,t);if(0===t.end.column){var o=i.getTextRange(t);if("\n"==o[o.length-1]){var s=i.getLine(t.end.row);/^\s+$/.test(s)&&(t.end.column=s.length)}}r&&(t=r)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(this.selection.isEmpty()){var e=this.getCursorPosition(),t=e.column;if(0!==t){var i,n,r=this.session.getLine(e.row);tt.toLowerCase()?1:0});for(var n=new f(0,0,0,0),r=e.first;r<=e.last;r++){var o=t.getLine(r);n.start.row=r,n.end.row=r,n.end.column=o.length,t.replace(n,i[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),i=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,i,e)},this.getNumberAt=function(e,t){var i=/[\-]?[0-9]+(?:\.[0-9]+)?/g;i.lastIndex=0;for(var n=this.session.getLine(e);i.lastIndex=t){var o={value:r[0],start:r.index,end:r.index+r[0].length};return o}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,i=this.selection.getCursor().column,n=new f(t,i-1,t,i),r=this.session.getTextRange(n);if(!isNaN(parseFloat(r))&&isFinite(r)){var o=this.getNumberAt(t,i);if(o){var s=o.value.indexOf(".")>=0?o.start+o.value.indexOf(".")+1:o.end,a=o.start+o.value.length-s,l=parseFloat(o.value);l*=Math.pow(10,a),e*=s!==o.end&&if+1)break;f=p.last}for(h--,a=this.session.$moveLines(u,f,t?0:e),t&&e==-1&&(d=h+1);d<=h;)s[d].moveBy(a,0),d++;t||(a=0),l+=a}r.fromOrientedRange(r.ranges[0]),r.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var i=this.renderer,n=this.renderer.layerConfig,r=e*Math.floor(n.height/n.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(r,0)}):t===!1&&(this.selection.moveCursorBy(r,0),this.selection.clearSelection()),this.$blockScrolling--;var o=i.scrollTop;i.scrollBy(0,r*n.lineHeight),null!=t&&i.scrollCursorIntoView(null,.5),i.animateScrolling(o)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,i,n){this.renderer.scrollToLine(e,t,i,n)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var i=this.getCursorPosition(),n=new y(this.session,i.row,i.column),r=n.getCurrentToken(),o=r||n.stepForward();if(o){var s,a,l=!1,c={},h=i.column-o.start,d={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(o.value.match(/[{}()\[\]]/g)){for(;h=0;--o)this.$tryReplace(i[o],e)&&n++;return this.selection.setSelectionRange(r),this.$blockScrolling-=1,n},this.$tryReplace=function(e,t){var i=this.session.getTextRange(e);return t=this.$search.replace(i,t),null!==t?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,i){t||(t={}),"string"==typeof e||e instanceof RegExp?t.needle=e:"object"==typeof e&&n.mixin(t,e);var r=this.selection.getRange();null==t.needle&&(e=this.session.getTextRange(r)||this.$search.$options.needle,e||(r=this.session.getWordRange(r.start.row,r.start.column),e=this.session.getTextRange(r)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:r});var o=this.$search.find(this.session);return t.preventScroll?o:o?(this.revealRange(o,i),o):(t.backwards?r.start=r.end:r.end=r.start,void this.selection.setRange(r))},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var i=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(i)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(e){var t,i=this,n=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var r=this.$scrollAnchor;r.style.cssText="position:absolute",this.container.insertBefore(r,this.container.firstChild);var o=this.on("changeSelection",function(){n=!0}),s=this.renderer.on("beforeRender",function(){n&&(t=i.renderer.container.getBoundingClientRect())}),a=this.renderer.on("afterRender",function(){if(n&&t&&(i.isFocused()||i.searchBox&&i.searchBox.isFocused())){var e=i.renderer,o=e.$cursorLayer.$pixelPos,s=e.layerConfig,a=o.top-s.offset;n=o.top>=0&&a+t.top<0||!(o.topwindow.innerHeight)&&null,null!=n&&(r.style.top=a+"px",r.style.left=o.left+"px",r.style.height=s.lineHeight+"px",r.scrollIntoView(n)),n=t=null}});this.setAutoScrollEditorIntoView=function(e){e||(delete this.setAutoScrollEditorIntoView,this.off("changeSelection",o),this.renderer.off("afterRender",a),this.renderer.off("beforeRender",s))}}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;t&&(t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&"wide"!=e,r.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e)))}}).call(w.prototype),v.defineOptions(w.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=w}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,i){"use strict";var n=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:1==e.lines.length?null:e.lines,text:1==e.lines.length?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function i(e,t){for(var i=new Array(e.length),n=0;n0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return 0===this.dirtyCounter},this.$serializeDeltas=function(t){return i(t,e)},this.$deserializeDeltas=function(e){return i(e,t)}}).call(n.prototype),t.UndoManager=n}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("../lib/dom"),r=e("../lib/oop"),o=e("../lib/lang"),s=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=n.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){r.implement(this,s),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;ts&&(m=o.end.row+1,o=t.getNextFoldLine(m,o),s=o?o.start.row:1/0),m>r){for(;this.$cells.length>p+1;)f=this.$cells.pop(),this.element.removeChild(f.element);break}f=this.$cells[++p],f||(f={element:null,textNode:null,foldWidget:null},f.element=n.createElement("div"),f.textNode=document.createTextNode(""),f.element.appendChild(f.textNode),this.element.appendChild(f.element),this.$cells[p]=f);var g="ace_gutter-cell ";l[m]&&(g+=l[m]),c[m]&&(g+=c[m]),this.$annotations[m]&&(g+=this.$annotations[m].className),f.element.className!=g&&(f.element.className=g);var v=t.getRowLength(m)*e.lineHeight+"px";if(v!=f.element.style.height&&(f.element.style.height=v),a){var y=a[m];null==y&&(y=a[m]=t.getFoldWidget(m))}if(y){f.foldWidget||(f.foldWidget=n.createElement("span"),f.element.appendChild(f.foldWidget));var g="ace_fold-widget ace_"+y;g+="start"==y&&m==s&&mi.right-t.right?"foldWidgets":void 0}}).call(a.prototype),t.Gutter=a}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,i){"use strict";var n=e("../range").Range,r=e("../lib/dom"),o=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,i,n){return(e?1:0)|(t?2:0)|(i?4:0)|(n?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(e){this.config=e;var t=[];for(var i in this.markers){var n=this.markers[i];if(n.range){var r=n.range.clipRows(e.firstRow,e.lastRow);if(!r.isEmpty())if(r=r.toScreenRange(this.session),n.renderer){var o=this.$getTop(r.start.row,e),s=this.$padding+r.start.column*e.characterWidth;n.renderer(t,r,s,o,e)}else"fullLine"==n.type?this.drawFullLineMarker(t,r,n.clazz,e):"screenLine"==n.type?this.drawScreenLineMarker(t,r,n.clazz,e):r.isMultiLine()?"text"==n.type?this.drawTextMarker(t,r,n.clazz,e):this.drawMultiLineMarker(t,r,n.clazz,e):this.drawSingleLineMarker(t,r,n.clazz+" ace_start ace_br15",e)}else n.update(t,this,this.session,e)}this.element.innerHTML=t.join("")}},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,i,r,o,s){for(var a=this.session,l=i.start.row,c=i.end.row,h=l,d=0,u=0,f=a.getScreenLastRowColumn(h),p=new n(h,i.start.column,h,u);h<=c;h++)p.start.row=p.end.row=h,p.start.column=h==l?i.start.column:a.getRowWrapIndent(h),p.end.column=f,d=u,u=f,f=h+1f,h==c),o,h==c?0:1,s)},this.drawMultiLineMarker=function(e,t,i,n,r){var o=this.$padding,s=n.lineHeight,a=this.$getTop(t.start.row,n),l=o+t.start.column*n.characterWidth;r=r||"",e.push("
"),a=this.$getTop(t.end.row,n);var c=t.end.column*n.characterWidth;if(e.push("
"),s=(t.end.row-t.start.row-1)*n.lineHeight,!(s<=0)){a=this.$getTop(t.start.row+1,n);var h=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")}},this.drawSingleLineMarker=function(e,t,i,n,r,o){var s=n.lineHeight,a=(t.end.column+(r||0)-t.start.column)*n.characterWidth,l=this.$getTop(t.start.row,n),c=this.$padding+t.start.column*n.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,i,n,r){var o=this.$getTop(t.start.row,n),s=n.lineHeight;t.start.row!=t.end.row&&(s+=this.$getTop(t.end.row,n)-o),e.push("
")},this.drawScreenLineMarker=function(e,t,i,n,r){var o=this.$getTop(t.start.row,n),s=n.lineHeight;e.push("
")}}).call(o.prototype),t.Marker=o}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("../lib/oop"),r=e("../lib/dom"),o=e("../lib/lang"),s=(e("../lib/useragent"),e("../lib/event_emitter").EventEmitter),a=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){n.implement(this,s),this.EOF_CHAR="¶",this.EOL_CHAR_LF="¬",this.EOL_CHAR_CRLF="¤",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="—",this.SPACE_CHAR="·",this.$padding=0,this.$updateEolChar=function(){var e="\n"==this.session.doc.getNewLineCharacter()?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles!=e&&(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides!=e&&(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;for(var t=this.$tabStrings=[0],i=1;i"+o.stringRepeat(this.TAB_CHAR,i)+""):t.push(o.stringRepeat(" ",i));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var n="ace_indent-guide",r="",s="";if(this.showInvisibles){n+=" ace_invisible",r=" ace_invisible_space",s=" ace_invisible_tab";var a=o.stringRepeat(this.SPACE_CHAR,this.tabSize),l=o.stringRepeat(this.TAB_CHAR,this.tabSize)}else var a=o.stringRepeat(" ",this.tabSize),l=a;this.$tabStrings[" "]=""+a+"",this.$tabStrings["\t"]=""+l+""}},this.updateLines=function(e,t,i){this.config.lastRow==e.lastRow&&this.config.firstRow==e.firstRow||this.scrollLines(e),this.config=e;for(var n=Math.max(t,e.firstRow),r=Math.min(i,e.lastRow),o=this.element.childNodes,s=0,a=e.firstRow;ac&&(a=l.end.row+1,l=this.session.getNextFoldLine(a,l),c=l?l.start.row:1/0),!(a>r);){var h=o[s++];if(h){var d=[];this.$renderLine(d,a,!this.$useLineGroups(),a==c&&l),h.style.height=e.lineHeight*this.session.getRowLength(a)+"px",h.innerHTML=d.join("")}a++}},this.scrollLines=function(e){var t=this.config;if(this.config=e,!t||t.lastRow0;n--)i.removeChild(i.firstChild);if(t.lastRow>e.lastRow)for(var n=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);n>0;n--)i.removeChild(i.lastChild);if(e.firstRowt.lastRow){var r=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);i.appendChild(r)}},this.$renderLinesFragment=function(e,t,i){for(var n=this.element.ownerDocument.createDocumentFragment(),o=t,s=this.session.getNextFoldLine(o),a=s?s.start.row:1/0;o>a&&(o=s.end.row+1,s=this.session.getNextFoldLine(o,s),a=s?s.start.row:1/0),!(o>i);){var l=r.createElement("div"),c=[];if(this.$renderLine(c,o,!1,o==a&&s),l.innerHTML=c.join(""),this.$useLineGroups())l.className="ace_line_group",n.appendChild(l),l.style.height=e.lineHeight*this.session.getRowLength(o)+"px";else for(;l.firstChild;)n.appendChild(l.firstChild);o++}return n},this.update=function(e){this.config=e;for(var t=[],i=e.firstRow,n=e.lastRow,r=i,o=this.session.getNextFoldLine(r),s=o?o.start.row:1/0;r>s&&(r=o.end.row+1,o=this.session.getNextFoldLine(r,o),s=o?o.start.row:1/0),!(r>n);)this.$useLineGroups()&&t.push("
"),this.$renderLine(t,r,!1,r==s&&o),this.$useLineGroups()&&t.push("
"),r++;this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,i,n){var r=this,s=/\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]/g,a=function(e,i,n,s,a){if(i)return r.showInvisibles?""+o.stringRepeat(r.SPACE_CHAR,e.length)+"":e;if("&"==e)return"&";if("<"==e)return"<";if(">"==e)return">";if("\t"==e){var l=r.session.getScreenTabSize(t+s);return t+=l-1,r.$tabStrings[l]}if(" "==e){var c=r.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",h=r.showInvisibles?r.SPACE_CHAR:"";return t+=1,""+h+""}return n?""+r.SPACE_CHAR+"":(t+=1,""+e+"")},l=n.replace(s,a);if(this.$textToken[i.type])e.push(l);else{var c="ace_"+i.type.replace(/\./g," ace_"),h="";"fold"==i.type&&(h=" style='width:"+i.value.length*this.config.characterWidth+"px;' "),e.push("",l,"")}return t+n.length},this.renderIndentGuide=function(e,t,i){var n=t.search(this.$indentGuideRe);return n<=0||n>=i?t:" "==t[0]?(n-=n%this.tabSize,e.push(o.stringRepeat(this.$tabStrings[" "],n/this.tabSize)),t.substr(n)):"\t"==t[0]?(e.push(o.stringRepeat(this.$tabStrings["\t"],n)),t.substr(n)):t},this.$renderWrappedLine=function(e,t,i,n){for(var r=0,s=0,a=i[0],l=0,c=0;c=a;)l=this.$renderToken(e,l,h,d.substring(0,a-r)),d=d.substring(a-r),r=a,n||e.push("
","
"),e.push(o.stringRepeat(" ",i.indent)),s++,l=0,a=i[s]||Number.MAX_VALUE;0!=d.length&&(r+=d.length,l=this.$renderToken(e,l,h,d))}}},this.$renderSimpleLine=function(e,t){var i=0,n=t[0],r=n.value;this.displayIndentGuides&&(r=this.renderIndentGuide(e,r)),r&&(i=this.$renderToken(e,i,n,r));for(var o=1;o"),r.length){var o=this.session.getRowSplitData(t);o&&o.length?this.$renderWrappedLine(e,r,o,i):this.$renderSimpleLine(e,r)}this.showInvisibles&&(n&&(t=n.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),i||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,i){for(var n=0,o=0;o+e[n].value.lengthi-t&&(s=s.substring(0,i-t)),r.push({type:e[n].type,value:s}),o=t+s.length,n+=1}for(;oi?r.push({type:e[n].type,value:s.substring(0,i-o)}):r.push(e[n]),o+=s.length,n+=1}}var n=this.session,r=[],o=n.getTokens(e);return t.walk(function(e,t,s,a,l){null!=e?r.push({type:"fold",value:e}):(l&&(o=n.getTokens(t)),o.length&&i(o,a,s))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";var n,r=e("../lib/dom"),o=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),void 0===n&&(n=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(n?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){for(var t=this.cursors,i=t.length;i--;)t[i].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){for(var t=this.cursors,i=t.length;i--;)t[i].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e==this.smoothBlinking||n||(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var i=this.session.documentToScreenPosition(e),n=this.$padding+i.column*this.config.characterWidth,r=(i.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:n,top:r}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,i=0,n=0;void 0!==t&&0!==t.length||(t=[{cursor:null}]);for(var i=0,r=t.length;ie.height+e.offset||o.top<0)&&i>1)){var s=(this.cursors[n++]||this.addCursor()).style;this.drawCursor?this.drawCursor(s,o,e,t[i],this.session):(s.left=o.left+"px",s.top=o.top+"px",s.width=e.characterWidth+"px",s.height=e.lineHeight+"px")}}for(;this.cursors.length>n;)this.removeCursor();var a=this.session.getOverwrite();this.$setOverwrite(a),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(o.prototype),t.Cursor=o}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./lib/dom"),o=e("./lib/event"),s=e("./lib/event_emitter").EventEmitter,a=function(e){this.element=r.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=r.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,o.addListener(this.element,"scroll",this.onScroll.bind(this)),o.addListener(this.element,"mousedown",o.preventDefault)};(function(){n.implement(this,s),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e}}).call(a.prototype);var l=function(e,t){a.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=r.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};n.inherits(l,a),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(l.prototype);var c=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};n.inherits(c,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(c.prototype),t.ScrollBar=l,t.ScrollBarV=l,t.ScrollBarH=c,t.VScrollBar=l,t.HScrollBar=c}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,i){"use strict";var n=e("./lib/event"),r=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){if(this.changes=this.changes|e,!this.pending&&this.changes){this.pending=!0;var t=this;n.nextFrame(function(){t.pending=!1;for(var e;e=t.changes;)t.changes=0,t.onRender(e)},this.window)}}}).call(r.prototype),t.RenderLoop=r}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,i){var n=e("../lib/oop"),r=e("../lib/dom"),o=e("../lib/lang"),s=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,l=0,c=t.FontMetrics=function(e){this.el=r.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=r.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=r.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),l||this.$testFractionalRect(),this.$measureNode.innerHTML=o.stringRepeat("X",l),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){n.implement(this,a),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=r.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;l=t>0&&t<1?50:100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",s.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(50===l){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var t={height:e.height,width:e.width/l}}else var t={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/l};return 0===t.width||0===t.height?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=o.stringRepeat(e,l);var t=this.$main.getBoundingClientRect();return t.width/l},this.getCharacterWidth=function(e){var t=this.charSizes[e];return void 0===t&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(c.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./lib/dom"),o=e("./config"),s=e("./lib/useragent"),a=e("./layer/gutter").Gutter,l=e("./layer/marker").Marker,c=e("./layer/text").Text,h=e("./layer/cursor").Cursor,d=e("./scrollbar").HScrollBar,u=e("./scrollbar").VScrollBar,f=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,m=e("./lib/event_emitter").EventEmitter,g='.ace_editor {\tposition: relative;\toverflow: hidden;\tfont: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;\tdirection: ltr;\t}\t.ace_scroller {\tposition: absolute;\toverflow: hidden;\ttop: 0;\tbottom: 0;\tbackground-color: inherit;\t-ms-user-select: none;\t-moz-user-select: none;\t-webkit-user-select: none;\tuser-select: none;\tcursor: text;\t}\t.ace_content {\tposition: absolute;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tmin-width: 100%;\t}\t.ace_dragging .ace_scroller:before{\tposition: absolute;\ttop: 0;\tleft: 0;\tright: 0;\tbottom: 0;\tcontent: \'\';\tbackground: rgba(250, 250, 250, 0.01);\tz-index: 1000;\t}\t.ace_dragging.ace_dark .ace_scroller:before{\tbackground: rgba(0, 0, 0, 0.01);\t}\t.ace_selecting, .ace_selecting * {\tcursor: text !important;\t}\t.ace_gutter {\tposition: absolute;\toverflow : hidden;\twidth: auto;\ttop: 0;\tbottom: 0;\tleft: 0;\tcursor: default;\tz-index: 4;\t-ms-user-select: none;\t-moz-user-select: none;\t-webkit-user-select: none;\tuser-select: none;\t}\t.ace_gutter-active-line {\tposition: absolute;\tleft: 0;\tright: 0;\t}\t.ace_scroller.ace_scroll-left {\tbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\t}\t.ace_gutter-cell {\tpadding-left: 19px;\tpadding-right: 6px;\tbackground-repeat: no-repeat;\t}\t.ace_gutter-cell.ace_error {\tbackground-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==");\tbackground-repeat: no-repeat;\tbackground-position: 2px center;\t}\t.ace_gutter-cell.ace_warning {\tbackground-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==");\tbackground-position: 2px center;\t}\t.ace_gutter-cell.ace_info {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");\tbackground-position: 2px center;\t}\t.ace_dark .ace_gutter-cell.ace_info {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");\t}\t.ace_scrollbar {\tposition: absolute;\tright: 0;\tbottom: 0;\tz-index: 6;\t}\t.ace_scrollbar-inner {\tposition: absolute;\tcursor: text;\tleft: 0;\ttop: 0;\t}\t.ace_scrollbar-v{\toverflow-x: hidden;\toverflow-y: scroll;\ttop: 0;\t}\t.ace_scrollbar-h {\toverflow-x: scroll;\toverflow-y: hidden;\tleft: 0;\t}\t.ace_print-margin {\tposition: absolute;\theight: 100%;\t}\t.ace_text-input {\tposition: absolute;\tz-index: 0;\twidth: 0.5em;\theight: 1em;\topacity: 0;\tbackground: transparent;\t-moz-appearance: none;\tappearance: none;\tborder: none;\tresize: none;\toutline: none;\toverflow: hidden;\tfont: inherit;\tpadding: 0 1px;\tmargin: 0 -1px;\ttext-indent: -1em;\t-ms-user-select: text;\t-moz-user-select: text;\t-webkit-user-select: text;\tuser-select: text;\twhite-space: pre!important;\t}\t.ace_text-input.ace_composition {\tbackground: inherit;\tcolor: inherit;\tz-index: 1000;\topacity: 1;\ttext-indent: 0;\t}\t.ace_layer {\tz-index: 1;\tposition: absolute;\toverflow: hidden;\tword-wrap: normal;\twhite-space: pre;\theight: 100%;\twidth: 100%;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tpointer-events: none;\t}\t.ace_gutter-layer {\tposition: relative;\twidth: auto;\ttext-align: right;\tpointer-events: auto;\t}\t.ace_text-layer {\tfont: inherit !important;\t}\t.ace_cjk {\tdisplay: inline-block;\ttext-align: center;\t}\t.ace_cursor-layer {\tz-index: 4;\t}\t.ace_cursor {\tz-index: 4;\tposition: absolute;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tborder-left: 2px solid;\ttransform: translatez(0);\t}\t.ace_slim-cursors .ace_cursor {\tborder-left-width: 1px;\t}\t.ace_overwrite-cursors .ace_cursor {\tborder-left-width: 0;\tborder-bottom: 1px solid;\t}\t.ace_hidden-cursors .ace_cursor {\topacity: 0.2;\t}\t.ace_smooth-blinking .ace_cursor {\t-webkit-transition: opacity 0.18s;\ttransition: opacity 0.18s;\t}\t.ace_editor.ace_multiselect .ace_cursor {\tborder-left-width: 1px;\t}\t.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\tposition: absolute;\tz-index: 3;\t}\t.ace_marker-layer .ace_selection {\tposition: absolute;\tz-index: 5;\t}\t.ace_marker-layer .ace_bracket {\tposition: absolute;\tz-index: 6;\t}\t.ace_marker-layer .ace_active-line {\tposition: absolute;\tz-index: 2;\t}\t.ace_marker-layer .ace_selected-word {\tposition: absolute;\tz-index: 4;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\t}\t.ace_line .ace_fold {\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tdisplay: inline-block;\theight: 11px;\tmargin-top: -2px;\tvertical-align: middle;\tbackground-image:\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");\tbackground-repeat: no-repeat, repeat-x;\tbackground-position: center center, top left;\tcolor: transparent;\tborder: 1px solid black;\tborder-radius: 2px;\tcursor: pointer;\tpointer-events: auto;\t}\t.ace_dark .ace_fold {\t}\t.ace_fold:hover{\tbackground-image:\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");\t}\t.ace_tooltip {\tbackground-color: #FFF;\tbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\tbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\tborder: 1px solid gray;\tborder-radius: 1px;\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\tcolor: black;\tmax-width: 100%;\tpadding: 3px 4px;\tposition: fixed;\tz-index: 999999;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tcursor: default;\twhite-space: pre;\tword-wrap: break-word;\tline-height: normal;\tfont-style: normal;\tfont-weight: normal;\tletter-spacing: normal;\tpointer-events: none;\t}\t.ace_folding-enabled > .ace_gutter-cell {\tpadding-right: 13px;\t}\t.ace_fold-widget {\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tmargin: 0 -12px 0 1px;\tdisplay: none;\twidth: 11px;\tvertical-align: top;\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");\tbackground-repeat: no-repeat;\tbackground-position: center;\tborder-radius: 3px;\tborder: 1px solid transparent;\tcursor: pointer;\t}\t.ace_folding-enabled .ace_fold-widget {\tdisplay: inline-block; \t}\t.ace_fold-widget.ace_end {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");\t}\t.ace_fold-widget.ace_closed {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");\t}\t.ace_fold-widget:hover {\tborder: 1px solid rgba(0, 0, 0, 0.3);\tbackground-color: rgba(255, 255, 255, 0.2);\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\t}\t.ace_fold-widget:active {\tborder: 1px solid rgba(0, 0, 0, 0.4);\tbackground-color: rgba(0, 0, 0, 0.05);\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\t}\t.ace_dark .ace_fold-widget {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");\t}\t.ace_dark .ace_fold-widget.ace_end {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");\t}\t.ace_dark .ace_fold-widget.ace_closed {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");\t}\t.ace_dark .ace_fold-widget:hover {\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\tbackground-color: rgba(255, 255, 255, 0.1);\t}\t.ace_dark .ace_fold-widget:active {\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\t}\t.ace_fold-widget.ace_invalid {\tbackground-color: #FFB4B4;\tborder-color: #DE5555;\t}\t.ace_fade-fold-widgets .ace_fold-widget {\t-webkit-transition: opacity 0.4s ease 0.05s;\ttransition: opacity 0.4s ease 0.05s;\topacity: 0;\t}\t.ace_fade-fold-widgets:hover .ace_fold-widget {\t-webkit-transition: opacity 0.05s ease 0.05s;\ttransition: opacity 0.05s ease 0.05s;\topacity:1;\t}\t.ace_underline {\ttext-decoration: underline;\t}\t.ace_bold {\tfont-weight: bold;\t}\t.ace_nobold .ace_bold {\tfont-weight: normal;\t}\t.ace_italic {\tfont-style: italic;\t}\t.ace_error-marker {\tbackground-color: rgba(255, 0, 0,0.2);\tposition: absolute;\tz-index: 9;\t}\t.ace_highlight-marker {\tbackground-color: rgba(255, 255, 0,0.2);\tposition: absolute;\tz-index: 8;\t}\t.ace_br1 {border-top-left-radius : 3px;}\t.ace_br2 {border-top-right-radius : 3px;}\t.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\t.ace_br4 {border-bottom-right-radius: 3px;}\t.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\t.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\t.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\t.ace_br8 {border-bottom-left-radius : 3px;}\t.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\t.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\t.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t'; +r.importCssString(g,"ace_editor.css");var v=function(e,t){var i=this;this.container=e||r.createElement("div"),this.$keepTextAreaAtCursor=!s.isOldIE,r.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=r.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=r.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=r.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new a(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new l(this.content);var n=this.$textLayer=new c(this.content);this.canvas=n.element,this.$markerFront=new l(this.content),this.$cursorLayer=new h(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new u(this.container,this),this.scrollBarH=new d(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){i.$scrollAnimation||i.session.setScrollTop(e.data-i.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){i.$scrollAnimation||i.session.setScrollLeft(e.data-i.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){i.updateCharacterSize(),i.onResize(!0,i.gutterWidth,i.$size.width,i.$size.height),i._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new f(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),o.resetOptions(this),o._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,n.implement(this,m),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),e&&(this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(e,t,i){if(void 0===t&&(t=1/0),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,i,n){if(!(this.resizing>2)){this.resizing>0?this.resizing++:this.resizing=e?1:0;var r=this.container;n||(n=r.clientHeight||r.scrollHeight),i||(i=r.clientWidth||r.scrollWidth);var o=this.$updateCachedSize(e,t,i,n);if(!this.$size.scrollerHeight||!i&&!n)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(o|this.$changes,!0):this.$loop.schedule(o|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null}},this.$updateCachedSize=function(e,t,i,n){n-=this.$extraHeight||0;var r=0,o=this.$size,s={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};return n&&(e||o.height!=n)&&(o.height=n,r|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",r|=this.CHANGE_SCROLL),i&&(e||o.width!=i)&&(r|=this.CHANGE_SIZE,o.width=i,null==t&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",o.scrollerWidth=Math.max(0,i-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)&&(r|=this.CHANGE_FULL)),o.$dirty=!i||!n,r&&this._signal("resize",s),r},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-2*this.$padding,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var i=this.session.selection.getCursor();i.column=0,e=this.$cursorLayer.getPixelPosition(i,!0),t*=this.session.getRowLength(i.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var e=r.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=r.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,i=this.$cursorLayer.$pixelPos.left;t-=e.offset;var n=this.textarea.style,r=this.lineHeight;if(t<0||t>e.height-r)return void(n.top=n.left="0");var o=this.characterWidth;if(this.$composition){var s=this.textarea.value.replace(/^\x01+/,"");o*=this.session.$getStringScreenWidth(s)[0]+2,r+=2}i-=this.scrollLeft,i>this.$size.scrollerWidth-o&&(i=this.$size.scrollerWidth-o),i+=this.gutterWidth,n.height=r+"px",n.width=o+"px",n.left=Math.min(i,this.$size.scrollerWidth-o)+"px",n.top=Math.min(t,this.$size.height-r)+"px"}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,i=this.session.documentToScreenRow(t,0)*e.lineHeight;return i-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,i,n){var r=this.scrollMargin;r.top=0|e,r.bottom=0|t,r.right=0|n,r.left=0|i,r.v=r.top+r.bottom,r.h=r.left+r.right,r.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-r.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){if(this.$changes&&(e|=this.$changes,this.$changes=0),!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t)return void(this.$changes|=e);if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var i=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){if(e|=this.$computeLayerConfig(),i.firstRow!=this.layerConfig.firstRow&&i.firstRowScreen==this.layerConfig.firstRowScreen){var n=this.scrollTop+(i.firstRow-this.layerConfig.firstRow)*this.lineHeight;n>0&&(this.scrollTop=n,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}i=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-i.offset+"px",this.content.style.marginTop=-i.offset+"px",this.content.style.width=i.width+2*this.$padding+"px",this.content.style.height=i.minHeight+"px"}return e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),e&this.CHANGE_FULL?(this.$textLayer.update(i),this.$showGutter&&this.$gutterLayer.update(i),this.$markerBack.update(i),this.$markerFront.update(i),this.$cursorLayer.update(i),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender")):e&this.CHANGE_SCROLL?(e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(i):this.$textLayer.scrollLines(i),this.$showGutter&&this.$gutterLayer.update(i),this.$markerBack.update(i),this.$markerFront.update(i),this.$cursorLayer.update(i),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender")):(e&this.CHANGE_TEXT?(this.$textLayer.update(i),this.$showGutter&&this.$gutterLayer.update(i)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(i):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(i),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(i),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(i),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(i),void this._signal("afterRender"))},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,i=Math.max((this.$minLines||1)*this.lineHeight,Math.min(t,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(i+=this.scrollBarH.getHeight());var n=e>t;if(i!=this.desiredHeight||this.$size.height!=this.desiredHeight||n!=this.$vScroll){n!=this.$vScroll&&(this.$vScroll=n,this.scrollBarV.setVisible(n));var r=this.container.clientWidth;this.container.style.height=i+"px",this.$updateCachedSize(!0,this.$gutterWidth,r,i),this.desiredHeight=i,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,i=t.height<=2*this.lineHeight,n=this.session.getScreenLength(),r=n*this.lineHeight,o=this.$getLongestLine(),s=!i&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-o-2*this.$padding<0),a=this.$horizScroll!==s;a&&(this.$horizScroll=s,this.scrollBarH.setVisible(s));var l=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var c=this.scrollTop%this.lineHeight,h=t.scrollerHeight+this.lineHeight,d=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;r+=d;var u=this.scrollMargin;this.session.setScrollTop(Math.max(-u.top,Math.min(this.scrollTop,r-t.scrollerHeight+u.bottom))),this.session.setScrollLeft(Math.max(-u.left,Math.min(this.scrollLeft,o+2*this.$padding-t.scrollerWidth+u.right)));var f=!i&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-r+d<0||this.scrollTop>u.top),p=l!==f;p&&(this.$vScroll=f,this.scrollBarV.setVisible(f));var m,g,v=Math.ceil(h/this.lineHeight)-1,y=Math.max(0,Math.round((this.scrollTop-c)/this.lineHeight)),w=y+v,b=this.lineHeight;y=e.screenToDocumentRow(y,0);var A=e.getFoldLine(y);A&&(y=A.start.row),m=e.documentToScreenRow(y,0),g=e.getRowLength(y)*b,w=Math.min(e.screenToDocumentRow(w,0),e.getLength()-1),h=t.scrollerHeight+e.getRowLength(w)*b+g,c=this.scrollTop-m*b;var C=0;return this.layerConfig.width!=o&&(C=this.CHANGE_H_SCROLL),(a||p)&&(C=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(o=this.$getLongestLine())),this.layerConfig={width:o,padding:this.$padding,firstRow:y,firstRowScreen:m,lastRow:w,lineHeight:b,characterWidth:this.characterWidth,minHeight:h,maxHeight:r,offset:c,gutterOffset:Math.max(0,Math.ceil((c+t.height-t.scrollerHeight)/b)),height:this.$size.scrollerHeight},C},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var i=this.layerConfig;if(!(e>i.lastRow+1||to?(t&&l+s>o+this.lineHeight&&(o-=t*this.$size.scrollerHeight),0===o&&(o=-this.scrollMargin.top),this.session.setScrollTop(o)):l+this.$size.scrollerHeight-ar?(r=1-this.scrollMargin.top||t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom||e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0},this.pixelToScreenCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=(e+this.scrollLeft-i.left-this.$padding)/this.characterWidth,r=Math.floor((t+this.scrollTop-i.top)/this.lineHeight),o=Math.round(n);return{row:r,column:o,side:n-o>0?1:-1}},this.screenToTextCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=Math.round((e+this.scrollLeft-i.left-this.$padding)/this.characterWidth),r=(t+this.scrollTop-i.top)/this.lineHeight;return this.session.screenToDocumentPosition(r,Math.max(n,0))},this.textToScreenCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=this.session.documentToScreenPosition(e,t),r=this.$padding+Math.round(n.column*this.characterWidth),o=n.row*this.lineHeight;return{pageX:i.left+r-this.scrollLeft,pageY:i.top+o-this.scrollTop}},this.visualizeFocus=function(){r.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){r.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,r.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(r.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(e,t){function i(i){if(n.$themeId!=e)return t&&t();if(i.cssClass){r.importCssString(i.cssText,i.cssClass,n.container.ownerDocument),n.theme&&r.removeCssClass(n.container,n.theme.cssClass);var o="padding"in i?i.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&o!=n.$padding&&n.setPadding(o),n.$theme=i.cssClass,n.theme=i,r.addCssClass(n.container,i.cssClass),r.setCssClass(n.container,"ace_dark",i.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:i}),t&&t()}}var n=this;if(this.$themeId=e,n._dispatchEvent("themeChange",{theme:e}),e&&"string"!=typeof e)i(e);else{var s=e||this.$options.theme.initialValue;o.loadModule(["theme",s],i)}},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){r.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){r.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(v.prototype),o.defineOptions(v.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){"number"==typeof e&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){r.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){return this.$gutterLineHighlight?(this.$gutterLineHighlight.style.display=e?"":"none",void(this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight())):(this.$gutterLineHighlight=r.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight))},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){"number"==typeof e&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},scrollPastEnd:{set:function(e){e=+e||0,this.$scrollPastEnd!=e&&(this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=v}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),o=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,a=e("../config"),l=function(t,n,r,o){if(this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),a.get("packaged")||!e.toUrl)o=o||a.moduleUrl(n.id,"worker");else{var s=this.$normalizePath;o=o||s(e.toUrl("ace/worker/worker.js",null,"_"));var l={};t.forEach(function(t){l[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{var c=n.src,h=i(77),d=new h([c],{type:"application/javascript"}),u=(window.URL||window.webkitURL).createObjectURL(d);this.$worker=new Worker(u)}catch(e){if(!(e instanceof window.DOMException))throw e;var d=this.$workerBlob(o),f=window.URL||window.webkitURL,p=f.createObjectURL(d);this.$worker=new Worker(p),f.revokeObjectURL(p)}this.$worker.postMessage({init:!0,tlns:l,module:n.id,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var i=this.callbacks[t.id];i&&(i(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return o.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,i){if(i){var n=this.callbackId++;this.callbacks[n]=i,t.push(n)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(e){console.error(e.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),"insert"==e.action?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;e&&(this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e}))},this.$workerBlob=function(e){var t="importScripts('"+o.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(e){var i=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,n=new i;return n.append(t),n.getBlob("application/javascript")}}}).call(l.prototype);var c=function(e,t,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var n=null,r=!1,o=Object.create(s),l=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){l.messageBuffer.push(e),n&&(r?setTimeout(c):c())},this.setEmitSync=function(e){r=e};var c=function(){var e=l.messageBuffer.shift();e.command?n[e.command].apply(n,e.args):e.event&&o._signal(e.event,e.data)};o.postMessage=function(e){l.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},a.loadModule(["worker",t],function(e){for(n=new e[i](o);l.messageBuffer.length;)c()})};c.prototype=l.prototype,t.UIWorkerClient=c,t.WorkerClient=l}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,i){"use strict";var n=e("./range").Range,r=e("./lib/event_emitter").EventEmitter,o=e("./lib/oop"),s=function(e,t,i,n,r,o){var s=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=r,this.othersClass=o,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=n,this.$onCursorChange=function(){setTimeout(function(){s.onCursorChange()})},this.$pos=i;var a=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=a.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){o.implement(this,r),this.setup=function(){var e=this,t=this.doc,i=this.session;this.selectionBefore=i.selection.toJSON(),i.selection.inMultiSelectMode&&i.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var r=this.pos;r.$insertRight=!0,r.detach(),r.markerId=i.addMarker(new n(r.row,r.column,r.row,r.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(i){var n=t.createAnchor(i.row,i.column);n.$insertRight=!0,n.detach(),e.others.push(n)}),i.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(i){i.markerId=e.addMarker(new n(i.row,i.column,i.row,i.column+t.length),t.othersClass,null,!1)})}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,o=t.start.column-this.pos.column;if(this.updateAnchors(e),r&&(this.length+=i),r&&!this.session.$fromUndo)if("insert"===e.action)for(var s=this.others.length-1;s>=0;s--){var a=this.others[s],l={row:a.row,column:a.column+o};this.doc.insertMergedLines(l,e.lines)}else if("remove"===e.action)for(var s=this.others.length-1;s>=0;s--){var a=this.others[s],l={row:a.row,column:a.column+o};this.doc.remove(new n(l.row,l.column,l.row,l.column-i))}this.$updating=!1,this.updateMarkers()}},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(!this.$updating){var e=this,t=this.session,i=function(i,r){t.removeMarker(i.markerId),i.markerId=t.addMarker(new n(i.row,i.column,i.row,i.column+e.length),r,null,!1)};i(this.pos,this.mainClass);for(var r=this.others.length;r--;)i(this.others[r],this.othersClass)}},this.onCursorChange=function(e){if(!this.$updating&&this.session){var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))}},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth!==-1){for(var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth,i=0;i1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)}},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var i=e.length;i--;){var n=this.ranges.indexOf(e[i]);this.ranges.splice(n,1)}this._signal("removeRange",{ranges:e}),0===this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new a,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],i=l.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(i,t.cursor==t.start)}else{var i=this.getRange(),n=this.isBackwards(),r=i.start.row,o=i.end.row;if(r==o){if(n)var s=i.end,a=i.start;else var s=i.start,a=i.end;return this.addRange(l.fromPoints(a,a)),void this.addRange(l.fromPoints(s,s))}var c=[],h=this.getLineRange(r,!0);h.start.column=i.start.column,c.push(h);for(var d=r+1;d1){var e=this.rangeList.ranges,t=e[e.length-1],i=l.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(i,t.cursor==t.start)}else{var n=this.session.documentToScreenPosition(this.selectionLead),r=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(n,r);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,i){var n=[],o=e.column0;)m--;if(m>0)for(var g=0;n[g].isEmpty();)g++;for(var v=m;v>=g;v--)n[v].isEmpty()&&n.splice(v,1)}return n}}.call(c.prototype);var v=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(e.marker){this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(e){for(var t=this.session.$selectionMarkers,i=e.length;i--;){var n=e[i];if(n.marker){this.session.removeMarker(n.marker);var r=t.indexOf(n);r!=-1&&t.splice(r,1)}}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(e){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(e){var t=e.command,i=e.editor;if(i.multiSelect){if(t.multiSelectAction)"forEach"==t.multiSelectAction?n=i.forEachSelection(t,e.args):"forEachLine"==t.multiSelectAction?n=i.forEachSelection(t,e.args,!0):"single"==t.multiSelectAction?(i.exitMultiSelectMode(),n=t.exec(i,e.args||{})):n=t.multiSelectAction(i,e.args||{});else{var n=t.exec(i,e.args||{});i.multiSelect.addRange(i.multiSelect.toOrientedRange()),i.multiSelect.mergeOverlappingRanges()}return n}},this.forEachSelection=function(e,t,i){if(!this.inVirtualSelectionMode){var n,r=i&&i.keepOrder,o=1==i||i&&i.$byLines,s=this.session,a=this.selection,l=a.rangeList,h=(r?a:l).ranges;if(!h.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var d=a._eventRegistry;a._eventRegistry={};var u=new c(s);this.inVirtualSelectionMode=!0;for(var f=h.length;f--;){if(o)for(;f>0&&h[f].start.row==h[f-1].end.row;)f--;u.fromOrientedRange(h[f]),u.index=f,this.selection=s.selection=u;var p=e.exec?e.exec(this,t||{}):e(this,t||{});n||void 0===p||(n=p),u.toOrientedRange(h[f])}u.detach(),this.selection=s.selection=a,this.inVirtualSelectionMode=!1,a._eventRegistry=d,a.mergeOverlappingRanges();var m=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),m&&m.from==m.to&&this.renderer.animateScrolling(m.from),n}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var t=this.multiSelect.rangeList.ranges,i=[],n=0;no&&(o=i.column),rc?e.insert(n,u.stringRepeat(" ",r-c)):e.remove(new l(n.row,n.column,n.row,n.column-r+c)),t.start.column=t.end.column=o,t.start.row=t.end.row=n.row,t.cursor=t.end}),t.fromOrientedRange(i[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var c=this.selection.getRange(),h=c.start.row,d=c.end.row,f=h==d;if(f){var p,m=this.session.getLength();do p=this.session.getLine(d);while(/[=:]/.test(p)&&++d0);h<0&&(h=0),d>=m&&(d=m-1)}var g=this.session.removeFullLines(h,d);g=this.$reAlignText(g,f),this.session.insert({row:h,column:0},g.join("\n")+"\n"),f||(c.start.column=0,c.end.column=g[g.length-1].length),this.selection.setRange(c)}},this.$reAlignText=function(e,t){function i(e){return u.stringRepeat(" ",e)}function n(e){return e[2]?i(s)+e[2]+i(a-e[2].length+l)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function r(e){return e[2]?i(s+a-e[2].length)+e[2]+i(l," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function o(e){return e[2]?i(s)+e[2]+i(l)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var s,a,l,c=!0,h=!0;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?null==s?(s=t[1].length,a=t[2].length,l=t[3].length,t):(s+a+l!=t[1].length+t[2].length+t[3].length&&(h=!1),s!=t[1].length&&(c=!1),s>t[1].length&&(s=t[1].length),at[3].length&&(l=t[3].length),t):[e]}).map(t?n:c?h?r:n:o)}}).call(v.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var i=e.oldSession;i&&(i.multiSelect.off("addRange",this.$onAddRange),i.multiSelect.off("removeRange",this.$onRemoveRange),i.multiSelect.off("multiSelect",this.$onMultiSelect),i.multiSelect.off("singleSelect",this.$onSingleSelect),i.multiSelect.lead.off("change",this.$checkMultiselectChange),i.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=o,e("./config").defineOptions(v.prototype,"editor",{enableMultiselect:{set:function(e){o(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",h)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",h))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,i){"use strict";var n=e("../../range").Range,r=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,i){var n=e.getLine(i);return this.foldingStartMarker.test(n)?"start":"markbeginend"==t&&this.foldingStopMarker&&this.foldingStopMarker.test(n)?"end":""},this.getFoldWidgetRange=function(e,t,i){return null},this.indentationBlock=function(e,t,i){var r=/\S/,o=e.getLine(t),s=o.search(r);if(s!=-1){for(var a=i||o.length,l=e.getLength(),c=t,h=t;++tc){var u=e.getLine(h).length;return new n(c,a,h,u)}}},this.openingBracketBlock=function(e,t,i,r,o){var s={row:i,column:r+1},a=e.$findClosingBracket(t,s,o);if(a){var l=e.foldWidgets[a.row];return null==l&&(l=e.getFoldWidget(a.row)),"start"==l&&a.row>s.row&&(a.row--,a.column=e.getLine(a.row).length),n.fromPoints(s,a)}},this.closingBracketBlock=function(e,t,i,r,o){var s={row:i,column:r},a=e.$findOpeningBracket(t,s);if(a)return a.column++,s.column--,n.fromPoints(a,s)}}).call(r.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {\tbackground: #f0f0f0;\tcolor: #333;\t}\t.ace-tm .ace_print-margin {\twidth: 1px;\tbackground: #e8e8e8;\t}\t.ace-tm .ace_fold {\tbackground-color: #6B72E6;\t}\t.ace-tm {\tbackground-color: #FFFFFF;\tcolor: black;\t}\t.ace-tm .ace_cursor {\tcolor: black;\t}\t.ace-tm .ace_invisible {\tcolor: rgb(191, 191, 191);\t}\t.ace-tm .ace_storage,\t.ace-tm .ace_keyword {\tcolor: blue;\t}\t.ace-tm .ace_constant {\tcolor: rgb(197, 6, 11);\t}\t.ace-tm .ace_constant.ace_buildin {\tcolor: rgb(88, 72, 246);\t}\t.ace-tm .ace_constant.ace_language {\tcolor: rgb(88, 92, 246);\t}\t.ace-tm .ace_constant.ace_library {\tcolor: rgb(6, 150, 14);\t}\t.ace-tm .ace_invalid {\tbackground-color: rgba(255, 0, 0, 0.1);\tcolor: red;\t}\t.ace-tm .ace_support.ace_function {\tcolor: rgb(60, 76, 114);\t}\t.ace-tm .ace_support.ace_constant {\tcolor: rgb(6, 150, 14);\t}\t.ace-tm .ace_support.ace_type,\t.ace-tm .ace_support.ace_class {\tcolor: rgb(109, 121, 222);\t}\t.ace-tm .ace_keyword.ace_operator {\tcolor: rgb(104, 118, 135);\t}\t.ace-tm .ace_string {\tcolor: rgb(3, 106, 7);\t}\t.ace-tm .ace_comment {\tcolor: rgb(76, 136, 107);\t}\t.ace-tm .ace_comment.ace_doc {\tcolor: rgb(0, 102, 255);\t}\t.ace-tm .ace_comment.ace_doc.ace_tag {\tcolor: rgb(128, 159, 191);\t}\t.ace-tm .ace_constant.ace_numeric {\tcolor: rgb(0, 0, 205);\t}\t.ace-tm .ace_variable {\tcolor: rgb(49, 132, 149);\t}\t.ace-tm .ace_xml-pe {\tcolor: rgb(104, 104, 91);\t}\t.ace-tm .ace_entity.ace_name.ace_function {\tcolor: #0000A2;\t}\t.ace-tm .ace_heading {\tcolor: rgb(12, 7, 255);\t}\t.ace-tm .ace_list {\tcolor:rgb(185, 6, 144);\t}\t.ace-tm .ace_meta.ace_tag {\tcolor:rgb(0, 22, 142);\t}\t.ace-tm .ace_string.ace_regex {\tcolor: rgb(255, 0, 0)\t}\t.ace-tm .ace_marker-layer .ace_selection {\tbackground: rgb(181, 213, 255);\t}\t.ace-tm.ace_multiselect .ace_selection.ace_start {\tbox-shadow: 0 0 3px 0px white;\t}\t.ace-tm .ace_marker-layer .ace_step {\tbackground: rgb(252, 255, 0);\t}\t.ace-tm .ace_marker-layer .ace_stack {\tbackground: rgb(164, 229, 101);\t}\t.ace-tm .ace_marker-layer .ace_bracket {\tmargin: -1px 0 0 -1px;\tborder: 1px solid rgb(192, 192, 192);\t}\t.ace-tm .ace_marker-layer .ace_active-line {\tbackground: rgba(0, 0, 0, 0.07);\t}\t.ace-tm .ace_gutter-active-line {\tbackground-color : #dcdcdc;\t}\t.ace-tm .ace_marker-layer .ace_selected-word {\tbackground: rgb(250, 250, 255);\tborder: 1px solid rgb(200, 200, 250);\t}\t.ace-tm .ace_indent-guide {\tbackground: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\t}\t';var n=e("../lib/dom");n.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,i){"use strict";function n(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=(e("./lib/oop"),e("./lib/dom"));e("./range").Range,function(){this.getRowLength=function(e){var t;return t=this.lineWidgets?this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:0,this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach(),this.editor!=e&&(this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets)))},this.detach=function(e){var t=this.editor;if(t){this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var i=this.session.lineWidgets;i&&i.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})}},this.updateOnFold=function(e,t){var i=t.lineWidgets;if(i&&e.action){for(var n=e.data,r=n.start.row,o=n.end.row,s="add"==e.action,a=r+1;a0&&!n[r];)r--;this.firstRow=i.firstRow,this.lastRow=i.lastRow,t.$cursorLayer.config=i;for(var s=r;s<=o;s++){var a=n[s];if(a&&a.el)if(a.hidden)a.el.style.top=-100-(a.pixelHeight||0)+"px";else{a._inDocument||(a._inDocument=!0,t.container.appendChild(a.el));var l=t.$cursorLayer.getPixelPosition({row:s,column:0},!0).top;a.coverLine||(l+=i.lineHeight*this.session.getRowLineCount(a.row)),a.el.style.top=l-i.offset+"px";var c=a.coverGutter?0:t.gutterWidth;a.fixedWidth||(c-=t.scrollLeft),a.el.style.left=c+"px",a.fullWidth&&a.screenWidth&&(a.el.style.minWidth=i.width+2*i.padding+"px"),a.fixedWidth?a.el.style.right=t.scrollBar.getWidth()+"px":a.el.style.right=""}}}}}.call(n.prototype),t.LineWidgets=n}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,i){"use strict";function n(e,t,i){for(var n=0,r=e.length-1;n<=r;){var o=n+r>>1,s=i(t,e[o]);if(s>0)n=o+1;else{if(!(s<0))return o;r=o-1}}return-(n+1)}function r(e,t,i){var r=e.getAnnotations().sort(a.comparePoints);if(r.length){var o=n(r,{row:t,column:-1},a.comparePoints);o<0&&(o=-o-1),o>=r.length?o=i>0?0:r.length-1:0===o&&i<0&&(o=r.length-1);var s=r[o]; +if(s&&i){if(s.row===t){do s=r[o+=i];while(s&&s.row===t);if(!s)return r.slice()}var l=[];t=s.row;do l[i<0?"unshift":"push"](s),s=r[o+=i];while(s&&s.row==t);return l.length&&l}}}var o=e("../line_widgets").LineWidgets,s=e("../lib/dom"),a=e("../range").Range;t.showErrorMarker=function(e,t){var i=e.session;i.widgetManager||(i.widgetManager=new o(i),i.widgetManager.attach(e));var n=e.getCursorPosition(),a=n.row,l=i.widgetManager.getWidgetsAtRow(a).filter(function(e){return"errorMarker"==e.type})[0];l?l.destroy():a-=t;var c,h=r(i,a,t);if(h){var d=h[0];n.column=(d.pos&&"number"!=typeof d.column?d.pos.sc:d.column)||0,n.row=d.row,c=e.renderer.$gutterLayer.$annotations[n.row]}else{if(l)return;c={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(n.row),e.selection.moveToPosition(n);var u={row:n.row,fixedWidth:!0,coverGutter:!0,el:s.createElement("div"),type:"errorMarker"},f=u.el.appendChild(s.createElement("div")),p=u.el.appendChild(s.createElement("div"));p.className="error_widget_arrow "+c.className;var m=e.renderer.$cursorLayer.getPixelPosition(n).left;p.style.left=m+e.renderer.gutterWidth-5+"px",u.el.className="error_widget_wrapper",f.className="error_widget "+c.className,f.innerHTML=c.text.join("
"),f.appendChild(s.createElement("div"));var g=function(e,t,i){if(0===t&&("esc"===i||"return"===i))return u.destroy(),{command:"null"}};u.destroy=function(){e.$mouseHandler.isMousePressed||(e.keyBinding.removeKeyboardHandler(g),i.widgetManager.removeLineWidget(u),e.off("changeSelection",u.destroy),e.off("changeSession",u.destroy),e.off("mouseup",u.destroy),e.off("change",u.destroy))},e.keyBinding.addKeyboardHandler(g),e.on("changeSelection",u.destroy),e.on("changeSession",u.destroy),e.on("mouseup",u.destroy),e.on("change",u.destroy),e.session.widgetManager.addLineWidget(u),u.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:u.el.offsetHeight})},s.importCssString("\t .error_widget_wrapper {\t background: inherit;\t color: inherit;\t border:none\t }\t .error_widget {\t border-top: solid 2px;\t border-bottom: solid 2px;\t margin: 5px 0;\t padding: 10px 40px;\t white-space: pre-wrap;\t }\t .error_widget.ace_error, .error_widget_arrow.ace_error{\t border-color: #ff5a5a\t }\t .error_widget.ace_warning, .error_widget_arrow.ace_warning{\t border-color: #F1D817\t }\t .error_widget.ace_info, .error_widget_arrow.ace_info{\t border-color: #5a5a5a\t }\t .error_widget.ace_ok, .error_widget_arrow.ace_ok{\t border-color: #5aaa5a\t }\t .error_widget_arrow {\t position: absolute;\t border: solid 5px;\t border-top-color: transparent!important;\t border-right-color: transparent!important;\t border-left-color: transparent!important;\t top: -5px;\t }\t","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,i){"use strict";e("./lib/fixoldbrowsers");var n=e("./lib/dom"),r=e("./lib/event"),o=e("./editor").Editor,s=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,l=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.acequire=e,t.edit=function(e){if("string"==typeof e){var i=e;if(e=document.getElementById(i),!e)throw new Error("ace.edit can't find div #"+i)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var s="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;s=a.value,e=n.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(s=n.getInnerText(e),e.innerHTML="");var c=t.createEditSession(s),h=new o(new l(e));h.setSession(c);var d={document:c,editor:h,onResize:h.resize.bind(h,null)};return a&&(d.textarea=a),r.addListener(window,"resize",d.onResize),h.on("destroy",function(){r.removeListener(window,"resize",d.onResize),d.editor.container.env=null}),h.container.env=h.env=d,h},t.createEditSession=function(e,t){var i=new s(e,t);return i.setUndoManager(new a),i},t.EditSession=s,t.UndoManager=a,t.version="1.2.3"}),function(){ace.acequire(["ace/ace"],function(e){e&&e.config.init(!0),window.ace||(window.ace=e);for(var t in e)e.hasOwnProperty(t)&&(window.ace[t]=e[t])})}(),e.exports=window.ace.acequire("ace/ace")},function(e,t,i){ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,i){"use strict";var n=e("../lib/oop"),r=e("./text_highlight_rules").TextHighlightRules,o=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'[^"\\\\]+'},{token:"string",regex:'"',next:"start"},{token:"string",regex:"",next:"start"}]}};n.inherits(o,r),t.JsonHighlightRules=o}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,i){"use strict";var n=e("../range").Range,r=function(){};(function(){this.checkOutdent=function(e,t){return!!/^\s+$/.test(e)&&/^\s*\}/.test(t)},this.autoOutdent=function(e,t){var i=e.getLine(t),r=i.match(/^(\s*\})/);if(!r)return 0;var o=r[1].length,s=e.findMatchingBracket({row:t,column:o});if(!s||s.row==t)return 0;var a=this.$getIndent(e.getLine(s.row));e.replace(new n(t,0,t,o-1),a)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,i){"use strict";var n,r=e("../../lib/oop"),o=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,a=e("../../lib/lang"),l=["text","paren.rparen","punctuation.operator"],c=["text","paren.rparen","punctuation.operator","comment"],h={},d=function(e){var t=-1;return e.multiSelect&&(t=e.selection.index,h.rangeCount!=e.multiSelect.rangeCount&&(h={rangeCount:e.multiSelect.rangeCount})),h[t]?n=h[t]:void(n=h[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""})},u=function(e,t,i,n){var r=e.end.row-e.start.row;return{text:i+t+n,selection:[0,e.start.column+1,r,e.end.column+(r?0:1)]}},f=function(){this.add("braces","insertion",function(e,t,i,r,o){var s=i.getCursorPosition(),l=r.doc.getLine(s.row);if("{"==o){d(i);var c=i.getSelectionRange(),h=r.doc.getTextRange(c);if(""!==h&&"{"!==h&&i.getWrapBehavioursEnabled())return u(c,h,"{","}");if(f.isSaneInsertion(i,r))return/[\]\}\)]/.test(l[s.column])||i.inMultiSelectMode?(f.recordAutoInsert(i,r,"}"),{text:"{}",selection:[1,1]}):(f.recordMaybeInsert(i,r,"{"),{text:"{",selection:[1,1]})}else if("}"==o){d(i);var p=l.substring(s.column,s.column+1);if("}"==p){var m=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(null!==m&&f.isAutoInsertedClosing(s,l,o))return f.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if("\n"==o||"\r\n"==o){d(i);var g="";f.isMaybeInsertedClosing(s,l)&&(g=a.stringRepeat("}",n.maybeInsertedBrackets),f.clearMaybeInsertedClosing());var p=l.substring(s.column,s.column+1);if("}"===p){var v=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!v)return null;var y=this.$getIndent(r.getLine(v.row))}else{if(!g)return void f.clearMaybeInsertedClosing();var y=this.$getIndent(l)}var w=y+r.getTabString();return{text:"\n"+w+"\n"+y+g,selection:[1,w.length,1,w.length]}}f.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,i,r,o){var s=r.doc.getTextRange(o);if(!o.isMultiLine()&&"{"==s){d(i);var a=r.doc.getLine(o.start.row),l=a.substring(o.end.column,o.end.column+1);if("}"==l)return o.end.column++,o;n.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,i,n,r){if("("==r){d(i);var o=i.getSelectionRange(),s=n.doc.getTextRange(o);if(""!==s&&i.getWrapBehavioursEnabled())return u(o,s,"(",")");if(f.isSaneInsertion(i,n))return f.recordAutoInsert(i,n,")"),{text:"()",selection:[1,1]}}else if(")"==r){d(i);var a=i.getCursorPosition(),l=n.doc.getLine(a.row),c=l.substring(a.column,a.column+1);if(")"==c){var h=n.$findOpeningBracket(")",{column:a.column+1,row:a.row});if(null!==h&&f.isAutoInsertedClosing(a,l,r))return f.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,i,n,r){var o=n.doc.getTextRange(r);if(!r.isMultiLine()&&"("==o){d(i);var s=n.doc.getLine(r.start.row),a=s.substring(r.start.column+1,r.start.column+2);if(")"==a)return r.end.column++,r}}),this.add("brackets","insertion",function(e,t,i,n,r){if("["==r){d(i);var o=i.getSelectionRange(),s=n.doc.getTextRange(o);if(""!==s&&i.getWrapBehavioursEnabled())return u(o,s,"[","]");if(f.isSaneInsertion(i,n))return f.recordAutoInsert(i,n,"]"),{text:"[]",selection:[1,1]}}else if("]"==r){d(i);var a=i.getCursorPosition(),l=n.doc.getLine(a.row),c=l.substring(a.column,a.column+1);if("]"==c){var h=n.$findOpeningBracket("]",{column:a.column+1,row:a.row});if(null!==h&&f.isAutoInsertedClosing(a,l,r))return f.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,i,n,r){var o=n.doc.getTextRange(r);if(!r.isMultiLine()&&"["==o){d(i);var s=n.doc.getLine(r.start.row),a=s.substring(r.start.column+1,r.start.column+2);if("]"==a)return r.end.column++,r}}),this.add("string_dquotes","insertion",function(e,t,i,n,r){if('"'==r||"'"==r){d(i);var o=r,s=i.getSelectionRange(),a=n.doc.getTextRange(s);if(""!==a&&"'"!==a&&'"'!=a&&i.getWrapBehavioursEnabled())return u(s,a,o,o);if(!a){var l=i.getCursorPosition(),c=n.doc.getLine(l.row),h=c.substring(l.column-1,l.column),f=c.substring(l.column,l.column+1),p=n.getTokenAt(l.row,l.column),m=n.getTokenAt(l.row,l.column+1);if("\\"==h&&p&&/escape/.test(p.type))return null;var g,v=p&&/string|escape/.test(p.type),y=!m||/string|escape/.test(m.type);if(f==o)g=v!==y;else{if(v&&!y)return null;if(v&&y)return null;var w=n.$mode.tokenRe;w.lastIndex=0;var b=w.test(h);w.lastIndex=0;var A=w.test(h);if(b||A)return null;if(f&&!/[\s;,.})\]\\]/.test(f))return null;g=!0}return{text:g?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,i,n,r){var o=n.doc.getTextRange(r);if(!r.isMultiLine()&&('"'==o||"'"==o)){d(i);var s=n.doc.getLine(r.start.row),a=s.substring(r.start.column+1,r.start.column+2);if(a==o)return r.end.column++,r}})};f.isSaneInsertion=function(e,t){var i=e.getCursorPosition(),n=new s(t,i.row,i.column);if(!this.$matchTokenType(n.getCurrentToken()||"text",l)){var r=new s(t,i.row,i.column+1);if(!this.$matchTokenType(r.getCurrentToken()||"text",l))return!1}return n.stepForward(),n.getCurrentTokenRow()!==i.row||this.$matchTokenType(n.getCurrentToken()||"text",c)},f.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},f.recordAutoInsert=function(e,t,i){var r=e.getCursorPosition(),o=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,o,n.autoInsertedLineEnd[0])||(n.autoInsertedBrackets=0),n.autoInsertedRow=r.row,n.autoInsertedLineEnd=i+o.substr(r.column),n.autoInsertedBrackets++},f.recordMaybeInsert=function(e,t,i){var r=e.getCursorPosition(),o=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,o)||(n.maybeInsertedBrackets=0),n.maybeInsertedRow=r.row,n.maybeInsertedLineStart=o.substr(0,r.column)+i,n.maybeInsertedLineEnd=o.substr(r.column),n.maybeInsertedBrackets++},f.isAutoInsertedClosing=function(e,t,i){return n.autoInsertedBrackets>0&&e.row===n.autoInsertedRow&&i===n.autoInsertedLineEnd[0]&&t.substr(e.column)===n.autoInsertedLineEnd},f.isMaybeInsertedClosing=function(e,t){return n.maybeInsertedBrackets>0&&e.row===n.maybeInsertedRow&&t.substr(e.column)===n.maybeInsertedLineEnd&&t.substr(0,e.column)==n.maybeInsertedLineStart},f.popAutoInsertedClosing=function(){n.autoInsertedLineEnd=n.autoInsertedLineEnd.substr(1),n.autoInsertedBrackets--},f.clearMaybeInsertedClosing=function(){n&&(n.maybeInsertedBrackets=0,n.maybeInsertedRow=-1)},r.inherits(f,o),t.CstyleBehaviour=f}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,i){"use strict";var n=e("../../lib/oop"),r=e("../../range").Range,o=e("./fold_mode").FoldMode,s=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};n.inherits(s,o),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,i){var n=e.getLine(i);if(this.singleLineBlockCommentRe.test(n)&&!this.startRegionRe.test(n)&&!this.tripleStarBlockCommentRe.test(n))return"";var r=this._getFoldWidgetBase(e,t,i);return!r&&this.startRegionRe.test(n)?"start":r},this.getFoldWidgetRange=function(e,t,i,n){var r=e.getLine(i);if(this.startRegionRe.test(r))return this.getCommentRegionBlock(e,r,i);var o=r.match(this.foldingStartMarker);if(o){var s=o.index;if(o[1])return this.openingBracketBlock(e,o[1],i,s);var a=e.getCommentFoldRange(i,s+o[0].length,1);return a&&!a.isMultiLine()&&(n?a=this.getSectionRange(e,i):"all"!=t&&(a=null)),a}if("markbegin"!==t){var o=r.match(this.foldingStopMarker);if(o){var s=o.index+o[0].length;return o[1]?this.closingBracketBlock(e,o[1],i,s):e.getCommentFoldRange(i,s,-1)}}},this.getSectionRange=function(e,t){var i=e.getLine(t),n=i.search(/\S/),o=t,s=i.length;t+=1;for(var a=t,l=e.getLength();++tc)break;var h=this.getFoldWidgetRange(e,"all",t);if(h){if(h.start.row<=o)break;if(h.isMultiLine())t=h.end.row;else if(n==c)break}a=t}}return new r(o,s,a,e.getLine(a).length)},this.getCommentRegionBlock=function(e,t,i){for(var n=t.search(/\s*$/),o=e.getLength(),s=i,a=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,l=1;++is)return new r(s,n,h,t.length)}}.call(s.prototype)}),ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),o=e("./text").Mode,s=e("./json_highlight_rules").JsonHighlightRules,a=e("./matching_brace_outdent").MatchingBraceOutdent,l=e("./behaviour/cstyle").CstyleBehaviour,c=e("./folding/cstyle").FoldMode,h=e("../worker/worker_client").WorkerClient,d=function(){this.HighlightRules=s,this.$outdent=new a,this.$behaviour=new l,this.foldingRules=new c};r.inherits(d,o),function(){this.getNextLineIndent=function(e,t,i){var n=this.$getIndent(t);if("start"==e){var r=t.match(/^.*[\{\(\[]\s*$/);r&&(n+=i)}return n},this.checkOutdent=function(e,t,i){return this.$outdent.checkOutdent(t,i)},this.autoOutdent=function(e,t,i){this.$outdent.autoOutdent(t,i)},this.createWorker=function(e){var t=new h(["ace"],i(47),"JsonWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/json"}.call(d.prototype),t.Mode=d})},function(e,t){e.exports.id="ace/mode/json_worker",e.exports.src='"no use strict";(function(window){function resolveModuleId(id,paths){for(var testPath=id,tail="";testPath;){var alias=paths[testPath];if("string"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\/*$/,"/")+(tail||alias.main||alias.name);if(alias===!1)return"";var i=testPath.lastIndexOf("/");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:"error",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf("!")){var chunks=moduleName.split("!");return window.normalizeModule(parentId,chunks[0])+"!"+window.normalizeModule(parentId,chunks[1])}if("."==moduleName.charAt(0)){var base=parentId.split("/").slice(0,-1).join("/");for(moduleName=(base?base+"/":"")+moduleName;-1!==moduleName.indexOf(".")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\.\\//,"").replace(/\\/\\.\\//,"/").replace(/[^\\/]+\\/\\.\\.\\//,"")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error("worker.js acequire() accepts only (parentId, id) as arguments");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log("unable to load "+id);var path=resolveModuleId(id,window.acequire.tlns);return".js"!=path.slice(-3)&&(path+=".js"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,"string"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),"function"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=["require","exports","module"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case"require":return req;case"exports":return module.exports;case"module":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire("ace/lib/event_emitter").EventEmitter,oop=window.acequire("ace/lib/oop"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:"call",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:"event",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error("Unknown command:"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire("ace/lib/es5-shim"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}})(this),ace.define("ace/lib/oop",["require","exports","module"],function(acequire,exports){"use strict";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define("ace/range",["require","exports","module"],function(acequire,exports){"use strict";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){"object"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){"object"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define("ace/apply_delta",["require","exports","module"],function(acequire,exports){"use strict";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||"";switch(delta.action){case"insert":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case"remove":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(acequire,exports){"use strict";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){"object"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?"unshift":"push"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),EventEmitter=acequire("./lib/event_emitter").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal("change",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),applyDelta=acequire("./apply_delta").applyDelta,EventEmitter=acequire("./lib/event_emitter").EventEmitter,Range=acequire("./range").Range,Anchor=acequire("./anchor").Anchor,Document=function(textOrLines){this.$lines=[""],0===textOrLines.length?this.$lines=[""]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0==="aaa".split(/a/).length?function(text){return text.replace(/\\r\\n|\\r/g,"\\n").split("\\n")}:function(text){return text.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=match?match[1]:"\\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\\r\\n";case"unix":return"\\n";default:return this.$autoNewLine||"\\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return"\\r\\n"==text||"\\r"==text||"\\n"==text},this.getLine=function(row){return this.$lines[row]||""},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||"").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."),this.insertMergedLines(position,["",""])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:"insert",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([""]),column=0):(lines=[""].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:"insert",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:"remove",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:"remove",lines:["",""]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert="insert"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal("change",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(""),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:"insert"==delta.action?"remove":"insert",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define("ace/lib/lang",["require","exports","module"],function(acequire,exports){"use strict";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split("").reverse().join("")},exports.stringRepeat=function(string,count){for(var result="";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\s\\s*/,trimEndRegexp=/\\s\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,"")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,"")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&"object"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if("object"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}var cons=obj.constructor;if(cons===RegExp)return obj;copy=cons();for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,"\\\\$1")},exports.escapeHTML=function(str){return str.replace(/&/g,"&").replace(/"/g,""").replace(/\'/g,"'").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:"insert",start:data[i],lines:data[i+1]};else var d={action:"remove",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define("ace/mode/json/json_parse",["require","exports","module"],function(){"use strict";var at,ch,text,value,escapee={\'"\':\'"\',"\\\\":"\\\\","/":"/",b:"\\b",f:"\\f",n:"\\n",r:"\\r",t:"\t"},error=function(m){throw{name:"SyntaxError",message:m,at:at,text:text}},next=function(c){return c&&c!==ch&&error("Expected \'"+c+"\' instead of \'"+ch+"\'"),ch=text.charAt(at),at+=1,ch},number=function(){var number,string="";for("-"===ch&&(string="-",next("-"));ch>="0"&&"9">=ch;)string+=ch,next();if("."===ch)for(string+=".";next()&&ch>="0"&&"9">=ch;)string+=ch;if("e"===ch||"E"===ch)for(string+=ch,next(),("-"===ch||"+"===ch)&&(string+=ch,next());ch>="0"&&"9">=ch;)string+=ch,next();return number=+string,isNaN(number)?(error("Bad number"),void 0):number},string=function(){var hex,i,uffff,string="";if(\'"\'===ch)for(;next();){if(\'"\'===ch)return next(),string;if("\\\\"===ch)if(next(),"u"===ch){for(uffff=0,i=0;4>i&&(hex=parseInt(next(),16),isFinite(hex));i+=1)uffff=16*uffff+hex;string+=String.fromCharCode(uffff)}else{if("string"!=typeof escapee[ch])break;string+=escapee[ch]}else string+=ch}error("Bad string")},white=function(){for(;ch&&" ">=ch;)next()},word=function(){switch(ch){case"t":return next("t"),next("r"),next("u"),next("e"),!0;case"f":return next("f"),next("a"),next("l"),next("s"),next("e"),!1;case"n":return next("n"),next("u"),next("l"),next("l"),null}error("Unexpected \'"+ch+"\'")},array=function(){var array=[];if("["===ch){if(next("["),white(),"]"===ch)return next("]"),array;for(;ch;){if(array.push(value()),white(),"]"===ch)return next("]"),array;next(","),white()}}error("Bad array")},object=function(){var key,object={};if("{"===ch){if(next("{"),white(),"}"===ch)return next("}"),object;for(;ch;){if(key=string(),white(),next(":"),Object.hasOwnProperty.call(object,key)&&error(\'Duplicate key "\'+key+\'"\'),object[key]=value(),white(),"}"===ch)return next("}"),object;next(","),white()}}error("Bad object")};return value=function(){switch(white(),ch){case"{":return object();case"[":return array();case\'"\':return string();case"-":return number();default:return ch>="0"&&"9">=ch?number():word()}},function(source,reviver){var result;return text=source,at=0,ch=" ",result=value(),white(),ch&&error("Syntax error"),"function"==typeof reviver?function walk(holder,key){var k,v,value=holder[key];if(value&&"object"==typeof value)for(k in value)Object.hasOwnProperty.call(value,k)&&(v=walk(value,k),void 0!==v?value[k]=v:delete value[k]);return reviver.call(holder,key,value)}({"":result},""):result}}),ace.define("ace/mode/json_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/json/json_parse"],function(acequire,exports){"use strict";var oop=acequire("../lib/oop"),Mirror=acequire("../worker/mirror").Mirror,parse=acequire("./json/json_parse"),JsonWorker=exports.JsonWorker=function(sender){Mirror.call(this,sender),this.setTimeout(200)};oop.inherits(JsonWorker,Mirror),function(){this.onUpdate=function(){var value=this.doc.getValue(),errors=[];try{value&&parse(value)}catch(e){var pos=this.doc.indexToPosition(e.at-1);errors.push({row:pos.row,column:pos.column,text:e.message,type:"error"})}this.sender.emit("annotate",errors)}}.call(JsonWorker.prototype)}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,"sentinel",{}),"sentinel"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if("function"!=typeof target)throw new TypeError("Function.prototype.bind called on incompatible "+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,"__defineGetter__"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,"XXX"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0\n}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return"[object Array]"==_toString(obj)});var boxedString=Object("a"),splitString="a"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,thisp=arguments[1],i=-1,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=[],thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError("reduce of empty array with no initial value")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError("reduceRight of empty array with no initial value")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(object,property){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if("object"!=typeof prototype)throw new TypeError("typeof prototype["+typeof prototype+"] != \'object\'");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom="undefined"==typeof document||doesDefinePropertyWork(document.createElement("div"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR="Property description must be an object: ",ERR_NON_OBJECT_TARGET="Object.defineProperty called on non-object: ",ERR_ACCESSORS_NOT_SUPPORTED="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(object,property,descriptor){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if("object"!=typeof descriptor&&"function"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,"value"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,"get")&&defineGetter(object,property,descriptor.get),owns(descriptor,"set")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return"function"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name="";owns(object,name);)name+="?";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError("Object.keys called on a non-object");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws="\t\\n\v\\f\\r   ᠎              \\u2028\\u2029\ufeff";if(!String.prototype.trim||ws.trim()){ws="["+ws+"]";var trimBeginRegexp=RegExp("^"+ws+ws+"*"),trimEndRegexp=RegExp(ws+ws+"*$");String.prototype.trim=function(){return(this+"").replace(trimBeginRegexp,"").replace(trimEndRegexp,"")}}var toObject=function(o){if(null==o)throw new TypeError("can\'t convert "+o+" to object");return Object(o)}});'; +},function(e,t,i){t=e.exports=i(49)(),t.push([e.id,'div.jsoneditor .jsoneditor-search input{height:auto;border:inherit}div.jsoneditor .jsoneditor-search input:focus{border:none!important;box-shadow:none!important}div.jsoneditor table{border-collapse:collapse;width:auto}div.jsoneditor td,div.jsoneditor th{padding:0;display:table-cell;text-align:left;vertical-align:inherit;border-radius:inherit}div.jsoneditor-field,div.jsoneditor-readonly,div.jsoneditor-value{border:1px solid transparent;min-height:16px;min-width:32px;padding:2px;margin:1px;word-wrap:break-word;float:left}div.jsoneditor-field p,div.jsoneditor-value p{margin:0}div.jsoneditor-value{word-break:break-word}div.jsoneditor-readonly{min-width:16px;color:gray}div.jsoneditor-empty{border-color:#d3d3d3;border-style:dashed;border-radius:2px}div.jsoneditor-field.jsoneditor-empty:after,div.jsoneditor-value.jsoneditor-empty:after{pointer-events:none;color:#d3d3d3;font-size:8pt}div.jsoneditor-field.jsoneditor-empty:after{content:"field"}div.jsoneditor-value.jsoneditor-empty:after{content:"value"}a.jsoneditor-value.jsoneditor-url,div.jsoneditor-value.jsoneditor-url{color:green;text-decoration:underline}a.jsoneditor-value.jsoneditor-url{display:inline-block;padding:2px;margin:2px}a.jsoneditor-value.jsoneditor-url:focus,a.jsoneditor-value.jsoneditor-url:hover{color:#ee422e}div.jsoneditor td.jsoneditor-separator{padding:3px 0;vertical-align:top;color:gray}div.jsoneditor-field.jsoneditor-highlight,div.jsoneditor-field[contenteditable=true]:focus,div.jsoneditor-field[contenteditable=true]:hover,div.jsoneditor-value.jsoneditor-highlight,div.jsoneditor-value[contenteditable=true]:focus,div.jsoneditor-value[contenteditable=true]:hover{background-color:#ffffab;border:1px solid #ff0;border-radius:2px}div.jsoneditor-field.jsoneditor-highlight-active,div.jsoneditor-field.jsoneditor-highlight-active:focus,div.jsoneditor-field.jsoneditor-highlight-active:hover,div.jsoneditor-value.jsoneditor-highlight-active,div.jsoneditor-value.jsoneditor-highlight-active:focus,div.jsoneditor-value.jsoneditor-highlight-active:hover{background-color:#fe0;border:1px solid #ffc700;border-radius:2px}div.jsoneditor-value.jsoneditor-string{color:green}div.jsoneditor-value.jsoneditor-array,div.jsoneditor-value.jsoneditor-object{min-width:16px;color:gray}div.jsoneditor-value.jsoneditor-number{color:#ee422e}div.jsoneditor-value.jsoneditor-boolean{color:#ff8c00}div.jsoneditor-value.jsoneditor-null{color:#004ed0}div.jsoneditor-value.jsoneditor-invalid{color:#000}div.jsoneditor-tree button{width:24px;height:24px;padding:0;margin:0;border:none;cursor:pointer;background:transparent url('+i(1)+")}div.jsoneditor-mode-form tr.jsoneditor-expandable td.jsoneditor-tree,div.jsoneditor-mode-view tr.jsoneditor-expandable td.jsoneditor-tree{cursor:pointer}div.jsoneditor-tree button.jsoneditor-collapsed{background-position:0 -48px}div.jsoneditor-tree button.jsoneditor-expanded{background-position:0 -72px}div.jsoneditor-tree button.jsoneditor-contextmenu{background-position:-48px -72px}div.jsoneditor-tree button.jsoneditor-contextmenu.jsoneditor-selected,div.jsoneditor-tree button.jsoneditor-contextmenu:focus,div.jsoneditor-tree button.jsoneditor-contextmenu:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu{background-position:-48px -48px}div.jsoneditor-tree :focus{outline:none}div.jsoneditor-tree button:focus{background-color:#f5f5f5;outline:1px solid #e5e5e5}div.jsoneditor-tree button.jsoneditor-invisible{visibility:hidden;background:none}div.jsoneditor{color:#1a1a1a;border:1px solid #3883fa;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;overflow:hidden;position:relative;padding:0;line-height:100%}div.jsoneditor-tree table.jsoneditor-tree{border-collapse:collapse;border-spacing:0;width:100%;margin:0}div.jsoneditor-outer{position:static;width:100%;height:100%;margin:-35px 0 0;padding:35px 0 0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.ace-jsoneditor,textarea.jsoneditor-text{min-height:150px}div.jsoneditor-tree{width:100%;height:100%;position:relative;overflow:auto}textarea.jsoneditor-text{width:100%;height:100%;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;outline-width:0;border:none;background-color:#fff;resize:none}tr.jsoneditor-highlight,tr.jsoneditor-selected{background-color:#e6e6e6}tr.jsoneditor-selected button.jsoneditor-contextmenu,tr.jsoneditor-selected button.jsoneditor-dragarea{visibility:hidden}tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{visibility:visible}div.jsoneditor-tree button.jsoneditor-dragarea{background:url("+i(1)+") -72px -72px;cursor:move}div.jsoneditor-tree button.jsoneditor-dragarea:focus,div.jsoneditor-tree button.jsoneditor-dragarea:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{background-position:-72px -48px}div.jsoneditor td,div.jsoneditor th,div.jsoneditor tr{padding:0;margin:0}div.jsoneditor td,div.jsoneditor td.jsoneditor-tree{vertical-align:top}.jsoneditor-schema-error,div.jsoneditor-field,div.jsoneditor-value,div.jsoneditor td,div.jsoneditor textarea,div.jsoneditor th{font-family:droid sans mono,consolas,monospace,courier new,courier,sans-serif;font-size:10pt;color:#1a1a1a}.jsoneditor-schema-error{cursor:default;display:inline-block;height:24px;line-height:24px;position:relative;text-align:center;width:24px}div.jsoneditor-tree .jsoneditor-schema-error{width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url("+i(1)+') -168px -48px}.jsoneditor-schema-error .jsoneditor-popover{background-color:#4c4c4c;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.4);color:#fff;display:none;padding:7px 10px;position:absolute;width:200px;z-index:4}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above{bottom:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below{top:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left{top:-7px;right:32px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right{top:-7px;left:32px}.jsoneditor-schema-error .jsoneditor-popover:before{border-right:7px solid transparent;border-left:7px solid transparent;content:"";display:block;left:50%;margin-left:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above:before{border-top:7px solid #4c4c4c;bottom:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below:before{border-bottom:7px solid #4c4c4c;top:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before{border-left:7px solid #4c4c4c;right:-14px;left:inherit}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before,.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-top:7px solid transparent;border-bottom:7px solid transparent;content:"";top:19px;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-right:7px solid #4c4c4c;left:-14px}.jsoneditor-schema-error:focus .jsoneditor-popover,.jsoneditor-schema-error:hover .jsoneditor-popover{display:block;-webkit-animation:fade-in .3s linear 1,move-up .3s linear 1;-moz-animation:fade-in .3s linear 1,move-up .3s linear 1;-ms-animation:fade-in .3s linear 1,move-up .3s linear 1}@-webkit-keyframes fade-in{0%{opacity:0}to{opacity:1}}@-moz-keyframes fade-in{0%{opacity:0}to{opacity:1}}@-ms-keyframes fade-in{0%{opacity:0}to{opacity:1}}.jsoneditor .jsoneditor-text-errors{width:100%;border-collapse:collapse;background-color:#ffef8b;border-top:1px solid gold}.jsoneditor .jsoneditor-text-errors td{padding:3px 6px;vertical-align:middle}.jsoneditor-text-errors .jsoneditor-schema-error{border:none;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url('+i(1)+") -168px -48px}div.jsoneditor-contextmenu-root{position:relative;width:0;height:0}div.jsoneditor-contextmenu{position:absolute;box-sizing:content-box;z-index:99999}div.jsoneditor-contextmenu li,div.jsoneditor-contextmenu ul{box-sizing:content-box}div.jsoneditor-contextmenu ul{position:relative;left:0;top:0;width:124px;background:#fff;border:1px solid #d3d3d3;box-shadow:2px 2px 12px hsla(0,0%,50%,.3);list-style:none;margin:0;padding:0}div.jsoneditor-contextmenu ul li button{padding:0;margin:0;width:124px;height:24px;border:none;cursor:pointer;color:#4d4d4d;background:transparent;font-size:10pt;font-family:arial,sans-serif;box-sizing:border-box;line-height:26px;text-align:left}div.jsoneditor-contextmenu ul li button::-moz-focus-inner{padding:0;border:0}div.jsoneditor-contextmenu ul li button:focus,div.jsoneditor-contextmenu ul li button:hover{color:#1a1a1a;background-color:#f5f5f5;outline:none}div.jsoneditor-contextmenu ul li button.jsoneditor-default{width:92px}div.jsoneditor-contextmenu ul li button.jsoneditor-expand{float:right;width:32px;height:24px;border-left:1px solid #e5e5e5}div.jsoneditor-contextmenu div.jsoneditor-icon{float:left;width:24px;height:24px;border:none;padding:0;margin:0;background-image:url("+i(1)+")}div.jsoneditor-contextmenu ul li button div.jsoneditor-expand{float:right;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url("+i(1)+") 0 -72px;opacity:.4}div.jsoneditor-contextmenu ul li.jsoneditor-selected div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button.jsoneditor-expand:focus div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button.jsoneditor-expand:hover div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button:focus div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button:hover div.jsoneditor-expand{opacity:1}div.jsoneditor-contextmenu div.jsoneditor-separator{height:0;border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}div.jsoneditor-contextmenu button.jsoneditor-remove>div.jsoneditor-icon{background-position:-24px -24px}div.jsoneditor-contextmenu button.jsoneditor-remove:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-remove:hover>div.jsoneditor-icon{background-position:-24px 0}div.jsoneditor-contextmenu button.jsoneditor-append>div.jsoneditor-icon{background-position:0 -24px}div.jsoneditor-contextmenu button.jsoneditor-append:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-append:hover>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-insert>div.jsoneditor-icon{background-position:0 -24px}div.jsoneditor-contextmenu button.jsoneditor-insert:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-insert:hover>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-duplicate>div.jsoneditor-icon{background-position:-48px -24px}div.jsoneditor-contextmenu button.jsoneditor-duplicate:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-duplicate:hover>div.jsoneditor-icon{background-position:-48px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-asc>div.jsoneditor-icon{background-position:-168px -24px}div.jsoneditor-contextmenu button.jsoneditor-sort-asc:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-sort-asc:hover>div.jsoneditor-icon{background-position:-168px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-desc>div.jsoneditor-icon{background-position:-192px -24px}div.jsoneditor-contextmenu button.jsoneditor-sort-desc:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-sort-desc:hover>div.jsoneditor-icon{background-position:-192px 0}div.jsoneditor-contextmenu ul li button.jsoneditor-selected,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover{color:#fff;background-color:#ee422e}div.jsoneditor-contextmenu ul li{overflow:hidden}div.jsoneditor-contextmenu ul li ul{display:none;position:relative;left:-10px;top:0;border:none;box-shadow:inset 0 0 10px hsla(0,0%,50%,.5);padding:0 10px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}div.jsoneditor-contextmenu ul li ul li button{padding-left:24px;animation:all ease-in-out 1s}div.jsoneditor-contextmenu ul li ul li button:focus,div.jsoneditor-contextmenu ul li ul li button:hover{background-color:#f5f5f5}div.jsoneditor-contextmenu button.jsoneditor-type-string>div.jsoneditor-icon{background-position:-144px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-string.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-string:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-string:hover>div.jsoneditor-icon{background-position:-144px 0}div.jsoneditor-contextmenu button.jsoneditor-type-auto>div.jsoneditor-icon{background-position:-120px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-auto.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-auto:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-auto:hover>div.jsoneditor-icon{background-position:-120px 0}div.jsoneditor-contextmenu button.jsoneditor-type-object>div.jsoneditor-icon{background-position:-72px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-object.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-object:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-object:hover>div.jsoneditor-icon{background-position:-72px 0}div.jsoneditor-contextmenu button.jsoneditor-type-array>div.jsoneditor-icon{background-position:-96px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-array.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-array:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-array:hover>div.jsoneditor-icon{background-position:-96px 0}div.jsoneditor-contextmenu button.jsoneditor-type-modes>div.jsoneditor-icon{background-image:none;width:6px}div.jsoneditor-menu{width:100%;height:35px;padding:2px;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-color:#3883fa;border-bottom:1px solid #3883fa}div.jsoneditor-menu>button,div.jsoneditor-menu>div.jsoneditor-modes>button{width:26px;height:26px;margin:2px;padding:0;border-radius:2px;border:1px solid transparent;background:transparent url("+i(1)+");color:#fff;opacity:.8;font-family:arial,sans-serif;font-size:10pt;float:left}div.jsoneditor-menu>button:hover,div.jsoneditor-menu>div.jsoneditor-modes>button:hover{background-color:hsla(0,0%,100%,.2);border:1px solid hsla(0,0%,100%,.4)}div.jsoneditor-menu>button:active,div.jsoneditor-menu>button:focus,div.jsoneditor-menu>div.jsoneditor-modes>button:active,div.jsoneditor-menu>div.jsoneditor-modes>button:focus{background-color:hsla(0,0%,100%,.3)}div.jsoneditor-menu>button:disabled,div.jsoneditor-menu>div.jsoneditor-modes>button:disabled{opacity:.5}div.jsoneditor-menu>button.jsoneditor-collapse-all{background-position:0 -96px}div.jsoneditor-menu>button.jsoneditor-expand-all{background-position:0 -120px}div.jsoneditor-menu>button.jsoneditor-undo{background-position:-24px -96px}div.jsoneditor-menu>button.jsoneditor-undo:disabled{background-position:-24px -120px}div.jsoneditor-menu>button.jsoneditor-redo{background-position:-48px -96px}div.jsoneditor-menu>button.jsoneditor-redo:disabled{background-position:-48px -120px}div.jsoneditor-menu>button.jsoneditor-compact{background-position:-72px -96px}div.jsoneditor-menu>button.jsoneditor-format{background-position:-72px -120px}div.jsoneditor-menu>div.jsoneditor-modes{display:inline-block;float:left}div.jsoneditor-menu>div.jsoneditor-modes>button{background-image:none;width:auto;padding-left:6px;padding-right:6px}div.jsoneditor-menu>button.jsoneditor-separator,div.jsoneditor-menu>div.jsoneditor-modes>button.jsoneditor-separator{margin-left:10px}div.jsoneditor-menu a{font-family:arial,sans-serif;font-size:10pt;color:#fff;opacity:.8;vertical-align:middle}div.jsoneditor-menu a:hover{opacity:1}div.jsoneditor-menu a.jsoneditor-poweredBy{font-size:8pt;position:absolute;right:0;top:0;padding:10px}table.jsoneditor-search div.jsoneditor-results,table.jsoneditor-search input{font-family:arial,sans-serif;font-size:10pt;color:#1a1a1a;background:transparent}table.jsoneditor-search div.jsoneditor-results{color:#fff;padding-right:5px;line-height:24px}table.jsoneditor-search{position:absolute;right:4px;top:4px;border-collapse:collapse;border-spacing:0}table.jsoneditor-search div.jsoneditor-frame{border:1px solid transparent;background-color:#fff;padding:0 2px;margin:0}table.jsoneditor-search div.jsoneditor-frame table{border-collapse:collapse}table.jsoneditor-search input{width:120px;border:none;outline:none;margin:1px;line-height:20px}table.jsoneditor-search button{width:16px;height:24px;padding:0;margin:0;border:none;background:url("+i(1)+");vertical-align:top}table.jsoneditor-search button:hover{background-color:transparent}table.jsoneditor-search button.jsoneditor-refresh{width:18px;background-position:-99px -73px}table.jsoneditor-search button.jsoneditor-next{cursor:pointer;background-position:-124px -73px}table.jsoneditor-search button.jsoneditor-next:hover{background-position:-124px -49px}table.jsoneditor-search button.jsoneditor-previous{cursor:pointer;background-position:-148px -73px;margin-right:2px}table.jsoneditor-search button.jsoneditor-previous:hover{background-position:-148px -49px}",""])},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;tg)return 1}for(var v=0,y=Math.max(f.length,p.length);vr)return 1}return 0}},function(e,t,i){e.exports=i(54)},function(e,t){"use strict";function i(){this.locked=!1}i.prototype.highlight=function(e){this.locked||(this.node!=e&&(this.node&&this.node.setHighlight(!1),this.node=e,this.node.setHighlight(!0)),this._cancelUnhighlight())},i.prototype.unhighlight=function(){if(!this.locked){var e=this;this.node&&(this._cancelUnhighlight(),this.unhighlightTimer=setTimeout(function(){e.node.setHighlight(!1),e.node=void 0,e.unhighlightTimer=void 0},0))}},i.prototype._cancelUnhighlight=function(){this.unhighlightTimer&&(clearTimeout(this.unhighlightTimer),this.unhighlightTimer=void 0)},i.prototype.lock=function(){this.locked=!0},i.prototype.unlock=function(){this.locked=!1},e.exports=i},function(e,t,i){"use strict";function n(e){this.editor=e,this.history=[],this.index=-1,this.clear(),this.actions={editField:{undo:function(e){e.node.updateField(e.oldValue)},redo:function(e){e.node.updateField(e.newValue)}},editValue:{undo:function(e){e.node.updateValue(e.oldValue)},redo:function(e){e.node.updateValue(e.newValue)}},changeType:{undo:function(e){e.node.changeType(e.oldType)},redo:function(e){e.node.changeType(e.newType)}},appendNodes:{undo:function(e){e.nodes.forEach(function(t){e.parent.removeChild(t)})},redo:function(e){e.nodes.forEach(function(t){e.parent.appendChild(t)})}},insertBeforeNodes:{undo:function(e){e.nodes.forEach(function(t){e.parent.removeChild(t)})},redo:function(e){e.nodes.forEach(function(t){e.parent.insertBefore(t,e.beforeNode)})}},insertAfterNodes:{undo:function(e){e.nodes.forEach(function(t){e.parent.removeChild(t)})},redo:function(e){var t=e.afterNode;e.nodes.forEach(function(i){e.parent.insertAfter(e.node,t),t=i})}},removeNodes:{undo:function(e){var t=e.parent,i=t.childs[e.index]||t.append;e.nodes.forEach(function(e){t.insertBefore(e,i)})},redo:function(e){e.nodes.forEach(function(t){e.parent.removeChild(t)})}},duplicateNodes:{undo:function(e){e.nodes.forEach(function(t){e.parent.removeChild(t)})},redo:function(e){var t=e.afterNode;e.nodes.forEach(function(i){e.parent.insertAfter(i,t),t=i})}},moveNodes:{undo:function(e){e.nodes.forEach(function(t){e.oldBeforeNode.parent.moveBefore(t,e.oldBeforeNode)})},redo:function(e){e.nodes.forEach(function(t){e.newBeforeNode.parent.moveBefore(t,e.newBeforeNode)})}},sort:{undo:function(e){var t=e.node;t.hideChilds(),t.sort=e.oldSort,t.childs=e.oldChilds,t.showChilds()},redo:function(e){var t=e.node;t.hideChilds(),t.sort=e.newSort,t.childs=e.newChilds,t.showChilds()}}}}i(3),n.prototype.onChange=function(){},n.prototype.add=function(e,t){this.index++,this.history[this.index]={action:e,params:t,timestamp:new Date},this.index=0},n.prototype.canRedo=function(){return this.index0;){var n=t.shift();if("number"==typeof n){if("array"!==i.type)throw new Error("Cannot get child node at index "+n+": node is no array");i=i.childs[n]}else{if("object"!==i.type)throw new Error("Cannot get child node "+n+": node is no object");i=i.childs.filter(function(e){return e.field===n})[0]}}return i},n.prototype.findParents=function(){for(var e=[],t=this.parent;t;)e.unshift(t),t=t.parent;return e},n.prototype.setError=function(e,t){this.getDom(),this.error=e;var i=this.dom.tdError;if(e){i||(i=document.createElement("td"),this.dom.tdError=i,this.dom.tdValue.parentNode.appendChild(i));var n=document.createElement("div");n.className="jsoneditor-popover jsoneditor-right",n.appendChild(document.createTextNode(e.message));var r=document.createElement("button");for(r.type="button",r.className="jsoneditor-schema-error",r.appendChild(n),r.onmouseover=r.onfocus=function(){for(var e=["right","above","below","left"],t=0;t0&&(e=this.childs.filter(function(e){return i.indexOf(e.field)!==-1}).map(function(e){return{node:e,error:{message:'duplicate key "'+e.field+'"'}}}))}if(this.childs)for(var n=0;n0&&(e=e.concat(o))}return e},n.prototype.clearDom=function(){this.dom={}},n.prototype.getDom=function(){var e=this.dom;if(e.tr)return e.tr;if(this._updateEditability(),e.tr=document.createElement("tr"),e.tr.node=this,"tree"===this.editor.options.mode){var t=document.createElement("td");if(this.editable.field&&this.parent){var i=document.createElement("button");i.type="button",e.drag=i,i.className="jsoneditor-dragarea",i.title="Drag to move this field (Alt+Shift+Arrows)",t.appendChild(i)}e.tr.appendChild(t);var n=document.createElement("td"),r=document.createElement("button");r.type="button",e.menu=r,r.className="jsoneditor-contextmenu",r.title="Click to open the actions menu (Ctrl+M)",n.appendChild(e.menu),e.tr.appendChild(n)}var o=document.createElement("td");return e.tr.appendChild(o),e.tree=this._createDomTree(),o.appendChild(e.tree),this.updateDom({updateIndexes:!0}),e.tr},n.onDragStart=function(e,t){if(!Array.isArray(e))return n.onDragStart([e],t);if(0!==e.length){var i=e[0],r=e[e.length-1],o=n.getNodeFromTarget(t.target),s=r._nextSibling(),l=i.editor,c=a.getAbsoluteTop(o.dom.tr)-a.getAbsoluteTop(i.dom.tr);l.mousemove||(l.mousemove=a.addEventListener(window,"mousemove",function(t){n.onDrag(e,t)})),l.mouseup||(l.mouseup=a.addEventListener(window,"mouseup",function(t){n.onDragEnd(e,t)})),l.highlighter.lock(),l.drag={oldCursor:document.body.style.cursor,oldSelection:l.getSelection(),oldBeforeNode:s,mouseX:t.pageX,offsetY:c,level:i.getLevel()},document.body.style.cursor="move",t.preventDefault()}},n.onDrag=function(e,t){if(!Array.isArray(e))return n.onDrag([e],t);if(0!==e.length){var i,r,o,s,c,h,d,u,f,p,m,g,v,y,w=e[0].editor,b=t.pageY-w.drag.offsetY,A=t.pageX,C=!1,E=e[0];if(i=E.dom.tr,f=a.getAbsoluteTop(i),g=i.offsetHeight,bp+g&&(d=void 0)),d&&(e.forEach(function(e){d.parent.moveBefore(e,d)}),C=!0)}else{var x=e[e.length-1];if(c=x.expanded&&x.append?x.append.getDom():x.dom.tr,s=c?c.nextSibling:void 0){m=a.getAbsoluteTop(s),o=s;do u=n.getNodeFromTarget(o),o&&(v=o.nextSibling?a.getAbsoluteTop(o.nextSibling):0,y=o?v-m:0,u.parent.childs.length==e.length&&u.parent.childs[e.length-1]==x&&(f+=27)),o=o.nextSibling;while(o&&b>f+y);if(u&&u.parent){var F=A-w.drag.mouseX,k=Math.round(F/24/2),S=w.drag.level+k,$=u.getLevel();for(r=u.dom.tr.previousSibling;$0)return i[0].enum}return null},n._findSchema=function(e,t){for(var i=e,n=0;n0?this.editor.multiselection.nodes:[this],b=w[0],A=w[w.length-1];if(13==u){if(f==this.dom.value)this.editable.value&&!e.ctrlKey||a.isUrl(this.value)&&(window.open(this.value,"_blank"),v=!0);else if(f==this.dom.expand){var C=this._hasChilds();if(C){var E=e.ctrlKey;this._onExpand(E),f.focus(),v=!0}}}else if(68==u)p&&y&&(n.onDuplicate(w),v=!0);else if(69==u)p&&(this._onExpand(m),f.focus(),v=!0);else if(77==u&&y)p&&(this.showContextMenu(f),v=!0);else if(46==u&&y)p&&(n.onRemove(w),v=!0);else if(45==u&&y)p&&!m?(this._onInsertBefore(),v=!0):p&&m&&(this._onInsertAfter(),v=!0);else if(35==u){if(g){var x=this._lastNode();x&&x.focus(n.focusElement||this._getElementName(f)),v=!0}}else if(36==u){if(g){var F=this._firstNode();F&&F.focus(n.focusElement||this._getElementName(f)),v=!0}}else if(37==u){if(g&&!m){var k=this._previousElement(f);k&&this.focus(this._getElementName(k)),v=!0}else if(g&&m&&y){if(A.expanded){var S=A.getAppend();r=S?S.nextSibling:void 0}else{var $=A.getDom();r=$.nextSibling}r&&(i=n.getNodeFromTarget(r),o=r.nextSibling,_=n.getNodeFromTarget(o),i&&i instanceof l&&1!=A.parent.childs.length&&_&&_.parent&&(s=this.editor.getSelection(),c=A._nextSibling(),w.forEach(function(e){_.parent.moveBefore(e,_)}),this.focus(n.focusElement||this._getElementName(f)),this.editor._onAction("moveNodes",{nodes:w,oldBeforeNode:c,newBeforeNode:_,oldSelection:s,newSelection:this.editor.getSelection()})))}}else if(38==u)g&&!m?(t=this._previousNode(),t&&(this.editor.deselect(!0),t.focus(n.focusElement||this._getElementName(f))),v=!0):!g&&p&&m&&y?(t=this._previousNode(),t&&(d=this.editor.multiselection,d.start=d.start||this,d.end=t,h=this.editor._findTopLevelNodes(d.start,d.end),this.editor.select(h),t.focus("field")),v=!0):g&&m&&y&&(t=b._previousNode(),t&&t.parent&&(s=this.editor.getSelection(),c=A._nextSibling(),w.forEach(function(e){t.parent.moveBefore(e,t)}),this.focus(n.focusElement||this._getElementName(f)),this.editor._onAction("moveNodes",{nodes:w,oldBeforeNode:c,newBeforeNode:t,oldSelection:s,newSelection:this.editor.getSelection()})),v=!0);else if(39==u){if(g&&!m){var D=this._nextElement(f);D&&this.focus(this._getElementName(D)),v=!0}else if(g&&m&&y){$=b.getDom();var B=$.previousSibling;B&&(t=n.getNodeFromTarget(B),t&&t.parent&&t instanceof l&&!t.isVisible()&&(s=this.editor.getSelection(),c=A._nextSibling(),w.forEach(function(e){t.parent.moveBefore(e,t)}),this.focus(n.focusElement||this._getElementName(f)),this.editor._onAction("moveNodes",{nodes:w,oldBeforeNode:c,newBeforeNode:t,oldSelection:s,newSelection:this.editor.getSelection()})))}}else if(40==u)if(g&&!m)i=this._nextNode(),i&&(this.editor.deselect(!0),i.focus(n.focusElement||this._getElementName(f))),v=!0;else if(!g&&p&&m&&y)i=this._nextNode(),i&&(d=this.editor.multiselection,d.start=d.start||this,d.end=i,h=this.editor._findTopLevelNodes(d.start,d.end),this.editor.select(h),i.focus("field")),v=!0;else if(g&&m&&y){i=A.expanded?A.append?A.append._nextNode():void 0:A._nextNode();var _=i&&(i._nextNode()||i.parent.append);_&&_.parent&&(s=this.editor.getSelection(),c=A._nextSibling(),w.forEach(function(e){_.parent.moveBefore(e,_)}),this.focus(n.focusElement||this._getElementName(f)),this.editor._onAction("moveNodes",{nodes:w,oldBeforeNode:c,newBeforeNode:_,oldSelection:s,newSelection:this.editor.getSelection()})),v=!0}v&&(e.preventDefault(),e.stopPropagation())},n.prototype._onExpand=function(e){if(e){var t=this.dom.tr.parentNode,i=t.parentNode,n=i.scrollTop;i.removeChild(t)}this.expanded?this.collapse(e):this.expand(e),e&&(i.appendChild(t),i.scrollTop=n)},n.onRemove=function(e){if(!Array.isArray(e))return n.onRemove([e]);if(e&&e.length>0){var t=e[0],i=t.parent,r=t.editor,o=t.getIndex();r.highlighter.unhighlight();var s=r.getSelection();n.blurNodes(e);var a=r.getSelection();e.forEach(function(e){e.parent._remove(e)}),r._onAction("removeNodes",{nodes:e.slice(0),parent:i,index:o,oldSelection:s,newSelection:a})}},n.onDuplicate=function(e){if(!Array.isArray(e))return n.onDuplicate([e]);if(e&&e.length>0){var t=e[e.length-1],i=t.parent,r=t.editor;r.deselect(r.multiselection.nodes);var o=r.getSelection(),s=t,a=e.map(function(e){var t=e.clone();return i.insertAfter(t,s),s=t,t});1===e.length?a[0].focus():r.select(a);var l=r.getSelection();r._onAction("duplicateNodes",{afterNode:t,nodes:a,parent:i,oldSelection:o,newSelection:l})}},n.prototype._onInsertBefore=function(e,t,i){var r=this.editor.getSelection(),o=new n(this.editor,{field:void 0!=e?e:"",value:void 0!=t?t:"",type:i});o.expand(!0),this.parent.insertBefore(o,this),this.editor.highlighter.unhighlight(),o.focus("field");var s=this.editor.getSelection();this.editor._onAction("insertBeforeNodes",{nodes:[o],beforeNode:this,parent:this.parent,oldSelection:r,newSelection:s})},n.prototype._onInsertAfter=function(e,t,i){var r=this.editor.getSelection(),o=new n(this.editor,{field:void 0!=e?e:"",value:void 0!=t?t:"",type:i});o.expand(!0),this.parent.insertAfter(o,this),this.editor.highlighter.unhighlight(),o.focus("field");var s=this.editor.getSelection();this.editor._onAction("insertAfterNodes",{nodes:[o],afterNode:this,parent:this.parent,oldSelection:r,newSelection:s})},n.prototype._onAppend=function(e,t,i){var r=this.editor.getSelection(),o=new n(this.editor,{field:void 0!=e?e:"",value:void 0!=t?t:"",type:i});o.expand(!0),this.parent.appendChild(o),this.editor.highlighter.unhighlight(),o.focus("field");var s=this.editor.getSelection();this.editor._onAction("appendNodes",{nodes:[o],parent:this.parent,oldSelection:r,newSelection:s})},n.prototype._onChangeType=function(e){var t=this.type;if(e!=t){var i=this.editor.getSelection();this.changeType(e);var n=this.editor.getSelection();this.editor._onAction("changeType",{node:this,oldType:t,newType:e,oldSelection:i,newSelection:n})}},n.prototype.sort=function(e){if(this._hasChilds()){var t="desc"==e?-1:1,i="array"==this.type?"value":"field";this.hideChilds();var n=this.childs,o=this.sortOrder;this.childs=this.childs.concat(),this.childs.sort(function(e,n){return t*r(e[i],n[i])}),this.sortOrder=1==t?"asc":"desc",this.editor._onAction("sort",{node:this,oldChilds:n,oldSort:o,newChilds:this.childs,newSort:this.sortOrder}),this.showChilds()}},n.prototype.getAppend=function(){return this.append||(this.append=new l(this.editor),this.append.setParent(this)),this.append.getDom()},n.getNodeFromTarget=function(e){for(;e;){if(e.node)return e.node;e=e.parentNode}},n.blurNodes=function(e){if(!Array.isArray(e))return void n.blurNodes([e]);var t=e[0],i=t.parent,r=t.getIndex();i.childs[r+e.length]?i.childs[r+e.length].focus():i.childs[r-1]?i.childs[r-1].focus():i.focus()},n.prototype._nextSibling=function(){var e=this.parent.childs.indexOf(this);return this.parent.childs[e+1]||this.parent.append},n.prototype._previousNode=function(){var e=null,t=this.getDom();if(t&&t.parentNode){var i=t;do i=i.previousSibling,e=n.getNodeFromTarget(i);while(i&&e instanceof l&&!e.isVisible())}return e},n.prototype._nextNode=function(){var e=null,t=this.getDom();if(t&&t.parentNode){var i=t;do i=i.nextSibling,e=n.getNodeFromTarget(i);while(i&&e instanceof l&&!e.isVisible())}return e},n.prototype._firstNode=function(){var e=null,t=this.getDom();if(t&&t.parentNode){var i=t.parentNode.firstChild;e=n.getNodeFromTarget(i)}return e},n.prototype._lastNode=function(){var e=null,t=this.getDom();if(t&&t.parentNode){var i=t.parentNode.lastChild;for(e=n.getNodeFromTarget(i);i&&e instanceof l&&!e.isVisible();)i=i.previousSibling,e=n.getNodeFromTarget(i)}return e},n.prototype._previousElement=function(e){var t=this.dom;switch(e){case t.value:if(this.fieldEditable)return t.field;case t.field:if(this._hasChilds())return t.expand;case t.expand:return t.menu;case t.menu:if(t.drag)return t.drag;default:return null}},n.prototype._nextElement=function(e){var t=this.dom;switch(e){case t.drag:return t.menu;case t.menu:if(this._hasChilds())return t.expand;case t.expand:if(this.fieldEditable)return t.field;case t.field:if(!this._hasChilds())return t.value;default:return null}},n.prototype._getElementName=function(e){var t=this.dom;for(var i in t)if(t.hasOwnProperty(i)&&t[i]==e)return i;return null},n.prototype._hasChilds=function(){return"array"==this.type||"object"==this.type},n.TYPE_TITLES={auto:'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.',object:'Field type "object". An object contains an unordered set of key/value pairs.',array:'Field type "array". An array contains an ordered collection of values.',string:'Field type "string". Field type is not determined from the value, but always returned as string.'},n.prototype.showContextMenu=function(e,t){var i=this,r=n.TYPE_TITLES,s=[];if(this.editable.value&&s.push({text:"Type",title:"Change the type of this field",className:"jsoneditor-type-"+this.type,submenu:[{text:"Auto",className:"jsoneditor-type-auto"+("auto"==this.type?" jsoneditor-selected":""),title:r.auto,click:function(){i._onChangeType("auto")}},{text:"Array",className:"jsoneditor-type-array"+("array"==this.type?" jsoneditor-selected":""),title:r.array,click:function(){i._onChangeType("array")}},{text:"Object",className:"jsoneditor-type-object"+("object"==this.type?" jsoneditor-selected":""),title:r.object,click:function(){i._onChangeType("object")}},{text:"String",className:"jsoneditor-type-string"+("string"==this.type?" jsoneditor-selected":""),title:r.string,click:function(){i._onChangeType("string")}}]}),this._hasChilds()){var a="asc"==this.sortOrder?"desc":"asc";s.push({text:"Sort",title:"Sort the childs of this "+this.type,className:"jsoneditor-sort-"+a,click:function(){i.sort(a)},submenu:[{text:"Ascending",className:"jsoneditor-sort-asc",title:"Sort the childs of this "+this.type+" in ascending order",click:function(){i.sort("asc")}},{text:"Descending",className:"jsoneditor-sort-desc",title:"Sort the childs of this "+this.type+" in descending order",click:function(){i.sort("desc")}}]})}if(this.parent&&this.parent._hasChilds()){s.length&&s.push({type:"separator"});var l=i.parent.childs;i==l[l.length-1]&&s.push({text:"Append",title:"Append a new field with type 'auto' after this field (Ctrl+Shift+Ins)",submenuTitle:"Select the type of the field to be appended",className:"jsoneditor-append",click:function(){i._onAppend("","","auto")},submenu:[{text:"Auto",className:"jsoneditor-type-auto",title:r.auto,click:function(){i._onAppend("","","auto")}},{text:"Array",className:"jsoneditor-type-array",title:r.array,click:function(){i._onAppend("",[])}},{text:"Object",className:"jsoneditor-type-object",title:r.object,click:function(){i._onAppend("",{})}},{text:"String",className:"jsoneditor-type-string",title:r.string,click:function(){i._onAppend("","","string")}}]}),s.push({text:"Insert",title:"Insert a new field with type 'auto' before this field (Ctrl+Ins)",submenuTitle:"Select the type of the field to be inserted",className:"jsoneditor-insert",click:function(){ +i._onInsertBefore("","","auto")},submenu:[{text:"Auto",className:"jsoneditor-type-auto",title:r.auto,click:function(){i._onInsertBefore("","","auto")}},{text:"Array",className:"jsoneditor-type-array",title:r.array,click:function(){i._onInsertBefore("",[])}},{text:"Object",className:"jsoneditor-type-object",title:r.object,click:function(){i._onInsertBefore("",{})}},{text:"String",className:"jsoneditor-type-string",title:r.string,click:function(){i._onInsertBefore("","","string")}}]}),this.editable.field&&(s.push({text:"Duplicate",title:"Duplicate this field (Ctrl+D)",className:"jsoneditor-duplicate",click:function(){n.onDuplicate(i)}}),s.push({text:"Remove",title:"Remove this field (Ctrl+Del)",className:"jsoneditor-remove",click:function(){n.onRemove(i)}}))}var c=new o(s,{close:t});c.show(e,this.editor.content)},n.prototype._getType=function(e){return e instanceof Array?"array":e instanceof Object?"object":"string"==typeof e&&"string"!=typeof this._stringCast(e)?"string":"auto"},n.prototype._stringCast=function(e){var t=e.toLowerCase(),i=Number(e),n=parseFloat(e);return""==e?"":"null"==t?null:"true"==t||"false"!=t&&(isNaN(i)||isNaN(n)?e:i)},n.prototype._escapeHTML=function(e){if("string"!=typeof e)return String(e);var t=String(e).replace(/&/g,"&").replace(//g,">").replace(/ /g,"  ").replace(/^ /," ").replace(/ $/," "),i=JSON.stringify(t),n=i.substring(1,i.length-1);return this.editor.options.escapeUnicode===!0&&(n=a.escapeUnicodeChars(n)),n},n.prototype._unescapeHTML=function(e){var t='"'+this._escapeJSON(e)+'"',i=a.parse(t);return i.replace(/</g,"<").replace(/>/g,">").replace(/ |\u00A0/g," ").replace(/&/g,"&")},n.prototype._escapeJSON=function(e){for(var t="",i=0;ithis.results.length-1&&(t=0),this._setActiveResult(t,e)}},i.prototype.previous=function(e){if(void 0!=this.results){var t=this.results.length-1,i=void 0!=this.resultIndex?this.resultIndex-1:t;i<0&&(i=t),this._setActiveResult(i,e)}},i.prototype._setActiveResult=function(e,t){if(this.activeResult){var i=this.activeResult.node,n=this.activeResult.elem;"field"==n?delete i.searchFieldActive:delete i.searchValueActive,i.updateDom()}if(!this.results||!this.results[e])return this.resultIndex=void 0,void(this.activeResult=void 0);this.resultIndex=e;var r=this.results[this.resultIndex].node,o=this.results[this.resultIndex].elem;"field"==o?r.searchFieldActive=!0:r.searchValueActive=!0,this.activeResult=this.results[this.resultIndex],r.updateDom(),r.scrollTo(function(){t&&r.focus(o)})},i.prototype._clearDelay=function(){void 0!=this.timeout&&(clearTimeout(this.timeout),delete this.timeout)},i.prototype._onDelayedSearch=function(e){this._clearDelay();var t=this;this.timeout=setTimeout(function(e){t._onSearch()},this.delay)},i.prototype._onSearch=function(e){this._clearDelay();var t=this.dom.search.value,i=t.length>0?t:void 0;if(i!=this.lastText||e)if(this.lastText=i,this.results=this.editor.search(i),this._setActiveResult(void 0),void 0!=i){var n=this.results.length;switch(n){case 0:this.dom.results.innerHTML="no results";break;case 1:this.dom.results.innerHTML="1 result";break;default:this.dom.results.innerHTML=n+" results"}}else this.dom.results.innerHTML=""},i.prototype._onKeyDown=function(e){var t=e.which;27==t?(this.dom.search.value="",this._onSearch(),e.preventDefault(),e.stopPropagation()):13==t&&(e.ctrlKey?this._onSearch(!0):e.shiftKey?this.previous():this.next(),e.preventDefault(),e.stopPropagation())},i.prototype._onKeyUp=function(e){var t=e.keyCode;27!=t&&13!=t&&this._onDelayedSearch(e)},i.prototype.clear=function(){this.dom.search.value="",this._onSearch()},i.prototype.destroy=function(){this.editor=null,this.dom.container.removeChild(this.dom.table),this.dom=null,this.results=null,this.activeResult=null,this._clearDelay()},e.exports=i},function(e,t,i){var n=i(45);i(46),i(44),e.exports=n},function(e,t){ace.define("ace/theme/jsoneditor",["require","exports","module","ace/lib/dom"],function(e,t,i){t.isDark=!1,t.cssClass="ace-jsoneditor",t.cssText='.ace-jsoneditor .ace_gutter {\tbackground: #ebebeb;\tcolor: #333\t}\t\t.ace-jsoneditor.ace_editor {\tfont-family: droid sans mono, consolas, monospace, courier new, courier, sans-serif;\tline-height: 1.3;\t}\t.ace-jsoneditor .ace_print-margin {\twidth: 1px;\tbackground: #e8e8e8\t}\t.ace-jsoneditor .ace_scroller {\tbackground-color: #FFFFFF\t}\t.ace-jsoneditor .ace_text-layer {\tcolor: gray\t}\t.ace-jsoneditor .ace_variable {\tcolor: #1a1a1a\t}\t.ace-jsoneditor .ace_cursor {\tborder-left: 2px solid #000000\t}\t.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\tborder-left: 0px;\tborder-bottom: 1px solid #000000\t}\t.ace-jsoneditor .ace_marker-layer .ace_selection {\tbackground: lightgray\t}\t.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\tbox-shadow: 0 0 3px 0px #FFFFFF;\tborder-radius: 2px\t}\t.ace-jsoneditor .ace_marker-layer .ace_step {\tbackground: rgb(255, 255, 0)\t}\t.ace-jsoneditor .ace_marker-layer .ace_bracket {\tmargin: -1px 0 0 -1px;\tborder: 1px solid #BFBFBF\t}\t.ace-jsoneditor .ace_marker-layer .ace_active-line {\tbackground: #FFFBD1\t}\t.ace-jsoneditor .ace_gutter-active-line {\tbackground-color : #dcdcdc\t}\t.ace-jsoneditor .ace_marker-layer .ace_selected-word {\tborder: 1px solid lightgray\t}\t.ace-jsoneditor .ace_invisible {\tcolor: #BFBFBF\t}\t.ace-jsoneditor .ace_keyword,\t.ace-jsoneditor .ace_meta,\t.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\tcolor: #AF956F\t}\t.ace-jsoneditor .ace_keyword.ace_operator {\tcolor: #484848\t}\t.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\tcolor: #96DC5F\t}\t.ace-jsoneditor .ace_constant.ace_language {\tcolor: darkorange\t}\t.ace-jsoneditor .ace_constant.ace_numeric {\tcolor: red\t}\t.ace-jsoneditor .ace_constant.ace_character.ace_entity {\tcolor: #BF78CC\t}\t.ace-jsoneditor .ace_invalid {\tcolor: #FFFFFF;\tbackground-color: #FF002A;\t}\t.ace-jsoneditor .ace_fold {\tbackground-color: #AF956F;\tborder-color: #000000\t}\t.ace-jsoneditor .ace_storage,\t.ace-jsoneditor .ace_support.ace_class,\t.ace-jsoneditor .ace_support.ace_function,\t.ace-jsoneditor .ace_support.ace_other,\t.ace-jsoneditor .ace_support.ace_type {\tcolor: #C52727\t}\t.ace-jsoneditor .ace_string {\tcolor: green\t}\t.ace-jsoneditor .ace_comment {\tcolor: #BCC8BA\t}\t.ace-jsoneditor .ace_entity.ace_name.ace_tag,\t.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\tcolor: #606060\t}\t.ace-jsoneditor .ace_markup.ace_underline {\ttext-decoration: underline\t}\t.ace-jsoneditor .ace_indent-guide {\tbackground: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y\t}';var n=e("../lib/dom");n.importCssString(t.cssText,t.cssClass)})},function(e,t,i){"use strict";function n(e){function t(e){this.editor=e,this.dom={}}return t.prototype=new e,t.prototype.getDom=function(){var e=this.dom;if(e.tr)return e.tr;this._updateEditability();var t=document.createElement("tr");if(t.node=this,e.tr=t,"tree"===this.editor.options.mode){e.tdDrag=document.createElement("td");var i=document.createElement("td");e.tdMenu=i;var n=document.createElement("button");n.type="button",n.className="jsoneditor-contextmenu",n.title="Click to open the actions menu (Ctrl+M)",e.menu=n,i.appendChild(e.menu)}var r=document.createElement("td"),o=document.createElement("div");return o.innerHTML="(empty)",o.className="jsoneditor-readonly",r.appendChild(o),e.td=r,e.text=o,this.updateDom(),t},t.prototype.updateDom=function(){var e=this.dom,t=e.td;t&&(t.style.paddingLeft=24*this.getLevel()+26+"px");var i=e.text;i&&(i.innerHTML="(empty "+this.parent.type+")");var n=e.tr;this.isVisible()?e.tr.firstChild||(e.tdDrag&&n.appendChild(e.tdDrag),e.tdMenu&&n.appendChild(e.tdMenu),n.appendChild(t)):e.tr.firstChild&&(e.tdDrag&&n.removeChild(e.tdDrag),e.tdMenu&&n.removeChild(e.tdMenu),n.removeChild(t))},t.prototype.isVisible=function(){return 0==this.parent.childs.length},t.prototype.showContextMenu=function(t,i){var n=this,r=e.TYPE_TITLES,s=[{text:"Append",title:"Append a new field with type 'auto' (Ctrl+Shift+Ins)",submenuTitle:"Select the type of the field to be appended",className:"jsoneditor-insert",click:function(){n._onAppend("","","auto")},submenu:[{text:"Auto",className:"jsoneditor-type-auto",title:r.auto,click:function(){n._onAppend("","","auto")}},{text:"Array",className:"jsoneditor-type-array",title:r.array,click:function(){n._onAppend("",[])}},{text:"Object",className:"jsoneditor-type-object",title:r.object,click:function(){n._onAppend("",{})}},{text:"String",className:"jsoneditor-type-string",title:r.string,click:function(){n._onAppend("","","string")}}]}],a=new o(s,{close:i});a.show(t,this.editor.content)},t.prototype.onEvent=function(e){var t=e.type,i=e.target||e.srcElement,n=this.dom,o=n.menu;if(i==o&&("mouseover"==t?this.editor.highlighter.highlight(this.parent):"mouseout"==t&&this.editor.highlighter.unhighlight()),"click"==t&&i==n.menu){var s=this.editor.highlighter;s.highlight(this.parent),s.lock(),r.addClassName(n.menu,"jsoneditor-selected"),this.showContextMenu(n.menu,function(){r.removeClassName(n.menu,"jsoneditor-selected"),s.unlock(),s.unhighlight()})}"keydown"==t&&this.onKeyDown(e)},t}var r=i(3),o=i(4);e.exports=n},function(e,t,i){var n=function(){var e={trace:function(){},yy:{},symbols_:{error:2,JSONString:3,STRING:4,JSONNumber:5,NUMBER:6,JSONNullLiteral:7,NULL:8,JSONBooleanLiteral:9,TRUE:10,FALSE:11,JSONText:12,JSONValue:13,EOF:14,JSONObject:15,JSONArray:16,"{":17,"}":18,JSONMemberList:19,JSONMember:20,":":21,",":22,"[":23,"]":24,JSONElementList:25,$accept:0,$end:1},terminals_:{2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"},productions_:[0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],performAction:function(e,t,i,n,r,o,s){var a=o.length-1;switch(r){case 1:this.$=e.replace(/\\(\\|")/g,"$1").replace(/\\n/g,"\n").replace(/\\r/g,"\r").replace(/\\t/g,"\t").replace(/\\v/g,"\v").replace(/\\f/g,"\f").replace(/\\b/g,"\b");break;case 2:this.$=Number(e);break;case 3:this.$=null;break;case 4:this.$=!0;break;case 5:this.$=!1;break;case 6:return this.$=o[a-1];case 13:this.$={};break;case 14:this.$=o[a-1];break;case 15:this.$=[o[a-2],o[a]];break;case 16:this.$={},this.$[o[a][0]]=o[a][1];break;case 17:this.$=o[a-2],o[a-2][o[a][0]]=o[a][1];break;case 18:this.$=[];break;case 19:this.$=o[a-1];break;case 20:this.$=[o[a]];break;case 21:this.$=o[a-2],o[a-2].push(o[a])}},table:[{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],defaultActions:{16:[2,6]},parseError:function(e,t){throw new Error(e)},parse:function(e){function t(e){r.length=r.length-2*e,o.length=o.length-e,s.length=s.length-e}function i(){var e;return e=n.lexer.lex()||1,"number"!=typeof e&&(e=n.symbols_[e]||e),e}var n=this,r=[0],o=[null],s=[],a=this.table,l="",c=0,h=0,d=0,u=2,f=1;this.lexer.setInput(e),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var p=this.lexer.yylloc;s.push(p),"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var m,g,v,y,w,b,A,C,E,x={};;){if(v=r[r.length-1],this.defaultActions[v]?y=this.defaultActions[v]:(null==m&&(m=i()),y=a[v]&&a[v][m]),"undefined"==typeof y||!y.length||!y[0]){if(!d){E=[];for(b in a[v])this.terminals_[b]&&b>2&&E.push("'"+this.terminals_[b]+"'");var F="";F=this.lexer.showPosition?"Parse error on line "+(c+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+E.join(", ")+", got '"+this.terminals_[m]+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(F,{text:this.lexer.match,token:this.terminals_[m]||m,line:this.lexer.yylineno,loc:p,expected:E})}if(3==d){if(m==f)throw new Error(F||"Parsing halted.");h=this.lexer.yyleng,l=this.lexer.yytext,c=this.lexer.yylineno,p=this.lexer.yylloc,m=i()}for(;!(u.toString()in a[v]);){if(0==v)throw new Error(F||"Parsing halted.");t(1),v=r[r.length-1]}g=m,m=u,v=r[r.length-1],y=a[v]&&a[v][u],d=3}if(y[0]instanceof Array&&y.length>1)throw new Error("Parse Error: multiple actions possible at state: "+v+", token: "+m);switch(y[0]){case 1:r.push(m),o.push(this.lexer.yytext),s.push(this.lexer.yylloc),r.push(y[1]),m=null,g?(m=g,g=null):(h=this.lexer.yyleng,l=this.lexer.yytext,c=this.lexer.yylineno,p=this.lexer.yylloc,d>0&&d--);break;case 2:if(A=this.productions_[y[1]][1],x.$=o[o.length-A],x._$={first_line:s[s.length-(A||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(A||1)].first_column,last_column:s[s.length-1].last_column},w=this.performAction.call(x,l,h,c,this.yy,y[1],o,s),"undefined"!=typeof w)return w;A&&(r=r.slice(0,-1*A*2),o=o.slice(0,-1*A),s=s.slice(0,-1*A)),r.push(this.productions_[y[1]][0]),o.push(x.$),s.push(x._$),C=a[r[r.length-2]][r[r.length-1]],r.push(C);break;case 3:return!0}}return!0}},t=function(){var e={EOF:1,parseError:function(e,t){if(!this.yy.parseError)throw new Error(e);this.yy.parseError(e,t)},setInput:function(e){return this._input=e,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var e=this._input[0];this.yytext+=e,this.yyleng++,this.match+=e,this.matched+=e;var t=e.match(/\n/);return t&&this.yylineno++,this._input=this._input.slice(1),e},unput:function(e){return this._input=e+this._input,this},more:function(){return this._more=!0,this},less:function(e){this._input=this.match.slice(e)+this._input},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,t,i,n,r;this._more||(this.yytext="",this.match="");for(var o=this._currentRules(),s=0;st[0].length)||(t=i,n=s,this.options.flex));s++);return t?(r=t[0].match(/\n.*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-1:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,o[n],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e?e:void 0):""===this._input?this.EOF:void this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return"undefined"!=typeof e?e:this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(e){this.begin(e)}};return e.options={},e.performAction=function(e,t,i,n){switch(i){case 0:break;case 1:return 6;case 2:return t.yytext=t.yytext.substr(1,t.yyleng-2),4;case 3:return 17;case 4:return 18;case 5:return 23;case 6:return 24;case 7:return 22;case 8:return 21;case 9:return 10;case 10:return 11;case 11:return 8;case 12:return 14;case 13:return"INVALID"}},e.rules=[/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt\/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/],e.conditions={INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}},e}();return e.lexer=t,e}();t.parser=n,t.parse=n.parse.bind(n)},function(e,t,i){"use strict";var n;try{n=i(57)}catch(e){}var r=i(17),o=i(3),s={},a=3,l="ace/theme/jsoneditor";s.create=function(e,t){t=t||{},this.options=t,t.indentation?this.indentation=Number(t.indentation):this.indentation=2;var s=t.ace?t.ace:n;this.mode="code"==t.mode?"code":"text","code"==this.mode&&"undefined"==typeof s&&(this.mode="text",console.warn("Failed to load Ace editor, falling back to plain text mode. Please use a JSONEditor bundle including Ace, or pass Ace as via the configuration option `ace`.")),this.theme=t.theme||l,this.theme===l&&window.ace&&i(58);var a=this;this.container=e,this.dom={},this.aceEditor=void 0,this.textarea=void 0,this.validateSchema=null,this._debouncedValidate=o.debounce(this.validate.bind(this),this.DEBOUNCE_INTERVAL),this.width=e.clientWidth,this.height=e.clientHeight,this.frame=document.createElement("div"),this.frame.className="jsoneditor jsoneditor-mode-"+this.options.mode,this.frame.onclick=function(e){e.preventDefault()},this.frame.onkeydown=function(e){a._onKeyDown(e)},this.menu=document.createElement("div"),this.menu.className="jsoneditor-menu",this.frame.appendChild(this.menu);var c=document.createElement("button");c.type="button",c.className="jsoneditor-format",c.title="Format JSON data, with proper indentation and line feeds (Ctrl+\\)",this.menu.appendChild(c),c.onclick=function(){try{a.format(),a._onChange()}catch(e){a._onError(e)}};var h=document.createElement("button");if(h.type="button",h.className="jsoneditor-compact",h.title="Compact JSON data, remove all whitespaces (Ctrl+Shift+\\)",this.menu.appendChild(h),h.onclick=function(){try{a.compact(),a._onChange()}catch(e){a._onError(e)}},this.options&&this.options.modes&&this.options.modes.length&&(this.modeSwitcher=new r(this.menu,this.options.modes,this.options.mode,function(e){a.setMode(e),a.modeSwitcher.focus()})),this.content=document.createElement("div"),this.content.className="jsoneditor-outer",this.frame.appendChild(this.content),this.container.appendChild(this.frame),"code"==this.mode){this.editorDom=document.createElement("div"),this.editorDom.style.height="100%",this.editorDom.style.width="100%",this.content.appendChild(this.editorDom);var d=s.edit(this.editorDom);d.$blockScrolling=1/0,d.setTheme(this.theme),d.setShowPrintMargin(!1),d.setFontSize(13),d.getSession().setMode("ace/mode/json"),d.getSession().setTabSize(this.indentation),d.getSession().setUseSoftTabs(!0),d.getSession().setUseWrapMode(!0),d.commands.bindKey("Ctrl-L",null),d.commands.bindKey("Command-L",null),this.aceEditor=d,this.hasOwnProperty("editor")||Object.defineProperty(this,"editor",{get:function(){return console.warn('Property "editor" has been renamed to "aceEditor".'),a.aceEditor},set:function(e){console.warn('Property "editor" has been renamed to "aceEditor".'),a.aceEditor=e}});var u=document.createElement("a");u.appendChild(document.createTextNode("powered by ace")),u.href="http://ace.ajax.org",u.target="_blank",u.className="jsoneditor-poweredBy",u.onclick=function(){window.open(u.href,u.target)},this.menu.appendChild(u),d.on("change",this._onChange.bind(this))}else{var f=document.createElement("textarea");f.className="jsoneditor-text",f.spellcheck=!1,this.content.appendChild(f),this.textarea=f,null===this.textarea.oninput?this.textarea.oninput=this._onChange.bind(this):this.textarea.onchange=this._onChange.bind(this)}this.setSchema(this.options.schema)},s._onChange=function(){if(this._debouncedValidate(),this.options.onChange)try{this.options.onChange()}catch(e){console.error("Error in onChange callback: ",e)}},s._onKeyDown=function(e){var t=e.which||e.keyCode,i=!1;220==t&&e.ctrlKey&&(e.shiftKey?(this.compact(),this._onChange()):(this.format(),this._onChange()),i=!0),i&&(e.preventDefault(),e.stopPropagation())},s.destroy=function(){this.aceEditor&&(this.aceEditor.destroy(),this.aceEditor=null),this.frame&&this.container&&this.frame.parentNode==this.container&&this.container.removeChild(this.frame),this.modeSwitcher&&(this.modeSwitcher.destroy(),this.modeSwitcher=null),this.textarea=null,this._debouncedValidate=null},s.compact=function(){var e=this.get(),t=JSON.stringify(e);this.setText(t)},s.format=function(){var e=this.get(),t=JSON.stringify(e,null,this.indentation);this.setText(t)},s.focus=function(){this.textarea&&this.textarea.focus(),this.aceEditor&&this.aceEditor.focus()},s.resize=function(){if(this.aceEditor){var e=!1;this.aceEditor.resize(e)}},s.set=function(e){this.setText(JSON.stringify(e,null,this.indentation))},s.get=function(){var e,t=this.getText();try{e=o.parse(t)}catch(i){t=o.sanitize(t),e=o.parse(t)}return e},s.getText=function(){return this.textarea?this.textarea.value:this.aceEditor?this.aceEditor.getValue():""},s.setText=function(e){var t;if(t=this.options.escapeUnicode===!0?o.escapeUnicodeChars(e):e,this.textarea&&(this.textarea.value=t),this.aceEditor){var i=this.options.onChange;this.options.onChange=null,this.aceEditor.setValue(t,-1),this.options.onChange=i}this.validate()},s.validate=function(){this.dom.validationErrors&&(this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors),this.dom.validationErrors=null,this.content.style.marginBottom="",this.content.style.paddingBottom="");var e,t=!1,i=[];try{e=this.get(),t=!0}catch(e){}if(t&&this.validateSchema){var n=this.validateSchema(e);n||(i=this.validateSchema.errors.map(function(e){return o.improveSchemaError(e)}))}if(i.length>0){var r=i.length>a;if(r){i=i.slice(0,a);var s=this.validateSchema.errors.length-a;i.push("("+s+" more errors...)")}var l=document.createElement("div");l.innerHTML=''+i.map(function(e){var t;return t="string"==typeof e?'":"",''+t+""}).join("")+"
'+e+"
"+e.dataPath+""+e.message+"
",this.dom.validationErrors=l,this.frame.appendChild(l);var c=l.clientHeight;this.content.style.marginBottom=-c+"px",this.content.style.paddingBottom=c+"px"}if(this.aceEditor){var h=!1;this.aceEditor.resize(h)}},e.exports=[{mode:"text",mixin:s,data:"text",load:s.format},{mode:"code",mixin:s,data:"text",load:s.format}]},function(e,t,i){"use strict";var n=i(52),r=i(53),o=i(56),s=i(4),a=i(55),l=i(17),c=i(3),h={};h.create=function(e,t){if(!e)throw new Error("No container element provided.");this.container=e,this.dom={},this.highlighter=new n,this.selection=void 0,this.multiselection={nodes:[]},this.validateSchema=null,this.errorNodes=[],this.node=null,this.focusTarget=null,this._setOptions(t),this.options.history&&"view"!==this.options.mode&&(this.history=new r(this)),this._createFrame(),this._createTable()},h.destroy=function(){this.frame&&this.container&&this.frame.parentNode==this.container&&(this.container.removeChild(this.frame),this.frame=null),this.container=null,this.dom=null,this.clear(),this.node=null,this.focusTarget=null,this.selection=null,this.multiselection=null,this.errorNodes=null,this.validateSchema=null,this._debouncedValidate=null,this.history&&(this.history.destroy(),this.history=null),this.searchBox&&(this.searchBox.destroy(),this.searchBox=null),this.modeSwitcher&&(this.modeSwitcher.destroy(),this.modeSwitcher=null)},h._setOptions=function(e){if(this.options={search:!0,history:!0,mode:"tree",name:void 0,schema:null},e)for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.setSchema(this.options.schema),this._debouncedValidate=c.debounce(this.validate.bind(this),this.DEBOUNCE_INTERVAL)},h.set=function(e,t){if(t&&(console.warn('Second parameter "name" is deprecated. Use setName(name) instead.'),this.options.name=t),e instanceof Function||void 0===e)this.clear();else{this.content.removeChild(this.table);var i={field:this.options.name,value:e},n=new a(this,i);this._setRoot(n),this.validate();var r=!1;this.node.expand(r),this.content.appendChild(this.table)}this.history&&this.history.clear(),this.searchBox&&this.searchBox.clear()},h.get=function(){if(this.focusTarget){var e=a.getNodeFromTarget(this.focusTarget);e&&e.blur()}return this.node?this.node.getValue():void 0},h.getText=function(){return JSON.stringify(this.get())},h.setText=function(e){this.set(c.parse(e))},h.setName=function(e){this.options.name=e,this.node&&this.node.updateField(this.options.name)},h.getName=function(){return this.options.name},h.focus=function(){var e=this.content.querySelector("[contenteditable=true]");e?e.focus():this.node.dom.expand?this.node.dom.expand.focus():this.node.dom.menu?this.node.dom.menu.focus():(e=this.frame.querySelector("button"),e&&e.focus())},h.clear=function(){this.node&&(this.node.collapse(),this.tbody.removeChild(this.node.getDom()),delete this.node)},h._setRoot=function(e){this.clear(),this.node=e,this.tbody.appendChild(e.getDom())},h.search=function(e){var t;return this.node?(this.content.removeChild(this.table),t=this.node.search(e),this.content.appendChild(this.table)):t=[],t},h.expandAll=function(){this.node&&(this.content.removeChild(this.table),this.node.expand(),this.content.appendChild(this.table))},h.collapseAll=function(){this.node&&(this.content.removeChild(this.table),this.node.collapse(),this.content.appendChild(this.table))},h._onAction=function(e,t){this.history&&this.history.add(e,t),this._onChange()},h._onChange=function(){if(this._debouncedValidate(),this.options.onChange)try{this.options.onChange()}catch(e){console.error("Error in onChange callback: ",e)}},h.validate=function(){this.errorNodes&&this.errorNodes.forEach(function(e){e.setError(null)});var e=this.node;if(e){var t=e.validate(),i=[];if(this.validateSchema){var n=this.validateSchema(e.getValue());n||(i=this.validateSchema.errors.map(function(e){return c.improveSchemaError(e)}).map(function(t){return{node:e.findNode(t.dataPath),error:t}}).filter(function(e){return null!=e.node}))}this.errorNodes=t.concat(i).reduce(function(e,t){return t.node.findParents().map(function(e){return{node:e,child:t.node,error:{message:"object"===e.type?"Contains invalid properties":"Contains invalid items"}}}).concat(e,[t])},[]).map(function(e){return e.node.setError(e.error,e.child),e.node})}},h.refresh=function(){this.node&&this.node.updateDom({recurse:!0})},h.startAutoScroll=function(e){var t=this,i=this.content,n=c.getAbsoluteTop(i),r=i.clientHeight,o=n+r,s=24,a=50;e0?this.autoScrollStep=(n+s-e)/3:e>o-s&&r+i.scrollTop3?(i.scrollTop+=r/3,n.animateCallback=t,n.animateTimeout=setTimeout(a,50)):(t&&t(!0),i.scrollTop=s,delete n.animateTimeout,delete n.animateCallback)};a()}else t&&t(!1)},h._createFrame=function(){function e(e){t._onEvent&&t._onEvent(e)}this.frame=document.createElement("div"),this.frame.className="jsoneditor jsoneditor-mode-"+this.options.mode,this.container.appendChild(this.frame);var t=this;this.frame.onclick=function(t){var i=t.target;e(t),"BUTTON"==i.nodeName&&t.preventDefault()},this.frame.oninput=e,this.frame.onchange=e,this.frame.onkeydown=e,this.frame.onkeyup=e,this.frame.oncut=e,this.frame.onpaste=e,this.frame.onmousedown=e,this.frame.onmouseup=e,this.frame.onmouseover=e,this.frame.onmouseout=e,c.addEventListener(this.frame,"focus",e,!0),c.addEventListener(this.frame,"blur",e,!0),this.frame.onfocusin=e,this.frame.onfocusout=e,this.menu=document.createElement("div"), +this.menu.className="jsoneditor-menu",this.frame.appendChild(this.menu);var i=document.createElement("button");i.type="button",i.className="jsoneditor-expand-all",i.title="Expand all fields",i.onclick=function(){t.expandAll()},this.menu.appendChild(i);var n=document.createElement("button");if(n.type="button",n.title="Collapse all fields",n.className="jsoneditor-collapse-all",n.onclick=function(){t.collapseAll()},this.menu.appendChild(n),this.history){var r=document.createElement("button");r.type="button",r.className="jsoneditor-undo jsoneditor-separator",r.title="Undo last action (Ctrl+Z)",r.onclick=function(){t._onUndo()},this.menu.appendChild(r),this.dom.undo=r;var s=document.createElement("button");s.type="button",s.className="jsoneditor-redo",s.title="Redo (Ctrl+Shift+Z)",s.onclick=function(){t._onRedo()},this.menu.appendChild(s),this.dom.redo=s,this.history.onChange=function(){r.disabled=!t.history.canUndo(),s.disabled=!t.history.canRedo()},this.history.onChange()}if(this.options&&this.options.modes&&this.options.modes.length){var a=this;this.modeSwitcher=new l(this.menu,this.options.modes,this.options.mode,function(e){a.modeSwitcher.destroy(),a.setMode(e),a.modeSwitcher.focus()})}this.options.search&&(this.searchBox=new o(this,this.menu))},h._onUndo=function(){this.history&&(this.history.undo(),this._onChange())},h._onRedo=function(){this.history&&(this.history.redo(),this._onChange())},h._onEvent=function(e){"keydown"==e.type&&this._onKeyDown(e),"focus"==e.type&&(this.focusTarget=e.target),"mousedown"==e.type&&this._startDragDistance(e),"mousemove"!=e.type&&"mouseup"!=e.type&&"click"!=e.type||this._updateDragDistance(e);var t=a.getNodeFromTarget(e.target);if(t&&t.selected){if("click"==e.type){if(e.target==t.dom.menu)return void this.showContextMenu(e.target);e.hasMoved||this.deselect()}"mousedown"==e.type&&a.onDragStart(this.multiselection.nodes,e)}else"mousedown"==e.type&&(this.deselect(),t&&e.target==t.dom.drag?a.onDragStart(t,e):(!t||e.target!=t.dom.field&&e.target!=t.dom.value&&e.target!=t.dom.select)&&this._onMultiSelectStart(e));t&&t.onEvent(e)},h._startDragDistance=function(e){this.dragDistanceEvent={initialTarget:e.target,initialPageX:e.pageX,initialPageY:e.pageY,dragDistance:0,hasMoved:!1}},h._updateDragDistance=function(e){this.dragDistanceEvent||this._startDragDistance(e);var t=e.pageX-this.dragDistanceEvent.initialPageX,i=e.pageY-this.dragDistanceEvent.initialPageY;return this.dragDistanceEvent.dragDistance=Math.sqrt(t*t+i*i),this.dragDistanceEvent.hasMoved=this.dragDistanceEvent.hasMoved||this.dragDistanceEvent.dragDistance>10,e.dragDistance=this.dragDistanceEvent.dragDistance,e.hasMoved=this.dragDistanceEvent.hasMoved,e.dragDistance},h._onMultiSelectStart=function(e){var t=a.getNodeFromTarget(e.target);if("tree"===this.options.mode&&void 0===this.options.onEditable){this.multiselection={start:t||null,end:null,nodes:[]},this._startDragDistance(e);var i=this;this.mousemove||(this.mousemove=c.addEventListener(window,"mousemove",function(e){i._onMultiSelect(e)})),this.mouseup||(this.mouseup=c.addEventListener(window,"mouseup",function(e){i._onMultiSelectEnd(e)}))}},h._onMultiSelect=function(e){if(e.preventDefault(),this._updateDragDistance(e),e.hasMoved){var t=a.getNodeFromTarget(e.target);t&&(null==this.multiselection.start&&(this.multiselection.start=t),this.multiselection.end=t),this.deselect();var i=this.multiselection.start,n=this.multiselection.end||this.multiselection.start;i&&n&&(this.multiselection.nodes=this._findTopLevelNodes(i,n),this.select(this.multiselection.nodes))}},h._onMultiSelectEnd=function(e){this.multiselection.nodes[0]&&this.multiselection.nodes[0].dom.menu.focus(),this.multiselection.start=null,this.multiselection.end=null,this.mousemove&&(c.removeEventListener(window,"mousemove",this.mousemove),delete this.mousemove),this.mouseup&&(c.removeEventListener(window,"mouseup",this.mouseup),delete this.mouseup)},h.deselect=function(e){this.multiselection.nodes.forEach(function(e){e.setSelected(!1)}),this.multiselection.nodes=[],e&&(this.multiselection.start=null,this.multiselection.end=null)},h.select=function(e){if(!Array.isArray(e))return this.select([e]);if(e){this.deselect(),this.multiselection.nodes=e.slice(0);var t=e[0];e.forEach(function(e){e.setSelected(!0,e===t)})}},h._findTopLevelNodes=function(e,t){for(var i=e.getNodePath(),n=t.getNodePath(),r=0;r="0"&&n<="9";)t+=n,l();if("."===n)for(t+=".";l()&&n>="0"&&n<="9";)t+=n;if("e"===n||"E"===n)for(t+=n,l(),"-"!==n&&"+"!==n||(t+=n,l());n>="0"&&n<="9";)t+=n,l();return e=+t,isFinite(e)?e:void a("Bad number")},h=function(){var e,t,i,r="";if('"'===n)for(;l();){if('"'===n)return l(),r;if("\\"===n)if(l(),"u"===n){for(i=0,t=0;t<4&&(e=parseInt(l(),16),isFinite(e));t+=1)i=16*i+e;r+=String.fromCharCode(i)}else{if("string"!=typeof s[n])break;r+=s[n]}else r+=n}a("Bad string")},d=function(){for(;n&&n<=" ";)l()},u=function(){switch(n){case"t":return l("t"),l("r"),l("u"),l("e"),!0;case"f":return l("f"),l("a"),l("l"),l("s"),l("e"),!1;case"n":return l("n"),l("u"),l("l"),l("l"),null}a("Unexpected '"+n+"'")},f=function(){var e=[];if("["===n){if(l("["),d(),"]"===n)return l("]"),e;for(;n;){if(e.push(o()),d(),"]"===n)return l("]"),e;l(","),d()}}a("Bad array")},p=function(){var e,t={};if("{"===n){if(l("{"),d(),"}"===n)return l("}"),t;for(;n;){if(e=h(),d(),l(":"),Object.hasOwnProperty.call(t,e)&&a('Duplicate key "'+e+'"'),t[e]=o(),d(),"}"===n)return l("}"),t;l(","),d()}}a("Bad object")};o=function(){switch(d(),n){case"{":return p();case"[":return f();case'"':return h();case"-":return c();default:return n>="0"&&n<="9"?c():u()}},e.exports=function(e,t){var s;return r=e,i=0,n=" ",s=o(),d(),n&&a("Syntax error"),"function"==typeof t?function e(i,n){var r,o,s=i[n];if(s&&"object"==typeof s)for(r in s)Object.prototype.hasOwnProperty.call(s,r)&&(o=e(s,r),void 0!==o?s[r]=o:delete s[r]);return t.call(i,n,s)}({"":s},""):s}},function(e,t){function i(e){return a.lastIndex=0,a.test(e)?'"'+e.replace(a,function(e){var t=l[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function n(e,t){var a,l,c,h,d,u=r,f=t[e];switch(f&&"object"==typeof f&&"function"==typeof f.toJSON&&(f=f.toJSON(e)),"function"==typeof s&&(f=s.call(t,e,f)),typeof f){case"string":return i(f);case"number":return isFinite(f)?String(f):"null";case"boolean":case"null":return String(f);case"object":if(!f)return"null";if(r+=o,d=[],"[object Array]"===Object.prototype.toString.apply(f)){for(h=f.length,a=0;a0&&l>a&&(l=a);for(var c=0;c=0?(h=p.substr(0,m),d=p.substr(m+1)):(h=p,d=""),u=decodeURIComponent(h),f=decodeURIComponent(d),i(o,u)?Array.isArray(o[u])?o[u].push(f):o[u]=[o[u],f]:o[u]=f}return o}},function(e,t){"use strict";var i=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};e.exports=function(e,t,n,r){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"==typeof e?Object.keys(e).map(function(r){var o=encodeURIComponent(i(r))+n;return Array.isArray(e[r])?e[r].map(function(e){return o+encodeURIComponent(i(e))}).join(t):o+encodeURIComponent(i(e[r]))}).join(t):r?encodeURIComponent(i(r))+n+encodeURIComponent(i(e)):""}},function(e,t,i){"use strict";t.decode=t.parse=i(67),t.encode=t.stringify=i(68)},function(e,t){e.exports='{\n "id": "http://json-schema.org/draft-04/schema#",\n "$schema": "http://json-schema.org/draft-04/schema#",\n "description": "Core schema meta-schema",\n "definitions": {\n "schemaArray": {\n "type": "array",\n "minItems": 1,\n "items": { "$ref": "#" }\n },\n "positiveInteger": {\n "type": "integer",\n "minimum": 0\n },\n "positiveIntegerDefault0": {\n "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]\n },\n "simpleTypes": {\n "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]\n },\n "stringArray": {\n "type": "array",\n "items": { "type": "string" },\n "minItems": 1,\n "uniqueItems": true\n }\n },\n "type": "object",\n "properties": {\n "id": {\n "type": "string",\n "format": "uri"\n },\n "$schema": {\n "type": "string",\n "format": "uri"\n },\n "title": {\n "type": "string"\n },\n "description": {\n "type": "string"\n },\n "default": {},\n "multipleOf": {\n "type": "number",\n "minimum": 0,\n "exclusiveMinimum": true\n },\n "maximum": {\n "type": "number"\n },\n "exclusiveMaximum": {\n "type": "boolean",\n "default": false\n },\n "minimum": {\n "type": "number"\n },\n "exclusiveMinimum": {\n "type": "boolean",\n "default": false\n },\n "maxLength": { "$ref": "#/definitions/positiveInteger" },\n "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },\n "pattern": {\n "type": "string",\n "format": "regex"\n },\n "additionalItems": {\n "anyOf": [\n { "type": "boolean" },\n { "$ref": "#" }\n ],\n "default": {}\n },\n "items": {\n "anyOf": [\n { "$ref": "#" },\n { "$ref": "#/definitions/schemaArray" }\n ],\n "default": {}\n },\n "maxItems": { "$ref": "#/definitions/positiveInteger" },\n "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },\n "uniqueItems": {\n "type": "boolean",\n "default": false\n },\n "maxProperties": { "$ref": "#/definitions/positiveInteger" },\n "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },\n "required": { "$ref": "#/definitions/stringArray" },\n "additionalProperties": {\n "anyOf": [\n { "type": "boolean" },\n { "$ref": "#" }\n ],\n "default": {}\n },\n "definitions": {\n "type": "object",\n "additionalProperties": { "$ref": "#" },\n "default": {}\n },\n "properties": {\n "type": "object",\n "additionalProperties": { "$ref": "#" },\n "default": {}\n },\n "patternProperties": {\n "type": "object",\n "additionalProperties": { "$ref": "#" },\n "default": {}\n },\n "dependencies": {\n "type": "object",\n "additionalProperties": {\n "anyOf": [\n { "$ref": "#" },\n { "$ref": "#/definitions/stringArray" }\n ]\n }\n },\n "enum": {\n "type": "array",\n "minItems": 1,\n "uniqueItems": true\n },\n "type": {\n "anyOf": [\n { "$ref": "#/definitions/simpleTypes" },\n {\n "type": "array",\n "items": { "$ref": "#/definitions/simpleTypes" },\n "minItems": 1,\n "uniqueItems": true\n }\n ]\n },\n "allOf": { "$ref": "#/definitions/schemaArray" },\n "anyOf": { "$ref": "#/definitions/schemaArray" },\n "oneOf": { "$ref": "#/definitions/schemaArray" },\n "not": { "$ref": "#" }\n },\n "dependencies": {\n "exclusiveMaximum": [ "maximum" ],\n "exclusiveMinimum": [ "minimum" ]\n },\n "default": {}\n}\n'},function(e,t){e.exports='{\n "id": "https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#",\n "$schema": "http://json-schema.org/draft-04/schema#",\n "description": "Core schema meta-schema (v5 proposals)",\n "definitions": {\n "schemaArray": {\n "type": "array",\n "minItems": 1,\n "items": { "$ref": "#" }\n },\n "positiveInteger": {\n "type": "integer",\n "minimum": 0\n },\n "positiveIntegerDefault0": {\n "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]\n },\n "simpleTypes": {\n "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]\n },\n "stringArray": {\n "type": "array",\n "items": { "type": "string" },\n "minItems": 1,\n "uniqueItems": true\n },\n "$data": {\n "type": "object",\n "required": [ "$data" ],\n "properties": {\n "$data": {\n "type": "string",\n "format": "relative-json-pointer"\n }\n },\n "additionalProperties": false\n }\n },\n "type": "object",\n "properties": {\n "id": {\n "type": "string",\n "format": "uri"\n },\n "$schema": {\n "type": "string",\n "format": "uri"\n },\n "title": {\n "type": "string"\n },\n "description": {\n "type": "string"\n },\n "default": {},\n "multipleOf": {\n "anyOf": [\n {\n "type": "number",\n "minimum": 0,\n "exclusiveMinimum": true\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "maximum": {\n "anyOf": [\n { "type": "number" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "exclusiveMaximum": {\n "anyOf": [\n {\n "type": "boolean",\n "default": false\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "minimum": {\n "anyOf": [\n { "type": "number" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "exclusiveMinimum": {\n "anyOf": [\n {\n "type": "boolean",\n "default": false\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "maxLength": {\n "anyOf": [\n { "$ref": "#/definitions/positiveInteger" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "minLength": {\n "anyOf": [\n { "$ref": "#/definitions/positiveIntegerDefault0" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "pattern": {\n "anyOf": [\n {\n "type": "string",\n "format": "regex"\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "additionalItems": {\n "anyOf": [\n { "type": "boolean" },\n { "$ref": "#" },\n { "$ref": "#/definitions/$data" }\n ],\n "default": {}\n },\n "items": {\n "anyOf": [\n { "$ref": "#" },\n { "$ref": "#/definitions/schemaArray" }\n ],\n "default": {}\n },\n "maxItems": {\n "anyOf": [\n { "$ref": "#/definitions/positiveInteger" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "minItems": {\n "anyOf": [\n { "$ref": "#/definitions/positiveIntegerDefault0" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "uniqueItems": {\n "anyOf": [\n {\n "type": "boolean",\n "default": false\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "maxProperties": {\n "anyOf": [\n { "$ref": "#/definitions/positiveInteger" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "minProperties": {\n "anyOf": [\n { "$ref": "#/definitions/positiveIntegerDefault0" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "required": {\n "anyOf": [\n { "$ref": "#/definitions/stringArray" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "additionalProperties": {\n "anyOf": [\n { "type": "boolean" },\n { "$ref": "#" },\n { "$ref": "#/definitions/$data" }\n ],\n "default": {}\n },\n "definitions": {\n "type": "object",\n "additionalProperties": { "$ref": "#" },\n "default": {}\n },\n "properties": {\n "type": "object",\n "additionalProperties": { "$ref": "#" },\n "default": {}\n },\n "patternProperties": {\n "type": "object",\n "additionalProperties": { "$ref": "#" },\n "default": {}\n },\n "dependencies": {\n "type": "object",\n "additionalProperties": {\n "anyOf": [\n { "$ref": "#" },\n { "$ref": "#/definitions/stringArray" }\n ]\n }\n },\n "enum": {\n "anyOf": [\n {\n "type": "array",\n "minItems": 1,\n "uniqueItems": true\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "type": {\n "anyOf": [\n { "$ref": "#/definitions/simpleTypes" },\n {\n "type": "array",\n "items": { "$ref": "#/definitions/simpleTypes" },\n "minItems": 1,\n "uniqueItems": true\n }\n ]\n },\n "allOf": { "$ref": "#/definitions/schemaArray" },\n "anyOf": { "$ref": "#/definitions/schemaArray" },\n "oneOf": { "$ref": "#/definitions/schemaArray" },\n "not": { "$ref": "#" },\n "format": {\n "anyOf": [\n { "type": "string" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "formatMaximum": {\n "anyOf": [\n { "type": "string" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "formatMinimum": {\n "anyOf": [\n { "type": "string" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "exclusiveFormatMaximum": {\n "anyOf": [\n {\n "type": "boolean",\n "default": false\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "exclusiveFormatMinimum": {\n "anyOf": [\n {\n "type": "boolean",\n "default": false\n },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "constant": {\n "anyOf": [\n {},\n { "$ref": "#/definitions/$data" }\n ]\n },\n "contains": { "$ref": "#" },\n "patternGroups": {\n "type": "object",\n "additionalProperties": {\n "type": "object",\n "required": [ "schema" ],\n "properties": {\n "maximum": {\n "anyOf": [\n { "$ref": "#/definitions/positiveInteger" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "minimum": {\n "anyOf": [\n { "$ref": "#/definitions/positiveIntegerDefault0" },\n { "$ref": "#/definitions/$data" }\n ]\n },\n "schema": { "$ref": "#" }\n },\n "additionalProperties": false\n },\n "default": {}\n },\n "switch": {\n "type": "array",\n "items": {\n "required": [ "then" ],\n "properties": {\n "if": { "$ref": "#" },\n "then": {\n "anyOf": [\n { "type": "boolean" },\n { "$ref": "#" }\n ]\n },\n "continue": { "type": "boolean" }\n },\n "additionalProperties": false,\n "dependencies": {\n "continue": [ "if" ]\n }\n }\n }\n },\n "dependencies": {\n "exclusiveMaximum": [ "maximum" ],\n "exclusiveMinimum": [ "minimum" ],\n "formatMaximum": [ "format" ],\n "formatMinimum": [ "format" ],\n "exclusiveFormatMaximum": [ "formatMaximum" ],\n "exclusiveFormatMinimum": [ "formatMinimum" ]\n },\n "default": {}\n}\n'},function(e,t,i){function n(e,t){for(var i=0;i=0&&w.splice(t,1)}function a(e){var t=document.createElement("style");return t.type="text/css",o(e,t),t}function l(e){var t=document.createElement("link");return t.rel="stylesheet",o(e,t),t}function c(e,t){var i,n,r;if(t.singleton){var o=y++;i=v||(v=a(t)),n=h.bind(null,i,o,!1),r=h.bind(null,i,o,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(i=l(t),n=u.bind(null,i),r=function(){s(i),i.href&&URL.revokeObjectURL(i.href)}):(i=a(t),n=d.bind(null,i),r=function(){s(i)});return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else r()}}function h(e,t,i,n){var r=i?"":n.css;if(e.styleSheet)e.styleSheet.cssText=b(t,r);else{var o=document.createTextNode(r),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(o,s[t]):e.appendChild(o)}}function d(e,t){var i=t.css,n=t.media;if(n&&e.setAttribute("media",n),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}function u(e,t){var i=t.css,n=t.sourceMap;n&&(i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var r=new Blob([i],{type:"text/css"}),o=e.href;e.href=URL.createObjectURL(r),o&&URL.revokeObjectURL(o)}var f={},p=function(e){var t;return function(){return"undefined"==typeof t&&(t=e.apply(this,arguments)),t}},m=p(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),g=p(function(){return document.head||document.getElementsByTagName("head")[0]}),v=null,y=0,w=[];e.exports=function(e,t){t=t||{},"undefined"==typeof t.singleton&&(t.singleton=m()),"undefined"==typeof t.insertAt&&(t.insertAt="bottom");var i=r(e);return n(i,t),function(e){for(var o=[],s=0;s1&&(n=i[0]+"@",e=i[1]),e=e.replace(_,".");var r=e.split("."),o=a(r,t).join(".");return n+o}function c(e){for(var t,i,n=[],r=0,o=e.length;r=55296&&t<=56319&&r65535&&(e-=65536,t+=T(e>>>10&1023|55296),e=56320|1023&e),t+=T(e)}).join("")}function d(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:A}function u(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function f(e,t,i){var n=0;for(e=i?j(e/F):e>>1,e+=j(e/t);e>R*E>>1;n+=A)e=j(e/R);return j(n+(R+1)*e/(e+x))}function p(e){var t,i,n,r,o,a,l,c,u,p,m=[],g=e.length,v=0,y=S,w=k;for(i=e.lastIndexOf($),i<0&&(i=0),n=0;n=128&&s("not-basic"),m.push(e.charCodeAt(n));for(r=i>0?i+1:0;r=g&&s("invalid-input"),c=d(e.charCodeAt(r++)),(c>=A||c>j((b-v)/a))&&s("overflow"),v+=c*a,u=l<=w?C:l>=w+E?E:l-w,!(cj(b/p)&&s("overflow"),a*=p;t=m.length+1,w=f(v-o,t,0==o),j(v/t)>b-y&&s("overflow"),y+=j(v/t),v%=t,m.splice(v++,0,y)}return h(m)}function m(e){var t,i,n,r,o,a,l,h,d,p,m,g,v,y,w,x=[];for(e=c(e),g=e.length,t=S,i=0,o=k,a=0;a=t&&mj((b-i)/v)&&s("overflow"),i+=(l-t)*v,t=l,a=0;ab&&s("overflow"),m==t){for(h=i,d=A;p=d<=o?C:d>=o+E?E:d-o,!(h= 0x80 (not a basic code point)","invalid-input":"Invalid input"},R=A-C,j=Math.floor,T=String.fromCharCode;w={version:"1.3.2",ucs2:{decode:c,encode:h},decode:p,encode:m,toASCII:v,toUnicode:g},n=function(){ +return w}.call(t,i,t,e),!(void 0!==n&&(e.exports=n))}(this)}).call(t,i(79)(e),function(){return this}())},function(e,t,i){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function r(e,t,i){if(e&&c.isObject(e)&&e instanceof n)return e;var r=new n;return r.parse(e,t,i),r}function o(e){return c.isString(e)&&(e=r(e)),e instanceof n?e.format():n.prototype.format.call(e)}function s(e,t){return r(e,!1,!0).resolve(t)}function a(e,t){return e?r(e,!1,!0).resolveObject(t):t}var l=i(74),c=i(76);t.parse=r,t.resolve=s,t.resolveObject=a,t.format=o,t.Url=n;var h=/^([a-z0-9.+-]+:)/i,d=/:[0-9]*$/,u=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,f=["<",">",'"',"`"," ","\r","\n","\t"],p=["{","}","|","\\","^","`"].concat(f),m=["'"].concat(p),g=["%","/","?",";","#"].concat(m),v=["/","?","#"],y=255,w=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,A={javascript:!0,"javascript:":!0},C={javascript:!0,"javascript:":!0},E={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},x=i(69);n.prototype.parse=function(e,t,i){if(!c.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var n=e.indexOf("?"),r=n!==-1&&n127?"x":j[P];if(!T.match(w)){var O=L.slice(0,S),N=L.slice(S+1),I=j.match(b);I&&(O.push(I[1]),N.unshift(I[2])),N.length&&(a="/"+N.join(".")+a),this.hostname=O.join(".");break}}}this.hostname.length>y?this.hostname="":this.hostname=this.hostname.toLowerCase(),_||(this.hostname=l.toASCII(this.hostname));var W=this.port?":"+this.port:"",H=this.hostname||"";this.host=H+W,this.href+=this.host,_&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==a[0]&&(a="/"+a))}if(!A[p])for(var S=0,R=m.length;S0)&&i.host.split("@");F&&(i.auth=F.shift(),i.host=i.hostname=F.shift())}return i.search=e.search,i.query=e.query,c.isNull(i.pathname)&&c.isNull(i.search)||(i.path=(i.pathname?i.pathname:"")+(i.search?i.search:"")),i.href=i.format(),i}if(!A.length)return i.pathname=null,i.search?i.path="/"+i.search:i.path=null,i.href=i.format(),i;for(var k=A.slice(-1)[0],S=(i.host||e.host||A.length>1)&&("."===k||".."===k)||""===k,$=0,D=A.length;D>=0;D--)k=A[D],"."===k?A.splice(D,1):".."===k?(A.splice(D,1),$++):$&&(A.splice(D,1),$--);if(!w&&!b)for(;$--;$)A.unshift("..");!w||""===A[0]||A[0]&&"/"===A[0].charAt(0)||A.unshift(""),S&&"/"!==A.join("/").substr(-1)&&A.push("");var B=""===A[0]||A[0]&&"/"===A[0].charAt(0);if(x){i.hostname=i.host=B?"":A.length?A.shift():"";var F=!!(i.host&&i.host.indexOf("@")>0)&&i.host.split("@");F&&(i.auth=F.shift(),i.host=i.hostname=F.shift())}return w=w||i.host&&A.length,w&&!B&&A.unshift(""),A.length?i.pathname=A.join("/"):(i.pathname=null,i.path=null),c.isNull(i.pathname)&&c.isNull(i.search)||(i.path=(i.pathname?i.pathname:"")+(i.search?i.search:"")),i.auth=e.auth||i.auth,i.slashes=i.slashes||e.slashes,i.href=i.format(),i},n.prototype.parseHost=function(){var e=this.host,t=d.exec(e);t&&(t=t[0],":"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t){"use strict";e.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t){(function(t){function i(){if(t.Blob)try{return new Blob(["asdf"],{type:"text/plain"}),Blob}catch(e){}var e=t.WebKitBlobBuilder||t.MozBlobBuilder||t.MSBlobBuilder;return function(t,i){var n=new e,r=i.endings,o=i.type;if(r)for(var s=0,a=t.length;s= 0xD800 && value <= 0xDBFF && pos < len) {\n\t // high surrogate, and there is a next character\n\t value = str.charCodeAt(pos);\n\t if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate\n\t }\n\t }\n\t return length;\n\t}\n\t\n\t\n\tfunction varOccurences(str, dataVar) {\n\t dataVar += '[^0-9]';\n\t var matches = str.match(new RegExp(dataVar, 'g'));\n\t return matches ? matches.length : 0;\n\t}\n\t\n\t\n\tfunction varReplace(str, dataVar, expr) {\n\t dataVar += '([^0-9])';\n\t expr = expr.replace(/\\$/g, '$$$$');\n\t return str.replace(new RegExp(dataVar, 'g'), expr + '$1');\n\t}\n\t\n\t\n\tvar EMPTY_ELSE = /else\\s*{\\s*}/g\n\t , EMPTY_IF_NO_ELSE = /if\\s*\\([^)]+\\)\\s*\\{\\s*\\}(?!\\s*else)/g\n\t , EMPTY_IF_WITH_ELSE = /if\\s*\\(([^)]+)\\)\\s*\\{\\s*\\}\\s*else(?!\\s*if)/g;\n\tfunction cleanUpCode(out) {\n\t return out.replace(EMPTY_ELSE, '')\n\t .replace(EMPTY_IF_NO_ELSE, '')\n\t .replace(EMPTY_IF_WITH_ELSE, 'if (!($1))');\n\t}\n\t\n\t\n\tvar ERRORS_REGEXP = /[^v\\.]errors/g\n\t , REMOVE_ERRORS = /var errors = 0;|var vErrors = null;|validate.errors = vErrors;/g\n\t , REMOVE_ERRORS_ASYNC = /var errors = 0;|var vErrors = null;/g\n\t , RETURN_VALID = 'return errors === 0;'\n\t , RETURN_TRUE = 'validate.errors = null; return true;'\n\t , RETURN_ASYNC = /if \\(errors === 0\\) return true;\\s*else throw new ValidationError\\(vErrors\\);/\n\t , RETURN_TRUE_ASYNC = 'return true;';\n\t\n\tfunction cleanUpVarErrors(out, async) {\n\t var matches = out.match(ERRORS_REGEXP);\n\t if (!matches || matches.length !== 2) return out;\n\t return async\n\t ? out.replace(REMOVE_ERRORS_ASYNC, '')\n\t .replace(RETURN_ASYNC, RETURN_TRUE_ASYNC)\n\t : out.replace(REMOVE_ERRORS, '')\n\t .replace(RETURN_VALID, RETURN_TRUE);\n\t}\n\t\n\t\n\tfunction schemaHasRules(schema, rules) {\n\t for (var key in schema) if (rules[key]) return true;\n\t}\n\t\n\t\n\tfunction toQuotedString(str) {\n\t return '\\'' + escapeQuotes(str) + '\\'';\n\t}\n\t\n\t\n\tfunction getPathExpr(currentPath, expr, jsonPointers, isNumber) {\n\t var path = jsonPointers // false by default\n\t ? '\\'/\\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \\'~0\\').replace(/\\\\//g, \\'~1\\')')\n\t : (isNumber ? '\\'[\\' + ' + expr + ' + \\']\\'' : '\\'[\\\\\\'\\' + ' + expr + ' + \\'\\\\\\']\\'');\n\t return joinPaths(currentPath, path);\n\t}\n\t\n\t\n\tfunction getPath(currentPath, prop, jsonPointers) {\n\t var path = jsonPointers // false by default\n\t ? toQuotedString('/' + escapeJsonPointer(prop))\n\t : toQuotedString(getProperty(prop));\n\t return joinPaths(currentPath, path);\n\t}\n\t\n\t\n\tvar RELATIVE_JSON_POINTER = /^([0-9]+)(#|\\/(?:[^~]|~0|~1)*)?$/;\n\tfunction getData($data, lvl, paths) {\n\t var matches = $data.match(RELATIVE_JSON_POINTER);\n\t if (!matches) throw new Error('Invalid relative JSON-pointer: ' + $data);\n\t var up = +matches[1];\n\t var jsonPointer = matches[2];\n\t if (jsonPointer == '#') {\n\t if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);\n\t return paths[lvl - up];\n\t }\n\t\n\t if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);\n\t var data = 'data' + ((lvl - up) || '');\n\t if (!jsonPointer) return data;\n\t\n\t var expr = data;\n\t var segments = jsonPointer.split('/');\n\t for (var i=0; i [{\"a\":\"b\"}]\n\t var match = jsString.match(/^\\s*(\\/\\*(.|[\\r\\n])*?\\*\\/)?\\s*[\\da-zA-Z_$]+\\s*\\(([\\s\\S]*)\\)\\s*;?\\s*$/);\n\t if (match) {\n\t jsString = match[3];\n\t }\n\t\n\t // helper functions to get the current/prev/next character\n\t function curr () { return jsString.charAt(i); }\n\t function next() { return jsString.charAt(i + 1); }\n\t function prev() { return jsString.charAt(i - 1); }\n\t\n\t // get the last parsed non-whitespace character\n\t function lastNonWhitespace () {\n\t var p = chars.length - 1;\n\t\n\t while (p >= 0) {\n\t var pp = chars[p];\n\t if (pp !== ' ' && pp !== '\\n' && pp !== '\\r' && pp !== '\\t') { // non whitespace\n\t return pp;\n\t }\n\t p--;\n\t }\n\t\n\t return '';\n\t }\n\t\n\t // skip a block comment '/* ... */'\n\t function skipBlockComment () {\n\t i += 2;\n\t while (i < jsString.length && (curr() !== '*' || next() !== '/')) {\n\t i++;\n\t }\n\t i += 2;\n\t }\n\t\n\t // skip a comment '// ...'\n\t function skipComment () {\n\t i += 2;\n\t while (i < jsString.length && (curr() !== '\\n')) {\n\t i++;\n\t }\n\t }\n\t\n\t // parse single or double quoted string\n\t function parseString(quote) {\n\t chars.push('\"');\n\t i++;\n\t var c = curr();\n\t while (i < jsString.length && c !== quote) {\n\t if (c === '\"' && prev() !== '\\\\') {\n\t // unescaped double quote, escape it\n\t chars.push('\\\\');\n\t }\n\t\n\t // handle escape character\n\t if (c === '\\\\') {\n\t i++;\n\t c = curr();\n\t\n\t // remove the escape character when followed by a single quote ', not needed\n\t if (c !== '\\'') {\n\t chars.push('\\\\');\n\t }\n\t }\n\t chars.push(c);\n\t\n\t i++;\n\t c = curr();\n\t }\n\t if (c === quote) {\n\t chars.push('\"');\n\t i++;\n\t }\n\t }\n\t\n\t // parse an unquoted key\n\t function parseKey() {\n\t var specialValues = ['null', 'true', 'false'];\n\t var key = '';\n\t var c = curr();\n\t\n\t var regexp = /[a-zA-Z_$\\d]/; // letter, number, underscore, dollar character\n\t while (regexp.test(c)) {\n\t key += c;\n\t i++;\n\t c = curr();\n\t }\n\t\n\t if (specialValues.indexOf(key) === -1) {\n\t chars.push('\"' + key + '\"');\n\t }\n\t else {\n\t chars.push(key);\n\t }\n\t }\n\t\n\t while(i < jsString.length) {\n\t var c = curr();\n\t\n\t if (c === '/' && next() === '*') {\n\t skipBlockComment();\n\t }\n\t else if (c === '/' && next() === '/') {\n\t skipComment();\n\t }\n\t else if (c === '\\'' || c === '\"') {\n\t parseString(c);\n\t }\n\t else if (/[a-zA-Z_$]/.test(c) && ['{', ','].indexOf(lastNonWhitespace()) !== -1) {\n\t // an unquoted object key (like a in '{a:2}')\n\t parseKey();\n\t }\n\t else {\n\t chars.push(c);\n\t i++;\n\t }\n\t }\n\t\n\t return chars.join('');\n\t};\n\t\n\t/**\n\t * Escape unicode characters.\n\t * For example input '\\u2661' (length 1) will output '\\\\u2661' (length 5).\n\t * @param {string} text\n\t * @return {string}\n\t */\n\texports.escapeUnicodeChars = function (text) {\n\t // see https://www.wikiwand.com/en/UTF-16\n\t // note: we leave surrogate pairs as two individual chars,\n\t // as JSON doesn't interpret them as a single unicode char.\n\t return text.replace(/[\\u007F-\\uFFFF]/g, function(c) {\n\t return '\\\\u'+('0000' + c.charCodeAt(0).toString(16)).slice(-4);\n\t })\n\t};\n\t\n\t/**\n\t * Validate a string containing a JSON object\n\t * This method uses JSONLint to validate the String. If JSONLint is not\n\t * available, the built-in JSON parser of the browser is used.\n\t * @param {String} jsonString String with an (invalid) JSON object\n\t * @throws Error\n\t */\n\texports.validate = function validate(jsonString) {\n\t if (typeof(jsonlint) != 'undefined') {\n\t jsonlint.parse(jsonString);\n\t }\n\t else {\n\t JSON.parse(jsonString);\n\t }\n\t};\n\t\n\t/**\n\t * Extend object a with the properties of object b\n\t * @param {Object} a\n\t * @param {Object} b\n\t * @return {Object} a\n\t */\n\texports.extend = function extend(a, b) {\n\t for (var prop in b) {\n\t if (b.hasOwnProperty(prop)) {\n\t a[prop] = b[prop];\n\t }\n\t }\n\t return a;\n\t};\n\t\n\t/**\n\t * Remove all properties from object a\n\t * @param {Object} a\n\t * @return {Object} a\n\t */\n\texports.clear = function clear (a) {\n\t for (var prop in a) {\n\t if (a.hasOwnProperty(prop)) {\n\t delete a[prop];\n\t }\n\t }\n\t return a;\n\t};\n\t\n\t/**\n\t * Get the type of an object\n\t * @param {*} object\n\t * @return {String} type\n\t */\n\texports.type = function type (object) {\n\t if (object === null) {\n\t return 'null';\n\t }\n\t if (object === undefined) {\n\t return 'undefined';\n\t }\n\t if ((object instanceof Number) || (typeof object === 'number')) {\n\t return 'number';\n\t }\n\t if ((object instanceof String) || (typeof object === 'string')) {\n\t return 'string';\n\t }\n\t if ((object instanceof Boolean) || (typeof object === 'boolean')) {\n\t return 'boolean';\n\t }\n\t if ((object instanceof RegExp) || (typeof object === 'regexp')) {\n\t return 'regexp';\n\t }\n\t if (exports.isArray(object)) {\n\t return 'array';\n\t }\n\t\n\t return 'object';\n\t};\n\t\n\t/**\n\t * Test whether a text contains a url (matches when a string starts\n\t * with 'http://*' or 'https://*' and has no whitespace characters)\n\t * @param {String} text\n\t */\n\tvar isUrlRegex = /^https?:\\/\\/\\S+$/;\n\texports.isUrl = function isUrl (text) {\n\t return (typeof text == 'string' || text instanceof String) &&\n\t isUrlRegex.test(text);\n\t};\n\t\n\t/**\n\t * Tes whether given object is an Array\n\t * @param {*} obj\n\t * @returns {boolean} returns true when obj is an array\n\t */\n\texports.isArray = function (obj) {\n\t return Object.prototype.toString.call(obj) === '[object Array]';\n\t};\n\t\n\t/**\n\t * Retrieve the absolute left value of a DOM element\n\t * @param {Element} elem A dom element, for example a div\n\t * @return {Number} left The absolute left position of this element\n\t * in the browser page.\n\t */\n\texports.getAbsoluteLeft = function getAbsoluteLeft(elem) {\n\t var rect = elem.getBoundingClientRect();\n\t return rect.left + window.pageXOffset || document.scrollLeft || 0;\n\t};\n\t\n\t/**\n\t * Retrieve the absolute top value of a DOM element\n\t * @param {Element} elem A dom element, for example a div\n\t * @return {Number} top The absolute top position of this element\n\t * in the browser page.\n\t */\n\texports.getAbsoluteTop = function getAbsoluteTop(elem) {\n\t var rect = elem.getBoundingClientRect();\n\t return rect.top + window.pageYOffset || document.scrollTop || 0;\n\t};\n\t\n\t/**\n\t * add a className to the given elements style\n\t * @param {Element} elem\n\t * @param {String} className\n\t */\n\texports.addClassName = function addClassName(elem, className) {\n\t var classes = elem.className.split(' ');\n\t if (classes.indexOf(className) == -1) {\n\t classes.push(className); // add the class to the array\n\t elem.className = classes.join(' ');\n\t }\n\t};\n\t\n\t/**\n\t * add a className to the given elements style\n\t * @param {Element} elem\n\t * @param {String} className\n\t */\n\texports.removeClassName = function removeClassName(elem, className) {\n\t var classes = elem.className.split(' ');\n\t var index = classes.indexOf(className);\n\t if (index != -1) {\n\t classes.splice(index, 1); // remove the class from the array\n\t elem.className = classes.join(' ');\n\t }\n\t};\n\t\n\t/**\n\t * Strip the formatting from the contents of a div\n\t * the formatting from the div itself is not stripped, only from its childs.\n\t * @param {Element} divElement\n\t */\n\texports.stripFormatting = function stripFormatting(divElement) {\n\t var childs = divElement.childNodes;\n\t for (var i = 0, iMax = childs.length; i < iMax; i++) {\n\t var child = childs[i];\n\t\n\t // remove the style\n\t if (child.style) {\n\t // TODO: test if child.attributes does contain style\n\t child.removeAttribute('style');\n\t }\n\t\n\t // remove all attributes\n\t var attributes = child.attributes;\n\t if (attributes) {\n\t for (var j = attributes.length - 1; j >= 0; j--) {\n\t var attribute = attributes[j];\n\t if (attribute.specified === true) {\n\t child.removeAttribute(attribute.name);\n\t }\n\t }\n\t }\n\t\n\t // recursively strip childs\n\t exports.stripFormatting(child);\n\t }\n\t};\n\t\n\t/**\n\t * Set focus to the end of an editable div\n\t * code from Nico Burns\n\t * http://stackoverflow.com/users/140293/nico-burns\n\t * http://stackoverflow.com/questions/1125292/how-to-move-cursor-to-end-of-contenteditable-entity\n\t * @param {Element} contentEditableElement A content editable div\n\t */\n\texports.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) {\n\t var range, selection;\n\t if(document.createRange) {\n\t range = document.createRange();//Create a range (a range is a like the selection but invisible)\n\t range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range\n\t range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start\n\t selection = window.getSelection();//get the selection object (allows you to change selection)\n\t selection.removeAllRanges();//remove any selections already made\n\t selection.addRange(range);//make the range you have just created the visible selection\n\t }\n\t};\n\t\n\t/**\n\t * Select all text of a content editable div.\n\t * http://stackoverflow.com/a/3806004/1262753\n\t * @param {Element} contentEditableElement A content editable div\n\t */\n\texports.selectContentEditable = function selectContentEditable(contentEditableElement) {\n\t if (!contentEditableElement || contentEditableElement.nodeName != 'DIV') {\n\t return;\n\t }\n\t\n\t var sel, range;\n\t if (window.getSelection && document.createRange) {\n\t range = document.createRange();\n\t range.selectNodeContents(contentEditableElement);\n\t sel = window.getSelection();\n\t sel.removeAllRanges();\n\t sel.addRange(range);\n\t }\n\t};\n\t\n\t/**\n\t * Get text selection\n\t * http://stackoverflow.com/questions/4687808/contenteditable-selected-text-save-and-restore\n\t * @return {Range | TextRange | null} range\n\t */\n\texports.getSelection = function getSelection() {\n\t if (window.getSelection) {\n\t var sel = window.getSelection();\n\t if (sel.getRangeAt && sel.rangeCount) {\n\t return sel.getRangeAt(0);\n\t }\n\t }\n\t return null;\n\t};\n\t\n\t/**\n\t * Set text selection\n\t * http://stackoverflow.com/questions/4687808/contenteditable-selected-text-save-and-restore\n\t * @param {Range | TextRange | null} range\n\t */\n\texports.setSelection = function setSelection(range) {\n\t if (range) {\n\t if (window.getSelection) {\n\t var sel = window.getSelection();\n\t sel.removeAllRanges();\n\t sel.addRange(range);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Get selected text range\n\t * @return {Object} params object containing parameters:\n\t * {Number} startOffset\n\t * {Number} endOffset\n\t * {Element} container HTML element holding the\n\t * selected text element\n\t * Returns null if no text selection is found\n\t */\n\texports.getSelectionOffset = function getSelectionOffset() {\n\t var range = exports.getSelection();\n\t\n\t if (range && 'startOffset' in range && 'endOffset' in range &&\n\t range.startContainer && (range.startContainer == range.endContainer)) {\n\t return {\n\t startOffset: range.startOffset,\n\t endOffset: range.endOffset,\n\t container: range.startContainer.parentNode\n\t };\n\t }\n\t\n\t return null;\n\t};\n\t\n\t/**\n\t * Set selected text range in given element\n\t * @param {Object} params An object containing:\n\t * {Element} container\n\t * {Number} startOffset\n\t * {Number} endOffset\n\t */\n\texports.setSelectionOffset = function setSelectionOffset(params) {\n\t if (document.createRange && window.getSelection) {\n\t var selection = window.getSelection();\n\t if(selection) {\n\t var range = document.createRange();\n\t\n\t if (!params.container.firstChild) {\n\t params.container.appendChild(document.createTextNode(''));\n\t }\n\t\n\t // TODO: do not suppose that the first child of the container is a textnode,\n\t // but recursively find the textnodes\n\t range.setStart(params.container.firstChild, params.startOffset);\n\t range.setEnd(params.container.firstChild, params.endOffset);\n\t\n\t exports.setSelection(range);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Get the inner text of an HTML element (for example a div element)\n\t * @param {Element} element\n\t * @param {Object} [buffer]\n\t * @return {String} innerText\n\t */\n\texports.getInnerText = function getInnerText(element, buffer) {\n\t var first = (buffer == undefined);\n\t if (first) {\n\t buffer = {\n\t 'text': '',\n\t 'flush': function () {\n\t var text = this.text;\n\t this.text = '';\n\t return text;\n\t },\n\t 'set': function (text) {\n\t this.text = text;\n\t }\n\t };\n\t }\n\t\n\t // text node\n\t if (element.nodeValue) {\n\t return buffer.flush() + element.nodeValue;\n\t }\n\t\n\t // divs or other HTML elements\n\t if (element.hasChildNodes()) {\n\t var childNodes = element.childNodes;\n\t var innerText = '';\n\t\n\t for (var i = 0, iMax = childNodes.length; i < iMax; i++) {\n\t var child = childNodes[i];\n\t\n\t if (child.nodeName == 'DIV' || child.nodeName == 'P') {\n\t var prevChild = childNodes[i - 1];\n\t var prevName = prevChild ? prevChild.nodeName : undefined;\n\t if (prevName && prevName != 'DIV' && prevName != 'P' && prevName != 'BR') {\n\t innerText += '\\n';\n\t buffer.flush();\n\t }\n\t innerText += exports.getInnerText(child, buffer);\n\t buffer.set('\\n');\n\t }\n\t else if (child.nodeName == 'BR') {\n\t innerText += buffer.flush();\n\t buffer.set('\\n');\n\t }\n\t else {\n\t innerText += exports.getInnerText(child, buffer);\n\t }\n\t }\n\t\n\t return innerText;\n\t }\n\t else {\n\t if (element.nodeName == 'P' && exports.getInternetExplorerVersion() != -1) {\n\t // On Internet Explorer, a

with hasChildNodes()==false is\n\t // rendered with a new line. Note that a

with\n\t // hasChildNodes()==true is rendered without a new line\n\t // Other browsers always ensure there is a
inside the

,\n\t // and if not, the

does not render a new line\n\t return buffer.flush();\n\t }\n\t }\n\t\n\t // br or unknown\n\t return '';\n\t};\n\t\n\t/**\n\t * Returns the version of Internet Explorer or a -1\n\t * (indicating the use of another browser).\n\t * Source: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx\n\t * @return {Number} Internet Explorer version, or -1 in case of an other browser\n\t */\n\texports.getInternetExplorerVersion = function getInternetExplorerVersion() {\n\t if (_ieVersion == -1) {\n\t var rv = -1; // Return value assumes failure.\n\t if (navigator.appName == 'Microsoft Internet Explorer')\n\t {\n\t var ua = navigator.userAgent;\n\t var re = new RegExp(\"MSIE ([0-9]{1,}[\\.0-9]{0,})\");\n\t if (re.exec(ua) != null) {\n\t rv = parseFloat( RegExp.$1 );\n\t }\n\t }\n\t\n\t _ieVersion = rv;\n\t }\n\t\n\t return _ieVersion;\n\t};\n\t\n\t/**\n\t * Test whether the current browser is Firefox\n\t * @returns {boolean} isFirefox\n\t */\n\texports.isFirefox = function isFirefox () {\n\t return (navigator.userAgent.indexOf(\"Firefox\") != -1);\n\t};\n\t\n\t/**\n\t * cached internet explorer version\n\t * @type {Number}\n\t * @private\n\t */\n\tvar _ieVersion = -1;\n\t\n\t/**\n\t * Add and event listener. Works for all browsers\n\t * @param {Element} element An html element\n\t * @param {string} action The action, for example \"click\",\n\t * without the prefix \"on\"\n\t * @param {function} listener The callback function to be executed\n\t * @param {boolean} [useCapture] false by default\n\t * @return {function} the created event listener\n\t */\n\texports.addEventListener = function addEventListener(element, action, listener, useCapture) {\n\t if (element.addEventListener) {\n\t if (useCapture === undefined)\n\t useCapture = false;\n\t\n\t if (action === \"mousewheel\" && exports.isFirefox()) {\n\t action = \"DOMMouseScroll\"; // For Firefox\n\t }\n\t\n\t element.addEventListener(action, listener, useCapture);\n\t return listener;\n\t } else if (element.attachEvent) {\n\t // Old IE browsers\n\t var f = function () {\n\t return listener.call(element, window.event);\n\t };\n\t element.attachEvent(\"on\" + action, f);\n\t return f;\n\t }\n\t};\n\t\n\t/**\n\t * Remove an event listener from an element\n\t * @param {Element} element An html dom element\n\t * @param {string} action The name of the event, for example \"mousedown\"\n\t * @param {function} listener The listener function\n\t * @param {boolean} [useCapture] false by default\n\t */\n\texports.removeEventListener = function removeEventListener(element, action, listener, useCapture) {\n\t if (element.removeEventListener) {\n\t if (useCapture === undefined)\n\t useCapture = false;\n\t\n\t if (action === \"mousewheel\" && exports.isFirefox()) {\n\t action = \"DOMMouseScroll\"; // For Firefox\n\t }\n\t\n\t element.removeEventListener(action, listener, useCapture);\n\t } else if (element.detachEvent) {\n\t // Old IE browsers\n\t element.detachEvent(\"on\" + action, listener);\n\t }\n\t};\n\t\n\t/**\n\t * Parse a JSON path like '.items[3].name' into an array\n\t * @param {string} jsonPath\n\t * @return {Array}\n\t */\n\texports.parsePath = function parsePath(jsonPath) {\n\t var prop, remainder;\n\t\n\t if (jsonPath.length === 0) {\n\t return [];\n\t }\n\t\n\t // find a match like '.prop'\n\t var match = jsonPath.match(/^\\.(\\w+)/);\n\t if (match) {\n\t prop = match[1];\n\t remainder = jsonPath.substr(prop.length + 1);\n\t }\n\t else if (jsonPath[0] === '[') {\n\t // find a match like\n\t var end = jsonPath.indexOf(']');\n\t if (end === -1) {\n\t throw new SyntaxError('Character ] expected in path');\n\t }\n\t if (end === 1) {\n\t throw new SyntaxError('Index expected after [');\n\t }\n\t\n\t var value = jsonPath.substring(1, end);\n\t if (value[0] === '\\'') {\n\t // ajv produces string prop names with single quotes, so we need\n\t // to reformat them into valid double-quoted JSON strings\n\t value = '\\\"' + value.substring(1, value.length - 1) + '\\\"';\n\t }\n\t\n\t prop = value === '*' ? value : JSON.parse(value); // parse string and number\n\t remainder = jsonPath.substr(end + 1);\n\t }\n\t else {\n\t throw new SyntaxError('Failed to parse path');\n\t }\n\t\n\t return [prop].concat(parsePath(remainder))\n\t};\n\t\n\t/**\n\t * Improve the error message of a JSON schema error\n\t * @param {Object} error\n\t * @return {Object} The error\n\t */\n\texports.improveSchemaError = function (error) {\n\t if (error.keyword === 'enum' && Array.isArray(error.schema)) {\n\t var enums = error.schema;\n\t if (enums) {\n\t enums = enums.map(function (value) {\n\t return JSON.stringify(value);\n\t });\n\t\n\t if (enums.length > 5) {\n\t var more = ['(' + (enums.length - 5) + ' more...)'];\n\t enums = enums.slice(0, 5);\n\t enums.push(more);\n\t }\n\t error.message = 'should be equal to one of: ' + enums.join(', ');\n\t }\n\t }\n\t\n\t if (error.keyword === 'additionalProperties') {\n\t error.message = 'should NOT have additional property: ' + error.params.additionalProperty;\n\t }\n\t\n\t return error;\n\t};\n\t\n\t/**\n\t * Test whether the child rect fits completely inside the parent rect.\n\t * @param {ClientRect} parent\n\t * @param {ClientRect} child\n\t * @param {number} margin\n\t */\n\texports.insideRect = function (parent, child, margin) {\n\t var _margin = margin !== undefined ? margin : 0;\n\t return child.left - _margin >= parent.left\n\t && child.right + _margin <= parent.right\n\t && child.top - _margin >= parent.top\n\t && child.bottom + _margin <= parent.bottom;\n\t};\n\t\n\t/**\n\t * Returns a function, that, as long as it continues to be invoked, will not\n\t * be triggered. The function will be called after it stops being called for\n\t * N milliseconds.\n\t *\n\t * Source: https://davidwalsh.name/javascript-debounce-function\n\t *\n\t * @param {function} func\n\t * @param {number} wait Number in milliseconds\n\t * @param {boolean} [immediate=false] If `immediate` is passed, trigger the\n\t * function on the leading edge, instead\n\t * of the trailing.\n\t * @return {function} Return the debounced function\n\t */\n\texports.debounce = function debounce(func, wait, immediate) {\n\t var timeout;\n\t return function() {\n\t var context = this, args = arguments;\n\t var later = function() {\n\t timeout = null;\n\t if (!immediate) func.apply(context, args);\n\t };\n\t var callNow = immediate && !timeout;\n\t clearTimeout(timeout);\n\t timeout = setTimeout(later, wait);\n\t if (callNow) func.apply(context, args);\n\t };\n\t};\n\t\n\t/**\n\t * Determines the difference between two texts.\n\t * Can only detect one removed or inserted block of characters.\n\t * @param {string} oldText\n\t * @param {string} newText\n\t * @return {{start: number, end: number}} Returns the start and end\n\t * of the changed part in newText.\n\t */\n\texports.textDiff = function textDiff(oldText, newText) {\n\t var len = newText.length;\n\t var start = 0;\n\t var oldEnd = oldText.length;\n\t var newEnd = newText.length;\n\t\n\t while (newText.charAt(start) === oldText.charAt(start)\n\t && start < len) {\n\t start++;\n\t }\n\t\n\t while (newText.charAt(newEnd - 1) === oldText.charAt(oldEnd - 1)\n\t && newEnd > start && oldEnd > 0) {\n\t newEnd--;\n\t oldEnd--;\n\t }\n\t\n\t return {start: start, end: newEnd};\n\t};\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar util = __webpack_require__(3);\n\t\n\t/**\n\t * A context menu\n\t * @param {Object[]} items Array containing the menu structure\n\t * TODO: describe structure\n\t * @param {Object} [options] Object with options. Available options:\n\t * {function} close Callback called when the\n\t * context menu is being closed.\n\t * @constructor\n\t */\n\tfunction ContextMenu (items, options) {\n\t this.dom = {};\n\t\n\t var me = this;\n\t var dom = this.dom;\n\t this.anchor = undefined;\n\t this.items = items;\n\t this.eventListeners = {};\n\t this.selection = undefined; // holds the selection before the menu was opened\n\t this.onClose = options ? options.close : undefined;\n\t\n\t // create root element\n\t var root = document.createElement('div');\n\t root.className = 'jsoneditor-contextmenu-root';\n\t dom.root = root;\n\t\n\t // create a container element\n\t var menu = document.createElement('div');\n\t menu.className = 'jsoneditor-contextmenu';\n\t dom.menu = menu;\n\t root.appendChild(menu);\n\t\n\t // create a list to hold the menu items\n\t var list = document.createElement('ul');\n\t list.className = 'jsoneditor-menu';\n\t menu.appendChild(list);\n\t dom.list = list;\n\t dom.items = []; // list with all buttons\n\t\n\t // create a (non-visible) button to set the focus to the menu\n\t var focusButton = document.createElement('button');\n\t focusButton.type = 'button';\n\t dom.focusButton = focusButton;\n\t var li = document.createElement('li');\n\t li.style.overflow = 'hidden';\n\t li.style.height = '0';\n\t li.appendChild(focusButton);\n\t list.appendChild(li);\n\t\n\t function createMenuItems (list, domItems, items) {\n\t items.forEach(function (item) {\n\t if (item.type == 'separator') {\n\t // create a separator\n\t var separator = document.createElement('div');\n\t separator.className = 'jsoneditor-separator';\n\t li = document.createElement('li');\n\t li.appendChild(separator);\n\t list.appendChild(li);\n\t }\n\t else {\n\t var domItem = {};\n\t\n\t // create a menu item\n\t var li = document.createElement('li');\n\t list.appendChild(li);\n\t\n\t // create a button in the menu item\n\t var button = document.createElement('button');\n\t button.type = 'button';\n\t button.className = item.className;\n\t domItem.button = button;\n\t if (item.title) {\n\t button.title = item.title;\n\t }\n\t if (item.click) {\n\t button.onclick = function (event) {\n\t event.preventDefault();\n\t me.hide();\n\t item.click();\n\t };\n\t }\n\t li.appendChild(button);\n\t\n\t // create the contents of the button\n\t if (item.submenu) {\n\t // add the icon to the button\n\t var divIcon = document.createElement('div');\n\t divIcon.className = 'jsoneditor-icon';\n\t button.appendChild(divIcon);\n\t button.appendChild(document.createTextNode(item.text));\n\t\n\t var buttonSubmenu;\n\t if (item.click) {\n\t // submenu and a button with a click handler\n\t button.className += ' jsoneditor-default';\n\t\n\t var buttonExpand = document.createElement('button');\n\t buttonExpand.type = 'button';\n\t domItem.buttonExpand = buttonExpand;\n\t buttonExpand.className = 'jsoneditor-expand';\n\t buttonExpand.innerHTML = '

';\n\t li.appendChild(buttonExpand);\n\t if (item.submenuTitle) {\n\t buttonExpand.title = item.submenuTitle;\n\t }\n\t\n\t buttonSubmenu = buttonExpand;\n\t }\n\t else {\n\t // submenu and a button without a click handler\n\t var divExpand = document.createElement('div');\n\t divExpand.className = 'jsoneditor-expand';\n\t button.appendChild(divExpand);\n\t\n\t buttonSubmenu = button;\n\t }\n\t\n\t // attach a handler to expand/collapse the submenu\n\t buttonSubmenu.onclick = function (event) {\n\t event.preventDefault();\n\t me._onExpandItem(domItem);\n\t buttonSubmenu.focus();\n\t };\n\t\n\t // create the submenu\n\t var domSubItems = [];\n\t domItem.subItems = domSubItems;\n\t var ul = document.createElement('ul');\n\t domItem.ul = ul;\n\t ul.className = 'jsoneditor-menu';\n\t ul.style.height = '0';\n\t li.appendChild(ul);\n\t createMenuItems(ul, domSubItems, item.submenu);\n\t }\n\t else {\n\t // no submenu, just a button with clickhandler\n\t button.innerHTML = '
' + item.text;\n\t }\n\t\n\t domItems.push(domItem);\n\t }\n\t });\n\t }\n\t createMenuItems(list, this.dom.items, items);\n\t\n\t // TODO: when the editor is small, show the submenu on the right instead of inline?\n\t\n\t // calculate the max height of the menu with one submenu expanded\n\t this.maxHeight = 0; // height in pixels\n\t items.forEach(function (item) {\n\t var height = (items.length + (item.submenu ? item.submenu.length : 0)) * 24;\n\t me.maxHeight = Math.max(me.maxHeight, height);\n\t });\n\t}\n\t\n\t/**\n\t * Get the currently visible buttons\n\t * @return {Array.} buttons\n\t * @private\n\t */\n\tContextMenu.prototype._getVisibleButtons = function () {\n\t var buttons = [];\n\t var me = this;\n\t this.dom.items.forEach(function (item) {\n\t buttons.push(item.button);\n\t if (item.buttonExpand) {\n\t buttons.push(item.buttonExpand);\n\t }\n\t if (item.subItems && item == me.expandedItem) {\n\t item.subItems.forEach(function (subItem) {\n\t buttons.push(subItem.button);\n\t if (subItem.buttonExpand) {\n\t buttons.push(subItem.buttonExpand);\n\t }\n\t // TODO: change to fully recursive method\n\t });\n\t }\n\t });\n\t\n\t return buttons;\n\t};\n\t\n\t// currently displayed context menu, a singleton. We may only have one visible context menu\n\tContextMenu.visibleMenu = undefined;\n\t\n\t/**\n\t * Attach the menu to an anchor\n\t * @param {HTMLElement} anchor Anchor where the menu will be attached\n\t * as sibling.\n\t * @param {HTMLElement} [contentWindow] The DIV with with the (scrollable) contents\n\t */\n\tContextMenu.prototype.show = function (anchor, contentWindow) {\n\t this.hide();\n\t\n\t // determine whether to display the menu below or above the anchor\n\t var showBelow = true;\n\t if (contentWindow) {\n\t var anchorRect = anchor.getBoundingClientRect();\n\t var contentRect = contentWindow.getBoundingClientRect();\n\t\n\t if (anchorRect.bottom + this.maxHeight < contentRect.bottom) {\n\t // fits below -> show below\n\t }\n\t else if (anchorRect.top - this.maxHeight > contentRect.top) {\n\t // fits above -> show above\n\t showBelow = false;\n\t }\n\t else {\n\t // doesn't fit above nor below -> show below\n\t }\n\t }\n\t\n\t // position the menu\n\t if (showBelow) {\n\t // display the menu below the anchor\n\t var anchorHeight = anchor.offsetHeight;\n\t this.dom.menu.style.left = '0px';\n\t this.dom.menu.style.top = anchorHeight + 'px';\n\t this.dom.menu.style.bottom = '';\n\t }\n\t else {\n\t // display the menu above the anchor\n\t this.dom.menu.style.left = '0px';\n\t this.dom.menu.style.top = '';\n\t this.dom.menu.style.bottom = '0px';\n\t }\n\t\n\t // attach the menu to the parent of the anchor\n\t var parent = anchor.parentNode;\n\t parent.insertBefore(this.dom.root, parent.firstChild);\n\t\n\t // create and attach event listeners\n\t var me = this;\n\t var list = this.dom.list;\n\t this.eventListeners.mousedown = util.addEventListener(window, 'mousedown', function (event) {\n\t // hide menu on click outside of the menu\n\t var target = event.target;\n\t if ((target != list) && !me._isChildOf(target, list)) {\n\t me.hide();\n\t event.stopPropagation();\n\t event.preventDefault();\n\t }\n\t });\n\t this.eventListeners.keydown = util.addEventListener(window, 'keydown', function (event) {\n\t me._onKeyDown(event);\n\t });\n\t\n\t // move focus to the first button in the context menu\n\t this.selection = util.getSelection();\n\t this.anchor = anchor;\n\t setTimeout(function () {\n\t me.dom.focusButton.focus();\n\t }, 0);\n\t\n\t if (ContextMenu.visibleMenu) {\n\t ContextMenu.visibleMenu.hide();\n\t }\n\t ContextMenu.visibleMenu = this;\n\t};\n\t\n\t/**\n\t * Hide the context menu if visible\n\t */\n\tContextMenu.prototype.hide = function () {\n\t // remove the menu from the DOM\n\t if (this.dom.root.parentNode) {\n\t this.dom.root.parentNode.removeChild(this.dom.root);\n\t if (this.onClose) {\n\t this.onClose();\n\t }\n\t }\n\t\n\t // remove all event listeners\n\t // all event listeners are supposed to be attached to document.\n\t for (var name in this.eventListeners) {\n\t if (this.eventListeners.hasOwnProperty(name)) {\n\t var fn = this.eventListeners[name];\n\t if (fn) {\n\t util.removeEventListener(window, name, fn);\n\t }\n\t delete this.eventListeners[name];\n\t }\n\t }\n\t\n\t if (ContextMenu.visibleMenu == this) {\n\t ContextMenu.visibleMenu = undefined;\n\t }\n\t};\n\t\n\t/**\n\t * Expand a submenu\n\t * Any currently expanded submenu will be hided.\n\t * @param {Object} domItem\n\t * @private\n\t */\n\tContextMenu.prototype._onExpandItem = function (domItem) {\n\t var me = this;\n\t var alreadyVisible = (domItem == this.expandedItem);\n\t\n\t // hide the currently visible submenu\n\t var expandedItem = this.expandedItem;\n\t if (expandedItem) {\n\t //var ul = expandedItem.ul;\n\t expandedItem.ul.style.height = '0';\n\t expandedItem.ul.style.padding = '';\n\t setTimeout(function () {\n\t if (me.expandedItem != expandedItem) {\n\t expandedItem.ul.style.display = '';\n\t util.removeClassName(expandedItem.ul.parentNode, 'jsoneditor-selected');\n\t }\n\t }, 300); // timeout duration must match the css transition duration\n\t this.expandedItem = undefined;\n\t }\n\t\n\t if (!alreadyVisible) {\n\t var ul = domItem.ul;\n\t ul.style.display = 'block';\n\t var height = ul.clientHeight; // force a reflow in Firefox\n\t setTimeout(function () {\n\t if (me.expandedItem == domItem) {\n\t ul.style.height = (ul.childNodes.length * 24) + 'px';\n\t ul.style.padding = '5px 10px';\n\t }\n\t }, 0);\n\t util.addClassName(ul.parentNode, 'jsoneditor-selected');\n\t this.expandedItem = domItem;\n\t }\n\t};\n\t\n\t/**\n\t * Handle onkeydown event\n\t * @param {Event} event\n\t * @private\n\t */\n\tContextMenu.prototype._onKeyDown = function (event) {\n\t var target = event.target;\n\t var keynum = event.which;\n\t var handled = false;\n\t var buttons, targetIndex, prevButton, nextButton;\n\t\n\t if (keynum == 27) { // ESC\n\t // hide the menu on ESC key\n\t\n\t // restore previous selection and focus\n\t if (this.selection) {\n\t util.setSelection(this.selection);\n\t }\n\t if (this.anchor) {\n\t this.anchor.focus();\n\t }\n\t\n\t this.hide();\n\t\n\t handled = true;\n\t }\n\t else if (keynum == 9) { // Tab\n\t if (!event.shiftKey) { // Tab\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t if (targetIndex == buttons.length - 1) {\n\t // move to first button\n\t buttons[0].focus();\n\t handled = true;\n\t }\n\t }\n\t else { // Shift+Tab\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t if (targetIndex == 0) {\n\t // move to last button\n\t buttons[buttons.length - 1].focus();\n\t handled = true;\n\t }\n\t }\n\t }\n\t else if (keynum == 37) { // Arrow Left\n\t if (target.className == 'jsoneditor-expand') {\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t prevButton = buttons[targetIndex - 1];\n\t if (prevButton) {\n\t prevButton.focus();\n\t }\n\t }\n\t handled = true;\n\t }\n\t else if (keynum == 38) { // Arrow Up\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t prevButton = buttons[targetIndex - 1];\n\t if (prevButton && prevButton.className == 'jsoneditor-expand') {\n\t // skip expand button\n\t prevButton = buttons[targetIndex - 2];\n\t }\n\t if (!prevButton) {\n\t // move to last button\n\t prevButton = buttons[buttons.length - 1];\n\t }\n\t if (prevButton) {\n\t prevButton.focus();\n\t }\n\t handled = true;\n\t }\n\t else if (keynum == 39) { // Arrow Right\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t nextButton = buttons[targetIndex + 1];\n\t if (nextButton && nextButton.className == 'jsoneditor-expand') {\n\t nextButton.focus();\n\t }\n\t handled = true;\n\t }\n\t else if (keynum == 40) { // Arrow Down\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t nextButton = buttons[targetIndex + 1];\n\t if (nextButton && nextButton.className == 'jsoneditor-expand') {\n\t // skip expand button\n\t nextButton = buttons[targetIndex + 2];\n\t }\n\t if (!nextButton) {\n\t // move to first button\n\t nextButton = buttons[0];\n\t }\n\t if (nextButton) {\n\t nextButton.focus();\n\t handled = true;\n\t }\n\t handled = true;\n\t }\n\t // TODO: arrow left and right\n\t\n\t if (handled) {\n\t event.stopPropagation();\n\t event.preventDefault();\n\t }\n\t};\n\t\n\t/**\n\t * Test if an element is a child of a parent element.\n\t * @param {Element} child\n\t * @param {Element} parent\n\t * @return {boolean} isChild\n\t */\n\tContextMenu.prototype._isChildOf = function (child, parent) {\n\t var e = child.parentNode;\n\t while (e) {\n\t if (e == parent) {\n\t return true;\n\t }\n\t e = e.parentNode;\n\t }\n\t\n\t return false;\n\t};\n\t\n\tmodule.exports = ContextMenu;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar json = typeof JSON !== 'undefined' ? JSON : __webpack_require__(63);\n\t\n\tmodule.exports = function (obj, opts) {\n\t if (!opts) opts = {};\n\t if (typeof opts === 'function') opts = { cmp: opts };\n\t var space = opts.space || '';\n\t if (typeof space === 'number') space = Array(space+1).join(' ');\n\t var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;\n\t var replacer = opts.replacer || function(key, value) { return value; };\n\t\n\t var cmp = opts.cmp && (function (f) {\n\t return function (node) {\n\t return function (a, b) {\n\t var aobj = { key: a, value: node[a] };\n\t var bobj = { key: b, value: node[b] };\n\t return f(aobj, bobj);\n\t };\n\t };\n\t })(opts.cmp);\n\t\n\t var seen = [];\n\t return (function stringify (parent, key, node, level) {\n\t var indent = space ? ('\\n' + new Array(level + 1).join(space)) : '';\n\t var colonSeparator = space ? ': ' : ':';\n\t\n\t if (node && node.toJSON && typeof node.toJSON === 'function') {\n\t node = node.toJSON();\n\t }\n\t\n\t node = replacer.call(parent, key, node);\n\t\n\t if (node === undefined) {\n\t return;\n\t }\n\t if (typeof node !== 'object' || node === null) {\n\t return json.stringify(node);\n\t }\n\t if (isArray(node)) {\n\t var out = [];\n\t for (var i = 0; i < node.length; i++) {\n\t var item = stringify(node, i, node[i], level+1) || json.stringify(null);\n\t out.push(indent + space + item);\n\t }\n\t return '[' + out.join(',') + indent + ']';\n\t }\n\t else {\n\t if (seen.indexOf(node) !== -1) {\n\t if (cycles) return json.stringify('__cycle__');\n\t throw new TypeError('Converting circular structure to JSON');\n\t }\n\t else seen.push(node);\n\t\n\t var keys = objectKeys(node).sort(cmp && cmp(node));\n\t var out = [];\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t var value = stringify(node, key, node[key], level+1);\n\t\n\t if(!value) continue;\n\t\n\t var keyValue = json.stringify(key)\n\t + colonSeparator\n\t + value;\n\t ;\n\t out.push(indent + space + keyValue);\n\t }\n\t seen.splice(seen.indexOf(node), 1);\n\t return '{' + out.join(',') + indent + '}';\n\t }\n\t })({ '': obj }, '', obj, 0);\n\t};\n\t\n\tvar isArray = Array.isArray || function (x) {\n\t return {}.toString.call(x) === '[object Array]';\n\t};\n\t\n\tvar objectKeys = Object.keys || function (obj) {\n\t var has = Object.prototype.hasOwnProperty || function () { return true };\n\t var keys = [];\n\t for (var key in obj) {\n\t if (has.call(obj, key)) keys.push(key);\n\t }\n\t return keys;\n\t};\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tmodule.exports = {\n\t setup: setupAsync,\n\t compile: compileAsync\n\t};\n\t\n\t\n\tvar util = __webpack_require__(2);\n\t\n\tvar ASYNC = {\n\t '*': checkGenerators,\n\t 'co*': checkGenerators,\n\t 'es7': checkAsyncFunction\n\t};\n\t\n\tvar TRANSPILE = {\n\t 'nodent': getNodent,\n\t 'regenerator': getRegenerator\n\t};\n\t\n\tvar MODES = [\n\t { async: 'co*' },\n\t { async: 'es7', transpile: 'nodent' },\n\t { async: 'co*', transpile: 'regenerator' }\n\t];\n\t\n\t\n\tvar regenerator, nodent;\n\t\n\t\n\tfunction setupAsync(opts, required) {\n\t if (required !== false) required = true;\n\t var async = opts.async\n\t , transpile = opts.transpile\n\t , check;\n\t\n\t switch (typeof transpile) {\n\t case 'string':\n\t var get = TRANSPILE[transpile];\n\t if (!get) throw new Error('bad transpiler: ' + transpile);\n\t return (opts._transpileFunc = get(opts, required));\n\t case 'undefined':\n\t case 'boolean':\n\t if (typeof async == 'string') {\n\t check = ASYNC[async];\n\t if (!check) throw new Error('bad async mode: ' + async);\n\t return (opts.transpile = check(opts, required));\n\t }\n\t\n\t for (var i=0; i',\n\t $notOp = $isMax ? '>' : '<';\n\t if ($isDataExcl) {\n\t var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n\t $exclusive = 'exclusive' + $lvl,\n\t $opExpr = 'op' + $lvl,\n\t $opStr = '\\' + ' + $opExpr + ' + \\'';\n\t out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n\t $schemaValueExcl = 'schemaExcl' + $lvl;\n\t out += ' var exclusive' + ($lvl) + '; if (typeof ' + ($schemaValueExcl) + ' != \\'boolean\\' && typeof ' + ($schemaValueExcl) + ' != \\'undefined\\') { ';\n\t var $errorKeyword = $exclusiveKeyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } else if( ';\n\t if ($isData) {\n\t out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n\t }\n\t out += ' ((exclusive' + ($lvl) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ')) { var op' + ($lvl) + ' = exclusive' + ($lvl) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\';';\n\t } else {\n\t var $exclusive = $schemaExcl === true,\n\t $opStr = $op;\n\t if (!$exclusive) $opStr += '=';\n\t var $opExpr = '\\'' + $opStr + '\\'';\n\t out += ' if ( ';\n\t if ($isData) {\n\t out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n\t }\n\t out += ' ' + ($data) + ' ' + ($notOp);\n\t if ($exclusive) {\n\t out += '=';\n\t }\n\t out += ' ' + ($schemaValue) + ') {';\n\t }\n\t var $errorKeyword = $keyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_limit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should be ' + ($opStr) + ' ';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue);\n\t } else {\n\t out += '' + ($schema) + '\\'';\n\t }\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate__limitItems(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t var $op = $keyword == 'maxItems' ? '>' : '<';\n\t out += 'if ( ';\n\t if ($isData) {\n\t out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n\t }\n\t out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n\t var $errorKeyword = $keyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_limitItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { limit: ' + ($schemaValue) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT have ';\n\t if ($keyword == 'maxItems') {\n\t out += 'more';\n\t } else {\n\t out += 'less';\n\t }\n\t out += ' than ';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue) + ' + \\'';\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' items\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '} ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate__limitLength(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t var $op = $keyword == 'maxLength' ? '>' : '<';\n\t out += 'if ( ';\n\t if ($isData) {\n\t out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n\t }\n\t if (it.opts.unicode === false) {\n\t out += ' ' + ($data) + '.length ';\n\t } else {\n\t out += ' ucs2length(' + ($data) + ') ';\n\t }\n\t out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';\n\t var $errorKeyword = $keyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_limitLength') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { limit: ' + ($schemaValue) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT be ';\n\t if ($keyword == 'maxLength') {\n\t out += 'longer';\n\t } else {\n\t out += 'shorter';\n\t }\n\t out += ' than ';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue) + ' + \\'';\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' characters\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '} ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate__limitProperties(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t var $op = $keyword == 'maxProperties' ? '>' : '<';\n\t out += 'if ( ';\n\t if ($isData) {\n\t out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n\t }\n\t out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n\t var $errorKeyword = $keyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_limitProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { limit: ' + ($schemaValue) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT have ';\n\t if ($keyword == 'maxProperties') {\n\t out += 'more';\n\t } else {\n\t out += 'less';\n\t }\n\t out += ' than ';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue) + ' + \\'';\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' properties\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '} ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_validate(it, $keyword) {\n\t var out = '';\n\t var $async = it.schema.$async === true;\n\t if (it.isTop) {\n\t var $top = it.isTop,\n\t $lvl = it.level = 0,\n\t $dataLvl = it.dataLevel = 0,\n\t $data = 'data';\n\t it.rootId = it.resolve.fullPath(it.root.schema.id);\n\t it.baseId = it.baseId || it.rootId;\n\t if ($async) {\n\t it.async = true;\n\t var $es7 = it.opts.async == 'es7';\n\t it.yieldAwait = $es7 ? 'await' : 'yield';\n\t }\n\t delete it.isTop;\n\t it.dataPathArr = [undefined];\n\t out += ' validate = ';\n\t if ($async) {\n\t if ($es7) {\n\t out += ' (async function ';\n\t } else {\n\t if (it.opts.async == 'co*') {\n\t out += 'co.wrap';\n\t }\n\t out += '(function* ';\n\t }\n\t } else {\n\t out += ' (function ';\n\t }\n\t out += ' (data, dataPath, parentData, parentDataProperty) { \\'use strict\\'; var vErrors = null; ';\n\t out += ' var errors = 0; ';\n\t } else {\n\t var $lvl = it.level,\n\t $dataLvl = it.dataLevel,\n\t $data = 'data' + ($dataLvl || '');\n\t if (it.schema.id) it.baseId = it.resolve.url(it.baseId, it.schema.id);\n\t if ($async && !it.async) throw new Error('async schema in sync schema');\n\t out += ' var errs_' + ($lvl) + ' = errors;';\n\t }\n\t var $valid = 'valid' + $lvl,\n\t $breakOnError = !it.opts.allErrors,\n\t $closingBraces1 = '',\n\t $closingBraces2 = '',\n\t $errorKeyword;\n\t var $typeSchema = it.schema.type,\n\t $typeIsArray = Array.isArray($typeSchema);\n\t if ($typeSchema && it.opts.coerceTypes) {\n\t var $coerceToTypes = it.util.coerceToTypes($typeSchema);\n\t if ($coerceToTypes) {\n\t var $schemaPath = it.schemaPath + '.type',\n\t $errSchemaPath = it.errSchemaPath + '/type',\n\t $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';\n\t out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { ';\n\t var $dataType = 'dataType' + $lvl,\n\t $coerced = 'coerced' + $lvl;\n\t out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; ';\n\t var $bracesCoercion = '';\n\t var arr1 = $coerceToTypes;\n\t if (arr1) {\n\t var $type, $i = -1,\n\t l1 = arr1.length - 1;\n\t while ($i < l1) {\n\t $type = arr1[$i += 1];\n\t if ($i) {\n\t out += ' if (' + ($coerced) + ' === undefined) { ';\n\t $bracesCoercion += '}';\n\t }\n\t if ($type == 'string') {\n\t out += ' if (' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\') ' + ($coerced) + ' = \\'\\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \\'\\'; ';\n\t } else if ($type == 'number' || $type == 'integer') {\n\t out += ' if (' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \\'string\\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';\n\t if ($type == 'integer') {\n\t out += ' && !(' + ($data) + ' % 1)';\n\t }\n\t out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';\n\t } else if ($type == 'boolean') {\n\t out += ' if (' + ($data) + ' === \\'false\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \\'true\\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';\n\t } else if ($type == 'null') {\n\t out += ' if (' + ($data) + ' === \\'\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';\n\t }\n\t }\n\t }\n\t out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { type: \\'';\n\t if ($typeIsArray) {\n\t out += '' + ($typeSchema.join(\",\"));\n\t } else {\n\t out += '' + ($typeSchema);\n\t }\n\t out += '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should be ';\n\t if ($typeIsArray) {\n\t out += '' + ($typeSchema.join(\",\"));\n\t } else {\n\t out += '' + ($typeSchema);\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } else { ';\n\t if ($dataLvl) {\n\t var $parentData = 'data' + (($dataLvl - 1) || ''),\n\t $dataProperty = it.dataPathArr[$dataLvl];\n\t out += ' ' + ($data) + ' = ' + ($parentData) + '[' + ($dataProperty) + '] = ' + ($coerced) + '; ';\n\t } else {\n\t out += ' data = ' + ($coerced) + '; if (parentData !== undefined) parentData[parentDataProperty] = ' + ($coerced) + '; ';\n\t }\n\t out += ' } } ';\n\t }\n\t }\n\t var arr2 = it.RULES;\n\t if (arr2) {\n\t var $rulesGroup, i2 = -1,\n\t l2 = arr2.length - 1;\n\t while (i2 < l2) {\n\t $rulesGroup = arr2[i2 += 1];\n\t if ($shouldUseGroup($rulesGroup)) {\n\t if ($rulesGroup.type) {\n\t out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { ';\n\t }\n\t if (it.opts.useDefaults && !it.compositeRule) {\n\t if ($rulesGroup.type == 'object' && it.schema.properties) {\n\t var $schema = it.schema.properties,\n\t $schemaKeys = Object.keys($schema);\n\t var arr3 = $schemaKeys;\n\t if (arr3) {\n\t var $propertyKey, i3 = -1,\n\t l3 = arr3.length - 1;\n\t while (i3 < l3) {\n\t $propertyKey = arr3[i3 += 1];\n\t var $sch = $schema[$propertyKey];\n\t if ($sch.default !== undefined) {\n\t var $passData = $data + it.util.getProperty($propertyKey);\n\t out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = ';\n\t if (it.opts.useDefaults == 'clone') {\n\t out += ' ' + (JSON.stringify($sch.default)) + ' ';\n\t } else {\n\t out += ' ' + (it.useDefault($sch.default)) + ' ';\n\t }\n\t out += '; ';\n\t }\n\t }\n\t }\n\t } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {\n\t var arr4 = it.schema.items;\n\t if (arr4) {\n\t var $sch, $i = -1,\n\t l4 = arr4.length - 1;\n\t while ($i < l4) {\n\t $sch = arr4[$i += 1];\n\t if ($sch.default !== undefined) {\n\t var $passData = $data + '[' + $i + ']';\n\t out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = ';\n\t if (it.opts.useDefaults == 'clone') {\n\t out += ' ' + (JSON.stringify($sch.default)) + ' ';\n\t } else {\n\t out += ' ' + (it.useDefault($sch.default)) + ' ';\n\t }\n\t out += '; ';\n\t }\n\t }\n\t }\n\t }\n\t }\n\t var arr5 = $rulesGroup.rules;\n\t if (arr5) {\n\t var $rule, i5 = -1,\n\t l5 = arr5.length - 1;\n\t while (i5 < l5) {\n\t $rule = arr5[i5 += 1];\n\t if ($shouldUseRule($rule)) {\n\t if ($rule.custom) {\n\t var $schema = it.schema[$rule.keyword],\n\t $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it),\n\t $ruleErrs = $ruleValidate.code + '.errors',\n\t $schemaPath = it.schemaPath + '.' + $rule.keyword,\n\t $errSchemaPath = it.errSchemaPath + '/' + $rule.keyword,\n\t $errs = 'errs' + $lvl,\n\t $i = 'i' + $lvl,\n\t $ruleErr = 'ruleErr' + $lvl,\n\t $rDef = $rule.definition,\n\t $asyncKeyword = $rDef.async,\n\t $inline = $rDef.inline,\n\t $macro = $rDef.macro;\n\t if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');\n\t if (!($inline || $macro)) {\n\t out += '' + ($ruleErrs) + ' = null;';\n\t }\n\t out += 'var ' + ($errs) + ' = errors;var valid' + ($lvl) + ';';\n\t if ($inline && $rDef.statements) {\n\t out += ' ' + ($ruleValidate.validate);\n\t } else if ($macro) {\n\t var $it = it.util.copy(it);\n\t $it.level++;\n\t $it.schema = $ruleValidate.validate;\n\t $it.schemaPath = '';\n\t var $wasComposite = it.compositeRule;\n\t it.compositeRule = $it.compositeRule = true;\n\t var $code = it.validate($it).replace(/validate\\.schema/g, $ruleValidate.code);\n\t it.compositeRule = $it.compositeRule = $wasComposite;\n\t out += ' ' + ($code);\n\t } else if ($rDef.compile || $rDef.validate) {\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = '';\n\t out += ' ' + ($ruleValidate.code) + '.call( ';\n\t if (it.opts.passContext) {\n\t out += 'this';\n\t } else {\n\t out += 'self';\n\t }\n\t var $validateArgs = $ruleValidate.validate.length;\n\t if ($rDef.compile || $rDef.schema === false) {\n\t out += ' , ' + ($data) + ' ';\n\t } else {\n\t out += ' , validate.schema' + ($schemaPath) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';\n\t }\n\t out += ' , (dataPath || \\'\\')';\n\t if (it.errorPath != '\"\"') {\n\t out += ' + ' + (it.errorPath);\n\t }\n\t if ($dataLvl) {\n\t out += ' , data' + (($dataLvl - 1) || '') + ' , ' + (it.dataPathArr[$dataLvl]) + ' ';\n\t } else {\n\t out += ' , parentData , parentDataProperty ';\n\t }\n\t out += ' ) ';\n\t var def_callRuleValidate = out;\n\t out = $$outStack.pop();\n\t if ($rDef.errors !== false) {\n\t if ($asyncKeyword) {\n\t $ruleErrs = 'customErrors' + $lvl;\n\t out += ' var ' + ($ruleErrs) + ' = null; try { valid' + ($lvl) + ' = ' + (it.yieldAwait) + (def_callRuleValidate) + '; } catch (e) { valid' + ($lvl) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';\n\t } else {\n\t out += ' ' + ($ruleValidate.code) + '.errors = null; ';\n\t }\n\t }\n\t }\n\t out += 'if (! ';\n\t if ($inline) {\n\t if ($rDef.statements) {\n\t out += ' valid' + ($lvl) + ' ';\n\t } else {\n\t out += ' (' + ($ruleValidate.validate) + ') ';\n\t }\n\t } else if ($macro) {\n\t out += ' valid' + ($it.level) + ' ';\n\t } else {\n\t if ($asyncKeyword) {\n\t if ($rDef.errors === false) {\n\t out += ' (' + (it.yieldAwait) + (def_callRuleValidate) + ') ';\n\t } else {\n\t out += ' valid' + ($lvl) + ' ';\n\t }\n\t } else {\n\t out += ' ' + (def_callRuleValidate) + ' ';\n\t }\n\t }\n\t out += ') { ';\n\t $errorKeyword = $rule.keyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = '';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'custom') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { keyword: \\'' + ($rule.keyword) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should pass \"' + ($rule.keyword) + '\" keyword validation\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t var def_customError = out;\n\t out = $$outStack.pop();\n\t if ($inline) {\n\t if ($rDef.errors) {\n\t if ($rDef.errors != 'full') {\n\t out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 2) res = slice.call(arguments, 1);\n\t resolve(res);\n\t });\n\t });\n\t}\n\t\n\t/**\n\t * Convert an array of \"yieldables\" to a promise.\n\t * Uses `Promise.all()` internally.\n\t *\n\t * @param {Array} obj\n\t * @return {Promise}\n\t * @api private\n\t */\n\t\n\tfunction arrayToPromise(obj) {\n\t return Promise.all(obj.map(toPromise, this));\n\t}\n\t\n\t/**\n\t * Convert an object of \"yieldables\" to a promise.\n\t * Uses `Promise.all()` internally.\n\t *\n\t * @param {Object} obj\n\t * @return {Promise}\n\t * @api private\n\t */\n\t\n\tfunction objectToPromise(obj){\n\t var results = new obj.constructor();\n\t var keys = Object.keys(obj);\n\t var promises = [];\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t var promise = toPromise.call(this, obj[key]);\n\t if (promise && isPromise(promise)) defer(promise, key);\n\t else results[key] = obj[key];\n\t }\n\t return Promise.all(promises).then(function () {\n\t return results;\n\t });\n\t\n\t function defer(promise, key) {\n\t // predefine the key in the result\n\t results[key] = undefined;\n\t promises.push(promise.then(function (res) {\n\t results[key] = res;\n\t }));\n\t }\n\t}\n\t\n\t/**\n\t * Check if `obj` is a promise.\n\t *\n\t * @param {Object} obj\n\t * @return {Boolean}\n\t * @api private\n\t */\n\t\n\tfunction isPromise(obj) {\n\t return 'function' == typeof obj.then;\n\t}\n\t\n\t/**\n\t * Check if `obj` is a generator.\n\t *\n\t * @param {Mixed} obj\n\t * @return {Boolean}\n\t * @api private\n\t */\n\t\n\tfunction isGenerator(obj) {\n\t return 'function' == typeof obj.next && 'function' == typeof obj.throw;\n\t}\n\t\n\t/**\n\t * Check if `obj` is a generator function.\n\t *\n\t * @param {Mixed} obj\n\t * @return {Boolean}\n\t * @api private\n\t */\n\tfunction isGeneratorFunction(obj) {\n\t var constructor = obj.constructor;\n\t if (!constructor) return false;\n\t if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;\n\t return isGenerator(constructor.prototype);\n\t}\n\t\n\t/**\n\t * Check for plain object.\n\t *\n\t * @param {Mixed} val\n\t * @return {Boolean}\n\t * @api private\n\t */\n\t\n\tfunction isObject(val) {\n\t return Object == val.constructor;\n\t}\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar ContextMenu = __webpack_require__(4);\n\t\n\t/**\n\t * Create a select box to be used in the editor menu's, which allows to switch mode\n\t * @param {HTMLElement} container\n\t * @param {String[]} modes Available modes: 'code', 'form', 'text', 'tree', 'view'\n\t * @param {String} current Available modes: 'code', 'form', 'text', 'tree', 'view'\n\t * @param {function(mode: string)} onSwitch Callback invoked on switch\n\t * @constructor\n\t */\n\tfunction ModeSwitcher(container, modes, current, onSwitch) {\n\t // available modes\n\t var availableModes = {\n\t code: {\n\t 'text': 'Code',\n\t 'title': 'Switch to code highlighter',\n\t 'click': function () {\n\t onSwitch('code')\n\t }\n\t },\n\t form: {\n\t 'text': 'Form',\n\t 'title': 'Switch to form editor',\n\t 'click': function () {\n\t onSwitch('form');\n\t }\n\t },\n\t text: {\n\t 'text': 'Text',\n\t 'title': 'Switch to plain text editor',\n\t 'click': function () {\n\t onSwitch('text');\n\t }\n\t },\n\t tree: {\n\t 'text': 'Tree',\n\t 'title': 'Switch to tree editor',\n\t 'click': function () {\n\t onSwitch('tree');\n\t }\n\t },\n\t view: {\n\t 'text': 'View',\n\t 'title': 'Switch to tree view',\n\t 'click': function () {\n\t onSwitch('view');\n\t }\n\t }\n\t };\n\t\n\t // list the selected modes\n\t var items = [];\n\t for (var i = 0; i < modes.length; i++) {\n\t var mode = modes[i];\n\t var item = availableModes[mode];\n\t if (!item) {\n\t throw new Error('Unknown mode \"' + mode + '\"');\n\t }\n\t\n\t item.className = 'jsoneditor-type-modes' + ((current == mode) ? ' jsoneditor-selected' : '');\n\t items.push(item);\n\t }\n\t\n\t // retrieve the title of current mode\n\t var currentMode = availableModes[current];\n\t if (!currentMode) {\n\t throw new Error('Unknown mode \"' + current + '\"');\n\t }\n\t var currentTitle = currentMode.text;\n\t\n\t // create the html element\n\t var box = document.createElement('button');\n\t box.type = 'button';\n\t box.className = 'jsoneditor-modes jsoneditor-separator';\n\t box.innerHTML = currentTitle + ' ▾';\n\t box.title = 'Switch editor mode';\n\t box.onclick = function () {\n\t var menu = new ContextMenu(items);\n\t menu.show(box);\n\t };\n\t\n\t var frame = document.createElement('div');\n\t frame.className = 'jsoneditor-modes';\n\t frame.style.position = 'relative';\n\t frame.appendChild(box);\n\t\n\t container.appendChild(frame);\n\t\n\t this.dom = {\n\t container: container,\n\t box: box,\n\t frame: frame\n\t };\n\t}\n\t\n\t/**\n\t * Set focus to switcher\n\t */\n\tModeSwitcher.prototype.focus = function () {\n\t this.dom.box.focus();\n\t};\n\t\n\t/**\n\t * Destroy the ModeSwitcher, remove from DOM\n\t */\n\tModeSwitcher.prototype.destroy = function () {\n\t if (this.dom && this.dom.frame && this.dom.frame.parentNode) {\n\t this.dom.frame.parentNode.removeChild(this.dom.frame);\n\t }\n\t this.dom = null;\n\t};\n\t\n\tmodule.exports = ModeSwitcher;\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar compileSchema = __webpack_require__(22)\n\t , resolve = __webpack_require__(8)\n\t , Cache = __webpack_require__(19)\n\t , SchemaObject = __webpack_require__(9)\n\t , stableStringify = __webpack_require__(5)\n\t , formats = __webpack_require__(21)\n\t , rules = __webpack_require__(23)\n\t , v5 = __webpack_require__(43)\n\t , util = __webpack_require__(2)\n\t , async = __webpack_require__(6)\n\t , co = __webpack_require__(16);\n\t\n\tmodule.exports = Ajv;\n\t\n\tAjv.prototype.compileAsync = async.compile;\n\tAjv.prototype.addKeyword = __webpack_require__(42);\n\tAjv.ValidationError = __webpack_require__(10);\n\t\n\tvar META_SCHEMA_ID = 'http://json-schema.org/draft-04/schema';\n\tvar SCHEMA_URI_FORMAT = /^(?:(?:[a-z][a-z0-9+-.]*:)?\\/\\/)?[^\\s]*$/i;\n\tfunction SCHEMA_URI_FORMAT_FUNC(str) {\n\t return SCHEMA_URI_FORMAT.test(str);\n\t}\n\t\n\tvar META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes' ];\n\t\n\t/**\n\t * Creates validator instance.\n\t * Usage: `Ajv(opts)`\n\t * @param {Object} opts optional options\n\t * @return {Object} ajv instance\n\t */\n\tfunction Ajv(opts) {\n\t if (!(this instanceof Ajv)) return new Ajv(opts);\n\t var self = this;\n\t\n\t opts = this._opts = util.copy(opts) || {};\n\t this._schemas = {};\n\t this._refs = {};\n\t this._formats = formats(opts.format);\n\t this._cache = opts.cache || new Cache;\n\t this._loadingSchemas = {};\n\t this.RULES = rules();\n\t\n\t // this is done on purpose, so that methods are bound to the instance\n\t // (without using bind) so that they can be used without the instance\n\t this.validate = validate;\n\t this.compile = compile;\n\t this.addSchema = addSchema;\n\t this.addMetaSchema = addMetaSchema;\n\t this.validateSchema = validateSchema;\n\t this.getSchema = getSchema;\n\t this.removeSchema = removeSchema;\n\t this.addFormat = addFormat;\n\t this.errorsText = errorsText;\n\t\n\t this._addSchema = _addSchema;\n\t this._compile = _compile;\n\t\n\t opts.loopRequired = opts.loopRequired || Infinity;\n\t if (opts.async || opts.transpile) async.setup(opts);\n\t if (opts.beautify === true) opts.beautify = { indent_size: 2 };\n\t if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;\n\t this._metaOpts = getMetaSchemaOptions();\n\t\n\t addInitialSchemas();\n\t if (opts.formats) addInitialFormats();\n\t if (opts.v5) v5.enable(this);\n\t if (typeof opts.meta == 'object') addMetaSchema(opts.meta);\n\t\n\t\n\t /**\n\t * Validate data using schema\n\t * Schema will be compiled and cached (using serialized JSON as key. [json-stable-stringify](https://github.com/substack/json-stable-stringify) is used to serialize.\n\t * @param {String|Object} schemaKeyRef key, ref or schema object\n\t * @param {Any} data to be validated\n\t * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).\n\t */\n\t function validate(schemaKeyRef, data) {\n\t var v;\n\t if (typeof schemaKeyRef == 'string') {\n\t v = getSchema(schemaKeyRef);\n\t if (!v) throw new Error('no schema with key or ref \"' + schemaKeyRef + '\"');\n\t } else {\n\t var schemaObj = _addSchema(schemaKeyRef);\n\t v = schemaObj.validate || _compile(schemaObj);\n\t }\n\t\n\t var valid = v(data);\n\t if (v.async) return self._opts.async == '*' ? co(valid) : valid;\n\t self.errors = v.errors;\n\t return valid;\n\t }\n\t\n\t\n\t /**\n\t * Create validating function for passed schema.\n\t * @param {Object} schema schema object\n\t * @return {Function} validating function\n\t */\n\t function compile(schema) {\n\t var schemaObj = _addSchema(schema);\n\t return schemaObj.validate || _compile(schemaObj);\n\t }\n\t\n\t\n\t /**\n\t * Adds schema to the instance.\n\t * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.\n\t * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.\n\t * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.\n\t * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.\n\t */\n\t function addSchema(schema, key, _skipValidation, _meta) {\n\t if (Array.isArray(schema)){\n\t for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used.\n\t * @param {Object} options optional options with properties `separator` and `dataVar`.\n\t * @return {String} human readable string with all errors descriptions\n\t */\n\t function errorsText(errors, options) {\n\t errors = errors || self.errors;\n\t if (!errors) return 'No errors';\n\t options = options || {};\n\t var separator = options.separator === undefined ? ', ' : options.separator;\n\t var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;\n\t\n\t var text = '';\n\t for (var i=0; i= 1 && month <= 12 && day >= 1 && day <= DAYS[month];\n\t}\n\t\n\t\n\tfunction time(str, full) {\n\t var matches = str.match(TIME);\n\t if (!matches) return false;\n\t\n\t var hour = matches[1];\n\t var minute = matches[2];\n\t var second = matches[3];\n\t var timeZone = matches[5];\n\t return hour <= 23 && minute <= 59 && second <= 59 && (!full || timeZone);\n\t}\n\t\n\t\n\tvar DATE_TIME_SEPARATOR = /t|\\s/i;\n\tfunction date_time(str) {\n\t // http://tools.ietf.org/html/rfc3339#section-5.6\n\t var dateTime = str.split(DATE_TIME_SEPARATOR);\n\t return date(dateTime[0]) && time(dateTime[1], true);\n\t}\n\t\n\t\n\tfunction hostname(str) {\n\t // http://tools.ietf.org/html/rfc1034#section-3.5\n\t return str.length <= 255 && HOSTNAME.test(str);\n\t}\n\t\n\t\n\tvar NOT_URI_FRAGMENT = /\\/|\\:/;\n\tfunction uri(str) {\n\t // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n\t return NOT_URI_FRAGMENT.test(str) && URI.test(str);\n\t}\n\t\n\t\n\tfunction regex(str) {\n\t try {\n\t new RegExp(str);\n\t return true;\n\t } catch(e) {\n\t return false;\n\t }\n\t}\n\t\n\t\n\tfunction compareDate(d1, d2) {\n\t if (!(d1 && d2)) return;\n\t if (d1 > d2) return 1;\n\t if (d1 < d2) return -1;\n\t if (d1 === d2) return 0;\n\t}\n\t\n\t\n\tfunction compareTime(t1, t2) {\n\t if (!(t1 && t2)) return;\n\t t1 = t1.match(TIME);\n\t t2 = t2.match(TIME);\n\t if (!(t1 && t2)) return;\n\t t1 = t1[1] + t1[2] + t1[3] + (t1[4]||'');\n\t t2 = t2[1] + t2[2] + t2[3] + (t2[4]||'');\n\t if (t1 > t2) return 1;\n\t if (t1 < t2) return -1;\n\t if (t1 === t2) return 0;\n\t}\n\t\n\t\n\tfunction compareDateTime(dt1, dt2) {\n\t if (!(dt1 && dt2)) return;\n\t dt1 = dt1.split(DATE_TIME_SEPARATOR);\n\t dt2 = dt2.split(DATE_TIME_SEPARATOR);\n\t var res = compareDate(dt1[0], dt2[0]);\n\t if (res === undefined) return;\n\t return res || compareTime(dt1[1], dt2[1]);\n\t}\n\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar resolve = __webpack_require__(8)\n\t , util = __webpack_require__(2)\n\t , stableStringify = __webpack_require__(5)\n\t , async = __webpack_require__(6);\n\t\n\tvar beautify = (function() { try { return __webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"js-beautify\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())).js_beautify; } catch(e) {/*empty*/} })();\n\t\n\tvar validateGenerator = __webpack_require__(15);\n\t\n\tmodule.exports = compile;\n\t\n\t\n\t/**\n\t * Compiles schema to validation function\n\t * @this Ajv\n\t * @param {Object} schema schema object\n\t * @param {Object} root object with information about the root schema for this schema\n\t * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution\n\t * @param {String} baseId base ID for IDs in the schema\n\t * @return {Function} validation function\n\t */\n\tfunction compile(schema, root, localRefs, baseId) {\n\t /* jshint validthis: true, evil: true */\n\t /* eslint no-shadow: 0 */\n\t var self = this\n\t , opts = this._opts\n\t , refVal = [ undefined ]\n\t , refs = {}\n\t , patterns = []\n\t , patternsHash = {}\n\t , defaults = []\n\t , defaultsHash = {}\n\t , customRules = [];\n\t\n\t root = root || { schema: schema, refVal: refVal, refs: refs };\n\t\n\t var formats = this._formats;\n\t var RULES = this.RULES;\n\t\n\t return localCompile(schema, root, localRefs, baseId);\n\t\n\t\n\t function localCompile(_schema, _root, localRefs, baseId) {\n\t var isRoot = !_root || (_root && _root.schema == _schema);\n\t if (_root.schema != root.schema)\n\t return compile.call(self, _schema, _root, localRefs, baseId);\n\t\n\t var $async = _schema.$async === true;\n\t if ($async && !opts.transpile) async.setup(opts);\n\t\n\t var sourceCode = validateGenerator({\n\t isTop: true,\n\t schema: _schema,\n\t isRoot: isRoot,\n\t baseId: baseId,\n\t root: _root,\n\t schemaPath: '',\n\t errSchemaPath: '#',\n\t errorPath: '\"\"',\n\t RULES: RULES,\n\t validate: validateGenerator,\n\t util: util,\n\t resolve: resolve,\n\t resolveRef: resolveRef,\n\t usePattern: usePattern,\n\t useDefault: useDefault,\n\t useCustomRule: useCustomRule,\n\t opts: opts,\n\t formats: formats,\n\t self: self\n\t });\n\t\n\t sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)\n\t + vars(defaults, defaultCode) + vars(customRules, customRuleCode)\n\t + sourceCode;\n\t\n\t if (opts.beautify) {\n\t /* istanbul ignore else */\n\t if (beautify) sourceCode = beautify(sourceCode, opts.beautify);\n\t else console.error('\"npm install js-beautify\" to use beautify option');\n\t }\n\t // console.log('\\n\\n\\n *** \\n', sourceCode);\n\t var validate, validateCode\n\t , transpile = opts._transpileFunc;\n\t try {\n\t validateCode = $async && transpile\n\t ? transpile(sourceCode)\n\t : sourceCode;\n\t eval(validateCode);\n\t refVal[0] = validate;\n\t } catch(e) {\n\t console.error('Error compiling schema, function code:', validateCode);\n\t throw e;\n\t }\n\t\n\t validate.schema = _schema;\n\t validate.errors = null;\n\t validate.refs = refs;\n\t validate.refVal = refVal;\n\t validate.root = isRoot ? validate : _root;\n\t if ($async) validate.async = true;\n\t validate.sourceCode = sourceCode;\n\t\n\t return validate;\n\t }\n\t\n\t function resolveRef(baseId, ref, isRoot) {\n\t ref = resolve.url(baseId, ref);\n\t var refIndex = refs[ref];\n\t var _refVal, refCode;\n\t if (refIndex !== undefined) {\n\t _refVal = refVal[refIndex];\n\t refCode = 'refVal[' + refIndex + ']';\n\t return resolvedRef(_refVal, refCode);\n\t }\n\t if (!isRoot) {\n\t var rootRefId = root.refs[ref];\n\t if (rootRefId !== undefined) {\n\t _refVal = root.refVal[rootRefId];\n\t refCode = addLocalRef(ref, _refVal);\n\t return resolvedRef(_refVal, refCode);\n\t }\n\t }\n\t\n\t refCode = addLocalRef(ref);\n\t var v = resolve.call(self, localCompile, root, ref);\n\t if (!v) {\n\t var localSchema = localRefs && localRefs[ref];\n\t if (localSchema) {\n\t v = resolve.inlineRef(localSchema, opts.inlineRefs)\n\t ? localSchema\n\t : compile.call(self, localSchema, root, localRefs, baseId);\n\t }\n\t }\n\t\n\t if (v) {\n\t replaceLocalRef(ref, v);\n\t return resolvedRef(v, refCode);\n\t }\n\t }\n\t\n\t function addLocalRef(ref, v) {\n\t var refId = refVal.length;\n\t refVal[refId] = v;\n\t refs[ref] = refId;\n\t return 'refVal' + refId;\n\t }\n\t\n\t function replaceLocalRef(ref, v) {\n\t var refId = refs[ref];\n\t refVal[refId] = v;\n\t }\n\t\n\t function resolvedRef(refVal, code) {\n\t return typeof refVal == 'object'\n\t ? { code: code, schema: refVal, inline: true }\n\t : { code: code, async: refVal && refVal.async };\n\t }\n\t\n\t function usePattern(regexStr) {\n\t var index = patternsHash[regexStr];\n\t if (index === undefined) {\n\t index = patternsHash[regexStr] = patterns.length;\n\t patterns[index] = regexStr;\n\t }\n\t return 'pattern' + index;\n\t }\n\t\n\t function useDefault(value) {\n\t switch (typeof value) {\n\t case 'boolean':\n\t case 'number':\n\t return '' + value;\n\t case 'string':\n\t return util.toQuotedString(value);\n\t case 'object':\n\t if (value === null) return 'null';\n\t var valueStr = stableStringify(value);\n\t var index = defaultsHash[valueStr];\n\t if (index === undefined) {\n\t index = defaultsHash[valueStr] = defaults.length;\n\t defaults[index] = value;\n\t }\n\t return 'default' + index;\n\t }\n\t }\n\t\n\t function useCustomRule(rule, schema, parentSchema, it) {\n\t var compile = rule.definition.compile\n\t , inline = rule.definition.inline\n\t , macro = rule.definition.macro;\n\t\n\t var validate;\n\t if (compile) {\n\t validate = compile.call(self, schema, parentSchema);\n\t } else if (macro) {\n\t validate = macro.call(self, schema, parentSchema);\n\t if (opts.validateSchema !== false) self.validateSchema(validate, true);\n\t } else if (inline) {\n\t validate = inline.call(self, it, rule.keyword, schema, parentSchema);\n\t } else {\n\t validate = rule.definition.validate;\n\t }\n\t\n\t var index = customRules.length;\n\t customRules[index] = validate;\n\t\n\t return {\n\t code: 'customRule' + index,\n\t validate: validate\n\t };\n\t }\n\t}\n\t\n\t\n\tfunction patternCode(i, patterns) {\n\t return 'var pattern' + i + ' = new RegExp(' + util.toQuotedString(patterns[i]) + ');';\n\t}\n\t\n\t\n\tfunction defaultCode(i) {\n\t return 'var default' + i + ' = defaults[' + i + '];';\n\t}\n\t\n\t\n\tfunction refValCode(i, refVal) {\n\t return refVal[i] ? 'var refVal' + i + ' = refVal[' + i + '];' : '';\n\t}\n\t\n\t\n\tfunction customRuleCode(i) {\n\t return 'var customRule' + i + ' = customRules[' + i + '];';\n\t}\n\t\n\t\n\tfunction vars(arr, statement) {\n\t if (!arr.length) return '';\n\t var code = '';\n\t for (var i=0; i',\n\t $result = 'result' + $lvl;\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t if ($isDataExcl) {\n\t var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n\t $exclusive = 'exclusive' + $lvl,\n\t $opExpr = 'op' + $lvl,\n\t $opStr = '\\' + ' + $opExpr + ' + \\'';\n\t out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n\t $schemaValueExcl = 'schemaExcl' + $lvl;\n\t out += ' if (typeof ' + ($schemaValueExcl) + ' != \\'boolean\\' && ' + ($schemaValueExcl) + ' !== undefined) { ' + ($valid) + ' = false; ';\n\t var $errorKeyword = $exclusiveKeyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveFormatLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t $closingBraces += '}';\n\t out += ' else { ';\n\t }\n\t if ($isData) {\n\t out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'string\\') ' + ($valid) + ' = false; else { ';\n\t $closingBraces += '}';\n\t }\n\t if ($isDataFormat) {\n\t out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { ';\n\t $closingBraces += '}';\n\t }\n\t out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ', ';\n\t if ($isData) {\n\t out += '' + ($schemaValue);\n\t } else {\n\t out += '' + (it.util.toQuotedString($schema));\n\t }\n\t out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; var exclusive' + ($lvl) + ' = ' + ($schemaValueExcl) + ' === true; if (' + ($valid) + ' === undefined) { ' + ($valid) + ' = exclusive' + ($lvl) + ' ? ' + ($result) + ' ' + ($op) + ' 0 : ' + ($result) + ' ' + ($op) + '= 0; } if (!' + ($valid) + ') var op' + ($lvl) + ' = exclusive' + ($lvl) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\';';\n\t } else {\n\t var $exclusive = $schemaExcl === true,\n\t $opStr = $op;\n\t if (!$exclusive) $opStr += '=';\n\t var $opExpr = '\\'' + $opStr + '\\'';\n\t if ($isData) {\n\t out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'string\\') ' + ($valid) + ' = false; else { ';\n\t $closingBraces += '}';\n\t }\n\t if ($isDataFormat) {\n\t out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { ';\n\t $closingBraces += '}';\n\t }\n\t out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ', ';\n\t if ($isData) {\n\t out += '' + ($schemaValue);\n\t } else {\n\t out += '' + (it.util.toQuotedString($schema));\n\t }\n\t out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; if (' + ($valid) + ' === undefined) ' + ($valid) + ' = ' + ($result) + ' ' + ($op);\n\t if (!$exclusive) {\n\t out += '=';\n\t }\n\t out += ' 0;';\n\t }\n\t out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { ';\n\t var $errorKeyword = $keyword;\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '_formatLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { limit: ';\n\t if ($isData) {\n\t out += '' + ($schemaValue);\n\t } else {\n\t out += '' + (it.util.toQuotedString($schema));\n\t }\n\t out += ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should be ' + ($opStr) + ' \"';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue) + ' + \\'';\n\t } else {\n\t out += '' + (it.util.escapeQuotes($schema));\n\t }\n\t out += '\"\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + (it.util.toQuotedString($schema));\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '}';\n\t return out;\n\t}\n\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_allOf(it, $keyword) {\n\t var out = ' ';\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $it = it.util.copy(it);\n\t var $closingBraces = '';\n\t $it.level++;\n\t var arr1 = $schema;\n\t if (arr1) {\n\t var $sch, $i = -1,\n\t l1 = arr1.length - 1;\n\t while ($i < l1) {\n\t $sch = arr1[$i += 1];\n\t if (it.util.schemaHasRules($sch, it.RULES.all)) {\n\t $it.schema = $sch;\n\t $it.schemaPath = $schemaPath + '[' + $i + ']';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $i;\n\t out += ' ' + (it.validate($it)) + ' ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t }\n\t }\n\t if ($breakOnError) {\n\t out += ' ' + ($closingBraces.slice(0, -1));\n\t }\n\t out = it.util.cleanUpCode(out);\n\t return out;\n\t}\n\n\n/***/ },\n/* 26 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_anyOf(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $errs = 'errs__' + $lvl;\n\t var $it = it.util.copy(it);\n\t var $closingBraces = '';\n\t $it.level++;\n\t var $noEmptySchema = $schema.every(function($sch) {\n\t return it.util.schemaHasRules($sch, it.RULES.all);\n\t });\n\t if ($noEmptySchema) {\n\t out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; ';\n\t var $wasComposite = it.compositeRule;\n\t it.compositeRule = $it.compositeRule = true;\n\t var arr1 = $schema;\n\t if (arr1) {\n\t var $sch, $i = -1,\n\t l1 = arr1.length - 1;\n\t while ($i < l1) {\n\t $sch = arr1[$i += 1];\n\t $it.schema = $sch;\n\t $it.schemaPath = $schemaPath + '[' + $i + ']';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $i;\n\t out += ' ' + (it.validate($it)) + ' ' + ($valid) + ' = ' + ($valid) + ' || valid' + ($it.level) + '; if (!' + ($valid) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t it.compositeRule = $it.compositeRule = $wasComposite;\n\t out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'anyOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should match some schema in anyOf\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n\t if (it.opts.allErrors) {\n\t out += ' } ';\n\t }\n\t out = it.util.cleanUpCode(out);\n\t } else {\n\t if ($breakOnError) {\n\t out += ' if (true) { ';\n\t }\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 27 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_constant(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t if (!$isData) {\n\t out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';\n\t }\n\t out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'constant') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should be equal to constant\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' }';\n\t return out;\n\t}\n\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_dependencies(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $errs = 'errs__' + $lvl;\n\t var $it = it.util.copy(it);\n\t var $closingBraces = '';\n\t $it.level++;\n\t var $schemaDeps = {},\n\t $propertyDeps = {};\n\t for ($property in $schema) {\n\t var $sch = $schema[$property];\n\t var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;\n\t $deps[$property] = $sch;\n\t }\n\t out += 'var ' + ($errs) + ' = errors;';\n\t var $currentErrorPath = it.errorPath;\n\t out += 'var missing' + ($lvl) + ';';\n\t for (var $property in $propertyDeps) {\n\t $deps = $propertyDeps[$property];\n\t out += ' if (' + ($data) + (it.util.getProperty($property)) + ' !== undefined && ( ';\n\t var arr1 = $deps;\n\t if (arr1) {\n\t var _$property, $i = -1,\n\t l1 = arr1.length - 1;\n\t while ($i < l1) {\n\t _$property = arr1[$i += 1];\n\t if ($i) {\n\t out += ' || ';\n\t }\n\t var $prop = it.util.getProperty(_$property);\n\t out += ' ( ' + ($data) + ($prop) + ' === undefined && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? _$property : $prop)) + ') ) ';\n\t }\n\t }\n\t out += ')) { ';\n\t var $propertyPath = 'missing' + $lvl,\n\t $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n\t }\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should have ';\n\t if ($deps.length == 1) {\n\t out += 'property ' + (it.util.escapeQuotes($deps[0]));\n\t } else {\n\t out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n\t }\n\t out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t $closingBraces += '}';\n\t out += ' else { ';\n\t }\n\t }\n\t it.errorPath = $currentErrorPath;\n\t for (var $property in $schemaDeps) {\n\t var $sch = $schemaDeps[$property];\n\t if (it.util.schemaHasRules($sch, it.RULES.all)) {\n\t out += ' valid' + ($it.level) + ' = true; if (' + ($data) + '[\\'' + ($property) + '\\'] !== undefined) { ';\n\t $it.schema = $sch;\n\t $it.schemaPath = $schemaPath + it.util.getProperty($property);\n\t $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);\n\t out += ' ' + (it.validate($it)) + ' } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t }\n\t if ($breakOnError) {\n\t out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n\t }\n\t out = it.util.cleanUpCode(out);\n\t return out;\n\t}\n\n\n/***/ },\n/* 29 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_enum(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t var $i = 'i' + $lvl;\n\t if (!$isData) {\n\t out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';\n\t }\n\t out += 'var ' + ($valid) + ';';\n\t if ($isData) {\n\t out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n\t }\n\t out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + ' ' + ($i) + ') { ';\n\t var $passData = $data + '[' + $i + ']';\n\t $it.schema = $sch;\n\t $it.schemaPath = $schemaPath + '[' + $i + ']';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $i;\n\t $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);\n\t $it.dataPathArr[$dataNxt] = $i;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t }\n\t }\n\t if (typeof $additionalItems == 'object' && it.util.schemaHasRules($additionalItems, it.RULES.all)) {\n\t $it.schema = $additionalItems;\n\t $it.schemaPath = it.schemaPath + '.additionalItems';\n\t $it.errSchemaPath = it.errSchemaPath + '/additionalItems';\n\t out += ' valid' + ($it.level) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var i' + ($lvl) + ' = ' + ($schema.length) + '; i' + ($lvl) + ' < ' + ($data) + '.length; i' + ($lvl) + '++) { ';\n\t $it.errorPath = it.util.getPathExpr(it.errorPath, 'i' + $lvl, it.opts.jsonPointers, true);\n\t var $passData = $data + '[i' + $lvl + ']';\n\t $it.dataPathArr[$dataNxt] = 'i' + $lvl;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t if ($breakOnError) {\n\t out += ' if (!valid' + ($it.level) + ') break; ';\n\t }\n\t out += ' } } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t } else if (it.util.schemaHasRules($schema, it.RULES.all)) {\n\t $it.schema = $schema;\n\t $it.schemaPath = $schemaPath;\n\t $it.errSchemaPath = $errSchemaPath;\n\t out += ' for (var i' + ($lvl) + ' = ' + (0) + '; i' + ($lvl) + ' < ' + ($data) + '.length; i' + ($lvl) + '++) { ';\n\t $it.errorPath = it.util.getPathExpr(it.errorPath, 'i' + $lvl, it.opts.jsonPointers, true);\n\t var $passData = $data + '[i' + $lvl + ']';\n\t $it.dataPathArr[$dataNxt] = 'i' + $lvl;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t if ($breakOnError) {\n\t out += ' if (!valid' + ($it.level) + ') break; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t if ($breakOnError) {\n\t out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n\t }\n\t out = it.util.cleanUpCode(out);\n\t return out;\n\t}\n\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_multipleOf(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t out += 'var division' + ($lvl) + ';if (';\n\t if ($isData) {\n\t out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \\'number\\' || ';\n\t }\n\t out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';\n\t if (it.opts.multipleOfPrecision) {\n\t out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';\n\t } else {\n\t out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';\n\t }\n\t out += ' ) ';\n\t if ($isData) {\n\t out += ' ) ';\n\t }\n\t out += ' ) { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'multipleOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { multipleOf: ' + ($schemaValue) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should be multiple of ';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue);\n\t } else {\n\t out += '' + ($schema) + '\\'';\n\t }\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '} ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 33 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_not(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $errs = 'errs__' + $lvl;\n\t var $it = it.util.copy(it);\n\t $it.level++;\n\t if (it.util.schemaHasRules($schema, it.RULES.all)) {\n\t $it.schema = $schema;\n\t $it.schemaPath = $schemaPath;\n\t $it.errSchemaPath = $errSchemaPath;\n\t out += ' var ' + ($errs) + ' = errors; ';\n\t var $wasComposite = it.compositeRule;\n\t it.compositeRule = $it.compositeRule = true;\n\t $it.createErrors = false;\n\t var $allErrorsOption;\n\t if ($it.opts.allErrors) {\n\t $allErrorsOption = $it.opts.allErrors;\n\t $it.opts.allErrors = false;\n\t }\n\t out += ' ' + (it.validate($it)) + ' ';\n\t $it.createErrors = true;\n\t if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;\n\t it.compositeRule = $it.compositeRule = $wasComposite;\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT be valid\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n\t if (it.opts.allErrors) {\n\t out += ' } ';\n\t }\n\t } else {\n\t out += ' var err = '; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT be valid\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t if ($breakOnError) {\n\t out += ' if (false) { ';\n\t }\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 34 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_oneOf(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $errs = 'errs__' + $lvl;\n\t var $it = it.util.copy(it);\n\t var $closingBraces = '';\n\t $it.level++;\n\t out += 'var ' + ($errs) + ' = errors;var prevValid' + ($lvl) + ' = false;var ' + ($valid) + ' = false; ';\n\t var $wasComposite = it.compositeRule;\n\t it.compositeRule = $it.compositeRule = true;\n\t var arr1 = $schema;\n\t if (arr1) {\n\t var $sch, $i = -1,\n\t l1 = arr1.length - 1;\n\t while ($i < l1) {\n\t $sch = arr1[$i += 1];\n\t if (it.util.schemaHasRules($sch, it.RULES.all)) {\n\t $it.schema = $sch;\n\t $it.schemaPath = $schemaPath + '[' + $i + ']';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $i;\n\t out += ' ' + (it.validate($it)) + ' ';\n\t } else {\n\t out += ' var valid' + ($it.level) + ' = true; ';\n\t }\n\t if ($i) {\n\t out += ' if (valid' + ($it.level) + ' && prevValid' + ($lvl) + ') ' + ($valid) + ' = false; else { ';\n\t $closingBraces += '}';\n\t }\n\t out += ' if (valid' + ($it.level) + ') ' + ($valid) + ' = prevValid' + ($lvl) + ' = true;';\n\t }\n\t }\n\t it.compositeRule = $it.compositeRule = $wasComposite;\n\t out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'oneOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: {} ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should match exactly one schema in oneOf\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';\n\t if (it.opts.allErrors) {\n\t out += ' } ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 35 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_pattern(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);\n\t out += 'if ( ';\n\t if ($isData) {\n\t out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n\t }\n\t out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'pattern') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { pattern: ';\n\t if ($isData) {\n\t out += '' + ($schemaValue);\n\t } else {\n\t out += '' + (it.util.toQuotedString($schema));\n\t }\n\t out += ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should match pattern \"';\n\t if ($isData) {\n\t out += '\\' + ' + ($schemaValue) + ' + \\'';\n\t } else {\n\t out += '' + (it.util.escapeQuotes($schema));\n\t }\n\t out += '\"\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + (it.util.toQuotedString($schema));\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += '} ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 36 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_patternRequired(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $key = 'key' + $lvl,\n\t $matched = 'patternMatched' + $lvl,\n\t $closingBraces = '';\n\t out += 'var ' + ($valid) + ' = true;';\n\t var arr1 = $schema;\n\t if (arr1) {\n\t var $pProperty, i1 = -1,\n\t l1 = arr1.length - 1;\n\t while (i1 < l1) {\n\t $pProperty = arr1[i1 += 1];\n\t out += ' var ' + ($matched) + ' = false; for (var ' + ($key) + ' in ' + ($data) + ') { ' + ($matched) + ' = ' + (it.usePattern($pProperty)) + '.test(' + ($key) + '); if (' + ($matched) + ') break; } ';\n\t var $missingPattern = it.util.escapeQuotes($pProperty);\n\t out += ' if (!' + ($matched) + ') { ' + ($valid) + ' = false; var err = '; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'patternRequired') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingPattern: \\'' + ($missingPattern) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should have property matching pattern \\\\\\'' + ($missingPattern) + '\\\\\\'\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n\t if ($breakOnError) {\n\t $closingBraces += '}';\n\t out += ' else { ';\n\t }\n\t }\n\t }\n\t out += '' + ($closingBraces);\n\t return out;\n\t}\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_properties(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $errs = 'errs__' + $lvl;\n\t var $it = it.util.copy(it);\n\t var $closingBraces = '';\n\t $it.level++;\n\t var $dataNxt = $it.dataLevel = it.dataLevel + 1,\n\t $nextData = 'data' + $dataNxt;\n\t var $schemaKeys = Object.keys($schema || {}),\n\t $pProperties = it.schema.patternProperties || {},\n\t $pPropertyKeys = Object.keys($pProperties),\n\t $aProperties = it.schema.additionalProperties,\n\t $someProperties = $schemaKeys.length || $pPropertyKeys.length,\n\t $noAdditional = $aProperties === false,\n\t $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,\n\t $removeAdditional = it.opts.removeAdditional,\n\t $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional;\n\t var $required = it.schema.required;\n\t if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required);\n\t if (it.opts.v5) {\n\t var $pgProperties = it.schema.patternGroups || {},\n\t $pgPropertyKeys = Object.keys($pgProperties);\n\t }\n\t out += 'var ' + ($errs) + ' = errors;var valid' + ($it.level) + ' = true;';\n\t if ($checkAdditional) {\n\t out += ' for (var key' + ($lvl) + ' in ' + ($data) + ') { ';\n\t if ($someProperties) {\n\t out += ' var isAdditional' + ($lvl) + ' = !(false ';\n\t if ($schemaKeys.length) {\n\t if ($schemaKeys.length > 5) {\n\t out += ' || validate.schema' + ($schemaPath) + '[key' + ($lvl) + '] ';\n\t } else {\n\t var arr1 = $schemaKeys;\n\t if (arr1) {\n\t var $propertyKey, i1 = -1,\n\t l1 = arr1.length - 1;\n\t while (i1 < l1) {\n\t $propertyKey = arr1[i1 += 1];\n\t out += ' || key' + ($lvl) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';\n\t }\n\t }\n\t }\n\t }\n\t if ($pPropertyKeys.length) {\n\t var arr2 = $pPropertyKeys;\n\t if (arr2) {\n\t var $pProperty, $i = -1,\n\t l2 = arr2.length - 1;\n\t while ($i < l2) {\n\t $pProperty = arr2[$i += 1];\n\t out += ' || ' + (it.usePattern($pProperty)) + '.test(key' + ($lvl) + ') ';\n\t }\n\t }\n\t }\n\t if (it.opts.v5 && $pgPropertyKeys && $pgPropertyKeys.length) {\n\t var arr3 = $pgPropertyKeys;\n\t if (arr3) {\n\t var $pgProperty, $i = -1,\n\t l3 = arr3.length - 1;\n\t while ($i < l3) {\n\t $pgProperty = arr3[$i += 1];\n\t out += ' || ' + (it.usePattern($pgProperty)) + '.test(key' + ($lvl) + ') ';\n\t }\n\t }\n\t }\n\t out += ' ); if (isAdditional' + ($lvl) + ') { ';\n\t }\n\t if ($removeAdditional == 'all') {\n\t out += ' delete ' + ($data) + '[key' + ($lvl) + ']; ';\n\t } else {\n\t var $currentErrorPath = it.errorPath;\n\t var $additionalProperty = '\\' + key' + $lvl + ' + \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.util.getPathExpr(it.errorPath, 'key' + $lvl, it.opts.jsonPointers);\n\t }\n\t if ($noAdditional) {\n\t if ($removeAdditional) {\n\t out += ' delete ' + ($data) + '[key' + ($lvl) + ']; ';\n\t } else {\n\t out += ' valid' + ($it.level) + ' = false; ';\n\t var $currErrSchemaPath = $errSchemaPath;\n\t $errSchemaPath = it.errSchemaPath + '/additionalProperties';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'additionalProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { additionalProperty: \\'' + ($additionalProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT have additional properties\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t $errSchemaPath = $currErrSchemaPath;\n\t if ($breakOnError) {\n\t out += ' break; ';\n\t }\n\t }\n\t } else if ($additionalIsSchema) {\n\t if ($removeAdditional == 'failing') {\n\t out += ' var ' + ($errs) + ' = errors; ';\n\t var $wasComposite = it.compositeRule;\n\t it.compositeRule = $it.compositeRule = true;\n\t $it.schema = $aProperties;\n\t $it.schemaPath = it.schemaPath + '.additionalProperties';\n\t $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n\t $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, 'key' + $lvl, it.opts.jsonPointers);\n\t var $passData = $data + '[key' + $lvl + ']';\n\t $it.dataPathArr[$dataNxt] = 'key' + $lvl;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t out += ' if (!valid' + ($it.level) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[key' + ($lvl) + ']; } ';\n\t it.compositeRule = $it.compositeRule = $wasComposite;\n\t } else {\n\t $it.schema = $aProperties;\n\t $it.schemaPath = it.schemaPath + '.additionalProperties';\n\t $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n\t $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, 'key' + $lvl, it.opts.jsonPointers);\n\t var $passData = $data + '[key' + $lvl + ']';\n\t $it.dataPathArr[$dataNxt] = 'key' + $lvl;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t if ($breakOnError) {\n\t out += ' if (!valid' + ($it.level) + ') break; ';\n\t }\n\t }\n\t }\n\t it.errorPath = $currentErrorPath;\n\t }\n\t if ($someProperties) {\n\t out += ' } ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t var $useDefaults = it.opts.useDefaults && !it.compositeRule;\n\t if ($schemaKeys.length) {\n\t var arr4 = $schemaKeys;\n\t if (arr4) {\n\t var $propertyKey, i4 = -1,\n\t l4 = arr4.length - 1;\n\t while (i4 < l4) {\n\t $propertyKey = arr4[i4 += 1];\n\t var $sch = $schema[$propertyKey];\n\t if (it.util.schemaHasRules($sch, it.RULES.all)) {\n\t var $prop = it.util.getProperty($propertyKey),\n\t $passData = $data + $prop,\n\t $hasDefault = $useDefaults && $sch.default !== undefined;\n\t $it.schema = $sch;\n\t $it.schemaPath = $schemaPath + $prop;\n\t $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);\n\t $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);\n\t $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t $code = it.util.varReplace($code, $nextData, $passData);\n\t var $useData = $passData;\n\t } else {\n\t var $useData = $nextData;\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';\n\t }\n\t if ($hasDefault) {\n\t out += ' ' + ($code) + ' ';\n\t } else {\n\t if ($requiredHash && $requiredHash[$propertyKey]) {\n\t out += ' if (' + ($useData) + ' === undefined) { valid' + ($it.level) + ' = false; ';\n\t var $currentErrorPath = it.errorPath,\n\t $currErrSchemaPath = $errSchemaPath,\n\t $missingProperty = it.util.escapeQuotes($propertyKey);\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n\t }\n\t $errSchemaPath = it.errSchemaPath + '/required';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t out += 'is a required property';\n\t } else {\n\t out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t $errSchemaPath = $currErrSchemaPath;\n\t it.errorPath = $currentErrorPath;\n\t out += ' } else { ';\n\t } else {\n\t if ($breakOnError) {\n\t out += ' if (' + ($useData) + ' === undefined) { valid' + ($it.level) + ' = true; } else { ';\n\t } else {\n\t out += ' if (' + ($useData) + ' !== undefined) { ';\n\t }\n\t }\n\t out += ' ' + ($code) + ' } ';\n\t }\n\t }\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t }\n\t }\n\t var arr5 = $pPropertyKeys;\n\t if (arr5) {\n\t var $pProperty, i5 = -1,\n\t l5 = arr5.length - 1;\n\t while (i5 < l5) {\n\t $pProperty = arr5[i5 += 1];\n\t var $sch = $pProperties[$pProperty];\n\t if (it.util.schemaHasRules($sch, it.RULES.all)) {\n\t $it.schema = $sch;\n\t $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);\n\t $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);\n\t out += ' for (var key' + ($lvl) + ' in ' + ($data) + ') { if (' + (it.usePattern($pProperty)) + '.test(key' + ($lvl) + ')) { ';\n\t $it.errorPath = it.util.getPathExpr(it.errorPath, 'key' + $lvl, it.opts.jsonPointers);\n\t var $passData = $data + '[key' + $lvl + ']';\n\t $it.dataPathArr[$dataNxt] = 'key' + $lvl;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t if ($breakOnError) {\n\t out += ' if (!valid' + ($it.level) + ') break; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' else valid' + ($it.level) + ' = true; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t }\n\t }\n\t if (it.opts.v5) {\n\t var arr6 = $pgPropertyKeys;\n\t if (arr6) {\n\t var $pgProperty, i6 = -1,\n\t l6 = arr6.length - 1;\n\t while (i6 < l6) {\n\t $pgProperty = arr6[i6 += 1];\n\t var $pgSchema = $pgProperties[$pgProperty],\n\t $sch = $pgSchema.schema;\n\t if (it.util.schemaHasRules($sch, it.RULES.all)) {\n\t $it.schema = $sch;\n\t $it.schemaPath = it.schemaPath + '.patternGroups' + it.util.getProperty($pgProperty) + '.schema';\n\t $it.errSchemaPath = it.errSchemaPath + '/patternGroups/' + it.util.escapeFragment($pgProperty) + '/schema';\n\t out += ' var pgPropCount' + ($lvl) + ' = 0; for (var key' + ($lvl) + ' in ' + ($data) + ') { if (' + (it.usePattern($pgProperty)) + '.test(key' + ($lvl) + ')) { pgPropCount' + ($lvl) + '++; ';\n\t $it.errorPath = it.util.getPathExpr(it.errorPath, 'key' + $lvl, it.opts.jsonPointers);\n\t var $passData = $data + '[key' + $lvl + ']';\n\t $it.dataPathArr[$dataNxt] = 'key' + $lvl;\n\t var $code = it.validate($it);\n\t if (it.util.varOccurences($code, $nextData) < 2) {\n\t out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n\t } else {\n\t out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n\t }\n\t if ($breakOnError) {\n\t out += ' if (!valid' + ($it.level) + ') break; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' else valid' + ($it.level) + ' = true; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t var $pgMin = $pgSchema.minimum,\n\t $pgMax = $pgSchema.maximum;\n\t if ($pgMin !== undefined || $pgMax !== undefined) {\n\t out += ' var ' + ($valid) + ' = true; ';\n\t var $currErrSchemaPath = $errSchemaPath;\n\t if ($pgMin !== undefined) {\n\t var $limit = $pgMin,\n\t $reason = 'minimum',\n\t $moreOrLess = 'less';\n\t out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' >= ' + ($pgMin) + '; ';\n\t $errSchemaPath = it.errSchemaPath + '/patternGroups/minimum';\n\t out += ' if (!' + ($valid) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'patternGroups') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { reason: \\'' + ($reason) + '\\', limit: ' + ($limit) + ', pattern: \\'' + (it.util.escapeQuotes($pgProperty)) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern \"' + (it.util.escapeQuotes($pgProperty)) + '\"\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } ';\n\t if ($pgMax !== undefined) {\n\t out += ' else ';\n\t }\n\t }\n\t if ($pgMax !== undefined) {\n\t var $limit = $pgMax,\n\t $reason = 'maximum',\n\t $moreOrLess = 'more';\n\t out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' <= ' + ($pgMax) + '; ';\n\t $errSchemaPath = it.errSchemaPath + '/patternGroups/maximum';\n\t out += ' if (!' + ($valid) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'patternGroups') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { reason: \\'' + ($reason) + '\\', limit: ' + ($limit) + ', pattern: \\'' + (it.util.escapeQuotes($pgProperty)) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern \"' + (it.util.escapeQuotes($pgProperty)) + '\"\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } ';\n\t }\n\t $errSchemaPath = $currErrSchemaPath;\n\t if ($breakOnError) {\n\t out += ' if (' + ($valid) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t if ($breakOnError) {\n\t out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n\t }\n\t out = it.util.cleanUpCode(out);\n\t return out;\n\t}\n\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_ref(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $async, $refCode;\n\t if ($schema == '#' || $schema == '#/') {\n\t if (it.isRoot) {\n\t $async = it.async;\n\t $refCode = 'validate';\n\t } else {\n\t $async = it.root.schema.$async === true;\n\t $refCode = 'root.refVal[0]';\n\t }\n\t } else {\n\t var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);\n\t if ($refVal === undefined) {\n\t var $message = 'can\\'t resolve reference ' + $schema + ' from id ' + it.baseId;\n\t if (it.opts.missingRefs == 'fail') {\n\t console.log($message);\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || '$ref') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { ref: \\'' + (it.util.escapeQuotes($schema)) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'can\\\\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t if ($breakOnError) {\n\t out += ' if (false) { ';\n\t }\n\t } else if (it.opts.missingRefs == 'ignore') {\n\t console.log($message);\n\t if ($breakOnError) {\n\t out += ' if (true) { ';\n\t }\n\t } else {\n\t var $error = new Error($message);\n\t $error.missingRef = it.resolve.url(it.baseId, $schema);\n\t $error.missingSchema = it.resolve.normalizeId(it.resolve.fullPath($error.missingRef));\n\t throw $error;\n\t }\n\t } else if ($refVal.inline) {\n\t var $it = it.util.copy(it);\n\t $it.level++;\n\t $it.schema = $refVal.schema;\n\t $it.schemaPath = '';\n\t $it.errSchemaPath = $schema;\n\t var $code = it.validate($it).replace(/validate\\.schema/g, $refVal.code);\n\t out += ' ' + ($code) + ' ';\n\t if ($breakOnError) {\n\t out += ' if (valid' + ($it.level) + ') { ';\n\t }\n\t } else {\n\t $async = $refVal.async;\n\t $refCode = $refVal.code;\n\t }\n\t }\n\t if ($refCode) {\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = '';\n\t if (it.opts.passContext) {\n\t out += ' ' + ($refCode) + '.call(this, ';\n\t } else {\n\t out += ' ' + ($refCode) + '( ';\n\t }\n\t out += ' ' + ($data) + ', (dataPath || \\'\\')';\n\t if (it.errorPath != '\"\"') {\n\t out += ' + ' + (it.errorPath);\n\t }\n\t if ($dataLvl) {\n\t out += ' , data' + (($dataLvl - 1) || '') + ' , ' + (it.dataPathArr[$dataLvl]) + ' ';\n\t } else {\n\t out += ' , parentData , parentDataProperty ';\n\t }\n\t out += ') ';\n\t var __callValidate = out;\n\t out = $$outStack.pop();\n\t if ($async) {\n\t if (!it.async) throw new Error('async schema referenced by sync schema');\n\t out += ' try { ';\n\t if ($breakOnError) {\n\t out += 'var ' + ($valid) + ' =';\n\t }\n\t out += ' ' + (it.yieldAwait) + ' ' + (__callValidate) + '; } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; } ';\n\t if ($breakOnError) {\n\t out += ' if (' + ($valid) + ') { ';\n\t }\n\t } else {\n\t out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t }\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_required(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t if (!$isData) {\n\t if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {\n\t var $required = [];\n\t var arr1 = $schema;\n\t if (arr1) {\n\t var $property, i1 = -1,\n\t l1 = arr1.length - 1;\n\t while (i1 < l1) {\n\t $property = arr1[i1 += 1];\n\t var $propertySch = it.schema.properties[$property];\n\t if (!($propertySch && it.util.schemaHasRules($propertySch, it.RULES.all))) {\n\t $required[$required.length] = $property;\n\t }\n\t }\n\t }\n\t } else {\n\t var $required = $schema;\n\t }\n\t }\n\t if ($isData || $required.length) {\n\t var $currentErrorPath = it.errorPath,\n\t $loopRequired = $isData || $required.length >= it.opts.loopRequired;\n\t if ($breakOnError) {\n\t out += ' var missing' + ($lvl) + '; ';\n\t if ($loopRequired) {\n\t if (!$isData) {\n\t out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + '; ';\n\t }\n\t var $i = 'i' + $lvl,\n\t $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n\t $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n\t }\n\t out += ' var ' + ($valid) + ' = true; ';\n\t if ($isData) {\n\t out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n\t }\n\t out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < schema' + ($lvl) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[schema' + ($lvl) + '[' + ($i) + ']] !== undefined; if (!' + ($valid) + ') break; } ';\n\t if ($isData) {\n\t out += ' } ';\n\t }\n\t out += ' if (!' + ($valid) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t out += 'is a required property';\n\t } else {\n\t out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } else { ';\n\t } else {\n\t out += ' if ( ';\n\t var arr2 = $required;\n\t if (arr2) {\n\t var _$property, $i = -1,\n\t l2 = arr2.length - 1;\n\t while ($i < l2) {\n\t _$property = arr2[$i += 1];\n\t if ($i) {\n\t out += ' || ';\n\t }\n\t var $prop = it.util.getProperty(_$property);\n\t out += ' ( ' + ($data) + ($prop) + ' === undefined && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? _$property : $prop)) + ') ) ';\n\t }\n\t }\n\t out += ') { ';\n\t var $propertyPath = 'missing' + $lvl,\n\t $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n\t }\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t out += 'is a required property';\n\t } else {\n\t out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } else { ';\n\t }\n\t } else {\n\t if ($loopRequired) {\n\t if (!$isData) {\n\t out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + '; ';\n\t }\n\t var $i = 'i' + $lvl,\n\t $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n\t $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n\t }\n\t if ($isData) {\n\t out += ' if (schema' + ($lvl) + ' && !Array.isArray(schema' + ($lvl) + ')) { var err = '; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t out += 'is a required property';\n\t } else {\n\t out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (schema' + ($lvl) + ' !== undefined) { ';\n\t }\n\t out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < schema' + ($lvl) + '.length; ' + ($i) + '++) { if (' + ($data) + '[schema' + ($lvl) + '[' + ($i) + ']] === undefined) { var err = '; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t out += 'is a required property';\n\t } else {\n\t out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';\n\t if ($isData) {\n\t out += ' } ';\n\t }\n\t } else {\n\t var arr3 = $required;\n\t if (arr3) {\n\t var $property, $i = -1,\n\t l3 = arr3.length - 1;\n\t while ($i < l3) {\n\t $property = arr3[$i += 1];\n\t var $prop = it.util.getProperty($property),\n\t $missingProperty = it.util.escapeQuotes($property);\n\t if (it.opts._errorDataPathProperty) {\n\t it.errorPath = it.util.getPath($currentErrorPath, $property, it.opts.jsonPointers);\n\t }\n\t out += ' if (' + ($data) + ($prop) + ' === undefined) { var err = '; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'';\n\t if (it.opts._errorDataPathProperty) {\n\t out += 'is a required property';\n\t } else {\n\t out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n\t }\n\t out += '\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n\t }\n\t }\n\t }\n\t }\n\t it.errorPath = $currentErrorPath;\n\t } else if ($breakOnError) {\n\t out += ' if (true) {';\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_switch(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $errs = 'errs__' + $lvl;\n\t var $it = it.util.copy(it);\n\t var $closingBraces = '';\n\t $it.level++;\n\t var $ifPassed = 'ifPassed' + it.level,\n\t $shouldContinue;\n\t out += 'var ' + ($ifPassed) + ';';\n\t var arr1 = $schema;\n\t if (arr1) {\n\t var $sch, $caseIndex = -1,\n\t l1 = arr1.length - 1;\n\t while ($caseIndex < l1) {\n\t $sch = arr1[$caseIndex += 1];\n\t if ($caseIndex && !$shouldContinue) {\n\t out += ' if (!' + ($ifPassed) + ') { ';\n\t $closingBraces += '}';\n\t }\n\t if ($sch.if && it.util.schemaHasRules($sch.if, it.RULES.all)) {\n\t out += ' var ' + ($errs) + ' = errors; ';\n\t var $wasComposite = it.compositeRule;\n\t it.compositeRule = $it.compositeRule = true;\n\t $it.createErrors = false;\n\t $it.schema = $sch.if;\n\t $it.schemaPath = $schemaPath + '[' + $caseIndex + '].if';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/if';\n\t out += ' ' + (it.validate($it)) + ' ';\n\t $it.createErrors = true;\n\t it.compositeRule = $it.compositeRule = $wasComposite;\n\t out += ' ' + ($ifPassed) + ' = valid' + ($it.level) + '; if (' + ($ifPassed) + ') { ';\n\t if (typeof $sch.then == 'boolean') {\n\t if ($sch.then === false) {\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'switch') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { caseIndex: ' + ($caseIndex) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should pass \"switch\" keyword validation\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t }\n\t out += ' var valid' + ($it.level) + ' = ' + ($sch.then) + '; ';\n\t } else {\n\t $it.schema = $sch.then;\n\t $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then';\n\t out += ' ' + (it.validate($it)) + ' ';\n\t }\n\t out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } } ';\n\t } else {\n\t out += ' ' + ($ifPassed) + ' = true; ';\n\t if (typeof $sch.then == 'boolean') {\n\t if ($sch.then === false) {\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'switch') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { caseIndex: ' + ($caseIndex) + ' } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should pass \"switch\" keyword validation\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t }\n\t out += ' var valid' + ($it.level) + ' = ' + ($sch.then) + '; ';\n\t } else {\n\t $it.schema = $sch.then;\n\t $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then';\n\t $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then';\n\t out += ' ' + (it.validate($it)) + ' ';\n\t }\n\t }\n\t $shouldContinue = $sch.continue\n\t }\n\t }\n\t out += '' + ($closingBraces) + 'var ' + ($valid) + ' = valid' + ($it.level) + '; ';\n\t out = it.util.cleanUpCode(out);\n\t return out;\n\t}\n\n\n/***/ },\n/* 41 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\tmodule.exports = function generate_uniqueItems(it, $keyword) {\n\t var out = ' ';\n\t var $lvl = it.level;\n\t var $dataLvl = it.dataLevel;\n\t var $schema = it.schema[$keyword];\n\t var $schemaPath = it.schemaPath + '.' + $keyword;\n\t var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n\t var $breakOnError = !it.opts.allErrors;\n\t var $errorKeyword;\n\t var $data = 'data' + ($dataLvl || '');\n\t var $valid = 'valid' + $lvl;\n\t var $isData = it.opts.v5 && $schema.$data;\n\t var $schemaValue = $isData ? it.util.getData($schema.$data, $dataLvl, it.dataPathArr) : $schema;\n\t if ($isData) {\n\t out += ' var schema' + ($lvl) + ' = ' + ($schemaValue) + '; ';\n\t $schemaValue = 'schema' + $lvl;\n\t }\n\t if (($schema || $isData) && it.opts.uniqueItems !== false) {\n\t if ($isData) {\n\t out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'boolean\\') ' + ($valid) + ' = false; else { ';\n\t }\n\t out += ' var ' + ($valid) + ' = true; if (' + ($data) + '.length > 1) { var i = ' + ($data) + '.length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } } ';\n\t if ($isData) {\n\t out += ' } ';\n\t }\n\t out += ' if (!' + ($valid) + ') { ';\n\t var $$outStack = $$outStack || [];\n\t $$outStack.push(out);\n\t out = ''; /* istanbul ignore else */\n\t if (it.createErrors !== false) {\n\t out += ' { keyword: \\'' + ($errorKeyword || 'uniqueItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: \"' + ($errSchemaPath) + '\" , params: { i: i, j: j } ';\n\t if (it.opts.messages !== false) {\n\t out += ' , message: \\'should NOT have duplicate items (items ## \\' + j + \\' and \\' + i + \\' are identical)\\' ';\n\t }\n\t if (it.opts.verbose) {\n\t out += ' , schema: ';\n\t if ($isData) {\n\t out += 'validate.schema' + ($schemaPath);\n\t } else {\n\t out += '' + ($schema);\n\t }\n\t out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n\t }\n\t out += ' } ';\n\t } else {\n\t out += ' {} ';\n\t }\n\t var __err = out;\n\t out = $$outStack.pop();\n\t if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n\t if (it.async) {\n\t out += ' throw new ValidationError([' + (__err) + ']); ';\n\t } else {\n\t out += ' validate.errors = [' + (__err) + ']; return false; ';\n\t }\n\t } else {\n\t out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n\t }\n\t out += ' } ';\n\t if ($breakOnError) {\n\t out += ' else { ';\n\t }\n\t } else {\n\t if ($breakOnError) {\n\t out += ' if (true) { ';\n\t }\n\t }\n\t return out;\n\t}\n\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar IDENTIFIER = /^[a-z_$][a-z0-9_$]*$/i;\n\t\n\t/**\n\t * Define custom keyword\n\t * @this Ajv\n\t * @param {String} keyword custom keyword, should be a valid identifier, should be different from all standard, custom and macro keywords.\n\t * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.\n\t */\n\tmodule.exports = function addKeyword(keyword, definition) {\n\t /* eslint no-shadow: 0 */\n\t var self = this;\n\t if (this.RULES.keywords[keyword])\n\t throw new Error('Keyword ' + keyword + ' is already defined');\n\t\n\t if (!IDENTIFIER.test(keyword))\n\t throw new Error('Keyword ' + keyword + ' is not a valid identifier');\n\t\n\t if (definition) {\n\t var dataType = definition.type;\n\t if (Array.isArray(dataType)) {\n\t var i, len = dataType.length;\n\t for (i=0; i\\s+/g, \">\");\n\t\n\tvar SearchBox = function(editor, range, showReplaceForm) {\n\t var div = dom.createElement(\"div\");\n\t div.innerHTML = html;\n\t this.element = div.firstChild;\n\t\n\t this.$init();\n\t this.setEditor(editor);\n\t};\n\t\n\t(function() {\n\t this.setEditor = function(editor) {\n\t editor.searchBox = this;\n\t editor.container.appendChild(this.element);\n\t this.editor = editor;\n\t };\n\t\n\t this.$initElements = function(sb) {\n\t this.searchBox = sb.querySelector(\".ace_search_form\");\n\t this.replaceBox = sb.querySelector(\".ace_replace_form\");\n\t this.searchOptions = sb.querySelector(\".ace_search_options\");\n\t this.regExpOption = sb.querySelector(\"[action=toggleRegexpMode]\");\n\t this.caseSensitiveOption = sb.querySelector(\"[action=toggleCaseSensitive]\");\n\t this.wholeWordOption = sb.querySelector(\"[action=toggleWholeWords]\");\n\t this.searchInput = this.searchBox.querySelector(\".ace_search_field\");\n\t this.replaceInput = this.replaceBox.querySelector(\".ace_search_field\");\n\t };\n\t \n\t this.$init = function() {\n\t var sb = this.element;\n\t \n\t this.$initElements(sb);\n\t \n\t var _this = this;\n\t event.addListener(sb, \"mousedown\", function(e) {\n\t setTimeout(function(){\n\t _this.activeInput.focus();\n\t }, 0);\n\t event.stopPropagation(e);\n\t });\n\t event.addListener(sb, \"click\", function(e) {\n\t var t = e.target || e.srcElement;\n\t var action = t.getAttribute(\"action\");\n\t if (action && _this[action])\n\t _this[action]();\n\t else if (_this.$searchBarKb.commands[action])\n\t _this.$searchBarKb.commands[action].exec(_this);\n\t event.stopPropagation(e);\n\t });\n\t\n\t event.addCommandKeyListener(sb, function(e, hashId, keyCode) {\n\t var keyString = keyUtil.keyCodeToString(keyCode);\n\t var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);\n\t if (command && command.exec) {\n\t command.exec(_this);\n\t event.stopEvent(e);\n\t }\n\t });\n\t\n\t this.$onChange = lang.delayedCall(function() {\n\t _this.find(false, false);\n\t });\n\t\n\t event.addListener(this.searchInput, \"input\", function() {\n\t _this.$onChange.schedule(20);\n\t });\n\t event.addListener(this.searchInput, \"focus\", function() {\n\t _this.activeInput = _this.searchInput;\n\t _this.searchInput.value && _this.highlight();\n\t });\n\t event.addListener(this.replaceInput, \"focus\", function() {\n\t _this.activeInput = _this.replaceInput;\n\t _this.searchInput.value && _this.highlight();\n\t });\n\t };\n\t this.$closeSearchBarKb = new HashHandler([{\n\t bindKey: \"Esc\",\n\t name: \"closeSearchBar\",\n\t exec: function(editor) {\n\t editor.searchBox.hide();\n\t }\n\t }]);\n\t this.$searchBarKb = new HashHandler();\n\t this.$searchBarKb.bindKeys({\n\t \"Ctrl-f|Command-f\": function(sb) {\n\t var isReplace = sb.isReplace = !sb.isReplace;\n\t sb.replaceBox.style.display = isReplace ? \"\" : \"none\";\n\t sb.searchInput.focus();\n\t },\n\t \"Ctrl-H|Command-Option-F\": function(sb) {\n\t sb.replaceBox.style.display = \"\";\n\t sb.replaceInput.focus();\n\t },\n\t \"Ctrl-G|Command-G\": function(sb) {\n\t sb.findNext();\n\t },\n\t \"Ctrl-Shift-G|Command-Shift-G\": function(sb) {\n\t sb.findPrev();\n\t },\n\t \"esc\": function(sb) {\n\t setTimeout(function() { sb.hide();});\n\t },\n\t \"Return\": function(sb) {\n\t if (sb.activeInput == sb.replaceInput)\n\t sb.replace();\n\t sb.findNext();\n\t },\n\t \"Shift-Return\": function(sb) {\n\t if (sb.activeInput == sb.replaceInput)\n\t sb.replace();\n\t sb.findPrev();\n\t },\n\t \"Alt-Return\": function(sb) {\n\t if (sb.activeInput == sb.replaceInput)\n\t sb.replaceAll();\n\t sb.findAll();\n\t },\n\t \"Tab\": function(sb) {\n\t (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();\n\t }\n\t });\n\t\n\t this.$searchBarKb.addCommands([{\n\t name: \"toggleRegexpMode\",\n\t bindKey: {win: \"Alt-R|Alt-/\", mac: \"Ctrl-Alt-R|Ctrl-Alt-/\"},\n\t exec: function(sb) {\n\t sb.regExpOption.checked = !sb.regExpOption.checked;\n\t sb.$syncOptions();\n\t }\n\t }, {\n\t name: \"toggleCaseSensitive\",\n\t bindKey: {win: \"Alt-C|Alt-I\", mac: \"Ctrl-Alt-R|Ctrl-Alt-I\"},\n\t exec: function(sb) {\n\t sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;\n\t sb.$syncOptions();\n\t }\n\t }, {\n\t name: \"toggleWholeWords\",\n\t bindKey: {win: \"Alt-B|Alt-W\", mac: \"Ctrl-Alt-B|Ctrl-Alt-W\"},\n\t exec: function(sb) {\n\t sb.wholeWordOption.checked = !sb.wholeWordOption.checked;\n\t sb.$syncOptions();\n\t }\n\t }]);\n\t\n\t this.$syncOptions = function() {\n\t dom.setCssClass(this.regExpOption, \"checked\", this.regExpOption.checked);\n\t dom.setCssClass(this.wholeWordOption, \"checked\", this.wholeWordOption.checked);\n\t dom.setCssClass(this.caseSensitiveOption, \"checked\", this.caseSensitiveOption.checked);\n\t this.find(false, false);\n\t };\n\t\n\t this.highlight = function(re) {\n\t this.editor.session.highlight(re || this.editor.$search.$options.re);\n\t this.editor.renderer.updateBackMarkers()\n\t };\n\t this.find = function(skipCurrent, backwards, preventScroll) {\n\t var range = this.editor.find(this.searchInput.value, {\n\t skipCurrent: skipCurrent,\n\t backwards: backwards,\n\t wrap: true,\n\t regExp: this.regExpOption.checked,\n\t caseSensitive: this.caseSensitiveOption.checked,\n\t wholeWord: this.wholeWordOption.checked,\n\t preventScroll: preventScroll\n\t });\n\t var noMatch = !range && this.searchInput.value;\n\t dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n\t this.editor._emit(\"findSearchBox\", { match: !noMatch });\n\t this.highlight();\n\t };\n\t this.findNext = function() {\n\t this.find(true, false);\n\t };\n\t this.findPrev = function() {\n\t this.find(true, true);\n\t };\n\t this.findAll = function(){\n\t var range = this.editor.findAll(this.searchInput.value, { \n\t regExp: this.regExpOption.checked,\n\t caseSensitive: this.caseSensitiveOption.checked,\n\t wholeWord: this.wholeWordOption.checked\n\t });\n\t var noMatch = !range && this.searchInput.value;\n\t dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n\t this.editor._emit(\"findSearchBox\", { match: !noMatch });\n\t this.highlight();\n\t this.hide();\n\t };\n\t this.replace = function() {\n\t if (!this.editor.getReadOnly())\n\t this.editor.replace(this.replaceInput.value);\n\t }; \n\t this.replaceAndFindNext = function() {\n\t if (!this.editor.getReadOnly()) {\n\t this.editor.replace(this.replaceInput.value);\n\t this.findNext()\n\t }\n\t };\n\t this.replaceAll = function() {\n\t if (!this.editor.getReadOnly())\n\t this.editor.replaceAll(this.replaceInput.value);\n\t };\n\t\n\t this.hide = function() {\n\t this.element.style.display = \"none\";\n\t this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);\n\t this.editor.focus();\n\t };\n\t this.show = function(value, isReplace) {\n\t this.element.style.display = \"\";\n\t this.replaceBox.style.display = isReplace ? \"\" : \"none\";\n\t\n\t this.isReplace = isReplace;\n\t\n\t if (value)\n\t this.searchInput.value = value;\n\t \n\t this.find(false, false, true);\n\t \n\t this.searchInput.focus();\n\t this.searchInput.select();\n\t\n\t this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);\n\t };\n\t\n\t this.isFocused = function() {\n\t var el = document.activeElement;\n\t return el == this.searchInput || el == this.replaceInput;\n\t }\n\t}).call(SearchBox.prototype);\n\t\n\texports.SearchBox = SearchBox;\n\t\n\texports.Search = function(editor, isReplace) {\n\t var sb = editor.searchBox || new SearchBox(editor);\n\t sb.show(editor.session.getTextRange(), isReplace);\n\t};\n\t\n\t});\n\t (function() {\n\t ace.acequire([\"ace/ext/searchbox\"], function() {});\n\t })();\n\t \n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* ***** BEGIN LICENSE BLOCK *****\n\t * Distributed under the BSD license:\n\t *\n\t * Copyright (c) 2010, Ajax.org B.V.\n\t * All rights reserved.\n\t *\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are met:\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above copyright\n\t * notice, this list of conditions and the following disclaimer in the\n\t * documentation and/or other materials provided with the distribution.\n\t * * Neither the name of Ajax.org B.V. nor the\n\t * names of its contributors may be used to endorse or promote products\n\t * derived from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n\t * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\t * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\t * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n\t * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n\t * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n\t * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t *\n\t * ***** END LICENSE BLOCK ***** */\n\t\n\t/**\n\t * Define a module along with a payload\n\t * @param module a name for the payload\n\t * @param payload a function to call with (acequire, exports, module) params\n\t */\n\t\n\t(function() {\n\t\n\tvar ACE_NAMESPACE = \"ace\";\n\t\n\tvar global = (function() { return this; })();\n\tif (!global && typeof window != \"undefined\") global = window; // strict mode\n\t\n\t\n\tif (!ACE_NAMESPACE && typeof acequirejs !== \"undefined\")\n\t return;\n\t\n\t\n\tvar define = function(module, deps, payload) {\n\t if (typeof module !== \"string\") {\n\t if (define.original)\n\t define.original.apply(this, arguments);\n\t else {\n\t console.error(\"dropping module because define wasn\\'t a string.\");\n\t console.trace();\n\t }\n\t return;\n\t }\n\t if (arguments.length == 2)\n\t payload = deps;\n\t if (!define.modules[module]) {\n\t define.payloads[module] = payload;\n\t define.modules[module] = null;\n\t }\n\t};\n\t\n\tdefine.modules = {};\n\tdefine.payloads = {};\n\t\n\t/**\n\t * Get at functionality define()ed using the function above\n\t */\n\tvar _acequire = function(parentId, module, callback) {\n\t if (typeof module === \"string\") {\n\t var payload = lookup(parentId, module);\n\t if (payload != undefined) {\n\t callback && callback();\n\t return payload;\n\t }\n\t } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n\t var params = [];\n\t for (var i = 0, l = module.length; i < l; ++i) {\n\t var dep = lookup(parentId, module[i]);\n\t if (dep == undefined && acequire.original)\n\t return;\n\t params.push(dep);\n\t }\n\t return callback && callback.apply(null, params) || true;\n\t }\n\t};\n\t\n\tvar acequire = function(module, callback) {\n\t var packagedModule = _acequire(\"\", module, callback);\n\t if (packagedModule == undefined && acequire.original)\n\t return acequire.original.apply(this, arguments);\n\t return packagedModule;\n\t};\n\t\n\tvar normalizeModule = function(parentId, moduleName) {\n\t // normalize plugin acequires\n\t if (moduleName.indexOf(\"!\") !== -1) {\n\t var chunks = moduleName.split(\"!\");\n\t return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n\t }\n\t // normalize relative acequires\n\t if (moduleName.charAt(0) == \".\") {\n\t var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n\t moduleName = base + \"/\" + moduleName;\n\t\n\t while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n\t var previous = moduleName;\n\t moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n\t }\n\t }\n\t return moduleName;\n\t};\n\t\n\t/**\n\t * Internal function to lookup moduleNames and resolve them by calling the\n\t * definition function if needed.\n\t */\n\tvar lookup = function(parentId, moduleName) {\n\t moduleName = normalizeModule(parentId, moduleName);\n\t\n\t var module = define.modules[moduleName];\n\t if (!module) {\n\t module = define.payloads[moduleName];\n\t if (typeof module === 'function') {\n\t var exports = {};\n\t var mod = {\n\t id: moduleName,\n\t uri: '',\n\t exports: exports,\n\t packaged: true\n\t };\n\t\n\t var req = function(module, callback) {\n\t return _acequire(moduleName, module, callback);\n\t };\n\t\n\t var returnValue = module(req, exports, mod);\n\t exports = returnValue || mod.exports;\n\t define.modules[moduleName] = exports;\n\t delete define.payloads[moduleName];\n\t }\n\t module = define.modules[moduleName] = exports || module;\n\t }\n\t return module;\n\t};\n\t\n\tfunction exportAce(ns) {\n\t var root = global;\n\t if (ns) {\n\t if (!global[ns])\n\t global[ns] = {};\n\t root = global[ns];\n\t }\n\t\n\t if (!root.define || !root.define.packaged) {\n\t define.original = root.define;\n\t root.define = define;\n\t root.define.packaged = true;\n\t }\n\t\n\t if (!root.acequire || !root.acequire.packaged) {\n\t acequire.original = root.acequire;\n\t root.acequire = acequire;\n\t root.acequire.packaged = true;\n\t }\n\t}\n\t\n\texportAce(ACE_NAMESPACE);\n\t\n\t})();\n\t\n\tace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\t var real = {\n\t exec: RegExp.prototype.exec,\n\t test: RegExp.prototype.test,\n\t match: String.prototype.match,\n\t replace: String.prototype.replace,\n\t split: String.prototype.split\n\t },\n\t compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n\t compliantLastIndexIncrement = function () {\n\t var x = /^/g;\n\t real.test.call(x, \"\");\n\t return !x.lastIndex;\n\t }();\n\t\n\t if (compliantLastIndexIncrement && compliantExecNpcg)\n\t return;\n\t RegExp.prototype.exec = function (str) {\n\t var match = real.exec.apply(this, arguments),\n\t name, r2;\n\t if ( typeof(str) == 'string' && match) {\n\t if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n\t r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n\t real.replace.call(str.slice(match.index), r2, function () {\n\t for (var i = 1; i < arguments.length - 2; i++) {\n\t if (arguments[i] === undefined)\n\t match[i] = undefined;\n\t }\n\t });\n\t }\n\t if (this._xregexp && this._xregexp.captureNames) {\n\t for (var i = 1; i < match.length; i++) {\n\t name = this._xregexp.captureNames[i - 1];\n\t if (name)\n\t match[name] = match[i];\n\t }\n\t }\n\t if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n\t this.lastIndex--;\n\t }\n\t return match;\n\t };\n\t if (!compliantLastIndexIncrement) {\n\t RegExp.prototype.test = function (str) {\n\t var match = real.exec.call(this, str);\n\t if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n\t this.lastIndex--;\n\t return !!match;\n\t };\n\t }\n\t\n\t function getNativeFlags (regex) {\n\t return (regex.global ? \"g\" : \"\") +\n\t (regex.ignoreCase ? \"i\" : \"\") +\n\t (regex.multiline ? \"m\" : \"\") +\n\t (regex.extended ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n\t (regex.sticky ? \"y\" : \"\");\n\t }\n\t\n\t function indexOf (array, item, from) {\n\t if (Array.prototype.indexOf) // Use the native array method if available\n\t return array.indexOf(item, from);\n\t for (var i = from || 0; i < array.length; i++) {\n\t if (array[i] === item)\n\t return i;\n\t }\n\t return -1;\n\t }\n\t\n\t});\n\t\n\tace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\n\tfunction Empty() {}\n\t\n\tif (!Function.prototype.bind) {\n\t Function.prototype.bind = function bind(that) { // .length is 1\n\t var target = this;\n\t if (typeof target != \"function\") {\n\t throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n\t }\n\t var args = slice.call(arguments, 1); // for normal call\n\t var bound = function () {\n\t\n\t if (this instanceof bound) {\n\t\n\t var result = target.apply(\n\t this,\n\t args.concat(slice.call(arguments))\n\t );\n\t if (Object(result) === result) {\n\t return result;\n\t }\n\t return this;\n\t\n\t } else {\n\t return target.apply(\n\t that,\n\t args.concat(slice.call(arguments))\n\t );\n\t\n\t }\n\t\n\t };\n\t if(target.prototype) {\n\t Empty.prototype = target.prototype;\n\t bound.prototype = new Empty();\n\t Empty.prototype = null;\n\t }\n\t return bound;\n\t };\n\t}\n\tvar call = Function.prototype.call;\n\tvar prototypeOfArray = Array.prototype;\n\tvar prototypeOfObject = Object.prototype;\n\tvar slice = prototypeOfArray.slice;\n\tvar _toString = call.bind(prototypeOfObject.toString);\n\tvar owns = call.bind(prototypeOfObject.hasOwnProperty);\n\tvar defineGetter;\n\tvar defineSetter;\n\tvar lookupGetter;\n\tvar lookupSetter;\n\tvar supportsAccessors;\n\tif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n\t defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n\t defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n\t lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n\t lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n\t}\n\tif ([1,2].splice(0).length != 2) {\n\t if(function() { // test IE < 9 to splice bug - see issue #138\n\t function makeArray(l) {\n\t var a = new Array(l+2);\n\t a[0] = a[1] = 0;\n\t return a;\n\t }\n\t var array = [], lengthBefore;\n\t \n\t array.splice.apply(array, makeArray(20));\n\t array.splice.apply(array, makeArray(26));\n\t\n\t lengthBefore = array.length; //46\n\t array.splice(5, 0, \"XXX\"); // add one element\n\t\n\t lengthBefore + 1 == array.length\n\t\n\t if (lengthBefore + 1 == array.length) {\n\t return true;// has right splice implementation without bugs\n\t }\n\t }()) {//IE 6/7\n\t var array_splice = Array.prototype.splice;\n\t Array.prototype.splice = function(start, deleteCount) {\n\t if (!arguments.length) {\n\t return [];\n\t } else {\n\t return array_splice.apply(this, [\n\t start === void 0 ? 0 : start,\n\t deleteCount === void 0 ? (this.length - start) : deleteCount\n\t ].concat(slice.call(arguments, 2)))\n\t }\n\t };\n\t } else {//IE8\n\t Array.prototype.splice = function(pos, removeCount){\n\t var length = this.length;\n\t if (pos > 0) {\n\t if (pos > length)\n\t pos = length;\n\t } else if (pos == void 0) {\n\t pos = 0;\n\t } else if (pos < 0) {\n\t pos = Math.max(length + pos, 0);\n\t }\n\t\n\t if (!(pos+removeCount < length))\n\t removeCount = length - pos;\n\t\n\t var removed = this.slice(pos, pos+removeCount);\n\t var insert = slice.call(arguments, 2);\n\t var add = insert.length; \n\t if (pos === length) {\n\t if (add) {\n\t this.push.apply(this, insert);\n\t }\n\t } else {\n\t var remove = Math.min(removeCount, length - pos);\n\t var tailOldPos = pos + remove;\n\t var tailNewPos = tailOldPos + add - remove;\n\t var tailCount = length - tailOldPos;\n\t var lengthAfterRemove = length - remove;\n\t\n\t if (tailNewPos < tailOldPos) { // case A\n\t for (var i = 0; i < tailCount; ++i) {\n\t this[tailNewPos+i] = this[tailOldPos+i];\n\t }\n\t } else if (tailNewPos > tailOldPos) { // case B\n\t for (i = tailCount; i--; ) {\n\t this[tailNewPos+i] = this[tailOldPos+i];\n\t }\n\t } // else, add == remove (nothing to do)\n\t\n\t if (add && pos === lengthAfterRemove) {\n\t this.length = lengthAfterRemove; // truncate array\n\t this.push.apply(this, insert);\n\t } else {\n\t this.length = lengthAfterRemove + add; // reserves space\n\t for (i = 0; i < add; ++i) {\n\t this[pos+i] = insert[i];\n\t }\n\t }\n\t }\n\t return removed;\n\t };\n\t }\n\t}\n\tif (!Array.isArray) {\n\t Array.isArray = function isArray(obj) {\n\t return _toString(obj) == \"[object Array]\";\n\t };\n\t}\n\tvar boxedString = Object(\"a\"),\n\t splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\t\n\tif (!Array.prototype.forEach) {\n\t Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t thisp = arguments[1],\n\t i = -1,\n\t length = self.length >>> 0;\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(); // TODO message\n\t }\n\t\n\t while (++i < length) {\n\t if (i in self) {\n\t fun.call(thisp, self[i], i, object);\n\t }\n\t }\n\t };\n\t}\n\tif (!Array.prototype.map) {\n\t Array.prototype.map = function map(fun /*, thisp*/) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t length = self.length >>> 0,\n\t result = Array(length),\n\t thisp = arguments[1];\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(fun + \" is not a function\");\n\t }\n\t\n\t for (var i = 0; i < length; i++) {\n\t if (i in self)\n\t result[i] = fun.call(thisp, self[i], i, object);\n\t }\n\t return result;\n\t };\n\t}\n\tif (!Array.prototype.filter) {\n\t Array.prototype.filter = function filter(fun /*, thisp */) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t length = self.length >>> 0,\n\t result = [],\n\t value,\n\t thisp = arguments[1];\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(fun + \" is not a function\");\n\t }\n\t\n\t for (var i = 0; i < length; i++) {\n\t if (i in self) {\n\t value = self[i];\n\t if (fun.call(thisp, value, i, object)) {\n\t result.push(value);\n\t }\n\t }\n\t }\n\t return result;\n\t };\n\t}\n\tif (!Array.prototype.every) {\n\t Array.prototype.every = function every(fun /*, thisp */) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t length = self.length >>> 0,\n\t thisp = arguments[1];\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(fun + \" is not a function\");\n\t }\n\t\n\t for (var i = 0; i < length; i++) {\n\t if (i in self && !fun.call(thisp, self[i], i, object)) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t };\n\t}\n\tif (!Array.prototype.some) {\n\t Array.prototype.some = function some(fun /*, thisp */) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t length = self.length >>> 0,\n\t thisp = arguments[1];\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(fun + \" is not a function\");\n\t }\n\t\n\t for (var i = 0; i < length; i++) {\n\t if (i in self && fun.call(thisp, self[i], i, object)) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\t}\n\tif (!Array.prototype.reduce) {\n\t Array.prototype.reduce = function reduce(fun /*, initial*/) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t length = self.length >>> 0;\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(fun + \" is not a function\");\n\t }\n\t if (!length && arguments.length == 1) {\n\t throw new TypeError(\"reduce of empty array with no initial value\");\n\t }\n\t\n\t var i = 0;\n\t var result;\n\t if (arguments.length >= 2) {\n\t result = arguments[1];\n\t } else {\n\t do {\n\t if (i in self) {\n\t result = self[i++];\n\t break;\n\t }\n\t if (++i >= length) {\n\t throw new TypeError(\"reduce of empty array with no initial value\");\n\t }\n\t } while (true);\n\t }\n\t\n\t for (; i < length; i++) {\n\t if (i in self) {\n\t result = fun.call(void 0, result, self[i], i, object);\n\t }\n\t }\n\t\n\t return result;\n\t };\n\t}\n\tif (!Array.prototype.reduceRight) {\n\t Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n\t var object = toObject(this),\n\t self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t object,\n\t length = self.length >>> 0;\n\t if (_toString(fun) != \"[object Function]\") {\n\t throw new TypeError(fun + \" is not a function\");\n\t }\n\t if (!length && arguments.length == 1) {\n\t throw new TypeError(\"reduceRight of empty array with no initial value\");\n\t }\n\t\n\t var result, i = length - 1;\n\t if (arguments.length >= 2) {\n\t result = arguments[1];\n\t } else {\n\t do {\n\t if (i in self) {\n\t result = self[i--];\n\t break;\n\t }\n\t if (--i < 0) {\n\t throw new TypeError(\"reduceRight of empty array with no initial value\");\n\t }\n\t } while (true);\n\t }\n\t\n\t do {\n\t if (i in this) {\n\t result = fun.call(void 0, result, self[i], i, object);\n\t }\n\t } while (i--);\n\t\n\t return result;\n\t };\n\t}\n\tif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n\t Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n\t var self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t toObject(this),\n\t length = self.length >>> 0;\n\t\n\t if (!length) {\n\t return -1;\n\t }\n\t\n\t var i = 0;\n\t if (arguments.length > 1) {\n\t i = toInteger(arguments[1]);\n\t }\n\t i = i >= 0 ? i : Math.max(0, length + i);\n\t for (; i < length; i++) {\n\t if (i in self && self[i] === sought) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t };\n\t}\n\tif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n\t Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n\t var self = splitString && _toString(this) == \"[object String]\" ?\n\t this.split(\"\") :\n\t toObject(this),\n\t length = self.length >>> 0;\n\t\n\t if (!length) {\n\t return -1;\n\t }\n\t var i = length - 1;\n\t if (arguments.length > 1) {\n\t i = Math.min(i, toInteger(arguments[1]));\n\t }\n\t i = i >= 0 ? i : length - Math.abs(i);\n\t for (; i >= 0; i--) {\n\t if (i in self && sought === self[i]) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t };\n\t}\n\tif (!Object.getPrototypeOf) {\n\t Object.getPrototypeOf = function getPrototypeOf(object) {\n\t return object.__proto__ || (\n\t object.constructor ?\n\t object.constructor.prototype :\n\t prototypeOfObject\n\t );\n\t };\n\t}\n\tif (!Object.getOwnPropertyDescriptor) {\n\t var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n\t \"non-object: \";\n\t Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n\t if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n\t throw new TypeError(ERR_NON_OBJECT + object);\n\t if (!owns(object, property))\n\t return;\n\t\n\t var descriptor, getter, setter;\n\t descriptor = { enumerable: true, configurable: true };\n\t if (supportsAccessors) {\n\t var prototype = object.__proto__;\n\t object.__proto__ = prototypeOfObject;\n\t\n\t var getter = lookupGetter(object, property);\n\t var setter = lookupSetter(object, property);\n\t object.__proto__ = prototype;\n\t\n\t if (getter || setter) {\n\t if (getter) descriptor.get = getter;\n\t if (setter) descriptor.set = setter;\n\t return descriptor;\n\t }\n\t }\n\t descriptor.value = object[property];\n\t return descriptor;\n\t };\n\t}\n\tif (!Object.getOwnPropertyNames) {\n\t Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n\t return Object.keys(object);\n\t };\n\t}\n\tif (!Object.create) {\n\t var createEmpty;\n\t if (Object.prototype.__proto__ === null) {\n\t createEmpty = function () {\n\t return { \"__proto__\": null };\n\t };\n\t } else {\n\t createEmpty = function () {\n\t var empty = {};\n\t for (var i in empty)\n\t empty[i] = null;\n\t empty.constructor =\n\t empty.hasOwnProperty =\n\t empty.propertyIsEnumerable =\n\t empty.isPrototypeOf =\n\t empty.toLocaleString =\n\t empty.toString =\n\t empty.valueOf =\n\t empty.__proto__ = null;\n\t return empty;\n\t }\n\t }\n\t\n\t Object.create = function create(prototype, properties) {\n\t var object;\n\t if (prototype === null) {\n\t object = createEmpty();\n\t } else {\n\t if (typeof prototype != \"object\")\n\t throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n\t var Type = function () {};\n\t Type.prototype = prototype;\n\t object = new Type();\n\t object.__proto__ = prototype;\n\t }\n\t if (properties !== void 0)\n\t Object.defineProperties(object, properties);\n\t return object;\n\t };\n\t}\n\t\n\tfunction doesDefinePropertyWork(object) {\n\t try {\n\t Object.defineProperty(object, \"sentinel\", {});\n\t return \"sentinel\" in object;\n\t } catch (exception) {\n\t }\n\t}\n\tif (Object.defineProperty) {\n\t var definePropertyWorksOnObject = doesDefinePropertyWork({});\n\t var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n\t doesDefinePropertyWork(document.createElement(\"div\"));\n\t if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n\t var definePropertyFallback = Object.defineProperty;\n\t }\n\t}\n\t\n\tif (!Object.defineProperty || definePropertyFallback) {\n\t var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n\t var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n\t var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n\t \"on this javascript engine\";\n\t\n\t Object.defineProperty = function defineProperty(object, property, descriptor) {\n\t if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n\t throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n\t if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n\t throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n\t if (definePropertyFallback) {\n\t try {\n\t return definePropertyFallback.call(Object, object, property, descriptor);\n\t } catch (exception) {\n\t }\n\t }\n\t if (owns(descriptor, \"value\")) {\n\t\n\t if (supportsAccessors && (lookupGetter(object, property) ||\n\t lookupSetter(object, property)))\n\t {\n\t var prototype = object.__proto__;\n\t object.__proto__ = prototypeOfObject;\n\t delete object[property];\n\t object[property] = descriptor.value;\n\t object.__proto__ = prototype;\n\t } else {\n\t object[property] = descriptor.value;\n\t }\n\t } else {\n\t if (!supportsAccessors)\n\t throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n\t if (owns(descriptor, \"get\"))\n\t defineGetter(object, property, descriptor.get);\n\t if (owns(descriptor, \"set\"))\n\t defineSetter(object, property, descriptor.set);\n\t }\n\t\n\t return object;\n\t };\n\t}\n\tif (!Object.defineProperties) {\n\t Object.defineProperties = function defineProperties(object, properties) {\n\t for (var property in properties) {\n\t if (owns(properties, property))\n\t Object.defineProperty(object, property, properties[property]);\n\t }\n\t return object;\n\t };\n\t}\n\tif (!Object.seal) {\n\t Object.seal = function seal(object) {\n\t return object;\n\t };\n\t}\n\tif (!Object.freeze) {\n\t Object.freeze = function freeze(object) {\n\t return object;\n\t };\n\t}\n\ttry {\n\t Object.freeze(function () {});\n\t} catch (exception) {\n\t Object.freeze = (function freeze(freezeObject) {\n\t return function freeze(object) {\n\t if (typeof object == \"function\") {\n\t return object;\n\t } else {\n\t return freezeObject(object);\n\t }\n\t };\n\t })(Object.freeze);\n\t}\n\tif (!Object.preventExtensions) {\n\t Object.preventExtensions = function preventExtensions(object) {\n\t return object;\n\t };\n\t}\n\tif (!Object.isSealed) {\n\t Object.isSealed = function isSealed(object) {\n\t return false;\n\t };\n\t}\n\tif (!Object.isFrozen) {\n\t Object.isFrozen = function isFrozen(object) {\n\t return false;\n\t };\n\t}\n\tif (!Object.isExtensible) {\n\t Object.isExtensible = function isExtensible(object) {\n\t if (Object(object) === object) {\n\t throw new TypeError(); // TODO message\n\t }\n\t var name = '';\n\t while (owns(object, name)) {\n\t name += '?';\n\t }\n\t object[name] = true;\n\t var returnValue = owns(object, name);\n\t delete object[name];\n\t return returnValue;\n\t };\n\t}\n\tif (!Object.keys) {\n\t var hasDontEnumBug = true,\n\t dontEnums = [\n\t \"toString\",\n\t \"toLocaleString\",\n\t \"valueOf\",\n\t \"hasOwnProperty\",\n\t \"isPrototypeOf\",\n\t \"propertyIsEnumerable\",\n\t \"constructor\"\n\t ],\n\t dontEnumsLength = dontEnums.length;\n\t\n\t for (var key in {\"toString\": null}) {\n\t hasDontEnumBug = false;\n\t }\n\t\n\t Object.keys = function keys(object) {\n\t\n\t if (\n\t (typeof object != \"object\" && typeof object != \"function\") ||\n\t object === null\n\t ) {\n\t throw new TypeError(\"Object.keys called on a non-object\");\n\t }\n\t\n\t var keys = [];\n\t for (var name in object) {\n\t if (owns(object, name)) {\n\t keys.push(name);\n\t }\n\t }\n\t\n\t if (hasDontEnumBug) {\n\t for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n\t var dontEnum = dontEnums[i];\n\t if (owns(object, dontEnum)) {\n\t keys.push(dontEnum);\n\t }\n\t }\n\t }\n\t return keys;\n\t };\n\t\n\t}\n\tif (!Date.now) {\n\t Date.now = function now() {\n\t return new Date().getTime();\n\t };\n\t}\n\tvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n\t \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n\t \"\\u2029\\uFEFF\";\n\tif (!String.prototype.trim || ws.trim()) {\n\t ws = \"[\" + ws + \"]\";\n\t var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n\t trimEndRegexp = new RegExp(ws + ws + \"*$\");\n\t String.prototype.trim = function trim() {\n\t return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n\t };\n\t}\n\t\n\tfunction toInteger(n) {\n\t n = +n;\n\t if (n !== n) { // isNaN\n\t n = 0;\n\t } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n\t n = (n > 0 || -1) * Math.floor(Math.abs(n));\n\t }\n\t return n;\n\t}\n\t\n\tfunction isPrimitive(input) {\n\t var type = typeof input;\n\t return (\n\t input === null ||\n\t type === \"undefined\" ||\n\t type === \"boolean\" ||\n\t type === \"number\" ||\n\t type === \"string\"\n\t );\n\t}\n\t\n\tfunction toPrimitive(input) {\n\t var val, valueOf, toString;\n\t if (isPrimitive(input)) {\n\t return input;\n\t }\n\t valueOf = input.valueOf;\n\t if (typeof valueOf === \"function\") {\n\t val = valueOf.call(input);\n\t if (isPrimitive(val)) {\n\t return val;\n\t }\n\t }\n\t toString = input.toString;\n\t if (typeof toString === \"function\") {\n\t val = toString.call(input);\n\t if (isPrimitive(val)) {\n\t return val;\n\t }\n\t }\n\t throw new TypeError();\n\t}\n\tvar toObject = function (o) {\n\t if (o == null) { // this matches both null and undefined\n\t throw new TypeError(\"can't convert \"+o+\" to object\");\n\t }\n\t return Object(o);\n\t};\n\t\n\t});\n\t\n\tace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tacequire(\"./regexp\");\n\tacequire(\"./es5-shim\");\n\t\n\t});\n\t\n\tace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\t\n\texports.getDocumentHead = function(doc) {\n\t if (!doc)\n\t doc = document;\n\t return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n\t};\n\t\n\texports.createElement = function(tag, ns) {\n\t return document.createElementNS ?\n\t document.createElementNS(ns || XHTML_NS, tag) :\n\t document.createElement(tag);\n\t};\n\t\n\texports.hasCssClass = function(el, name) {\n\t var classes = (el.className || \"\").split(/\\s+/g);\n\t return classes.indexOf(name) !== -1;\n\t};\n\texports.addCssClass = function(el, name) {\n\t if (!exports.hasCssClass(el, name)) {\n\t el.className += \" \" + name;\n\t }\n\t};\n\texports.removeCssClass = function(el, name) {\n\t var classes = el.className.split(/\\s+/g);\n\t while (true) {\n\t var index = classes.indexOf(name);\n\t if (index == -1) {\n\t break;\n\t }\n\t classes.splice(index, 1);\n\t }\n\t el.className = classes.join(\" \");\n\t};\n\t\n\texports.toggleCssClass = function(el, name) {\n\t var classes = el.className.split(/\\s+/g), add = true;\n\t while (true) {\n\t var index = classes.indexOf(name);\n\t if (index == -1) {\n\t break;\n\t }\n\t add = false;\n\t classes.splice(index, 1);\n\t }\n\t if (add)\n\t classes.push(name);\n\t\n\t el.className = classes.join(\" \");\n\t return add;\n\t};\n\texports.setCssClass = function(node, className, include) {\n\t if (include) {\n\t exports.addCssClass(node, className);\n\t } else {\n\t exports.removeCssClass(node, className);\n\t }\n\t};\n\t\n\texports.hasCssString = function(id, doc) {\n\t var index = 0, sheets;\n\t doc = doc || document;\n\t\n\t if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n\t while (index < sheets.length)\n\t if (sheets[index++].owningElement.id === id) return true;\n\t } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n\t while (index < sheets.length)\n\t if (sheets[index++].id === id) return true;\n\t }\n\t\n\t return false;\n\t};\n\t\n\texports.importCssString = function importCssString(cssText, id, doc) {\n\t doc = doc || document;\n\t if (id && exports.hasCssString(id, doc))\n\t return null;\n\t \n\t var style;\n\t \n\t if (id)\n\t cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n\t \n\t if (doc.createStyleSheet) {\n\t style = doc.createStyleSheet();\n\t style.cssText = cssText;\n\t if (id)\n\t style.owningElement.id = id;\n\t } else {\n\t style = exports.createElement(\"style\");\n\t style.appendChild(doc.createTextNode(cssText));\n\t if (id)\n\t style.id = id;\n\t\n\t exports.getDocumentHead(doc).appendChild(style);\n\t }\n\t};\n\t\n\texports.importCssStylsheet = function(uri, doc) {\n\t if (doc.createStyleSheet) {\n\t doc.createStyleSheet(uri);\n\t } else {\n\t var link = exports.createElement('link');\n\t link.rel = 'stylesheet';\n\t link.href = uri;\n\t\n\t exports.getDocumentHead(doc).appendChild(link);\n\t }\n\t};\n\t\n\texports.getInnerWidth = function(element) {\n\t return (\n\t parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n\t parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n\t element.clientWidth\n\t );\n\t};\n\t\n\texports.getInnerHeight = function(element) {\n\t return (\n\t parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n\t parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n\t element.clientHeight\n\t );\n\t};\n\t\n\texports.scrollbarWidth = function(document) {\n\t var inner = exports.createElement(\"ace_inner\");\n\t inner.style.width = \"100%\";\n\t inner.style.minWidth = \"0px\";\n\t inner.style.height = \"200px\";\n\t inner.style.display = \"block\";\n\t\n\t var outer = exports.createElement(\"ace_outer\");\n\t var style = outer.style;\n\t\n\t style.position = \"absolute\";\n\t style.left = \"-10000px\";\n\t style.overflow = \"hidden\";\n\t style.width = \"200px\";\n\t style.minWidth = \"0px\";\n\t style.height = \"150px\";\n\t style.display = \"block\";\n\t\n\t outer.appendChild(inner);\n\t\n\t var body = document.documentElement;\n\t body.appendChild(outer);\n\t\n\t var noScrollbar = inner.offsetWidth;\n\t\n\t style.overflow = \"scroll\";\n\t var withScrollbar = inner.offsetWidth;\n\t\n\t if (noScrollbar == withScrollbar) {\n\t withScrollbar = outer.clientWidth;\n\t }\n\t\n\t body.removeChild(outer);\n\t\n\t return noScrollbar-withScrollbar;\n\t};\n\t\n\tif (typeof document == \"undefined\") {\n\t exports.importCssString = function() {};\n\t return;\n\t}\n\t\n\tif (window.pageYOffset !== undefined) {\n\t exports.getPageScrollTop = function() {\n\t return window.pageYOffset;\n\t };\n\t\n\t exports.getPageScrollLeft = function() {\n\t return window.pageXOffset;\n\t };\n\t}\n\telse {\n\t exports.getPageScrollTop = function() {\n\t return document.body.scrollTop;\n\t };\n\t\n\t exports.getPageScrollLeft = function() {\n\t return document.body.scrollLeft;\n\t };\n\t}\n\t\n\tif (window.getComputedStyle)\n\t exports.computedStyle = function(element, style) {\n\t if (style)\n\t return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n\t return window.getComputedStyle(element, \"\") || {};\n\t };\n\telse\n\t exports.computedStyle = function(element, style) {\n\t if (style)\n\t return element.currentStyle[style];\n\t return element.currentStyle;\n\t };\n\texports.setInnerHtml = function(el, innerHtml) {\n\t var element = el.cloneNode(false);//document.createElement(\"div\");\n\t element.innerHTML = innerHtml;\n\t el.parentNode.replaceChild(element, el);\n\t return element;\n\t};\n\t\n\tif (\"textContent\" in document.documentElement) {\n\t exports.setInnerText = function(el, innerText) {\n\t el.textContent = innerText;\n\t };\n\t\n\t exports.getInnerText = function(el) {\n\t return el.textContent;\n\t };\n\t}\n\telse {\n\t exports.setInnerText = function(el, innerText) {\n\t el.innerText = innerText;\n\t };\n\t\n\t exports.getInnerText = function(el) {\n\t return el.innerText;\n\t };\n\t}\n\t\n\texports.getParentWindow = function(document) {\n\t return document.defaultView || document.parentWindow;\n\t};\n\t\n\t});\n\t\n\tace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\texports.inherits = function(ctor, superCtor) {\n\t ctor.super_ = superCtor;\n\t ctor.prototype = Object.create(superCtor.prototype, {\n\t constructor: {\n\t value: ctor,\n\t enumerable: false,\n\t writable: true,\n\t configurable: true\n\t }\n\t });\n\t};\n\t\n\texports.mixin = function(obj, mixin) {\n\t for (var key in mixin) {\n\t obj[key] = mixin[key];\n\t }\n\t return obj;\n\t};\n\t\n\texports.implement = function(proto, mixin) {\n\t exports.mixin(proto, mixin);\n\t};\n\t\n\t});\n\t\n\tace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tacequire(\"./fixoldbrowsers\");\n\t\n\tvar oop = acequire(\"./oop\");\n\tvar Keys = (function() {\n\t var ret = {\n\t MODIFIER_KEYS: {\n\t 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n\t },\n\t\n\t KEY_MODS: {\n\t \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n\t \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n\t },\n\t\n\t FUNCTION_KEYS : {\n\t 8 : \"Backspace\",\n\t 9 : \"Tab\",\n\t 13 : \"Return\",\n\t 19 : \"Pause\",\n\t 27 : \"Esc\",\n\t 32 : \"Space\",\n\t 33 : \"PageUp\",\n\t 34 : \"PageDown\",\n\t 35 : \"End\",\n\t 36 : \"Home\",\n\t 37 : \"Left\",\n\t 38 : \"Up\",\n\t 39 : \"Right\",\n\t 40 : \"Down\",\n\t 44 : \"Print\",\n\t 45 : \"Insert\",\n\t 46 : \"Delete\",\n\t 96 : \"Numpad0\",\n\t 97 : \"Numpad1\",\n\t 98 : \"Numpad2\",\n\t 99 : \"Numpad3\",\n\t 100: \"Numpad4\",\n\t 101: \"Numpad5\",\n\t 102: \"Numpad6\",\n\t 103: \"Numpad7\",\n\t 104: \"Numpad8\",\n\t 105: \"Numpad9\",\n\t '-13': \"NumpadEnter\",\n\t 112: \"F1\",\n\t 113: \"F2\",\n\t 114: \"F3\",\n\t 115: \"F4\",\n\t 116: \"F5\",\n\t 117: \"F6\",\n\t 118: \"F7\",\n\t 119: \"F8\",\n\t 120: \"F9\",\n\t 121: \"F10\",\n\t 122: \"F11\",\n\t 123: \"F12\",\n\t 144: \"Numlock\",\n\t 145: \"Scrolllock\"\n\t },\n\t\n\t PRINTABLE_KEYS: {\n\t 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\n\t 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\n\t 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\n\t 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\n\t 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\n\t 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\n\t 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n\t 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n\t }\n\t };\n\t var name, i;\n\t for (i in ret.FUNCTION_KEYS) {\n\t name = ret.FUNCTION_KEYS[i].toLowerCase();\n\t ret[name] = parseInt(i, 10);\n\t }\n\t for (i in ret.PRINTABLE_KEYS) {\n\t name = ret.PRINTABLE_KEYS[i].toLowerCase();\n\t ret[name] = parseInt(i, 10);\n\t }\n\t oop.mixin(ret, ret.MODIFIER_KEYS);\n\t oop.mixin(ret, ret.PRINTABLE_KEYS);\n\t oop.mixin(ret, ret.FUNCTION_KEYS);\n\t ret.enter = ret[\"return\"];\n\t ret.escape = ret.esc;\n\t ret.del = ret[\"delete\"];\n\t ret[173] = '-';\n\t \n\t (function() {\n\t var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n\t for (var i = Math.pow(2, mods.length); i--;) { \n\t ret.KEY_MODS[i] = mods.filter(function(x) {\n\t return i & ret.KEY_MODS[x];\n\t }).join(\"-\") + \"-\";\n\t }\n\t })();\n\t\n\t ret.KEY_MODS[0] = \"\";\n\t ret.KEY_MODS[-1] = \"input-\";\n\t\n\t return ret;\n\t})();\n\toop.mixin(exports, Keys);\n\t\n\texports.keyCodeToString = function(keyCode) {\n\t var keyString = Keys[keyCode];\n\t if (typeof keyString != \"string\")\n\t keyString = String.fromCharCode(keyCode);\n\t return keyString.toLowerCase();\n\t};\n\t\n\t});\n\t\n\tace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\texports.OS = {\n\t LINUX: \"LINUX\",\n\t MAC: \"MAC\",\n\t WINDOWS: \"WINDOWS\"\n\t};\n\texports.getOS = function() {\n\t if (exports.isMac) {\n\t return exports.OS.MAC;\n\t } else if (exports.isLinux) {\n\t return exports.OS.LINUX;\n\t } else {\n\t return exports.OS.WINDOWS;\n\t }\n\t};\n\tif (typeof navigator != \"object\")\n\t return;\n\t\n\tvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\n\tvar ua = navigator.userAgent;\n\texports.isWin = (os == \"win\");\n\texports.isMac = (os == \"mac\");\n\texports.isLinux = (os == \"linux\");\n\texports.isIE = \n\t (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n\t ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n\t : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n\t \n\texports.isOldIE = exports.isIE && exports.isIE < 9;\n\texports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\n\texports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv\\:(\\d+)/)||[])[1], 10) < 4;\n\texports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\n\texports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\t\n\texports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\t\n\texports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\t\n\texports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\t\n\texports.isTouchPad = ua.indexOf(\"TouchPad\") >= 0;\n\t\n\texports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\t\n\t});\n\t\n\tace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar keys = acequire(\"./keys\");\n\tvar useragent = acequire(\"./useragent\");\n\t\n\tvar pressedKeys = null;\n\tvar ts = 0;\n\t\n\texports.addListener = function(elem, type, callback) {\n\t if (elem.addEventListener) {\n\t return elem.addEventListener(type, callback, false);\n\t }\n\t if (elem.attachEvent) {\n\t var wrapper = function() {\n\t callback.call(elem, window.event);\n\t };\n\t callback._wrapper = wrapper;\n\t elem.attachEvent(\"on\" + type, wrapper);\n\t }\n\t};\n\t\n\texports.removeListener = function(elem, type, callback) {\n\t if (elem.removeEventListener) {\n\t return elem.removeEventListener(type, callback, false);\n\t }\n\t if (elem.detachEvent) {\n\t elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n\t }\n\t};\n\texports.stopEvent = function(e) {\n\t exports.stopPropagation(e);\n\t exports.preventDefault(e);\n\t return false;\n\t};\n\t\n\texports.stopPropagation = function(e) {\n\t if (e.stopPropagation)\n\t e.stopPropagation();\n\t else\n\t e.cancelBubble = true;\n\t};\n\t\n\texports.preventDefault = function(e) {\n\t if (e.preventDefault)\n\t e.preventDefault();\n\t else\n\t e.returnValue = false;\n\t};\n\texports.getButton = function(e) {\n\t if (e.type == \"dblclick\")\n\t return 0;\n\t if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n\t return 2;\n\t if (e.preventDefault) {\n\t return e.button;\n\t }\n\t else {\n\t return {1:0, 2:2, 4:1}[e.button];\n\t }\n\t};\n\t\n\texports.capture = function(el, eventHandler, releaseCaptureHandler) {\n\t function onMouseUp(e) {\n\t eventHandler && eventHandler(e);\n\t releaseCaptureHandler && releaseCaptureHandler(e);\n\t\n\t exports.removeListener(document, \"mousemove\", eventHandler, true);\n\t exports.removeListener(document, \"mouseup\", onMouseUp, true);\n\t exports.removeListener(document, \"dragstart\", onMouseUp, true);\n\t }\n\t\n\t exports.addListener(document, \"mousemove\", eventHandler, true);\n\t exports.addListener(document, \"mouseup\", onMouseUp, true);\n\t exports.addListener(document, \"dragstart\", onMouseUp, true);\n\t \n\t return onMouseUp;\n\t};\n\t\n\texports.addTouchMoveListener = function (el, callback) {\n\t if (\"ontouchmove\" in el) {\n\t var startx, starty;\n\t exports.addListener(el, \"touchstart\", function (e) {\n\t var touchObj = e.changedTouches[0];\n\t startx = touchObj.clientX;\n\t starty = touchObj.clientY;\n\t });\n\t exports.addListener(el, \"touchmove\", function (e) {\n\t var factor = 1,\n\t touchObj = e.changedTouches[0];\n\t\n\t e.wheelX = -(touchObj.clientX - startx) / factor;\n\t e.wheelY = -(touchObj.clientY - starty) / factor;\n\t\n\t startx = touchObj.clientX;\n\t starty = touchObj.clientY;\n\t\n\t callback(e);\n\t });\n\t } \n\t};\n\t\n\texports.addMouseWheelListener = function(el, callback) {\n\t if (\"onmousewheel\" in el) {\n\t exports.addListener(el, \"mousewheel\", function(e) {\n\t var factor = 8;\n\t if (e.wheelDeltaX !== undefined) {\n\t e.wheelX = -e.wheelDeltaX / factor;\n\t e.wheelY = -e.wheelDeltaY / factor;\n\t } else {\n\t e.wheelX = 0;\n\t e.wheelY = -e.wheelDelta / factor;\n\t }\n\t callback(e);\n\t });\n\t } else if (\"onwheel\" in el) {\n\t exports.addListener(el, \"wheel\", function(e) {\n\t var factor = 0.35;\n\t switch (e.deltaMode) {\n\t case e.DOM_DELTA_PIXEL:\n\t e.wheelX = e.deltaX * factor || 0;\n\t e.wheelY = e.deltaY * factor || 0;\n\t break;\n\t case e.DOM_DELTA_LINE:\n\t case e.DOM_DELTA_PAGE:\n\t e.wheelX = (e.deltaX || 0) * 5;\n\t e.wheelY = (e.deltaY || 0) * 5;\n\t break;\n\t }\n\t \n\t callback(e);\n\t });\n\t } else {\n\t exports.addListener(el, \"DOMMouseScroll\", function(e) {\n\t if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n\t e.wheelX = (e.detail || 0) * 5;\n\t e.wheelY = 0;\n\t } else {\n\t e.wheelX = 0;\n\t e.wheelY = (e.detail || 0) * 5;\n\t }\n\t callback(e);\n\t });\n\t }\n\t};\n\t\n\texports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\n\t var clicks = 0;\n\t var startX, startY, timer; \n\t var eventNames = {\n\t 2: \"dblclick\",\n\t 3: \"tripleclick\",\n\t 4: \"quadclick\"\n\t };\n\t\n\t function onMousedown(e) {\n\t if (exports.getButton(e) !== 0) {\n\t clicks = 0;\n\t } else if (e.detail > 1) {\n\t clicks++;\n\t if (clicks > 4)\n\t clicks = 1;\n\t } else {\n\t clicks = 1;\n\t }\n\t if (useragent.isIE) {\n\t var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n\t if (!timer || isNewClick)\n\t clicks = 1;\n\t if (timer)\n\t clearTimeout(timer);\n\t timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n\t\n\t if (clicks == 1) {\n\t startX = e.clientX;\n\t startY = e.clientY;\n\t }\n\t }\n\t \n\t e._clicks = clicks;\n\t\n\t eventHandler[callbackName](\"mousedown\", e);\n\t\n\t if (clicks > 4)\n\t clicks = 0;\n\t else if (clicks > 1)\n\t return eventHandler[callbackName](eventNames[clicks], e);\n\t }\n\t function onDblclick(e) {\n\t clicks = 2;\n\t if (timer)\n\t clearTimeout(timer);\n\t timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n\t eventHandler[callbackName](\"mousedown\", e);\n\t eventHandler[callbackName](eventNames[clicks], e);\n\t }\n\t if (!Array.isArray(elements))\n\t elements = [elements];\n\t elements.forEach(function(el) {\n\t exports.addListener(el, \"mousedown\", onMousedown);\n\t if (useragent.isOldIE)\n\t exports.addListener(el, \"dblclick\", onDblclick);\n\t });\n\t};\n\t\n\tvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n\t ? function(e) {\n\t return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n\t }\n\t : function(e) {\n\t return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n\t };\n\t\n\texports.getModifierString = function(e) {\n\t return keys.KEY_MODS[getModifierHash(e)];\n\t};\n\t\n\tfunction normalizeCommandKeys(callback, e, keyCode) {\n\t var hashId = getModifierHash(e);\n\t\n\t if (!useragent.isMac && pressedKeys) {\n\t if (pressedKeys.OSKey)\n\t hashId |= 8;\n\t if (pressedKeys.altGr) {\n\t if ((3 & hashId) != 3)\n\t pressedKeys.altGr = 0;\n\t else\n\t return;\n\t }\n\t if (keyCode === 18 || keyCode === 17) {\n\t var location = \"location\" in e ? e.location : e.keyLocation;\n\t if (keyCode === 17 && location === 1) {\n\t if (pressedKeys[keyCode] == 1)\n\t ts = e.timeStamp;\n\t } else if (keyCode === 18 && hashId === 3 && location === 2) {\n\t var dt = e.timeStamp - ts;\n\t if (dt < 50)\n\t pressedKeys.altGr = true;\n\t }\n\t }\n\t }\n\t \n\t if (keyCode in keys.MODIFIER_KEYS) {\n\t keyCode = -1;\n\t }\n\t if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\n\t keyCode = -1;\n\t }\n\t \n\t if (!hashId && keyCode === 13) {\n\t var location = \"location\" in e ? e.location : e.keyLocation;\n\t if (location === 3) {\n\t callback(e, hashId, -keyCode);\n\t if (e.defaultPrevented)\n\t return;\n\t }\n\t }\n\t \n\t if (useragent.isChromeOS && hashId & 8) {\n\t callback(e, hashId, keyCode);\n\t if (e.defaultPrevented)\n\t return;\n\t else\n\t hashId &= ~8;\n\t }\n\t if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n\t return false;\n\t }\n\t \n\t return callback(e, hashId, keyCode);\n\t}\n\t\n\t\n\texports.addCommandKeyListener = function(el, callback) {\n\t var addListener = exports.addListener;\n\t if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n\t var lastKeyDownKeyCode = null;\n\t addListener(el, \"keydown\", function(e) {\n\t lastKeyDownKeyCode = e.keyCode;\n\t });\n\t addListener(el, \"keypress\", function(e) {\n\t return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n\t });\n\t } else {\n\t var lastDefaultPrevented = null;\n\t\n\t addListener(el, \"keydown\", function(e) {\n\t var keyCode = e.keyCode;\n\t pressedKeys[keyCode] = (pressedKeys[keyCode] || 0) + 1;\n\t if (keyCode == 91 || keyCode == 92) {\n\t pressedKeys.OSKey = true;\n\t } else if (pressedKeys.OSKey) {\n\t if (e.timeStamp - pressedKeys.lastT > 200 && pressedKeys.count == 1)\n\t resetPressedKeys();\n\t }\n\t if (pressedKeys[keyCode] == 1)\n\t pressedKeys.count++;\n\t pressedKeys.lastT = e.timeStamp;\n\t var result = normalizeCommandKeys(callback, e, keyCode);\n\t lastDefaultPrevented = e.defaultPrevented;\n\t return result;\n\t });\n\t\n\t addListener(el, \"keypress\", function(e) {\n\t if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n\t exports.stopEvent(e);\n\t lastDefaultPrevented = null;\n\t }\n\t });\n\t\n\t addListener(el, \"keyup\", function(e) {\n\t var keyCode = e.keyCode;\n\t if (!pressedKeys[keyCode]) {\n\t resetPressedKeys();\n\t } else {\n\t pressedKeys.count = Math.max(pressedKeys.count - 1, 0);\n\t }\n\t if (keyCode == 91 || keyCode == 92) {\n\t pressedKeys.OSKey = false;\n\t }\n\t pressedKeys[keyCode] = null;\n\t });\n\t\n\t if (!pressedKeys) {\n\t resetPressedKeys();\n\t addListener(window, \"focus\", resetPressedKeys);\n\t }\n\t }\n\t};\n\tfunction resetPressedKeys() {\n\t pressedKeys = Object.create(null);\n\t pressedKeys.count = 0;\n\t pressedKeys.lastT = 0;\n\t}\n\t\n\tif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n\t var postMessageId = 1;\n\t exports.nextTick = function(callback, win) {\n\t win = win || window;\n\t var messageName = \"zero-timeout-message-\" + postMessageId;\n\t exports.addListener(win, \"message\", function listener(e) {\n\t if (e.data == messageName) {\n\t exports.stopPropagation(e);\n\t exports.removeListener(win, \"message\", listener);\n\t callback();\n\t }\n\t });\n\t win.postMessage(messageName, \"*\");\n\t };\n\t}\n\t\n\t\n\texports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n\t || window.mozRequestAnimationFrame\n\t || window.webkitRequestAnimationFrame\n\t || window.msRequestAnimationFrame\n\t || window.oRequestAnimationFrame);\n\t\n\tif (exports.nextFrame)\n\t exports.nextFrame = exports.nextFrame.bind(window);\n\telse\n\t exports.nextFrame = function(callback) {\n\t setTimeout(callback, 17);\n\t };\n\t});\n\t\n\tace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\texports.last = function(a) {\n\t return a[a.length - 1];\n\t};\n\t\n\texports.stringReverse = function(string) {\n\t return string.split(\"\").reverse().join(\"\");\n\t};\n\t\n\texports.stringRepeat = function (string, count) {\n\t var result = '';\n\t while (count > 0) {\n\t if (count & 1)\n\t result += string;\n\t\n\t if (count >>= 1)\n\t string += string;\n\t }\n\t return result;\n\t};\n\t\n\tvar trimBeginRegexp = /^\\s\\s*/;\n\tvar trimEndRegexp = /\\s\\s*$/;\n\t\n\texports.stringTrimLeft = function (string) {\n\t return string.replace(trimBeginRegexp, '');\n\t};\n\t\n\texports.stringTrimRight = function (string) {\n\t return string.replace(trimEndRegexp, '');\n\t};\n\t\n\texports.copyObject = function(obj) {\n\t var copy = {};\n\t for (var key in obj) {\n\t copy[key] = obj[key];\n\t }\n\t return copy;\n\t};\n\t\n\texports.copyArray = function(array){\n\t var copy = [];\n\t for (var i=0, l=array.length; i 1);\n\t return ev.preventDefault();\n\t };\n\t\n\t this.startSelect = function(pos, waitForClickSelection) {\n\t pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n\t var editor = this.editor;\n\t editor.$blockScrolling++;\n\t if (this.mousedownEvent.getShiftKey())\n\t editor.selection.selectToPosition(pos);\n\t else if (!waitForClickSelection)\n\t editor.selection.moveToPosition(pos);\n\t if (!waitForClickSelection)\n\t this.select();\n\t if (editor.renderer.scroller.setCapture) {\n\t editor.renderer.scroller.setCapture();\n\t }\n\t editor.setStyle(\"ace_selecting\");\n\t this.setState(\"select\");\n\t editor.$blockScrolling--;\n\t };\n\t\n\t this.select = function() {\n\t var anchor, editor = this.editor;\n\t var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n\t editor.$blockScrolling++;\n\t if (this.$clickSelection) {\n\t var cmp = this.$clickSelection.comparePoint(cursor);\n\t\n\t if (cmp == -1) {\n\t anchor = this.$clickSelection.end;\n\t } else if (cmp == 1) {\n\t anchor = this.$clickSelection.start;\n\t } else {\n\t var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n\t cursor = orientedRange.cursor;\n\t anchor = orientedRange.anchor;\n\t }\n\t editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n\t }\n\t editor.selection.selectToPosition(cursor);\n\t editor.$blockScrolling--;\n\t editor.renderer.scrollCursorIntoView();\n\t };\n\t\n\t this.extendSelectionBy = function(unitName) {\n\t var anchor, editor = this.editor;\n\t var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n\t var range = editor.selection[unitName](cursor.row, cursor.column);\n\t editor.$blockScrolling++;\n\t if (this.$clickSelection) {\n\t var cmpStart = this.$clickSelection.comparePoint(range.start);\n\t var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\t\n\t if (cmpStart == -1 && cmpEnd <= 0) {\n\t anchor = this.$clickSelection.end;\n\t if (range.end.row != cursor.row || range.end.column != cursor.column)\n\t cursor = range.start;\n\t } else if (cmpEnd == 1 && cmpStart >= 0) {\n\t anchor = this.$clickSelection.start;\n\t if (range.start.row != cursor.row || range.start.column != cursor.column)\n\t cursor = range.end;\n\t } else if (cmpStart == -1 && cmpEnd == 1) {\n\t cursor = range.end;\n\t anchor = range.start;\n\t } else {\n\t var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n\t cursor = orientedRange.cursor;\n\t anchor = orientedRange.anchor;\n\t }\n\t editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n\t }\n\t editor.selection.selectToPosition(cursor);\n\t editor.$blockScrolling--;\n\t editor.renderer.scrollCursorIntoView();\n\t };\n\t\n\t this.selectEnd =\n\t this.selectAllEnd =\n\t this.selectByWordsEnd =\n\t this.selectByLinesEnd = function() {\n\t this.$clickSelection = null;\n\t this.editor.unsetStyle(\"ace_selecting\");\n\t if (this.editor.renderer.scroller.releaseCapture) {\n\t this.editor.renderer.scroller.releaseCapture();\n\t }\n\t };\n\t\n\t this.focusWait = function() {\n\t var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n\t var time = Date.now();\n\t\n\t if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n\t this.startSelect(this.mousedownEvent.getDocumentPosition());\n\t };\n\t\n\t this.onDoubleClick = function(ev) {\n\t var pos = ev.getDocumentPosition();\n\t var editor = this.editor;\n\t var session = editor.session;\n\t\n\t var range = session.getBracketRange(pos);\n\t if (range) {\n\t if (range.isEmpty()) {\n\t range.start.column--;\n\t range.end.column++;\n\t }\n\t this.setState(\"select\");\n\t } else {\n\t range = editor.selection.getWordRange(pos.row, pos.column);\n\t this.setState(\"selectByWords\");\n\t }\n\t this.$clickSelection = range;\n\t this.select();\n\t };\n\t\n\t this.onTripleClick = function(ev) {\n\t var pos = ev.getDocumentPosition();\n\t var editor = this.editor;\n\t\n\t this.setState(\"selectByLines\");\n\t var range = editor.getSelectionRange();\n\t if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n\t this.$clickSelection = editor.selection.getLineRange(range.start.row);\n\t this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n\t } else {\n\t this.$clickSelection = editor.selection.getLineRange(pos.row);\n\t }\n\t this.select();\n\t };\n\t\n\t this.onQuadClick = function(ev) {\n\t var editor = this.editor;\n\t\n\t editor.selectAll();\n\t this.$clickSelection = editor.getSelectionRange();\n\t this.setState(\"selectAll\");\n\t };\n\t\n\t this.onMouseWheel = function(ev) {\n\t if (ev.getAccelKey())\n\t return;\n\t if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n\t ev.wheelX = ev.wheelY;\n\t ev.wheelY = 0;\n\t }\n\t\n\t var t = ev.domEvent.timeStamp;\n\t var dt = t - (this.$lastScrollTime||0);\n\t \n\t var editor = this.editor;\n\t var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n\t if (isScrolable || dt < 200) {\n\t this.$lastScrollTime = t;\n\t editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n\t return ev.stop();\n\t }\n\t };\n\t \n\t this.onTouchMove = function (ev) {\n\t var t = ev.domEvent.timeStamp;\n\t var dt = t - (this.$lastScrollTime || 0);\n\t\n\t var editor = this.editor;\n\t var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n\t if (isScrolable || dt < 200) {\n\t this.$lastScrollTime = t;\n\t editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n\t return ev.stop();\n\t }\n\t };\n\t\n\t}).call(DefaultHandlers.prototype);\n\t\n\texports.DefaultHandlers = DefaultHandlers;\n\t\n\tfunction calcDistance(ax, ay, bx, by) {\n\t return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n\t}\n\t\n\tfunction calcRangeOrientation(range, cursor) {\n\t if (range.start.row == range.end.row)\n\t var cmp = 2 * cursor.column - range.start.column - range.end.column;\n\t else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n\t var cmp = cursor.column - 4;\n\t else\n\t var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\t\n\t if (cmp < 0)\n\t return {cursor: range.start, anchor: range.end};\n\t else\n\t return {cursor: range.end, anchor: range.start};\n\t}\n\t\n\t});\n\t\n\tace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar dom = acequire(\"./lib/dom\");\n\tfunction Tooltip (parentNode) {\n\t this.isOpen = false;\n\t this.$element = null;\n\t this.$parentNode = parentNode;\n\t}\n\t\n\t(function() {\n\t this.$init = function() {\n\t this.$element = dom.createElement(\"div\");\n\t this.$element.className = \"ace_tooltip\";\n\t this.$element.style.display = \"none\";\n\t this.$parentNode.appendChild(this.$element);\n\t return this.$element;\n\t };\n\t this.getElement = function() {\n\t return this.$element || this.$init();\n\t };\n\t this.setText = function(text) {\n\t dom.setInnerText(this.getElement(), text);\n\t };\n\t this.setHtml = function(html) {\n\t this.getElement().innerHTML = html;\n\t };\n\t this.setPosition = function(x, y) {\n\t this.getElement().style.left = x + \"px\";\n\t this.getElement().style.top = y + \"px\";\n\t };\n\t this.setClassName = function(className) {\n\t dom.addCssClass(this.getElement(), className);\n\t };\n\t this.show = function(text, x, y) {\n\t if (text != null)\n\t this.setText(text);\n\t if (x != null && y != null)\n\t this.setPosition(x, y);\n\t if (!this.isOpen) {\n\t this.getElement().style.display = \"block\";\n\t this.isOpen = true;\n\t }\n\t };\n\t\n\t this.hide = function() {\n\t if (this.isOpen) {\n\t this.getElement().style.display = \"none\";\n\t this.isOpen = false;\n\t }\n\t };\n\t this.getHeight = function() {\n\t return this.getElement().offsetHeight;\n\t };\n\t this.getWidth = function() {\n\t return this.getElement().offsetWidth;\n\t };\n\t\n\t}).call(Tooltip.prototype);\n\t\n\texports.Tooltip = Tooltip;\n\t});\n\t\n\tace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(acequire, exports, module) {\n\t\"use strict\";\n\tvar dom = acequire(\"../lib/dom\");\n\tvar oop = acequire(\"../lib/oop\");\n\tvar event = acequire(\"../lib/event\");\n\tvar Tooltip = acequire(\"../tooltip\").Tooltip;\n\t\n\tfunction GutterHandler(mouseHandler) {\n\t var editor = mouseHandler.editor;\n\t var gutter = editor.renderer.$gutterLayer;\n\t var tooltip = new GutterTooltip(editor.container);\n\t\n\t mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n\t if (!editor.isFocused() || e.getButton() != 0)\n\t return;\n\t var gutterRegion = gutter.getRegion(e);\n\t\n\t if (gutterRegion == \"foldWidgets\")\n\t return;\n\t\n\t var row = e.getDocumentPosition().row;\n\t var selection = editor.session.selection;\n\t\n\t if (e.getShiftKey())\n\t selection.selectTo(row, 0);\n\t else {\n\t if (e.domEvent.detail == 2) {\n\t editor.selectAll();\n\t return e.preventDefault();\n\t }\n\t mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n\t }\n\t mouseHandler.setState(\"selectByLines\");\n\t mouseHandler.captureMouse(e);\n\t return e.preventDefault();\n\t });\n\t\n\t\n\t var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\t\n\t function showTooltip() {\n\t var row = mouseEvent.getDocumentPosition().row;\n\t var annotation = gutter.$annotations[row];\n\t if (!annotation)\n\t return hideTooltip();\n\t\n\t var maxRow = editor.session.getLength();\n\t if (row == maxRow) {\n\t var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n\t var pos = mouseEvent.$pos;\n\t if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n\t return hideTooltip();\n\t }\n\t\n\t if (tooltipAnnotation == annotation)\n\t return;\n\t tooltipAnnotation = annotation.text.join(\"
\");\n\t\n\t tooltip.setHtml(tooltipAnnotation);\n\t tooltip.show();\n\t editor.on(\"mousewheel\", hideTooltip);\n\t\n\t if (mouseHandler.$tooltipFollowsMouse) {\n\t moveTooltip(mouseEvent);\n\t } else {\n\t var gutterElement = mouseEvent.domEvent.target;\n\t var rect = gutterElement.getBoundingClientRect();\n\t var style = tooltip.getElement().style;\n\t style.left = rect.right + \"px\";\n\t style.top = rect.bottom + \"px\";\n\t }\n\t }\n\t\n\t function hideTooltip() {\n\t if (tooltipTimeout)\n\t tooltipTimeout = clearTimeout(tooltipTimeout);\n\t if (tooltipAnnotation) {\n\t tooltip.hide();\n\t tooltipAnnotation = null;\n\t editor.removeEventListener(\"mousewheel\", hideTooltip);\n\t }\n\t }\n\t\n\t function moveTooltip(e) {\n\t tooltip.setPosition(e.x, e.y);\n\t }\n\t\n\t mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n\t var target = e.domEvent.target || e.domEvent.srcElement;\n\t if (dom.hasCssClass(target, \"ace_fold-widget\"))\n\t return hideTooltip();\n\t\n\t if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n\t moveTooltip(e);\n\t\n\t mouseEvent = e;\n\t if (tooltipTimeout)\n\t return;\n\t tooltipTimeout = setTimeout(function() {\n\t tooltipTimeout = null;\n\t if (mouseEvent && !mouseHandler.isMousePressed)\n\t showTooltip();\n\t else\n\t hideTooltip();\n\t }, 50);\n\t });\n\t\n\t event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n\t mouseEvent = null;\n\t if (!tooltipAnnotation || tooltipTimeout)\n\t return;\n\t\n\t tooltipTimeout = setTimeout(function() {\n\t tooltipTimeout = null;\n\t hideTooltip();\n\t }, 50);\n\t });\n\t \n\t editor.on(\"changeSession\", hideTooltip);\n\t}\n\t\n\tfunction GutterTooltip(parentNode) {\n\t Tooltip.call(this, parentNode);\n\t}\n\t\n\toop.inherits(GutterTooltip, Tooltip);\n\t\n\t(function(){\n\t this.setPosition = function(x, y) {\n\t var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\t var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n\t var width = this.getWidth();\n\t var height = this.getHeight();\n\t x += 15;\n\t y += 15;\n\t if (x + width > windowWidth) {\n\t x -= (x + width) - windowWidth;\n\t }\n\t if (y + height > windowHeight) {\n\t y -= 20 + height;\n\t }\n\t Tooltip.prototype.setPosition.call(this, x, y);\n\t };\n\t\n\t}).call(GutterTooltip.prototype);\n\t\n\t\n\t\n\texports.GutterHandler = GutterHandler;\n\t\n\t});\n\t\n\tace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar event = acequire(\"../lib/event\");\n\tvar useragent = acequire(\"../lib/useragent\");\n\tvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n\t this.domEvent = domEvent;\n\t this.editor = editor;\n\t \n\t this.x = this.clientX = domEvent.clientX;\n\t this.y = this.clientY = domEvent.clientY;\n\t\n\t this.$pos = null;\n\t this.$inSelection = null;\n\t \n\t this.propagationStopped = false;\n\t this.defaultPrevented = false;\n\t};\n\t\n\t(function() { \n\t \n\t this.stopPropagation = function() {\n\t event.stopPropagation(this.domEvent);\n\t this.propagationStopped = true;\n\t };\n\t \n\t this.preventDefault = function() {\n\t event.preventDefault(this.domEvent);\n\t this.defaultPrevented = true;\n\t };\n\t \n\t this.stop = function() {\n\t this.stopPropagation();\n\t this.preventDefault();\n\t };\n\t this.getDocumentPosition = function() {\n\t if (this.$pos)\n\t return this.$pos;\n\t \n\t this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n\t return this.$pos;\n\t };\n\t this.inSelection = function() {\n\t if (this.$inSelection !== null)\n\t return this.$inSelection;\n\t \n\t var editor = this.editor;\n\t \n\t\n\t var selectionRange = editor.getSelectionRange();\n\t if (selectionRange.isEmpty())\n\t this.$inSelection = false;\n\t else {\n\t var pos = this.getDocumentPosition();\n\t this.$inSelection = selectionRange.contains(pos.row, pos.column);\n\t }\n\t\n\t return this.$inSelection;\n\t };\n\t this.getButton = function() {\n\t return event.getButton(this.domEvent);\n\t };\n\t this.getShiftKey = function() {\n\t return this.domEvent.shiftKey;\n\t };\n\t \n\t this.getAccelKey = useragent.isMac\n\t ? function() { return this.domEvent.metaKey; }\n\t : function() { return this.domEvent.ctrlKey; };\n\t \n\t}).call(MouseEvent.prototype);\n\t\n\t});\n\t\n\tace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar dom = acequire(\"../lib/dom\");\n\tvar event = acequire(\"../lib/event\");\n\tvar useragent = acequire(\"../lib/useragent\");\n\t\n\tvar AUTOSCROLL_DELAY = 200;\n\tvar SCROLL_CURSOR_DELAY = 200;\n\tvar SCROLL_CURSOR_HYSTERESIS = 5;\n\t\n\tfunction DragdropHandler(mouseHandler) {\n\t\n\t var editor = mouseHandler.editor;\n\t\n\t var blankImage = dom.createElement(\"img\");\n\t blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n\t if (useragent.isOpera)\n\t blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\t\n\t var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\t\n\t exports.forEach(function(x) {\n\t mouseHandler[x] = this[x];\n\t }, this);\n\t editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\t\n\t\n\t var mouseTarget = editor.container;\n\t var dragSelectionMarker, x, y;\n\t var timerId, range;\n\t var dragCursor, counter = 0;\n\t var dragOperation;\n\t var isInternal;\n\t var autoScrollStartTime;\n\t var cursorMovedTime;\n\t var cursorPointOnCaretMoved;\n\t\n\t this.onDragStart = function(e) {\n\t if (this.cancelDrag || !mouseTarget.draggable) {\n\t var self = this;\n\t setTimeout(function(){\n\t self.startSelect();\n\t self.captureMouse(e);\n\t }, 0);\n\t return e.preventDefault();\n\t }\n\t range = editor.getSelectionRange();\n\t\n\t var dataTransfer = e.dataTransfer;\n\t dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n\t if (useragent.isOpera) {\n\t editor.container.appendChild(blankImage);\n\t blankImage.scrollTop = 0;\n\t }\n\t dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n\t if (useragent.isOpera) {\n\t editor.container.removeChild(blankImage);\n\t }\n\t dataTransfer.clearData();\n\t dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\t\n\t isInternal = true;\n\t this.setState(\"drag\");\n\t };\n\t\n\t this.onDragEnd = function(e) {\n\t mouseTarget.draggable = false;\n\t isInternal = false;\n\t this.setState(null);\n\t if (!editor.getReadOnly()) {\n\t var dropEffect = e.dataTransfer.dropEffect;\n\t if (!dragOperation && dropEffect == \"move\")\n\t editor.session.remove(editor.getSelectionRange());\n\t editor.renderer.$cursorLayer.setBlinking(true);\n\t }\n\t this.editor.unsetStyle(\"ace_dragging\");\n\t this.editor.renderer.setCursorStyle(\"\");\n\t };\n\t\n\t this.onDragEnter = function(e) {\n\t if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n\t return;\n\t x = e.clientX;\n\t y = e.clientY;\n\t if (!dragSelectionMarker)\n\t addDragMarker();\n\t counter++;\n\t e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n\t return event.preventDefault(e);\n\t };\n\t\n\t this.onDragOver = function(e) {\n\t if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n\t return;\n\t x = e.clientX;\n\t y = e.clientY;\n\t if (!dragSelectionMarker) {\n\t addDragMarker();\n\t counter++;\n\t }\n\t if (onMouseMoveTimer !== null)\n\t onMouseMoveTimer = null;\n\t\n\t e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n\t return event.preventDefault(e);\n\t };\n\t\n\t this.onDragLeave = function(e) {\n\t counter--;\n\t if (counter <= 0 && dragSelectionMarker) {\n\t clearDragMarker();\n\t dragOperation = null;\n\t return event.preventDefault(e);\n\t }\n\t };\n\t\n\t this.onDrop = function(e) {\n\t if (!dragCursor)\n\t return;\n\t var dataTransfer = e.dataTransfer;\n\t if (isInternal) {\n\t switch (dragOperation) {\n\t case \"move\":\n\t if (range.contains(dragCursor.row, dragCursor.column)) {\n\t range = {\n\t start: dragCursor,\n\t end: dragCursor\n\t };\n\t } else {\n\t range = editor.moveText(range, dragCursor);\n\t }\n\t break;\n\t case \"copy\":\n\t range = editor.moveText(range, dragCursor, true);\n\t break;\n\t }\n\t } else {\n\t var dropData = dataTransfer.getData('Text');\n\t range = {\n\t start: dragCursor,\n\t end: editor.session.insert(dragCursor, dropData)\n\t };\n\t editor.focus();\n\t dragOperation = null;\n\t }\n\t clearDragMarker();\n\t return event.preventDefault(e);\n\t };\n\t\n\t event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n\t event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n\t event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n\t event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n\t event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n\t event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\t\n\t function scrollCursorIntoView(cursor, prevCursor) {\n\t var now = Date.now();\n\t var vMovement = !prevCursor || cursor.row != prevCursor.row;\n\t var hMovement = !prevCursor || cursor.column != prevCursor.column;\n\t if (!cursorMovedTime || vMovement || hMovement) {\n\t editor.$blockScrolling += 1;\n\t editor.moveCursorToPosition(cursor);\n\t editor.$blockScrolling -= 1;\n\t cursorMovedTime = now;\n\t cursorPointOnCaretMoved = {x: x, y: y};\n\t } else {\n\t var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n\t if (distance > SCROLL_CURSOR_HYSTERESIS) {\n\t cursorMovedTime = null;\n\t } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n\t editor.renderer.scrollCursorIntoView();\n\t cursorMovedTime = null;\n\t }\n\t }\n\t }\n\t\n\t function autoScroll(cursor, prevCursor) {\n\t var now = Date.now();\n\t var lineHeight = editor.renderer.layerConfig.lineHeight;\n\t var characterWidth = editor.renderer.layerConfig.characterWidth;\n\t var editorRect = editor.renderer.scroller.getBoundingClientRect();\n\t var offsets = {\n\t x: {\n\t left: x - editorRect.left,\n\t right: editorRect.right - x\n\t },\n\t y: {\n\t top: y - editorRect.top,\n\t bottom: editorRect.bottom - y\n\t }\n\t };\n\t var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n\t var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n\t var scrollCursor = {row: cursor.row, column: cursor.column};\n\t if (nearestXOffset / characterWidth <= 2) {\n\t scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n\t }\n\t if (nearestYOffset / lineHeight <= 1) {\n\t scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n\t }\n\t var vScroll = cursor.row != scrollCursor.row;\n\t var hScroll = cursor.column != scrollCursor.column;\n\t var vMovement = !prevCursor || cursor.row != prevCursor.row;\n\t if (vScroll || (hScroll && !vMovement)) {\n\t if (!autoScrollStartTime)\n\t autoScrollStartTime = now;\n\t else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n\t editor.renderer.scrollCursorIntoView(scrollCursor);\n\t } else {\n\t autoScrollStartTime = null;\n\t }\n\t }\n\t\n\t function onDragInterval() {\n\t var prevCursor = dragCursor;\n\t dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n\t scrollCursorIntoView(dragCursor, prevCursor);\n\t autoScroll(dragCursor, prevCursor);\n\t }\n\t\n\t function addDragMarker() {\n\t range = editor.selection.toOrientedRange();\n\t dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n\t editor.clearSelection();\n\t if (editor.isFocused())\n\t editor.renderer.$cursorLayer.setBlinking(false);\n\t clearInterval(timerId);\n\t onDragInterval();\n\t timerId = setInterval(onDragInterval, 20);\n\t counter = 0;\n\t event.addListener(document, \"mousemove\", onMouseMove);\n\t }\n\t\n\t function clearDragMarker() {\n\t clearInterval(timerId);\n\t editor.session.removeMarker(dragSelectionMarker);\n\t dragSelectionMarker = null;\n\t editor.$blockScrolling += 1;\n\t editor.selection.fromOrientedRange(range);\n\t editor.$blockScrolling -= 1;\n\t if (editor.isFocused() && !isInternal)\n\t editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n\t range = null;\n\t dragCursor = null;\n\t counter = 0;\n\t autoScrollStartTime = null;\n\t cursorMovedTime = null;\n\t event.removeListener(document, \"mousemove\", onMouseMove);\n\t }\n\t var onMouseMoveTimer = null;\n\t function onMouseMove() {\n\t if (onMouseMoveTimer == null) {\n\t onMouseMoveTimer = setTimeout(function() {\n\t if (onMouseMoveTimer != null && dragSelectionMarker)\n\t clearDragMarker();\n\t }, 20);\n\t }\n\t }\n\t\n\t function canAccept(dataTransfer) {\n\t var types = dataTransfer.types;\n\t return !types || Array.prototype.some.call(types, function(type) {\n\t return type == 'text/plain' || type == 'Text';\n\t });\n\t }\n\t\n\t function getDropEffect(e) {\n\t var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n\t var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\t\n\t var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n\t var effectAllowed = \"uninitialized\";\n\t try {\n\t effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n\t } catch (e) {}\n\t var dropEffect = \"none\";\n\t\n\t if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n\t dropEffect = \"copy\";\n\t else if (moveAllowed.indexOf(effectAllowed) >= 0)\n\t dropEffect = \"move\";\n\t else if (copyAllowed.indexOf(effectAllowed) >= 0)\n\t dropEffect = \"copy\";\n\t\n\t return dropEffect;\n\t }\n\t}\n\t\n\t(function() {\n\t\n\t this.dragWait = function() {\n\t var interval = Date.now() - this.mousedownEvent.time;\n\t if (interval > this.editor.getDragDelay())\n\t this.startDrag();\n\t };\n\t\n\t this.dragWaitEnd = function() {\n\t var target = this.editor.container;\n\t target.draggable = false;\n\t this.startSelect(this.mousedownEvent.getDocumentPosition());\n\t this.selectEnd();\n\t };\n\t\n\t this.dragReadyEnd = function(e) {\n\t this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n\t this.editor.unsetStyle(\"ace_dragging\");\n\t this.editor.renderer.setCursorStyle(\"\");\n\t this.dragWaitEnd();\n\t };\n\t\n\t this.startDrag = function(){\n\t this.cancelDrag = false;\n\t var editor = this.editor;\n\t var target = editor.container;\n\t target.draggable = true;\n\t editor.renderer.$cursorLayer.setBlinking(false);\n\t editor.setStyle(\"ace_dragging\");\n\t var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n\t editor.renderer.setCursorStyle(cursorStyle);\n\t this.setState(\"dragReady\");\n\t };\n\t\n\t this.onMouseDrag = function(e) {\n\t var target = this.editor.container;\n\t if (useragent.isIE && this.state == \"dragReady\") {\n\t var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n\t if (distance > 3)\n\t target.dragDrop();\n\t }\n\t if (this.state === \"dragWait\") {\n\t var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n\t if (distance > 0) {\n\t target.draggable = false;\n\t this.startSelect(this.mousedownEvent.getDocumentPosition());\n\t }\n\t }\n\t };\n\t\n\t this.onMouseDown = function(e) {\n\t if (!this.$dragEnabled)\n\t return;\n\t this.mousedownEvent = e;\n\t var editor = this.editor;\n\t\n\t var inSelection = e.inSelection();\n\t var button = e.getButton();\n\t var clickCount = e.domEvent.detail || 1;\n\t if (clickCount === 1 && button === 0 && inSelection) {\n\t if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n\t return;\n\t this.mousedownEvent.time = Date.now();\n\t var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n\t if (\"unselectable\" in eventTarget)\n\t eventTarget.unselectable = \"on\";\n\t if (editor.getDragDelay()) {\n\t if (useragent.isWebKit) {\n\t this.cancelDrag = true;\n\t var mouseTarget = editor.container;\n\t mouseTarget.draggable = true;\n\t }\n\t this.setState(\"dragWait\");\n\t } else {\n\t this.startDrag();\n\t }\n\t this.captureMouse(e, this.onMouseDrag.bind(this));\n\t e.defaultPrevented = true;\n\t }\n\t };\n\t\n\t}).call(DragdropHandler.prototype);\n\t\n\t\n\tfunction calcDistance(ax, ay, bx, by) {\n\t return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n\t}\n\t\n\texports.DragdropHandler = DragdropHandler;\n\t\n\t});\n\t\n\tace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\t\"use strict\";\n\tvar dom = acequire(\"./dom\");\n\t\n\texports.get = function (url, callback) {\n\t var xhr = new XMLHttpRequest();\n\t xhr.open('GET', url, true);\n\t xhr.onreadystatechange = function () {\n\t if (xhr.readyState === 4) {\n\t callback(xhr.responseText);\n\t }\n\t };\n\t xhr.send(null);\n\t};\n\t\n\texports.loadScript = function(path, callback) {\n\t var head = dom.getDocumentHead();\n\t var s = document.createElement('script');\n\t\n\t s.src = path;\n\t head.appendChild(s);\n\t\n\t s.onload = s.onreadystatechange = function(_, isAbort) {\n\t if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n\t s = s.onload = s.onreadystatechange = null;\n\t if (!isAbort)\n\t callback();\n\t }\n\t };\n\t};\n\texports.qualifyURL = function(url) {\n\t var a = document.createElement('a');\n\t a.href = url;\n\t return a.href;\n\t}\n\t\n\t});\n\t\n\tace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar EventEmitter = {};\n\tvar stopPropagation = function() { this.propagationStopped = true; };\n\tvar preventDefault = function() { this.defaultPrevented = true; };\n\t\n\tEventEmitter._emit =\n\tEventEmitter._dispatchEvent = function(eventName, e) {\n\t this._eventRegistry || (this._eventRegistry = {});\n\t this._defaultHandlers || (this._defaultHandlers = {});\n\t\n\t var listeners = this._eventRegistry[eventName] || [];\n\t var defaultHandler = this._defaultHandlers[eventName];\n\t if (!listeners.length && !defaultHandler)\n\t return;\n\t\n\t if (typeof e != \"object\" || !e)\n\t e = {};\n\t\n\t if (!e.type)\n\t e.type = eventName;\n\t if (!e.stopPropagation)\n\t e.stopPropagation = stopPropagation;\n\t if (!e.preventDefault)\n\t e.preventDefault = preventDefault;\n\t\n\t listeners = listeners.slice();\n\t for (var i=0; i 1)\n\t base = parts[parts.length - 2];\n\t var path = options[component + \"Path\"];\n\t if (path == null) {\n\t path = options.basePath;\n\t } else if (sep == \"/\") {\n\t component = sep = \"\";\n\t }\n\t if (path && path.slice(-1) != \"/\")\n\t path += \"/\";\n\t return path + component + sep + base + this.get(\"suffix\");\n\t};\n\t\n\texports.setModuleUrl = function(name, subst) {\n\t return options.$moduleUrls[name] = subst;\n\t};\n\t\n\texports.$loading = {};\n\texports.loadModule = function(moduleName, onLoad) {\n\t var module, moduleType;\n\t if (Array.isArray(moduleName)) {\n\t moduleType = moduleName[0];\n\t moduleName = moduleName[1];\n\t }\n\t\n\t try {\n\t module = acequire(moduleName);\n\t } catch (e) {}\n\t if (module && !exports.$loading[moduleName])\n\t return onLoad && onLoad(module);\n\t\n\t if (!exports.$loading[moduleName])\n\t exports.$loading[moduleName] = [];\n\t\n\t exports.$loading[moduleName].push(onLoad);\n\t\n\t if (exports.$loading[moduleName].length > 1)\n\t return;\n\t\n\t var afterLoad = function() {\n\t acequire([moduleName], function(module) {\n\t exports._emit(\"load.module\", {name: moduleName, module: module});\n\t var listeners = exports.$loading[moduleName];\n\t exports.$loading[moduleName] = null;\n\t listeners.forEach(function(onLoad) {\n\t onLoad && onLoad(module);\n\t });\n\t });\n\t };\n\t\n\t if (!exports.get(\"packaged\"))\n\t return afterLoad();\n\t net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n\t};\n\tinit(true);function init(packaged) {\n\t\n\t if (!global || !global.document)\n\t return;\n\t \n\t options.packaged = packaged || acequire.packaged || module.packaged || (global.define && __webpack_require__(78).packaged);\n\t\n\t var scriptOptions = {};\n\t var scriptUrl = \"\";\n\t var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n\t var currentDocument = currentScript && currentScript.ownerDocument || document;\n\t \n\t var scripts = currentDocument.getElementsByTagName(\"script\");\n\t for (var i=0; i [\" + this.end.row + \"/\" + this.end.column + \"]\");\n\t };\n\t\n\t this.contains = function(row, column) {\n\t return this.compare(row, column) == 0;\n\t };\n\t this.compareRange = function(range) {\n\t var cmp,\n\t end = range.end,\n\t start = range.start;\n\t\n\t cmp = this.compare(end.row, end.column);\n\t if (cmp == 1) {\n\t cmp = this.compare(start.row, start.column);\n\t if (cmp == 1) {\n\t return 2;\n\t } else if (cmp == 0) {\n\t return 1;\n\t } else {\n\t return 0;\n\t }\n\t } else if (cmp == -1) {\n\t return -2;\n\t } else {\n\t cmp = this.compare(start.row, start.column);\n\t if (cmp == -1) {\n\t return -1;\n\t } else if (cmp == 1) {\n\t return 42;\n\t } else {\n\t return 0;\n\t }\n\t }\n\t };\n\t this.comparePoint = function(p) {\n\t return this.compare(p.row, p.column);\n\t };\n\t this.containsRange = function(range) {\n\t return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n\t };\n\t this.intersects = function(range) {\n\t var cmp = this.compareRange(range);\n\t return (cmp == -1 || cmp == 0 || cmp == 1);\n\t };\n\t this.isEnd = function(row, column) {\n\t return this.end.row == row && this.end.column == column;\n\t };\n\t this.isStart = function(row, column) {\n\t return this.start.row == row && this.start.column == column;\n\t };\n\t this.setStart = function(row, column) {\n\t if (typeof row == \"object\") {\n\t this.start.column = row.column;\n\t this.start.row = row.row;\n\t } else {\n\t this.start.row = row;\n\t this.start.column = column;\n\t }\n\t };\n\t this.setEnd = function(row, column) {\n\t if (typeof row == \"object\") {\n\t this.end.column = row.column;\n\t this.end.row = row.row;\n\t } else {\n\t this.end.row = row;\n\t this.end.column = column;\n\t }\n\t };\n\t this.inside = function(row, column) {\n\t if (this.compare(row, column) == 0) {\n\t if (this.isEnd(row, column) || this.isStart(row, column)) {\n\t return false;\n\t } else {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\t this.insideStart = function(row, column) {\n\t if (this.compare(row, column) == 0) {\n\t if (this.isEnd(row, column)) {\n\t return false;\n\t } else {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\t this.insideEnd = function(row, column) {\n\t if (this.compare(row, column) == 0) {\n\t if (this.isStart(row, column)) {\n\t return false;\n\t } else {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\t this.compare = function(row, column) {\n\t if (!this.isMultiLine()) {\n\t if (row === this.start.row) {\n\t return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n\t }\n\t }\n\t\n\t if (row < this.start.row)\n\t return -1;\n\t\n\t if (row > this.end.row)\n\t return 1;\n\t\n\t if (this.start.row === row)\n\t return column >= this.start.column ? 0 : -1;\n\t\n\t if (this.end.row === row)\n\t return column <= this.end.column ? 0 : 1;\n\t\n\t return 0;\n\t };\n\t this.compareStart = function(row, column) {\n\t if (this.start.row == row && this.start.column == column) {\n\t return -1;\n\t } else {\n\t return this.compare(row, column);\n\t }\n\t };\n\t this.compareEnd = function(row, column) {\n\t if (this.end.row == row && this.end.column == column) {\n\t return 1;\n\t } else {\n\t return this.compare(row, column);\n\t }\n\t };\n\t this.compareInside = function(row, column) {\n\t if (this.end.row == row && this.end.column == column) {\n\t return 1;\n\t } else if (this.start.row == row && this.start.column == column) {\n\t return -1;\n\t } else {\n\t return this.compare(row, column);\n\t }\n\t };\n\t this.clipRows = function(firstRow, lastRow) {\n\t if (this.end.row > lastRow)\n\t var end = {row: lastRow + 1, column: 0};\n\t else if (this.end.row < firstRow)\n\t var end = {row: firstRow, column: 0};\n\t\n\t if (this.start.row > lastRow)\n\t var start = {row: lastRow + 1, column: 0};\n\t else if (this.start.row < firstRow)\n\t var start = {row: firstRow, column: 0};\n\t\n\t return Range.fromPoints(start || this.start, end || this.end);\n\t };\n\t this.extend = function(row, column) {\n\t var cmp = this.compare(row, column);\n\t\n\t if (cmp == 0)\n\t return this;\n\t else if (cmp == -1)\n\t var start = {row: row, column: column};\n\t else\n\t var end = {row: row, column: column};\n\t\n\t return Range.fromPoints(start || this.start, end || this.end);\n\t };\n\t\n\t this.isEmpty = function() {\n\t return (this.start.row === this.end.row && this.start.column === this.end.column);\n\t };\n\t this.isMultiLine = function() {\n\t return (this.start.row !== this.end.row);\n\t };\n\t this.clone = function() {\n\t return Range.fromPoints(this.start, this.end);\n\t };\n\t this.collapseRows = function() {\n\t if (this.end.column == 0)\n\t return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n\t else\n\t return new Range(this.start.row, 0, this.end.row, 0)\n\t };\n\t this.toScreenRange = function(session) {\n\t var screenPosStart = session.documentToScreenPosition(this.start);\n\t var screenPosEnd = session.documentToScreenPosition(this.end);\n\t\n\t return new Range(\n\t screenPosStart.row, screenPosStart.column,\n\t screenPosEnd.row, screenPosEnd.column\n\t );\n\t };\n\t this.moveBy = function(row, column) {\n\t this.start.row += row;\n\t this.start.column += column;\n\t this.end.row += row;\n\t this.end.column += column;\n\t };\n\t\n\t}).call(Range.prototype);\n\tRange.fromPoints = function(start, end) {\n\t return new Range(start.row, start.column, end.row, end.column);\n\t};\n\tRange.comparePoints = comparePoints;\n\t\n\tRange.comparePoints = function(p1, p2) {\n\t return p1.row - p2.row || p1.column - p2.column;\n\t};\n\t\n\t\n\texports.Range = Range;\n\t});\n\t\n\tace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar lang = acequire(\"./lib/lang\");\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar Range = acequire(\"./range\").Range;\n\tvar Selection = function(session) {\n\t this.session = session;\n\t this.doc = session.getDocument();\n\t\n\t this.clearSelection();\n\t this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n\t this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\t\n\t var self = this;\n\t this.lead.on(\"change\", function(e) {\n\t self._emit(\"changeCursor\");\n\t if (!self.$isEmpty)\n\t self._emit(\"changeSelection\");\n\t if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n\t self.$desiredColumn = null;\n\t });\n\t\n\t this.selectionAnchor.on(\"change\", function() {\n\t if (!self.$isEmpty)\n\t self._emit(\"changeSelection\");\n\t });\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t this.isEmpty = function() {\n\t return (this.$isEmpty || (\n\t this.anchor.row == this.lead.row &&\n\t this.anchor.column == this.lead.column\n\t ));\n\t };\n\t this.isMultiLine = function() {\n\t if (this.isEmpty()) {\n\t return false;\n\t }\n\t\n\t return this.getRange().isMultiLine();\n\t };\n\t this.getCursor = function() {\n\t return this.lead.getPosition();\n\t };\n\t this.setSelectionAnchor = function(row, column) {\n\t this.anchor.setPosition(row, column);\n\t\n\t if (this.$isEmpty) {\n\t this.$isEmpty = false;\n\t this._emit(\"changeSelection\");\n\t }\n\t };\n\t this.getSelectionAnchor = function() {\n\t if (this.$isEmpty)\n\t return this.getSelectionLead();\n\t else\n\t return this.anchor.getPosition();\n\t };\n\t this.getSelectionLead = function() {\n\t return this.lead.getPosition();\n\t };\n\t this.shiftSelection = function(columns) {\n\t if (this.$isEmpty) {\n\t this.moveCursorTo(this.lead.row, this.lead.column + columns);\n\t return;\n\t }\n\t\n\t var anchor = this.getSelectionAnchor();\n\t var lead = this.getSelectionLead();\n\t\n\t var isBackwards = this.isBackwards();\n\t\n\t if (!isBackwards || anchor.column !== 0)\n\t this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\t\n\t if (isBackwards || lead.column !== 0) {\n\t this.$moveSelection(function() {\n\t this.moveCursorTo(lead.row, lead.column + columns);\n\t });\n\t }\n\t };\n\t this.isBackwards = function() {\n\t var anchor = this.anchor;\n\t var lead = this.lead;\n\t return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n\t };\n\t this.getRange = function() {\n\t var anchor = this.anchor;\n\t var lead = this.lead;\n\t\n\t if (this.isEmpty())\n\t return Range.fromPoints(lead, lead);\n\t\n\t if (this.isBackwards()) {\n\t return Range.fromPoints(lead, anchor);\n\t }\n\t else {\n\t return Range.fromPoints(anchor, lead);\n\t }\n\t };\n\t this.clearSelection = function() {\n\t if (!this.$isEmpty) {\n\t this.$isEmpty = true;\n\t this._emit(\"changeSelection\");\n\t }\n\t };\n\t this.selectAll = function() {\n\t var lastRow = this.doc.getLength() - 1;\n\t this.setSelectionAnchor(0, 0);\n\t this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n\t };\n\t this.setRange =\n\t this.setSelectionRange = function(range, reverse) {\n\t if (reverse) {\n\t this.setSelectionAnchor(range.end.row, range.end.column);\n\t this.selectTo(range.start.row, range.start.column);\n\t } else {\n\t this.setSelectionAnchor(range.start.row, range.start.column);\n\t this.selectTo(range.end.row, range.end.column);\n\t }\n\t if (this.getRange().isEmpty())\n\t this.$isEmpty = true;\n\t this.$desiredColumn = null;\n\t };\n\t\n\t this.$moveSelection = function(mover) {\n\t var lead = this.lead;\n\t if (this.$isEmpty)\n\t this.setSelectionAnchor(lead.row, lead.column);\n\t\n\t mover.call(this);\n\t };\n\t this.selectTo = function(row, column) {\n\t this.$moveSelection(function() {\n\t this.moveCursorTo(row, column);\n\t });\n\t };\n\t this.selectToPosition = function(pos) {\n\t this.$moveSelection(function() {\n\t this.moveCursorToPosition(pos);\n\t });\n\t };\n\t this.moveTo = function(row, column) {\n\t this.clearSelection();\n\t this.moveCursorTo(row, column);\n\t };\n\t this.moveToPosition = function(pos) {\n\t this.clearSelection();\n\t this.moveCursorToPosition(pos);\n\t };\n\t this.selectUp = function() {\n\t this.$moveSelection(this.moveCursorUp);\n\t };\n\t this.selectDown = function() {\n\t this.$moveSelection(this.moveCursorDown);\n\t };\n\t this.selectRight = function() {\n\t this.$moveSelection(this.moveCursorRight);\n\t };\n\t this.selectLeft = function() {\n\t this.$moveSelection(this.moveCursorLeft);\n\t };\n\t this.selectLineStart = function() {\n\t this.$moveSelection(this.moveCursorLineStart);\n\t };\n\t this.selectLineEnd = function() {\n\t this.$moveSelection(this.moveCursorLineEnd);\n\t };\n\t this.selectFileEnd = function() {\n\t this.$moveSelection(this.moveCursorFileEnd);\n\t };\n\t this.selectFileStart = function() {\n\t this.$moveSelection(this.moveCursorFileStart);\n\t };\n\t this.selectWordRight = function() {\n\t this.$moveSelection(this.moveCursorWordRight);\n\t };\n\t this.selectWordLeft = function() {\n\t this.$moveSelection(this.moveCursorWordLeft);\n\t };\n\t this.getWordRange = function(row, column) {\n\t if (typeof column == \"undefined\") {\n\t var cursor = row || this.lead;\n\t row = cursor.row;\n\t column = cursor.column;\n\t }\n\t return this.session.getWordRange(row, column);\n\t };\n\t this.selectWord = function() {\n\t this.setSelectionRange(this.getWordRange());\n\t };\n\t this.selectAWord = function() {\n\t var cursor = this.getCursor();\n\t var range = this.session.getAWordRange(cursor.row, cursor.column);\n\t this.setSelectionRange(range);\n\t };\n\t\n\t this.getLineRange = function(row, excludeLastChar) {\n\t var rowStart = typeof row == \"number\" ? row : this.lead.row;\n\t var rowEnd;\n\t\n\t var foldLine = this.session.getFoldLine(rowStart);\n\t if (foldLine) {\n\t rowStart = foldLine.start.row;\n\t rowEnd = foldLine.end.row;\n\t } else {\n\t rowEnd = rowStart;\n\t }\n\t if (excludeLastChar === true)\n\t return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n\t else\n\t return new Range(rowStart, 0, rowEnd + 1, 0);\n\t };\n\t this.selectLine = function() {\n\t this.setSelectionRange(this.getLineRange());\n\t };\n\t this.moveCursorUp = function() {\n\t this.moveCursorBy(-1, 0);\n\t };\n\t this.moveCursorDown = function() {\n\t this.moveCursorBy(1, 0);\n\t };\n\t this.moveCursorLeft = function() {\n\t var cursor = this.lead.getPosition(),\n\t fold;\n\t\n\t if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n\t this.moveCursorTo(fold.start.row, fold.start.column);\n\t } else if (cursor.column === 0) {\n\t if (cursor.row > 0) {\n\t this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n\t }\n\t }\n\t else {\n\t var tabSize = this.session.getTabSize();\n\t if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(\" \").length-1 == tabSize)\n\t this.moveCursorBy(0, -tabSize);\n\t else\n\t this.moveCursorBy(0, -1);\n\t }\n\t };\n\t this.moveCursorRight = function() {\n\t var cursor = this.lead.getPosition(),\n\t fold;\n\t if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n\t this.moveCursorTo(fold.end.row, fold.end.column);\n\t }\n\t else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n\t if (this.lead.row < this.doc.getLength() - 1) {\n\t this.moveCursorTo(this.lead.row + 1, 0);\n\t }\n\t }\n\t else {\n\t var tabSize = this.session.getTabSize();\n\t var cursor = this.lead;\n\t if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(\" \").length-1 == tabSize)\n\t this.moveCursorBy(0, tabSize);\n\t else\n\t this.moveCursorBy(0, 1);\n\t }\n\t };\n\t this.moveCursorLineStart = function() {\n\t var row = this.lead.row;\n\t var column = this.lead.column;\n\t var screenRow = this.session.documentToScreenRow(row, column);\n\t var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n\t var beforeCursor = this.session.getDisplayLine(\n\t row, null, firstColumnPosition.row,\n\t firstColumnPosition.column\n\t );\n\t\n\t var leadingSpace = beforeCursor.match(/^\\s*/);\n\t if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n\t firstColumnPosition.column += leadingSpace[0].length;\n\t this.moveCursorToPosition(firstColumnPosition);\n\t };\n\t this.moveCursorLineEnd = function() {\n\t var lead = this.lead;\n\t var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n\t if (this.lead.column == lineEnd.column) {\n\t var line = this.session.getLine(lineEnd.row);\n\t if (lineEnd.column == line.length) {\n\t var textEnd = line.search(/\\s+$/);\n\t if (textEnd > 0)\n\t lineEnd.column = textEnd;\n\t }\n\t }\n\t\n\t this.moveCursorTo(lineEnd.row, lineEnd.column);\n\t };\n\t this.moveCursorFileEnd = function() {\n\t var row = this.doc.getLength() - 1;\n\t var column = this.doc.getLine(row).length;\n\t this.moveCursorTo(row, column);\n\t };\n\t this.moveCursorFileStart = function() {\n\t this.moveCursorTo(0, 0);\n\t };\n\t this.moveCursorLongWordRight = function() {\n\t var row = this.lead.row;\n\t var column = this.lead.column;\n\t var line = this.doc.getLine(row);\n\t var rightOfCursor = line.substring(column);\n\t\n\t var match;\n\t this.session.nonTokenRe.lastIndex = 0;\n\t this.session.tokenRe.lastIndex = 0;\n\t var fold = this.session.getFoldAt(row, column, 1);\n\t if (fold) {\n\t this.moveCursorTo(fold.end.row, fold.end.column);\n\t return;\n\t }\n\t if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n\t column += this.session.nonTokenRe.lastIndex;\n\t this.session.nonTokenRe.lastIndex = 0;\n\t rightOfCursor = line.substring(column);\n\t }\n\t if (column >= line.length) {\n\t this.moveCursorTo(row, line.length);\n\t this.moveCursorRight();\n\t if (row < this.doc.getLength() - 1)\n\t this.moveCursorWordRight();\n\t return;\n\t }\n\t if (match = this.session.tokenRe.exec(rightOfCursor)) {\n\t column += this.session.tokenRe.lastIndex;\n\t this.session.tokenRe.lastIndex = 0;\n\t }\n\t\n\t this.moveCursorTo(row, column);\n\t };\n\t this.moveCursorLongWordLeft = function() {\n\t var row = this.lead.row;\n\t var column = this.lead.column;\n\t var fold;\n\t if (fold = this.session.getFoldAt(row, column, -1)) {\n\t this.moveCursorTo(fold.start.row, fold.start.column);\n\t return;\n\t }\n\t\n\t var str = this.session.getFoldStringAt(row, column, -1);\n\t if (str == null) {\n\t str = this.doc.getLine(row).substring(0, column);\n\t }\n\t\n\t var leftOfCursor = lang.stringReverse(str);\n\t var match;\n\t this.session.nonTokenRe.lastIndex = 0;\n\t this.session.tokenRe.lastIndex = 0;\n\t if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n\t column -= this.session.nonTokenRe.lastIndex;\n\t leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n\t this.session.nonTokenRe.lastIndex = 0;\n\t }\n\t if (column <= 0) {\n\t this.moveCursorTo(row, 0);\n\t this.moveCursorLeft();\n\t if (row > 0)\n\t this.moveCursorWordLeft();\n\t return;\n\t }\n\t if (match = this.session.tokenRe.exec(leftOfCursor)) {\n\t column -= this.session.tokenRe.lastIndex;\n\t this.session.tokenRe.lastIndex = 0;\n\t }\n\t\n\t this.moveCursorTo(row, column);\n\t };\n\t\n\t this.$shortWordEndIndex = function(rightOfCursor) {\n\t var match, index = 0, ch;\n\t var whitespaceRe = /\\s/;\n\t var tokenRe = this.session.tokenRe;\n\t\n\t tokenRe.lastIndex = 0;\n\t if (match = this.session.tokenRe.exec(rightOfCursor)) {\n\t index = this.session.tokenRe.lastIndex;\n\t } else {\n\t while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n\t index ++;\n\t\n\t if (index < 1) {\n\t tokenRe.lastIndex = 0;\n\t while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n\t tokenRe.lastIndex = 0;\n\t index ++;\n\t if (whitespaceRe.test(ch)) {\n\t if (index > 2) {\n\t index--;\n\t break;\n\t } else {\n\t while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n\t index ++;\n\t if (index > 2)\n\t break;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t tokenRe.lastIndex = 0;\n\t\n\t return index;\n\t };\n\t\n\t this.moveCursorShortWordRight = function() {\n\t var row = this.lead.row;\n\t var column = this.lead.column;\n\t var line = this.doc.getLine(row);\n\t var rightOfCursor = line.substring(column);\n\t\n\t var fold = this.session.getFoldAt(row, column, 1);\n\t if (fold)\n\t return this.moveCursorTo(fold.end.row, fold.end.column);\n\t\n\t if (column == line.length) {\n\t var l = this.doc.getLength();\n\t do {\n\t row++;\n\t rightOfCursor = this.doc.getLine(row);\n\t } while (row < l && /^\\s*$/.test(rightOfCursor));\n\t\n\t if (!/^\\s+/.test(rightOfCursor))\n\t rightOfCursor = \"\";\n\t column = 0;\n\t }\n\t\n\t var index = this.$shortWordEndIndex(rightOfCursor);\n\t\n\t this.moveCursorTo(row, column + index);\n\t };\n\t\n\t this.moveCursorShortWordLeft = function() {\n\t var row = this.lead.row;\n\t var column = this.lead.column;\n\t\n\t var fold;\n\t if (fold = this.session.getFoldAt(row, column, -1))\n\t return this.moveCursorTo(fold.start.row, fold.start.column);\n\t\n\t var line = this.session.getLine(row).substring(0, column);\n\t if (column === 0) {\n\t do {\n\t row--;\n\t line = this.doc.getLine(row);\n\t } while (row > 0 && /^\\s*$/.test(line));\n\t\n\t column = line.length;\n\t if (!/\\s+$/.test(line))\n\t line = \"\";\n\t }\n\t\n\t var leftOfCursor = lang.stringReverse(line);\n\t var index = this.$shortWordEndIndex(leftOfCursor);\n\t\n\t return this.moveCursorTo(row, column - index);\n\t };\n\t\n\t this.moveCursorWordRight = function() {\n\t if (this.session.$selectLongWords)\n\t this.moveCursorLongWordRight();\n\t else\n\t this.moveCursorShortWordRight();\n\t };\n\t\n\t this.moveCursorWordLeft = function() {\n\t if (this.session.$selectLongWords)\n\t this.moveCursorLongWordLeft();\n\t else\n\t this.moveCursorShortWordLeft();\n\t };\n\t this.moveCursorBy = function(rows, chars) {\n\t var screenPos = this.session.documentToScreenPosition(\n\t this.lead.row,\n\t this.lead.column\n\t );\n\t\n\t if (chars === 0) {\n\t if (this.$desiredColumn)\n\t screenPos.column = this.$desiredColumn;\n\t else\n\t this.$desiredColumn = screenPos.column;\n\t }\n\t\n\t var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);\n\t \n\t if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n\t if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\n\t if (docPos.row > 0 || rows > 0)\n\t docPos.row++;\n\t }\n\t }\n\t this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n\t };\n\t this.moveCursorToPosition = function(position) {\n\t this.moveCursorTo(position.row, position.column);\n\t };\n\t this.moveCursorTo = function(row, column, keepDesiredColumn) {\n\t var fold = this.session.getFoldAt(row, column, 1);\n\t if (fold) {\n\t row = fold.start.row;\n\t column = fold.start.column;\n\t }\n\t\n\t this.$keepDesiredColumnOnChange = true;\n\t this.lead.setPosition(row, column);\n\t this.$keepDesiredColumnOnChange = false;\n\t\n\t if (!keepDesiredColumn)\n\t this.$desiredColumn = null;\n\t };\n\t this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n\t var pos = this.session.screenToDocumentPosition(row, column);\n\t this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n\t };\n\t this.detach = function() {\n\t this.lead.detach();\n\t this.anchor.detach();\n\t this.session = this.doc = null;\n\t };\n\t\n\t this.fromOrientedRange = function(range) {\n\t this.setSelectionRange(range, range.cursor == range.start);\n\t this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n\t };\n\t\n\t this.toOrientedRange = function(range) {\n\t var r = this.getRange();\n\t if (range) {\n\t range.start.column = r.start.column;\n\t range.start.row = r.start.row;\n\t range.end.column = r.end.column;\n\t range.end.row = r.end.row;\n\t } else {\n\t range = r;\n\t }\n\t\n\t range.cursor = this.isBackwards() ? range.start : range.end;\n\t range.desiredColumn = this.$desiredColumn;\n\t return range;\n\t };\n\t this.getRangeOfMovements = function(func) {\n\t var start = this.getCursor();\n\t try {\n\t func(this);\n\t var end = this.getCursor();\n\t return Range.fromPoints(start,end);\n\t } catch(e) {\n\t return Range.fromPoints(start,start);\n\t } finally {\n\t this.moveCursorToPosition(start);\n\t }\n\t };\n\t\n\t this.toJSON = function() {\n\t if (this.rangeCount) {\n\t var data = this.ranges.map(function(r) {\n\t var r1 = r.clone();\n\t r1.isBackwards = r.cursor == r.start;\n\t return r1;\n\t });\n\t } else {\n\t var data = this.getRange();\n\t data.isBackwards = this.isBackwards();\n\t }\n\t return data;\n\t };\n\t\n\t this.fromJSON = function(data) {\n\t if (data.start == undefined) {\n\t if (this.rangeList) {\n\t this.toSingleRange(data[0]);\n\t for (var i = data.length; i--; ) {\n\t var r = Range.fromPoints(data[i].start, data[i].end);\n\t if (data[i].isBackwards)\n\t r.cursor = r.start;\n\t this.addRange(r, true);\n\t }\n\t return;\n\t } else\n\t data = data[0];\n\t }\n\t if (this.rangeList)\n\t this.toSingleRange(data);\n\t this.setSelectionRange(data, data.isBackwards);\n\t };\n\t\n\t this.isEqual = function(data) {\n\t if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n\t return false;\n\t if (!data.length || !this.ranges)\n\t return this.getRange().isEqual(data);\n\t\n\t for (var i = this.ranges.length; i--; ) {\n\t if (!this.ranges[i].isEqual(data[i]))\n\t return false;\n\t }\n\t return true;\n\t };\n\t\n\t}).call(Selection.prototype);\n\t\n\texports.Selection = Selection;\n\t});\n\t\n\tace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar config = acequire(\"./config\");\n\tvar MAX_TOKEN_COUNT = 2000;\n\tvar Tokenizer = function(rules) {\n\t this.states = rules;\n\t\n\t this.regExps = {};\n\t this.matchMappings = {};\n\t for (var key in this.states) {\n\t var state = this.states[key];\n\t var ruleRegExps = [];\n\t var matchTotal = 0;\n\t var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n\t var flag = \"g\";\n\t\n\t var splitterRurles = [];\n\t for (var i = 0; i < state.length; i++) {\n\t var rule = state[i];\n\t if (rule.defaultToken)\n\t mapping.defaultToken = rule.defaultToken;\n\t if (rule.caseInsensitive)\n\t flag = \"gi\";\n\t if (rule.regex == null)\n\t continue;\n\t\n\t if (rule.regex instanceof RegExp)\n\t rule.regex = rule.regex.toString().slice(1, -1);\n\t var adjustedregex = rule.regex;\n\t var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n\t if (Array.isArray(rule.token)) {\n\t if (rule.token.length == 1 || matchcount == 1) {\n\t rule.token = rule.token[0];\n\t } else if (matchcount - 1 != rule.token.length) {\n\t this.reportError(\"number of classes and regexp groups doesn't match\", { \n\t rule: rule,\n\t groupCount: matchcount - 1\n\t });\n\t rule.token = rule.token[0];\n\t } else {\n\t rule.tokenArray = rule.token;\n\t rule.token = null;\n\t rule.onMatch = this.$arrayTokens;\n\t }\n\t } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n\t if (matchcount > 1)\n\t rule.onMatch = this.$applyToken;\n\t else\n\t rule.onMatch = rule.token;\n\t }\n\t\n\t if (matchcount > 1) {\n\t if (/\\\\\\d/.test(rule.regex)) {\n\t adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n\t return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n\t });\n\t } else {\n\t matchcount = 1;\n\t adjustedregex = this.removeCapturingGroups(rule.regex);\n\t }\n\t if (!rule.splitRegex && typeof rule.token != \"string\")\n\t splitterRurles.push(rule); // flag will be known only at the very end\n\t }\n\t\n\t mapping[matchTotal] = i;\n\t matchTotal += matchcount;\n\t\n\t ruleRegExps.push(adjustedregex);\n\t if (!rule.onMatch)\n\t rule.onMatch = null;\n\t }\n\t \n\t if (!ruleRegExps.length) {\n\t mapping[0] = 0;\n\t ruleRegExps.push(\"$\");\n\t }\n\t \n\t splitterRurles.forEach(function(rule) {\n\t rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n\t }, this);\n\t\n\t this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n\t }\n\t};\n\t\n\t(function() {\n\t this.$setMaxTokenCount = function(m) {\n\t MAX_TOKEN_COUNT = m | 0;\n\t };\n\t \n\t this.$applyToken = function(str) {\n\t var values = this.splitRegex.exec(str).slice(1);\n\t var types = this.token.apply(this, values);\n\t if (typeof types === \"string\")\n\t return [{type: types, value: str}];\n\t\n\t var tokens = [];\n\t for (var i = 0, l = types.length; i < l; i++) {\n\t if (values[i])\n\t tokens[tokens.length] = {\n\t type: types[i],\n\t value: values[i]\n\t };\n\t }\n\t return tokens;\n\t };\n\t\n\t this.$arrayTokens = function(str) {\n\t if (!str)\n\t return [];\n\t var values = this.splitRegex.exec(str);\n\t if (!values)\n\t return \"text\";\n\t var tokens = [];\n\t var types = this.tokenArray;\n\t for (var i = 0, l = types.length; i < l; i++) {\n\t if (values[i + 1])\n\t tokens[tokens.length] = {\n\t type: types[i],\n\t value: values[i + 1]\n\t };\n\t }\n\t return tokens;\n\t };\n\t\n\t this.removeCapturingGroups = function(src) {\n\t var r = src.replace(\n\t /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n\t function(x, y) {return y ? \"(?:\" : x;}\n\t );\n\t return r;\n\t };\n\t\n\t this.createSplitterRegexp = function(src, flag) {\n\t if (src.indexOf(\"(?=\") != -1) {\n\t var stack = 0;\n\t var inChClass = false;\n\t var lastCapture = {};\n\t src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n\t m, esc, parenOpen, parenClose, square, index\n\t ) {\n\t if (inChClass) {\n\t inChClass = square != \"]\";\n\t } else if (square) {\n\t inChClass = true;\n\t } else if (parenClose) {\n\t if (stack == lastCapture.stack) {\n\t lastCapture.end = index+1;\n\t lastCapture.stack = -1;\n\t }\n\t stack--;\n\t } else if (parenOpen) {\n\t stack++;\n\t if (parenOpen.length != 1) {\n\t lastCapture.stack = stack\n\t lastCapture.start = index;\n\t }\n\t }\n\t return m;\n\t });\n\t\n\t if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n\t src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n\t }\n\t if (src.charAt(0) != \"^\") src = \"^\" + src;\n\t if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n\t \n\t return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n\t };\n\t this.getLineTokens = function(line, startState) {\n\t if (startState && typeof startState != \"string\") {\n\t var stack = startState.slice(0);\n\t startState = stack[0];\n\t if (startState === \"#tmp\") {\n\t stack.shift()\n\t startState = stack.shift()\n\t }\n\t } else\n\t var stack = [];\n\t\n\t var currentState = startState || \"start\";\n\t var state = this.states[currentState];\n\t if (!state) {\n\t currentState = \"start\";\n\t state = this.states[currentState];\n\t }\n\t var mapping = this.matchMappings[currentState];\n\t var re = this.regExps[currentState];\n\t re.lastIndex = 0;\n\t\n\t var match, tokens = [];\n\t var lastIndex = 0;\n\t var matchAttempts = 0;\n\t\n\t var token = {type: null, value: \"\"};\n\t\n\t while (match = re.exec(line)) {\n\t var type = mapping.defaultToken;\n\t var rule = null;\n\t var value = match[0];\n\t var index = re.lastIndex;\n\t\n\t if (index - value.length > lastIndex) {\n\t var skipped = line.substring(lastIndex, index - value.length);\n\t if (token.type == type) {\n\t token.value += skipped;\n\t } else {\n\t if (token.type)\n\t tokens.push(token);\n\t token = {type: type, value: skipped};\n\t }\n\t }\n\t\n\t for (var i = 0; i < match.length-2; i++) {\n\t if (match[i + 1] === undefined)\n\t continue;\n\t\n\t rule = state[mapping[i]];\n\t\n\t if (rule.onMatch)\n\t type = rule.onMatch(value, currentState, stack);\n\t else\n\t type = rule.token;\n\t\n\t if (rule.next) {\n\t if (typeof rule.next == \"string\") {\n\t currentState = rule.next;\n\t } else {\n\t currentState = rule.next(currentState, stack);\n\t }\n\t \n\t state = this.states[currentState];\n\t if (!state) {\n\t this.reportError(\"state doesn't exist\", currentState);\n\t currentState = \"start\";\n\t state = this.states[currentState];\n\t }\n\t mapping = this.matchMappings[currentState];\n\t lastIndex = index;\n\t re = this.regExps[currentState];\n\t re.lastIndex = index;\n\t }\n\t break;\n\t }\n\t\n\t if (value) {\n\t if (typeof type === \"string\") {\n\t if ((!rule || rule.merge !== false) && token.type === type) {\n\t token.value += value;\n\t } else {\n\t if (token.type)\n\t tokens.push(token);\n\t token = {type: type, value: value};\n\t }\n\t } else if (type) {\n\t if (token.type)\n\t tokens.push(token);\n\t token = {type: null, value: \"\"};\n\t for (var i = 0; i < type.length; i++)\n\t tokens.push(type[i]);\n\t }\n\t }\n\t\n\t if (lastIndex == line.length)\n\t break;\n\t\n\t lastIndex = index;\n\t\n\t if (matchAttempts++ > MAX_TOKEN_COUNT) {\n\t if (matchAttempts > 2 * line.length) {\n\t this.reportError(\"infinite loop with in ace tokenizer\", {\n\t startState: startState,\n\t line: line\n\t });\n\t }\n\t while (lastIndex < line.length) {\n\t if (token.type)\n\t tokens.push(token);\n\t token = {\n\t value: line.substring(lastIndex, lastIndex += 2000),\n\t type: \"overflow\"\n\t };\n\t }\n\t currentState = \"start\";\n\t stack = [];\n\t break;\n\t }\n\t }\n\t\n\t if (token.type)\n\t tokens.push(token);\n\t \n\t if (stack.length > 1) {\n\t if (stack[0] !== currentState)\n\t stack.unshift(\"#tmp\", currentState);\n\t }\n\t return {\n\t tokens : tokens,\n\t state : stack.length ? stack : currentState\n\t };\n\t };\n\t \n\t this.reportError = config.reportError;\n\t \n\t}).call(Tokenizer.prototype);\n\t\n\texports.Tokenizer = Tokenizer;\n\t});\n\t\n\tace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar lang = acequire(\"../lib/lang\");\n\t\n\tvar TextHighlightRules = function() {\n\t\n\t this.$rules = {\n\t \"start\" : [{\n\t token : \"empty_line\",\n\t regex : '^$'\n\t }, {\n\t defaultToken : \"text\"\n\t }]\n\t };\n\t};\n\t\n\t(function() {\n\t\n\t this.addRules = function(rules, prefix) {\n\t if (!prefix) {\n\t for (var key in rules)\n\t this.$rules[key] = rules[key];\n\t return;\n\t }\n\t for (var key in rules) {\n\t var state = rules[key];\n\t for (var i = 0; i < state.length; i++) {\n\t var rule = state[i];\n\t if (rule.next || rule.onMatch) {\n\t if (typeof rule.next == \"string\") {\n\t if (rule.next.indexOf(prefix) !== 0)\n\t rule.next = prefix + rule.next;\n\t }\n\t if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n\t rule.nextState = prefix + rule.nextState;\n\t }\n\t }\n\t this.$rules[prefix + key] = state;\n\t }\n\t };\n\t\n\t this.getRules = function() {\n\t return this.$rules;\n\t };\n\t\n\t this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n\t var embedRules = typeof HighlightRules == \"function\"\n\t ? new HighlightRules().getRules()\n\t : HighlightRules;\n\t if (states) {\n\t for (var i = 0; i < states.length; i++)\n\t states[i] = prefix + states[i];\n\t } else {\n\t states = [];\n\t for (var key in embedRules)\n\t states.push(prefix + key);\n\t }\n\t\n\t this.addRules(embedRules, prefix);\n\t\n\t if (escapeRules) {\n\t var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n\t for (var i = 0; i < states.length; i++)\n\t addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n\t }\n\t\n\t if (!this.$embeds)\n\t this.$embeds = [];\n\t this.$embeds.push(prefix);\n\t };\n\t\n\t this.getEmbeds = function() {\n\t return this.$embeds;\n\t };\n\t\n\t var pushState = function(currentState, stack) {\n\t if (currentState != \"start\" || stack.length)\n\t stack.unshift(this.nextState, currentState);\n\t return this.nextState;\n\t };\n\t var popState = function(currentState, stack) {\n\t stack.shift();\n\t return stack.shift() || \"start\";\n\t };\n\t\n\t this.normalizeRules = function() {\n\t var id = 0;\n\t var rules = this.$rules;\n\t function processState(key) {\n\t var state = rules[key];\n\t state.processed = true;\n\t for (var i = 0; i < state.length; i++) {\n\t var rule = state[i];\n\t if (!rule.regex && rule.start) {\n\t rule.regex = rule.start;\n\t if (!rule.next)\n\t rule.next = [];\n\t rule.next.push({\n\t defaultToken: rule.token\n\t }, {\n\t token: rule.token + \".end\",\n\t regex: rule.end || rule.start,\n\t next: \"pop\"\n\t });\n\t rule.token = rule.token + \".start\";\n\t rule.push = true;\n\t }\n\t var next = rule.next || rule.push;\n\t if (next && Array.isArray(next)) {\n\t var stateName = rule.stateName;\n\t if (!stateName) {\n\t stateName = rule.token;\n\t if (typeof stateName != \"string\")\n\t stateName = stateName[0] || \"\";\n\t if (rules[stateName])\n\t stateName += id++;\n\t }\n\t rules[stateName] = next;\n\t rule.next = stateName;\n\t processState(stateName);\n\t } else if (next == \"pop\") {\n\t rule.next = popState;\n\t }\n\t\n\t if (rule.push) {\n\t rule.nextState = rule.next || rule.push;\n\t rule.next = pushState;\n\t delete rule.push;\n\t }\n\t\n\t if (rule.rules) {\n\t for (var r in rule.rules) {\n\t if (rules[r]) {\n\t if (rules[r].push)\n\t rules[r].push.apply(rules[r], rule.rules[r]);\n\t } else {\n\t rules[r] = rule.rules[r];\n\t }\n\t }\n\t }\n\t if (rule.include || typeof rule == \"string\") {\n\t var includeName = rule.include || rule;\n\t var toInsert = rules[includeName];\n\t } else if (Array.isArray(rule))\n\t toInsert = rule;\n\t\n\t if (toInsert) {\n\t var args = [i, 1].concat(toInsert);\n\t if (rule.noEscape)\n\t args = args.filter(function(x) {return !x.next;});\n\t state.splice.apply(state, args);\n\t i--;\n\t toInsert = null;\n\t }\n\t \n\t if (rule.keywordMap) {\n\t rule.token = this.createKeywordMapper(\n\t rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n\t );\n\t delete rule.defaultToken;\n\t }\n\t }\n\t }\n\t Object.keys(rules).forEach(processState, this);\n\t };\n\t\n\t this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n\t var keywords = Object.create(null);\n\t Object.keys(map).forEach(function(className) {\n\t var a = map[className];\n\t if (ignoreCase)\n\t a = a.toLowerCase();\n\t var list = a.split(splitChar || \"|\");\n\t for (var i = list.length; i--; )\n\t keywords[list[i]] = className;\n\t });\n\t if (Object.getPrototypeOf(keywords)) {\n\t keywords.__proto__ = null;\n\t }\n\t this.$keywordList = Object.keys(keywords);\n\t map = null;\n\t return ignoreCase\n\t ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n\t : function(value) {return keywords[value] || defaultToken };\n\t };\n\t\n\t this.getKeywords = function() {\n\t return this.$keywords;\n\t };\n\t\n\t}).call(TextHighlightRules.prototype);\n\t\n\texports.TextHighlightRules = TextHighlightRules;\n\t});\n\t\n\tace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Behaviour = function() {\n\t this.$behaviours = {};\n\t};\n\t\n\t(function () {\n\t\n\t this.add = function (name, action, callback) {\n\t switch (undefined) {\n\t case this.$behaviours:\n\t this.$behaviours = {};\n\t case this.$behaviours[name]:\n\t this.$behaviours[name] = {};\n\t }\n\t this.$behaviours[name][action] = callback;\n\t }\n\t \n\t this.addBehaviours = function (behaviours) {\n\t for (var key in behaviours) {\n\t for (var action in behaviours[key]) {\n\t this.add(key, action, behaviours[key][action]);\n\t }\n\t }\n\t }\n\t \n\t this.remove = function (name) {\n\t if (this.$behaviours && this.$behaviours[name]) {\n\t delete this.$behaviours[name];\n\t }\n\t }\n\t \n\t this.inherit = function (mode, filter) {\n\t if (typeof mode === \"function\") {\n\t var behaviours = new mode().getBehaviours(filter);\n\t } else {\n\t var behaviours = mode.getBehaviours(filter);\n\t }\n\t this.addBehaviours(behaviours);\n\t }\n\t \n\t this.getBehaviours = function (filter) {\n\t if (!filter) {\n\t return this.$behaviours;\n\t } else {\n\t var ret = {}\n\t for (var i = 0; i < filter.length; i++) {\n\t if (this.$behaviours[filter[i]]) {\n\t ret[filter[i]] = this.$behaviours[filter[i]];\n\t }\n\t }\n\t return ret;\n\t }\n\t }\n\t\n\t}).call(Behaviour.prototype);\n\t\n\texports.Behaviour = Behaviour;\n\t});\n\t\n\tace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\texports.packages = {};\n\t\n\taddUnicodePackage({\n\t 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\t 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\t 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\t Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n\t Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n\t 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\t 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\t 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\t 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\t Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n\t 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\t 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\t Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n\t No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n\t 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\t Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n\t Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n\t Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n\t Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n\t Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n\t Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n\t 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\t 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\t 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\t Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n\t Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n\t 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\t Z: \"002000A01680180E2000-200A20282029202F205F3000\",\n\t Zs: \"002000A01680180E2000-200A202F205F3000\",\n\t Zl: \"2028\",\n\t Zp: \"2029\",\n\t 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\t Cc: \"0000-001F007F-009F\",\n\t Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n\t Co: \"E000-F8FF\",\n\t Cs: \"D800-DFFF\",\n\t 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\t});\n\t\n\tfunction addUnicodePackage (pack) {\n\t var codePoint = /\\w{4}/g;\n\t for (var name in pack)\n\t exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n\t}\n\t\n\t});\n\t\n\tace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\tvar TokenIterator = function(session, initialRow, initialColumn) {\n\t this.$session = session;\n\t this.$row = initialRow;\n\t this.$rowTokens = session.getTokens(initialRow);\n\t\n\t var token = session.getTokenAt(initialRow, initialColumn);\n\t this.$tokenIndex = token ? token.index : -1;\n\t};\n\t\n\t(function() { \n\t this.stepBackward = function() {\n\t this.$tokenIndex -= 1;\n\t \n\t while (this.$tokenIndex < 0) {\n\t this.$row -= 1;\n\t if (this.$row < 0) {\n\t this.$row = 0;\n\t return null;\n\t }\n\t \n\t this.$rowTokens = this.$session.getTokens(this.$row);\n\t this.$tokenIndex = this.$rowTokens.length - 1;\n\t }\n\t \n\t return this.$rowTokens[this.$tokenIndex];\n\t }; \n\t this.stepForward = function() {\n\t this.$tokenIndex += 1;\n\t var rowCount;\n\t while (this.$tokenIndex >= this.$rowTokens.length) {\n\t this.$row += 1;\n\t if (!rowCount)\n\t rowCount = this.$session.getLength();\n\t if (this.$row >= rowCount) {\n\t this.$row = rowCount - 1;\n\t return null;\n\t }\n\t\n\t this.$rowTokens = this.$session.getTokens(this.$row);\n\t this.$tokenIndex = 0;\n\t }\n\t \n\t return this.$rowTokens[this.$tokenIndex];\n\t }; \n\t this.getCurrentToken = function () {\n\t return this.$rowTokens[this.$tokenIndex];\n\t }; \n\t this.getCurrentTokenRow = function () {\n\t return this.$row;\n\t }; \n\t this.getCurrentTokenColumn = function() {\n\t var rowTokens = this.$rowTokens;\n\t var tokenIndex = this.$tokenIndex;\n\t var column = rowTokens[tokenIndex].start;\n\t if (column !== undefined)\n\t return column;\n\t \n\t column = 0;\n\t while (tokenIndex > 0) {\n\t tokenIndex -= 1;\n\t column += rowTokens[tokenIndex].value.length;\n\t }\n\t \n\t return column; \n\t };\n\t this.getCurrentTokenPosition = function() {\n\t return {row: this.$row, column: this.getCurrentTokenColumn()};\n\t };\n\t \n\t}).call(TokenIterator.prototype);\n\t\n\texports.TokenIterator = TokenIterator;\n\t});\n\t\n\tace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Tokenizer = acequire(\"../tokenizer\").Tokenizer;\n\tvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\tvar Behaviour = acequire(\"./behaviour\").Behaviour;\n\tvar unicode = acequire(\"../unicode\");\n\tvar lang = acequire(\"../lib/lang\");\n\tvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\tvar Range = acequire(\"../range\").Range;\n\t\n\tvar Mode = function() {\n\t this.HighlightRules = TextHighlightRules;\n\t this.$behaviour = new Behaviour();\n\t};\n\t\n\t(function() {\n\t\n\t this.tokenRe = new RegExp(\"^[\"\n\t + unicode.packages.L\n\t + unicode.packages.Mn + unicode.packages.Mc\n\t + unicode.packages.Nd\n\t + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n\t );\n\t\n\t this.nonTokenRe = new RegExp(\"^(?:[^\"\n\t + unicode.packages.L\n\t + unicode.packages.Mn + unicode.packages.Mc\n\t + unicode.packages.Nd\n\t + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n\t );\n\t\n\t this.getTokenizer = function() {\n\t if (!this.$tokenizer) {\n\t this.$highlightRules = this.$highlightRules || new this.HighlightRules();\n\t this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n\t }\n\t return this.$tokenizer;\n\t };\n\t\n\t this.lineCommentStart = \"\";\n\t this.blockComment = \"\";\n\t\n\t this.toggleCommentLines = function(state, session, startRow, endRow) {\n\t var doc = session.doc;\n\t\n\t var ignoreBlankLines = true;\n\t var shouldRemove = true;\n\t var minIndent = Infinity;\n\t var tabSize = session.getTabSize();\n\t var insertAtTabStop = false;\n\t\n\t if (!this.lineCommentStart) {\n\t if (!this.blockComment)\n\t return false;\n\t var lineCommentStart = this.blockComment.start;\n\t var lineCommentEnd = this.blockComment.end;\n\t var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n\t var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\t\n\t var comment = function(line, i) {\n\t if (testRemove(line, i))\n\t return;\n\t if (!ignoreBlankLines || /\\S/.test(line)) {\n\t doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n\t doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n\t }\n\t };\n\t\n\t var uncomment = function(line, i) {\n\t var m;\n\t if (m = line.match(regexpEnd))\n\t doc.removeInLine(i, line.length - m[0].length, line.length);\n\t if (m = line.match(regexpStart))\n\t doc.removeInLine(i, m[1].length, m[0].length);\n\t };\n\t\n\t var testRemove = function(line, row) {\n\t if (regexpStart.test(line))\n\t return true;\n\t var tokens = session.getTokens(row);\n\t for (var i = 0; i < tokens.length; i++) {\n\t if (tokens[i].type === \"comment\")\n\t return true;\n\t }\n\t };\n\t } else {\n\t if (Array.isArray(this.lineCommentStart)) {\n\t var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n\t var lineCommentStart = this.lineCommentStart[0];\n\t } else {\n\t var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n\t var lineCommentStart = this.lineCommentStart;\n\t }\n\t regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n\t \n\t insertAtTabStop = session.getUseSoftTabs();\n\t\n\t var uncomment = function(line, i) {\n\t var m = line.match(regexpStart);\n\t if (!m) return;\n\t var start = m[1].length, end = m[0].length;\n\t if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n\t end--;\n\t doc.removeInLine(i, start, end);\n\t };\n\t var commentWithSpace = lineCommentStart + \" \";\n\t var comment = function(line, i) {\n\t if (!ignoreBlankLines || /\\S/.test(line)) {\n\t if (shouldInsertSpace(line, minIndent, minIndent))\n\t doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n\t else\n\t doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n\t }\n\t };\n\t var testRemove = function(line, i) {\n\t return regexpStart.test(line);\n\t };\n\t \n\t var shouldInsertSpace = function(line, before, after) {\n\t var spaces = 0;\n\t while (before-- && line.charAt(before) == \" \")\n\t spaces++;\n\t if (spaces % tabSize != 0)\n\t return false;\n\t var spaces = 0;\n\t while (line.charAt(after++) == \" \")\n\t spaces++;\n\t if (tabSize > 2)\n\t return spaces % tabSize != tabSize - 1;\n\t else\n\t return spaces % tabSize == 0;\n\t return true;\n\t };\n\t }\n\t\n\t function iter(fun) {\n\t for (var i = startRow; i <= endRow; i++)\n\t fun(doc.getLine(i), i);\n\t }\n\t\n\t\n\t var minEmptyLength = Infinity;\n\t iter(function(line, i) {\n\t var indent = line.search(/\\S/);\n\t if (indent !== -1) {\n\t if (indent < minIndent)\n\t minIndent = indent;\n\t if (shouldRemove && !testRemove(line, i))\n\t shouldRemove = false;\n\t } else if (minEmptyLength > line.length) {\n\t minEmptyLength = line.length;\n\t }\n\t });\n\t\n\t if (minIndent == Infinity) {\n\t minIndent = minEmptyLength;\n\t ignoreBlankLines = false;\n\t shouldRemove = false;\n\t }\n\t\n\t if (insertAtTabStop && minIndent % tabSize != 0)\n\t minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\t\n\t iter(shouldRemove ? uncomment : comment);\n\t };\n\t\n\t this.toggleBlockComment = function(state, session, range, cursor) {\n\t var comment = this.blockComment;\n\t if (!comment)\n\t return;\n\t if (!comment.start && comment[0])\n\t comment = comment[0];\n\t\n\t var iterator = new TokenIterator(session, cursor.row, cursor.column);\n\t var token = iterator.getCurrentToken();\n\t\n\t var sel = session.selection;\n\t var initialRange = session.selection.toOrientedRange();\n\t var startRow, colDiff;\n\t\n\t if (token && /comment/.test(token.type)) {\n\t var startRange, endRange;\n\t while (token && /comment/.test(token.type)) {\n\t var i = token.value.indexOf(comment.start);\n\t if (i != -1) {\n\t var row = iterator.getCurrentTokenRow();\n\t var column = iterator.getCurrentTokenColumn() + i;\n\t startRange = new Range(row, column, row, column + comment.start.length);\n\t break;\n\t }\n\t token = iterator.stepBackward();\n\t }\n\t\n\t var iterator = new TokenIterator(session, cursor.row, cursor.column);\n\t var token = iterator.getCurrentToken();\n\t while (token && /comment/.test(token.type)) {\n\t var i = token.value.indexOf(comment.end);\n\t if (i != -1) {\n\t var row = iterator.getCurrentTokenRow();\n\t var column = iterator.getCurrentTokenColumn() + i;\n\t endRange = new Range(row, column, row, column + comment.end.length);\n\t break;\n\t }\n\t token = iterator.stepForward();\n\t }\n\t if (endRange)\n\t session.remove(endRange);\n\t if (startRange) {\n\t session.remove(startRange);\n\t startRow = startRange.start.row;\n\t colDiff = -comment.start.length;\n\t }\n\t } else {\n\t colDiff = comment.start.length;\n\t startRow = range.start.row;\n\t session.insert(range.end, comment.end);\n\t session.insert(range.start, comment.start);\n\t }\n\t if (initialRange.start.row == startRow)\n\t initialRange.start.column += colDiff;\n\t if (initialRange.end.row == startRow)\n\t initialRange.end.column += colDiff;\n\t session.selection.fromOrientedRange(initialRange);\n\t };\n\t\n\t this.getNextLineIndent = function(state, line, tab) {\n\t return this.$getIndent(line);\n\t };\n\t\n\t this.checkOutdent = function(state, line, input) {\n\t return false;\n\t };\n\t\n\t this.autoOutdent = function(state, doc, row) {\n\t };\n\t\n\t this.$getIndent = function(line) {\n\t return line.match(/^\\s*/)[0];\n\t };\n\t\n\t this.createWorker = function(session) {\n\t return null;\n\t };\n\t\n\t this.createModeDelegates = function (mapping) {\n\t this.$embeds = [];\n\t this.$modes = {};\n\t for (var i in mapping) {\n\t if (mapping[i]) {\n\t this.$embeds.push(i);\n\t this.$modes[i] = new mapping[i]();\n\t }\n\t }\n\t\n\t var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n\t \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\t\n\t for (var i = 0; i < delegations.length; i++) {\n\t (function(scope) {\n\t var functionName = delegations[i];\n\t var defaultHandler = scope[functionName];\n\t scope[delegations[i]] = function() {\n\t return this.$delegator(functionName, arguments, defaultHandler);\n\t };\n\t }(this));\n\t }\n\t };\n\t\n\t this.$delegator = function(method, args, defaultHandler) {\n\t var state = args[0];\n\t if (typeof state != \"string\")\n\t state = state[0];\n\t for (var i = 0; i < this.$embeds.length; i++) {\n\t if (!this.$modes[this.$embeds[i]]) continue;\n\t\n\t var split = state.split(this.$embeds[i]);\n\t if (!split[0] && split[1]) {\n\t args[0] = split[1];\n\t var mode = this.$modes[this.$embeds[i]];\n\t return mode[method].apply(mode, args);\n\t }\n\t }\n\t var ret = defaultHandler.apply(this, args);\n\t return defaultHandler ? ret : undefined;\n\t };\n\t\n\t this.transformAction = function(state, action, editor, session, param) {\n\t if (this.$behaviour) {\n\t var behaviours = this.$behaviour.getBehaviours();\n\t for (var key in behaviours) {\n\t if (behaviours[key][action]) {\n\t var ret = behaviours[key][action].apply(this, arguments);\n\t if (ret) {\n\t return ret;\n\t }\n\t }\n\t }\n\t }\n\t };\n\t \n\t this.getKeywords = function(append) {\n\t if (!this.completionKeywords) {\n\t var rules = this.$tokenizer.rules;\n\t var completionKeywords = [];\n\t for (var rule in rules) {\n\t var ruleItr = rules[rule];\n\t for (var r = 0, l = ruleItr.length; r < l; r++) {\n\t if (typeof ruleItr[r].token === \"string\") {\n\t if (/keyword|support|storage/.test(ruleItr[r].token))\n\t completionKeywords.push(ruleItr[r].regex);\n\t }\n\t else if (typeof ruleItr[r].token === \"object\") {\n\t for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n\t if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n\t var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n\t completionKeywords.push(rule.substr(1, rule.length - 2));\n\t }\n\t }\n\t }\n\t }\n\t }\n\t this.completionKeywords = completionKeywords;\n\t }\n\t if (!append)\n\t return this.$keywordList;\n\t return completionKeywords.concat(this.$keywordList || []);\n\t };\n\t \n\t this.$createKeywordList = function() {\n\t if (!this.$highlightRules)\n\t this.getTokenizer();\n\t return this.$keywordList = this.$highlightRules.$keywordList || [];\n\t };\n\t\n\t this.getCompletions = function(state, session, pos, prefix) {\n\t var keywords = this.$keywordList || this.$createKeywordList();\n\t return keywords.map(function(word) {\n\t return {\n\t name: word,\n\t value: word,\n\t score: 0,\n\t meta: \"keyword\"\n\t };\n\t });\n\t };\n\t\n\t this.$id = \"ace/mode/text\";\n\t}).call(Mode.prototype);\n\t\n\texports.Mode = Mode;\n\t});\n\t\n\tace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tfunction throwDeltaError(delta, errorText){\n\t console.log(\"Invalid Delta:\", delta);\n\t throw \"Invalid Delta: \" + errorText;\n\t}\n\t\n\tfunction positionInDocument(docLines, position) {\n\t return position.row >= 0 && position.row < docLines.length &&\n\t position.column >= 0 && position.column <= docLines[position.row].length;\n\t}\n\t\n\tfunction validateDelta(docLines, delta) {\n\t if (delta.action != \"insert\" && delta.action != \"remove\")\n\t throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n\t if (!(delta.lines instanceof Array))\n\t throwDeltaError(delta, \"delta.lines must be an Array\");\n\t if (!delta.start || !delta.end)\n\t throwDeltaError(delta, \"delta.start/end must be an present\");\n\t var start = delta.start;\n\t if (!positionInDocument(docLines, delta.start))\n\t throwDeltaError(delta, \"delta.start must be contained in document\");\n\t var end = delta.end;\n\t if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n\t throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n\t var numRangeRows = end.row - start.row;\n\t var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n\t if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n\t throwDeltaError(delta, \"delta.range must match delta lines\");\n\t}\n\t\n\texports.applyDelta = function(docLines, delta, doNotValidate) {\n\t \n\t var row = delta.start.row;\n\t var startColumn = delta.start.column;\n\t var line = docLines[row] || \"\";\n\t switch (delta.action) {\n\t case \"insert\":\n\t var lines = delta.lines;\n\t if (lines.length === 1) {\n\t docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n\t } else {\n\t var args = [row, 1].concat(delta.lines);\n\t docLines.splice.apply(docLines, args);\n\t docLines[row] = line.substring(0, startColumn) + docLines[row];\n\t docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n\t }\n\t break;\n\t case \"remove\":\n\t var endColumn = delta.end.column;\n\t var endRow = delta.end.row;\n\t if (row === endRow) {\n\t docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n\t } else {\n\t docLines.splice(\n\t row, endRow - row + 1,\n\t line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n\t );\n\t }\n\t break;\n\t }\n\t}\n\t});\n\t\n\tace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\t\n\tvar Anchor = exports.Anchor = function(doc, row, column) {\n\t this.$onChange = this.onChange.bind(this);\n\t this.attach(doc);\n\t \n\t if (typeof column == \"undefined\")\n\t this.setPosition(row.row, row.column);\n\t else\n\t this.setPosition(row, column);\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t this.getPosition = function() {\n\t return this.$clipPositionToDocument(this.row, this.column);\n\t };\n\t this.getDocument = function() {\n\t return this.document;\n\t };\n\t this.$insertRight = false;\n\t this.onChange = function(delta) {\n\t if (delta.start.row == delta.end.row && delta.start.row != this.row)\n\t return;\n\t\n\t if (delta.start.row > this.row)\n\t return;\n\t \n\t var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n\t this.setPosition(point.row, point.column, true);\n\t };\n\t \n\t function $pointsInOrder(point1, point2, equalPointsInOrder) {\n\t var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n\t return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n\t }\n\t \n\t function $getTransformedPoint(delta, point, moveIfEqual) {\n\t var deltaIsInsert = delta.action == \"insert\";\n\t var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n\t var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n\t var deltaStart = delta.start;\n\t var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n\t if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n\t return {\n\t row: point.row,\n\t column: point.column\n\t };\n\t }\n\t if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n\t return {\n\t row: point.row + deltaRowShift,\n\t column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n\t };\n\t }\n\t \n\t return {\n\t row: deltaStart.row,\n\t column: deltaStart.column\n\t };\n\t }\n\t this.setPosition = function(row, column, noClip) {\n\t var pos;\n\t if (noClip) {\n\t pos = {\n\t row: row,\n\t column: column\n\t };\n\t } else {\n\t pos = this.$clipPositionToDocument(row, column);\n\t }\n\t\n\t if (this.row == pos.row && this.column == pos.column)\n\t return;\n\t\n\t var old = {\n\t row: this.row,\n\t column: this.column\n\t };\n\t\n\t this.row = pos.row;\n\t this.column = pos.column;\n\t this._signal(\"change\", {\n\t old: old,\n\t value: pos\n\t });\n\t };\n\t this.detach = function() {\n\t this.document.removeEventListener(\"change\", this.$onChange);\n\t };\n\t this.attach = function(doc) {\n\t this.document = doc || this.document;\n\t this.document.on(\"change\", this.$onChange);\n\t };\n\t this.$clipPositionToDocument = function(row, column) {\n\t var pos = {};\n\t\n\t if (row >= this.document.getLength()) {\n\t pos.row = Math.max(0, this.document.getLength() - 1);\n\t pos.column = this.document.getLine(pos.row).length;\n\t }\n\t else if (row < 0) {\n\t pos.row = 0;\n\t pos.column = 0;\n\t }\n\t else {\n\t pos.row = row;\n\t pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n\t }\n\t\n\t if (column < 0)\n\t pos.column = 0;\n\t\n\t return pos;\n\t };\n\t\n\t}).call(Anchor.prototype);\n\t\n\t});\n\t\n\tace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar applyDelta = acequire(\"./apply_delta\").applyDelta;\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar Range = acequire(\"./range\").Range;\n\tvar Anchor = acequire(\"./anchor\").Anchor;\n\t\n\tvar Document = function(textOrLines) {\n\t this.$lines = [\"\"];\n\t if (textOrLines.length === 0) {\n\t this.$lines = [\"\"];\n\t } else if (Array.isArray(textOrLines)) {\n\t this.insertMergedLines({row: 0, column: 0}, textOrLines);\n\t } else {\n\t this.insert({row: 0, column:0}, textOrLines);\n\t }\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t this.setValue = function(text) {\n\t var len = this.getLength() - 1;\n\t this.remove(new Range(0, 0, len, this.getLine(len).length));\n\t this.insert({row: 0, column: 0}, text);\n\t };\n\t this.getValue = function() {\n\t return this.getAllLines().join(this.getNewLineCharacter());\n\t };\n\t this.createAnchor = function(row, column) {\n\t return new Anchor(this, row, column);\n\t };\n\t if (\"aaa\".split(/a/).length === 0) {\n\t this.$split = function(text) {\n\t return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n\t };\n\t } else {\n\t this.$split = function(text) {\n\t return text.split(/\\r\\n|\\r|\\n/);\n\t };\n\t }\n\t\n\t\n\t this.$detectNewLine = function(text) {\n\t var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n\t this.$autoNewLine = match ? match[1] : \"\\n\";\n\t this._signal(\"changeNewLineMode\");\n\t };\n\t this.getNewLineCharacter = function() {\n\t switch (this.$newLineMode) {\n\t case \"windows\":\n\t return \"\\r\\n\";\n\t case \"unix\":\n\t return \"\\n\";\n\t default:\n\t return this.$autoNewLine || \"\\n\";\n\t }\n\t };\n\t\n\t this.$autoNewLine = \"\";\n\t this.$newLineMode = \"auto\";\n\t this.setNewLineMode = function(newLineMode) {\n\t if (this.$newLineMode === newLineMode)\n\t return;\n\t\n\t this.$newLineMode = newLineMode;\n\t this._signal(\"changeNewLineMode\");\n\t };\n\t this.getNewLineMode = function() {\n\t return this.$newLineMode;\n\t };\n\t this.isNewLine = function(text) {\n\t return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n\t };\n\t this.getLine = function(row) {\n\t return this.$lines[row] || \"\";\n\t };\n\t this.getLines = function(firstRow, lastRow) {\n\t return this.$lines.slice(firstRow, lastRow + 1);\n\t };\n\t this.getAllLines = function() {\n\t return this.getLines(0, this.getLength());\n\t };\n\t this.getLength = function() {\n\t return this.$lines.length;\n\t };\n\t this.getTextRange = function(range) {\n\t return this.getLinesForRange(range).join(this.getNewLineCharacter());\n\t };\n\t this.getLinesForRange = function(range) {\n\t var lines;\n\t if (range.start.row === range.end.row) {\n\t lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n\t } else {\n\t lines = this.getLines(range.start.row, range.end.row);\n\t lines[0] = (lines[0] || \"\").substring(range.start.column);\n\t var l = lines.length - 1;\n\t if (range.end.row - range.start.row == l)\n\t lines[l] = lines[l].substring(0, range.end.column);\n\t }\n\t return lines;\n\t };\n\t this.insertLines = function(row, lines) {\n\t console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n\t return this.insertFullLines(row, lines);\n\t };\n\t this.removeLines = function(firstRow, lastRow) {\n\t console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n\t return this.removeFullLines(firstRow, lastRow);\n\t };\n\t this.insertNewLine = function(position) {\n\t console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\\'\\', \\'\\']) instead.\");\n\t return this.insertMergedLines(position, [\"\", \"\"]);\n\t };\n\t this.insert = function(position, text) {\n\t if (this.getLength() <= 1)\n\t this.$detectNewLine(text);\n\t \n\t return this.insertMergedLines(position, this.$split(text));\n\t };\n\t this.insertInLine = function(position, text) {\n\t var start = this.clippedPos(position.row, position.column);\n\t var end = this.pos(position.row, position.column + text.length);\n\t \n\t this.applyDelta({\n\t start: start,\n\t end: end,\n\t action: \"insert\",\n\t lines: [text]\n\t }, true);\n\t \n\t return this.clonePos(end);\n\t };\n\t \n\t this.clippedPos = function(row, column) {\n\t var length = this.getLength();\n\t if (row === undefined) {\n\t row = length;\n\t } else if (row < 0) {\n\t row = 0;\n\t } else if (row >= length) {\n\t row = length - 1;\n\t column = undefined;\n\t }\n\t var line = this.getLine(row);\n\t if (column == undefined)\n\t column = line.length;\n\t column = Math.min(Math.max(column, 0), line.length);\n\t return {row: row, column: column};\n\t };\n\t \n\t this.clonePos = function(pos) {\n\t return {row: pos.row, column: pos.column};\n\t };\n\t \n\t this.pos = function(row, column) {\n\t return {row: row, column: column};\n\t };\n\t \n\t this.$clipPosition = function(position) {\n\t var length = this.getLength();\n\t if (position.row >= length) {\n\t position.row = Math.max(0, length - 1);\n\t position.column = this.getLine(length - 1).length;\n\t } else {\n\t position.row = Math.max(0, position.row);\n\t position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n\t }\n\t return position;\n\t };\n\t this.insertFullLines = function(row, lines) {\n\t row = Math.min(Math.max(row, 0), this.getLength());\n\t var column = 0;\n\t if (row < this.getLength()) {\n\t lines = lines.concat([\"\"]);\n\t column = 0;\n\t } else {\n\t lines = [\"\"].concat(lines);\n\t row--;\n\t column = this.$lines[row].length;\n\t }\n\t this.insertMergedLines({row: row, column: column}, lines);\n\t }; \n\t this.insertMergedLines = function(position, lines) {\n\t var start = this.clippedPos(position.row, position.column);\n\t var end = {\n\t row: start.row + lines.length - 1,\n\t column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n\t };\n\t \n\t this.applyDelta({\n\t start: start,\n\t end: end,\n\t action: \"insert\",\n\t lines: lines\n\t });\n\t \n\t return this.clonePos(end);\n\t };\n\t this.remove = function(range) {\n\t var start = this.clippedPos(range.start.row, range.start.column);\n\t var end = this.clippedPos(range.end.row, range.end.column);\n\t this.applyDelta({\n\t start: start,\n\t end: end,\n\t action: \"remove\",\n\t lines: this.getLinesForRange({start: start, end: end})\n\t });\n\t return this.clonePos(start);\n\t };\n\t this.removeInLine = function(row, startColumn, endColumn) {\n\t var start = this.clippedPos(row, startColumn);\n\t var end = this.clippedPos(row, endColumn);\n\t \n\t this.applyDelta({\n\t start: start,\n\t end: end,\n\t action: \"remove\",\n\t lines: this.getLinesForRange({start: start, end: end})\n\t }, true);\n\t \n\t return this.clonePos(start);\n\t };\n\t this.removeFullLines = function(firstRow, lastRow) {\n\t firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n\t lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n\t var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n\t var deleteLastNewLine = lastRow < this.getLength() - 1;\n\t var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n\t var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n\t var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n\t var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n\t var range = new Range(startRow, startCol, endRow, endCol);\n\t var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n\t \n\t this.applyDelta({\n\t start: range.start,\n\t end: range.end,\n\t action: \"remove\",\n\t lines: this.getLinesForRange(range)\n\t });\n\t return deletedLines;\n\t };\n\t this.removeNewLine = function(row) {\n\t if (row < this.getLength() - 1 && row >= 0) {\n\t this.applyDelta({\n\t start: this.pos(row, this.getLine(row).length),\n\t end: this.pos(row + 1, 0),\n\t action: \"remove\",\n\t lines: [\"\", \"\"]\n\t });\n\t }\n\t };\n\t this.replace = function(range, text) {\n\t if (!(range instanceof Range))\n\t range = Range.fromPoints(range.start, range.end);\n\t if (text.length === 0 && range.isEmpty())\n\t return range.start;\n\t if (text == this.getTextRange(range))\n\t return range.end;\n\t\n\t this.remove(range);\n\t var end;\n\t if (text) {\n\t end = this.insert(range.start, text);\n\t }\n\t else {\n\t end = range.start;\n\t }\n\t \n\t return end;\n\t };\n\t this.applyDeltas = function(deltas) {\n\t for (var i=0; i=0; i--) {\n\t this.revertDelta(deltas[i]);\n\t }\n\t };\n\t this.applyDelta = function(delta, doNotValidate) {\n\t var isInsert = delta.action == \"insert\";\n\t if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n\t : !Range.comparePoints(delta.start, delta.end)) {\n\t return;\n\t }\n\t \n\t if (isInsert && delta.lines.length > 20000)\n\t this.$splitAndapplyLargeDelta(delta, 20000);\n\t applyDelta(this.$lines, delta, doNotValidate);\n\t this._signal(\"change\", delta);\n\t };\n\t \n\t this.$splitAndapplyLargeDelta = function(delta, MAX) {\n\t var lines = delta.lines;\n\t var l = lines.length;\n\t var row = delta.start.row; \n\t var column = delta.start.column;\n\t var from = 0, to = 0;\n\t do {\n\t from = to;\n\t to += MAX - 1;\n\t var chunk = lines.slice(from, to);\n\t if (to > l) {\n\t delta.lines = chunk;\n\t delta.start.row = row + from;\n\t delta.start.column = column;\n\t break;\n\t }\n\t chunk.push(\"\");\n\t this.applyDelta({\n\t start: this.pos(row + from, column),\n\t end: this.pos(row + to, column = 0),\n\t action: delta.action,\n\t lines: chunk\n\t }, true);\n\t } while(true);\n\t };\n\t this.revertDelta = function(delta) {\n\t this.applyDelta({\n\t start: this.clonePos(delta.start),\n\t end: this.clonePos(delta.end),\n\t action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n\t lines: delta.lines.slice()\n\t });\n\t };\n\t this.indexToPosition = function(index, startRow) {\n\t var lines = this.$lines || this.getAllLines();\n\t var newlineLength = this.getNewLineCharacter().length;\n\t for (var i = startRow || 0, l = lines.length; i < l; i++) {\n\t index -= lines[i].length + newlineLength;\n\t if (index < 0)\n\t return {row: i, column: index + lines[i].length + newlineLength};\n\t }\n\t return {row: l-1, column: lines[l-1].length};\n\t };\n\t this.positionToIndex = function(pos, startRow) {\n\t var lines = this.$lines || this.getAllLines();\n\t var newlineLength = this.getNewLineCharacter().length;\n\t var index = 0;\n\t var row = Math.min(pos.row, lines.length);\n\t for (var i = startRow || 0; i < row; ++i)\n\t index += lines[i].length + newlineLength;\n\t\n\t return index + pos.column;\n\t };\n\t\n\t}).call(Document.prototype);\n\t\n\texports.Document = Document;\n\t});\n\t\n\tace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\t\n\tvar BackgroundTokenizer = function(tokenizer, editor) {\n\t this.running = false;\n\t this.lines = [];\n\t this.states = [];\n\t this.currentLine = 0;\n\t this.tokenizer = tokenizer;\n\t\n\t var self = this;\n\t\n\t this.$worker = function() {\n\t if (!self.running) { return; }\n\t\n\t var workerStart = new Date();\n\t var currentLine = self.currentLine;\n\t var endLine = -1;\n\t var doc = self.doc;\n\t\n\t var startLine = currentLine;\n\t while (self.lines[currentLine])\n\t currentLine++;\n\t \n\t var len = doc.getLength();\n\t var processedLines = 0;\n\t self.running = false;\n\t while (currentLine < len) {\n\t self.$tokenizeRow(currentLine);\n\t endLine = currentLine;\n\t do {\n\t currentLine++;\n\t } while (self.lines[currentLine]);\n\t processedLines ++;\n\t if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { \n\t self.running = setTimeout(self.$worker, 20);\n\t break;\n\t }\n\t }\n\t self.currentLine = currentLine;\n\t \n\t if (startLine <= endLine)\n\t self.fireUpdateEvent(startLine, endLine);\n\t };\n\t};\n\t\n\t(function(){\n\t\n\t oop.implement(this, EventEmitter);\n\t this.setTokenizer = function(tokenizer) {\n\t this.tokenizer = tokenizer;\n\t this.lines = [];\n\t this.states = [];\n\t\n\t this.start(0);\n\t };\n\t this.setDocument = function(doc) {\n\t this.doc = doc;\n\t this.lines = [];\n\t this.states = [];\n\t\n\t this.stop();\n\t };\n\t this.fireUpdateEvent = function(firstRow, lastRow) {\n\t var data = {\n\t first: firstRow,\n\t last: lastRow\n\t };\n\t this._signal(\"update\", {data: data});\n\t };\n\t this.start = function(startRow) {\n\t this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n\t this.lines.splice(this.currentLine, this.lines.length);\n\t this.states.splice(this.currentLine, this.states.length);\n\t\n\t this.stop();\n\t this.running = setTimeout(this.$worker, 700);\n\t };\n\t \n\t this.scheduleStart = function() {\n\t if (!this.running)\n\t this.running = setTimeout(this.$worker, 700);\n\t }\n\t\n\t this.$updateOnChange = function(delta) {\n\t var startRow = delta.start.row;\n\t var len = delta.end.row - startRow;\n\t\n\t if (len === 0) {\n\t this.lines[startRow] = null;\n\t } else if (delta.action == \"remove\") {\n\t this.lines.splice(startRow, len + 1, null);\n\t this.states.splice(startRow, len + 1, null);\n\t } else {\n\t var args = Array(len + 1);\n\t args.unshift(startRow, 1);\n\t this.lines.splice.apply(this.lines, args);\n\t this.states.splice.apply(this.states, args);\n\t }\n\t\n\t this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\t\n\t this.stop();\n\t };\n\t this.stop = function() {\n\t if (this.running)\n\t clearTimeout(this.running);\n\t this.running = false;\n\t };\n\t this.getTokens = function(row) {\n\t return this.lines[row] || this.$tokenizeRow(row);\n\t };\n\t this.getState = function(row) {\n\t if (this.currentLine == row)\n\t this.$tokenizeRow(row);\n\t return this.states[row] || \"start\";\n\t };\n\t\n\t this.$tokenizeRow = function(row) {\n\t var line = this.doc.getLine(row);\n\t var state = this.states[row - 1];\n\t\n\t var data = this.tokenizer.getLineTokens(line, state, row);\n\t\n\t if (this.states[row] + \"\" !== data.state + \"\") {\n\t this.states[row] = data.state;\n\t this.lines[row + 1] = null;\n\t if (this.currentLine > row + 1)\n\t this.currentLine = row + 1;\n\t } else if (this.currentLine == row) {\n\t this.currentLine = row + 1;\n\t }\n\t\n\t return this.lines[row] = data.tokens;\n\t };\n\t\n\t}).call(BackgroundTokenizer.prototype);\n\t\n\texports.BackgroundTokenizer = BackgroundTokenizer;\n\t});\n\t\n\tace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar lang = acequire(\"./lib/lang\");\n\tvar oop = acequire(\"./lib/oop\");\n\tvar Range = acequire(\"./range\").Range;\n\t\n\tvar SearchHighlight = function(regExp, clazz, type) {\n\t this.setRegexp(regExp);\n\t this.clazz = clazz;\n\t this.type = type || \"text\";\n\t};\n\t\n\t(function() {\n\t this.MAX_RANGES = 500;\n\t \n\t this.setRegexp = function(regExp) {\n\t if (this.regExp+\"\" == regExp+\"\")\n\t return;\n\t this.regExp = regExp;\n\t this.cache = [];\n\t };\n\t\n\t this.update = function(html, markerLayer, session, config) {\n\t if (!this.regExp)\n\t return;\n\t var start = config.firstRow, end = config.lastRow;\n\t\n\t for (var i = start; i <= end; i++) {\n\t var ranges = this.cache[i];\n\t if (ranges == null) {\n\t ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n\t if (ranges.length > this.MAX_RANGES)\n\t ranges = ranges.slice(0, this.MAX_RANGES);\n\t ranges = ranges.map(function(match) {\n\t return new Range(i, match.offset, i, match.offset + match.length);\n\t });\n\t this.cache[i] = ranges.length ? ranges : \"\";\n\t }\n\t\n\t for (var j = ranges.length; j --; ) {\n\t markerLayer.drawSingleLineMarker(\n\t html, ranges[j].toScreenRange(session), this.clazz, config);\n\t }\n\t }\n\t };\n\t\n\t}).call(SearchHighlight.prototype);\n\t\n\texports.SearchHighlight = SearchHighlight;\n\t});\n\t\n\tace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"../range\").Range;\n\tfunction FoldLine(foldData, folds) {\n\t this.foldData = foldData;\n\t if (Array.isArray(folds)) {\n\t this.folds = folds;\n\t } else {\n\t folds = this.folds = [ folds ];\n\t }\n\t\n\t var last = folds[folds.length - 1];\n\t this.range = new Range(folds[0].start.row, folds[0].start.column,\n\t last.end.row, last.end.column);\n\t this.start = this.range.start;\n\t this.end = this.range.end;\n\t\n\t this.folds.forEach(function(fold) {\n\t fold.setFoldLine(this);\n\t }, this);\n\t}\n\t\n\t(function() {\n\t this.shiftRow = function(shift) {\n\t this.start.row += shift;\n\t this.end.row += shift;\n\t this.folds.forEach(function(fold) {\n\t fold.start.row += shift;\n\t fold.end.row += shift;\n\t });\n\t };\n\t\n\t this.addFold = function(fold) {\n\t if (fold.sameRow) {\n\t if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n\t throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n\t }\n\t this.folds.push(fold);\n\t this.folds.sort(function(a, b) {\n\t return -a.range.compareEnd(b.start.row, b.start.column);\n\t });\n\t if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n\t this.end.row = fold.end.row;\n\t this.end.column = fold.end.column;\n\t } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n\t this.start.row = fold.start.row;\n\t this.start.column = fold.start.column;\n\t }\n\t } else if (fold.start.row == this.end.row) {\n\t this.folds.push(fold);\n\t this.end.row = fold.end.row;\n\t this.end.column = fold.end.column;\n\t } else if (fold.end.row == this.start.row) {\n\t this.folds.unshift(fold);\n\t this.start.row = fold.start.row;\n\t this.start.column = fold.start.column;\n\t } else {\n\t throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n\t }\n\t fold.foldLine = this;\n\t };\n\t\n\t this.containsRow = function(row) {\n\t return row >= this.start.row && row <= this.end.row;\n\t };\n\t\n\t this.walk = function(callback, endRow, endColumn) {\n\t var lastEnd = 0,\n\t folds = this.folds,\n\t fold,\n\t cmp, stop, isNewRow = true;\n\t\n\t if (endRow == null) {\n\t endRow = this.end.row;\n\t endColumn = this.end.column;\n\t }\n\t\n\t for (var i = 0; i < folds.length; i++) {\n\t fold = folds[i];\n\t\n\t cmp = fold.range.compareStart(endRow, endColumn);\n\t if (cmp == -1) {\n\t callback(null, endRow, endColumn, lastEnd, isNewRow);\n\t return;\n\t }\n\t\n\t stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n\t stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n\t if (stop || cmp === 0) {\n\t return;\n\t }\n\t isNewRow = !fold.sameRow;\n\t lastEnd = fold.end.column;\n\t }\n\t callback(null, endRow, endColumn, lastEnd, isNewRow);\n\t };\n\t\n\t this.getNextFoldTo = function(row, column) {\n\t var fold, cmp;\n\t for (var i = 0; i < this.folds.length; i++) {\n\t fold = this.folds[i];\n\t cmp = fold.range.compareEnd(row, column);\n\t if (cmp == -1) {\n\t return {\n\t fold: fold,\n\t kind: \"after\"\n\t };\n\t } else if (cmp === 0) {\n\t return {\n\t fold: fold,\n\t kind: \"inside\"\n\t };\n\t }\n\t }\n\t return null;\n\t };\n\t\n\t this.addRemoveChars = function(row, column, len) {\n\t var ret = this.getNextFoldTo(row, column),\n\t fold, folds;\n\t if (ret) {\n\t fold = ret.fold;\n\t if (ret.kind == \"inside\"\n\t && fold.start.column != column\n\t && fold.start.row != row)\n\t {\n\t window.console && window.console.log(row, column, fold);\n\t } else if (fold.start.row == row) {\n\t folds = this.folds;\n\t var i = folds.indexOf(fold);\n\t if (i === 0) {\n\t this.start.column += len;\n\t }\n\t for (i; i < folds.length; i++) {\n\t fold = folds[i];\n\t fold.start.column += len;\n\t if (!fold.sameRow) {\n\t return;\n\t }\n\t fold.end.column += len;\n\t }\n\t this.end.column += len;\n\t }\n\t }\n\t };\n\t\n\t this.split = function(row, column) {\n\t var pos = this.getNextFoldTo(row, column);\n\t \n\t if (!pos || pos.kind == \"inside\")\n\t return null;\n\t \n\t var fold = pos.fold;\n\t var folds = this.folds;\n\t var foldData = this.foldData;\n\t \n\t var i = folds.indexOf(fold);\n\t var foldBefore = folds[i - 1];\n\t this.end.row = foldBefore.end.row;\n\t this.end.column = foldBefore.end.column;\n\t folds = folds.splice(i, folds.length - i);\n\t\n\t var newFoldLine = new FoldLine(foldData, folds);\n\t foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n\t return newFoldLine;\n\t };\n\t\n\t this.merge = function(foldLineNext) {\n\t var folds = foldLineNext.folds;\n\t for (var i = 0; i < folds.length; i++) {\n\t this.addFold(folds[i]);\n\t }\n\t var foldData = this.foldData;\n\t foldData.splice(foldData.indexOf(foldLineNext), 1);\n\t };\n\t\n\t this.toString = function() {\n\t var ret = [this.range.toString() + \": [\" ];\n\t\n\t this.folds.forEach(function(fold) {\n\t ret.push(\" \" + fold.toString());\n\t });\n\t ret.push(\"]\");\n\t return ret.join(\"\\n\");\n\t };\n\t\n\t this.idxToPosition = function(idx) {\n\t var lastFoldEndColumn = 0;\n\t\n\t for (var i = 0; i < this.folds.length; i++) {\n\t var fold = this.folds[i];\n\t\n\t idx -= fold.start.column - lastFoldEndColumn;\n\t if (idx < 0) {\n\t return {\n\t row: fold.start.row,\n\t column: fold.start.column + idx\n\t };\n\t }\n\t\n\t idx -= fold.placeholder.length;\n\t if (idx < 0) {\n\t return fold.start;\n\t }\n\t\n\t lastFoldEndColumn = fold.end.column;\n\t }\n\t\n\t return {\n\t row: this.end.row,\n\t column: this.end.column + idx\n\t };\n\t };\n\t}).call(FoldLine.prototype);\n\t\n\texports.FoldLine = FoldLine;\n\t});\n\t\n\tace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\tvar Range = acequire(\"./range\").Range;\n\tvar comparePoints = Range.comparePoints;\n\t\n\tvar RangeList = function() {\n\t this.ranges = [];\n\t};\n\t\n\t(function() {\n\t this.comparePoints = comparePoints;\n\t\n\t this.pointIndex = function(pos, excludeEdges, startIndex) {\n\t var list = this.ranges;\n\t\n\t for (var i = startIndex || 0; i < list.length; i++) {\n\t var range = list[i];\n\t var cmpEnd = comparePoints(pos, range.end);\n\t if (cmpEnd > 0)\n\t continue;\n\t var cmpStart = comparePoints(pos, range.start);\n\t if (cmpEnd === 0)\n\t return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n\t if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n\t return i;\n\t\n\t return -i-1;\n\t }\n\t return -i - 1;\n\t };\n\t\n\t this.add = function(range) {\n\t var excludeEdges = !range.isEmpty();\n\t var startIndex = this.pointIndex(range.start, excludeEdges);\n\t if (startIndex < 0)\n\t startIndex = -startIndex - 1;\n\t\n\t var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\t\n\t if (endIndex < 0)\n\t endIndex = -endIndex - 1;\n\t else\n\t endIndex++;\n\t return this.ranges.splice(startIndex, endIndex - startIndex, range);\n\t };\n\t\n\t this.addList = function(list) {\n\t var removed = [];\n\t for (var i = list.length; i--; ) {\n\t removed.push.apply(removed, this.add(list[i]));\n\t }\n\t return removed;\n\t };\n\t\n\t this.substractPoint = function(pos) {\n\t var i = this.pointIndex(pos);\n\t\n\t if (i >= 0)\n\t return this.ranges.splice(i, 1);\n\t };\n\t this.merge = function() {\n\t var removed = [];\n\t var list = this.ranges;\n\t \n\t list = list.sort(function(a, b) {\n\t return comparePoints(a.start, b.start);\n\t });\n\t \n\t var next = list[0], range;\n\t for (var i = 1; i < list.length; i++) {\n\t range = next;\n\t next = list[i];\n\t var cmp = comparePoints(range.end, next.start);\n\t if (cmp < 0)\n\t continue;\n\t\n\t if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n\t continue;\n\t\n\t if (comparePoints(range.end, next.end) < 0) {\n\t range.end.row = next.end.row;\n\t range.end.column = next.end.column;\n\t }\n\t\n\t list.splice(i, 1);\n\t removed.push(next);\n\t next = range;\n\t i--;\n\t }\n\t \n\t this.ranges = list;\n\t\n\t return removed;\n\t };\n\t\n\t this.contains = function(row, column) {\n\t return this.pointIndex({row: row, column: column}) >= 0;\n\t };\n\t\n\t this.containsPoint = function(pos) {\n\t return this.pointIndex(pos) >= 0;\n\t };\n\t\n\t this.rangeAtPoint = function(pos) {\n\t var i = this.pointIndex(pos);\n\t if (i >= 0)\n\t return this.ranges[i];\n\t };\n\t\n\t\n\t this.clipRows = function(startRow, endRow) {\n\t var list = this.ranges;\n\t if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n\t return [];\n\t\n\t var startIndex = this.pointIndex({row: startRow, column: 0});\n\t if (startIndex < 0)\n\t startIndex = -startIndex - 1;\n\t var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n\t if (endIndex < 0)\n\t endIndex = -endIndex - 1;\n\t\n\t var clipped = [];\n\t for (var i = startIndex; i < endIndex; i++) {\n\t clipped.push(list[i]);\n\t }\n\t return clipped;\n\t };\n\t\n\t this.removeAll = function() {\n\t return this.ranges.splice(0, this.ranges.length);\n\t };\n\t\n\t this.attach = function(session) {\n\t if (this.session)\n\t this.detach();\n\t\n\t this.session = session;\n\t this.onChange = this.$onChange.bind(this);\n\t\n\t this.session.on('change', this.onChange);\n\t };\n\t\n\t this.detach = function() {\n\t if (!this.session)\n\t return;\n\t this.session.removeListener('change', this.onChange);\n\t this.session = null;\n\t };\n\t\n\t this.$onChange = function(delta) {\n\t if (delta.action == \"insert\"){\n\t var start = delta.start;\n\t var end = delta.end;\n\t } else {\n\t var end = delta.start;\n\t var start = delta.end;\n\t }\n\t var startRow = start.row;\n\t var endRow = end.row;\n\t var lineDif = endRow - startRow;\n\t\n\t var colDiff = -start.column + end.column;\n\t var ranges = this.ranges;\n\t\n\t for (var i = 0, n = ranges.length; i < n; i++) {\n\t var r = ranges[i];\n\t if (r.end.row < startRow)\n\t continue;\n\t if (r.start.row > startRow)\n\t break;\n\t\n\t if (r.start.row == startRow && r.start.column >= start.column ) {\n\t if (r.start.column == start.column && this.$insertRight) {\n\t } else {\n\t r.start.column += colDiff;\n\t r.start.row += lineDif;\n\t }\n\t }\n\t if (r.end.row == startRow && r.end.column >= start.column) {\n\t if (r.end.column == start.column && this.$insertRight) {\n\t continue;\n\t }\n\t if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \n\t if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n\t r.end.column -= colDiff;\n\t }\n\t r.end.column += colDiff;\n\t r.end.row += lineDif;\n\t }\n\t }\n\t\n\t if (lineDif != 0 && i < n) {\n\t for (; i < n; i++) {\n\t var r = ranges[i];\n\t r.start.row += lineDif;\n\t r.end.row += lineDif;\n\t }\n\t }\n\t };\n\t\n\t}).call(RangeList.prototype);\n\t\n\texports.RangeList = RangeList;\n\t});\n\t\n\tace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"../range\").Range;\n\tvar RangeList = acequire(\"../range_list\").RangeList;\n\tvar oop = acequire(\"../lib/oop\")\n\tvar Fold = exports.Fold = function(range, placeholder) {\n\t this.foldLine = null;\n\t this.placeholder = placeholder;\n\t this.range = range;\n\t this.start = range.start;\n\t this.end = range.end;\n\t\n\t this.sameRow = range.start.row == range.end.row;\n\t this.subFolds = this.ranges = [];\n\t};\n\t\n\toop.inherits(Fold, RangeList);\n\t\n\t(function() {\n\t\n\t this.toString = function() {\n\t return '\"' + this.placeholder + '\" ' + this.range.toString();\n\t };\n\t\n\t this.setFoldLine = function(foldLine) {\n\t this.foldLine = foldLine;\n\t this.subFolds.forEach(function(fold) {\n\t fold.setFoldLine(foldLine);\n\t });\n\t };\n\t\n\t this.clone = function() {\n\t var range = this.range.clone();\n\t var fold = new Fold(range, this.placeholder);\n\t this.subFolds.forEach(function(subFold) {\n\t fold.subFolds.push(subFold.clone());\n\t });\n\t fold.collapseChildren = this.collapseChildren;\n\t return fold;\n\t };\n\t\n\t this.addSubFold = function(fold) {\n\t if (this.range.isEqual(fold))\n\t return;\n\t\n\t if (!this.range.containsRange(fold))\n\t throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\t consumeRange(fold, this.start);\n\t\n\t var row = fold.start.row, column = fold.start.column;\n\t for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n\t cmp = this.subFolds[i].range.compare(row, column);\n\t if (cmp != 1)\n\t break;\n\t }\n\t var afterStart = this.subFolds[i];\n\t\n\t if (cmp == 0)\n\t return afterStart.addSubFold(fold);\n\t var row = fold.range.end.row, column = fold.range.end.column;\n\t for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n\t cmp = this.subFolds[j].range.compare(row, column);\n\t if (cmp != 1)\n\t break;\n\t }\n\t var afterEnd = this.subFolds[j];\n\t\n\t if (cmp == 0)\n\t throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\t\n\t var consumedFolds = this.subFolds.splice(i, j - i, fold);\n\t fold.setFoldLine(this.foldLine);\n\t\n\t return fold;\n\t };\n\t \n\t this.restoreRange = function(range) {\n\t return restoreRange(range, this.start);\n\t };\n\t\n\t}).call(Fold.prototype);\n\t\n\tfunction consumePoint(point, anchor) {\n\t point.row -= anchor.row;\n\t if (point.row == 0)\n\t point.column -= anchor.column;\n\t}\n\tfunction consumeRange(range, anchor) {\n\t consumePoint(range.start, anchor);\n\t consumePoint(range.end, anchor);\n\t}\n\tfunction restorePoint(point, anchor) {\n\t if (point.row == 0)\n\t point.column += anchor.column;\n\t point.row += anchor.row;\n\t}\n\tfunction restoreRange(range, anchor) {\n\t restorePoint(range.start, anchor);\n\t restorePoint(range.end, anchor);\n\t}\n\t\n\t});\n\t\n\tace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"../range\").Range;\n\tvar FoldLine = acequire(\"./fold_line\").FoldLine;\n\tvar Fold = acequire(\"./fold\").Fold;\n\tvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\t\n\tfunction Folding() {\n\t this.getFoldAt = function(row, column, side) {\n\t var foldLine = this.getFoldLine(row);\n\t if (!foldLine)\n\t return null;\n\t\n\t var folds = foldLine.folds;\n\t for (var i = 0; i < folds.length; i++) {\n\t var fold = folds[i];\n\t if (fold.range.contains(row, column)) {\n\t if (side == 1 && fold.range.isEnd(row, column)) {\n\t continue;\n\t } else if (side == -1 && fold.range.isStart(row, column)) {\n\t continue;\n\t }\n\t return fold;\n\t }\n\t }\n\t };\n\t this.getFoldsInRange = function(range) {\n\t var start = range.start;\n\t var end = range.end;\n\t var foldLines = this.$foldData;\n\t var foundFolds = [];\n\t\n\t start.column += 1;\n\t end.column -= 1;\n\t\n\t for (var i = 0; i < foldLines.length; i++) {\n\t var cmp = foldLines[i].range.compareRange(range);\n\t if (cmp == 2) {\n\t continue;\n\t }\n\t else if (cmp == -2) {\n\t break;\n\t }\n\t\n\t var folds = foldLines[i].folds;\n\t for (var j = 0; j < folds.length; j++) {\n\t var fold = folds[j];\n\t cmp = fold.range.compareRange(range);\n\t if (cmp == -2) {\n\t break;\n\t } else if (cmp == 2) {\n\t continue;\n\t } else\n\t if (cmp == 42) {\n\t break;\n\t }\n\t foundFolds.push(fold);\n\t }\n\t }\n\t start.column -= 1;\n\t end.column += 1;\n\t\n\t return foundFolds;\n\t };\n\t\n\t this.getFoldsInRangeList = function(ranges) {\n\t if (Array.isArray(ranges)) {\n\t var folds = [];\n\t ranges.forEach(function(range) {\n\t folds = folds.concat(this.getFoldsInRange(range));\n\t }, this);\n\t } else {\n\t var folds = this.getFoldsInRange(ranges);\n\t }\n\t return folds;\n\t };\n\t this.getAllFolds = function() {\n\t var folds = [];\n\t var foldLines = this.$foldData;\n\t \n\t for (var i = 0; i < foldLines.length; i++)\n\t for (var j = 0; j < foldLines[i].folds.length; j++)\n\t folds.push(foldLines[i].folds[j]);\n\t\n\t return folds;\n\t };\n\t this.getFoldStringAt = function(row, column, trim, foldLine) {\n\t foldLine = foldLine || this.getFoldLine(row);\n\t if (!foldLine)\n\t return null;\n\t\n\t var lastFold = {\n\t end: { column: 0 }\n\t };\n\t var str, fold;\n\t for (var i = 0; i < foldLine.folds.length; i++) {\n\t fold = foldLine.folds[i];\n\t var cmp = fold.range.compareEnd(row, column);\n\t if (cmp == -1) {\n\t str = this\n\t .getLine(fold.start.row)\n\t .substring(lastFold.end.column, fold.start.column);\n\t break;\n\t }\n\t else if (cmp === 0) {\n\t return null;\n\t }\n\t lastFold = fold;\n\t }\n\t if (!str)\n\t str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\t\n\t if (trim == -1)\n\t return str.substring(0, column - lastFold.end.column);\n\t else if (trim == 1)\n\t return str.substring(column - lastFold.end.column);\n\t else\n\t return str;\n\t };\n\t\n\t this.getFoldLine = function(docRow, startFoldLine) {\n\t var foldData = this.$foldData;\n\t var i = 0;\n\t if (startFoldLine)\n\t i = foldData.indexOf(startFoldLine);\n\t if (i == -1)\n\t i = 0;\n\t for (i; i < foldData.length; i++) {\n\t var foldLine = foldData[i];\n\t if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n\t return foldLine;\n\t } else if (foldLine.end.row > docRow) {\n\t return null;\n\t }\n\t }\n\t return null;\n\t };\n\t this.getNextFoldLine = function(docRow, startFoldLine) {\n\t var foldData = this.$foldData;\n\t var i = 0;\n\t if (startFoldLine)\n\t i = foldData.indexOf(startFoldLine);\n\t if (i == -1)\n\t i = 0;\n\t for (i; i < foldData.length; i++) {\n\t var foldLine = foldData[i];\n\t if (foldLine.end.row >= docRow) {\n\t return foldLine;\n\t }\n\t }\n\t return null;\n\t };\n\t\n\t this.getFoldedRowCount = function(first, last) {\n\t var foldData = this.$foldData, rowCount = last-first+1;\n\t for (var i = 0; i < foldData.length; i++) {\n\t var foldLine = foldData[i],\n\t end = foldLine.end.row,\n\t start = foldLine.start.row;\n\t if (end >= last) {\n\t if (start < last) {\n\t if (start >= first)\n\t rowCount -= last-start;\n\t else\n\t rowCount = 0; // in one fold\n\t }\n\t break;\n\t } else if (end >= first){\n\t if (start >= first) // fold inside range\n\t rowCount -= end-start;\n\t else\n\t rowCount -= end-first+1;\n\t }\n\t }\n\t return rowCount;\n\t };\n\t\n\t this.$addFoldLine = function(foldLine) {\n\t this.$foldData.push(foldLine);\n\t this.$foldData.sort(function(a, b) {\n\t return a.start.row - b.start.row;\n\t });\n\t return foldLine;\n\t };\n\t this.addFold = function(placeholder, range) {\n\t var foldData = this.$foldData;\n\t var added = false;\n\t var fold;\n\t \n\t if (placeholder instanceof Fold)\n\t fold = placeholder;\n\t else {\n\t fold = new Fold(range, placeholder);\n\t fold.collapseChildren = range.collapseChildren;\n\t }\n\t this.$clipRangeToDocument(fold.range);\n\t\n\t var startRow = fold.start.row;\n\t var startColumn = fold.start.column;\n\t var endRow = fold.end.row;\n\t var endColumn = fold.end.column;\n\t if (!(startRow < endRow || \n\t startRow == endRow && startColumn <= endColumn - 2))\n\t throw new Error(\"The range has to be at least 2 characters width\");\n\t\n\t var startFold = this.getFoldAt(startRow, startColumn, 1);\n\t var endFold = this.getFoldAt(endRow, endColumn, -1);\n\t if (startFold && endFold == startFold)\n\t return startFold.addSubFold(fold);\n\t\n\t if (startFold && !startFold.range.isStart(startRow, startColumn))\n\t this.removeFold(startFold);\n\t \n\t if (endFold && !endFold.range.isEnd(endRow, endColumn))\n\t this.removeFold(endFold);\n\t var folds = this.getFoldsInRange(fold.range);\n\t if (folds.length > 0) {\n\t this.removeFolds(folds);\n\t folds.forEach(function(subFold) {\n\t fold.addSubFold(subFold);\n\t });\n\t }\n\t\n\t for (var i = 0; i < foldData.length; i++) {\n\t var foldLine = foldData[i];\n\t if (endRow == foldLine.start.row) {\n\t foldLine.addFold(fold);\n\t added = true;\n\t break;\n\t } else if (startRow == foldLine.end.row) {\n\t foldLine.addFold(fold);\n\t added = true;\n\t if (!fold.sameRow) {\n\t var foldLineNext = foldData[i + 1];\n\t if (foldLineNext && foldLineNext.start.row == endRow) {\n\t foldLine.merge(foldLineNext);\n\t break;\n\t }\n\t }\n\t break;\n\t } else if (endRow <= foldLine.start.row) {\n\t break;\n\t }\n\t }\n\t\n\t if (!added)\n\t foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\t\n\t if (this.$useWrapMode)\n\t this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n\t else\n\t this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n\t this.$modified = true;\n\t this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\t\n\t return fold;\n\t };\n\t\n\t this.addFolds = function(folds) {\n\t folds.forEach(function(fold) {\n\t this.addFold(fold);\n\t }, this);\n\t };\n\t\n\t this.removeFold = function(fold) {\n\t var foldLine = fold.foldLine;\n\t var startRow = foldLine.start.row;\n\t var endRow = foldLine.end.row;\n\t\n\t var foldLines = this.$foldData;\n\t var folds = foldLine.folds;\n\t if (folds.length == 1) {\n\t foldLines.splice(foldLines.indexOf(foldLine), 1);\n\t } else\n\t if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n\t folds.pop();\n\t foldLine.end.row = folds[folds.length - 1].end.row;\n\t foldLine.end.column = folds[folds.length - 1].end.column;\n\t } else\n\t if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n\t folds.shift();\n\t foldLine.start.row = folds[0].start.row;\n\t foldLine.start.column = folds[0].start.column;\n\t } else\n\t if (fold.sameRow) {\n\t folds.splice(folds.indexOf(fold), 1);\n\t } else\n\t {\n\t var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n\t folds = newFoldLine.folds;\n\t folds.shift();\n\t newFoldLine.start.row = folds[0].start.row;\n\t newFoldLine.start.column = folds[0].start.column;\n\t }\n\t\n\t if (!this.$updating) {\n\t if (this.$useWrapMode)\n\t this.$updateWrapData(startRow, endRow);\n\t else\n\t this.$updateRowLengthCache(startRow, endRow);\n\t }\n\t this.$modified = true;\n\t this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n\t };\n\t\n\t this.removeFolds = function(folds) {\n\t var cloneFolds = [];\n\t for (var i = 0; i < folds.length; i++) {\n\t cloneFolds.push(folds[i]);\n\t }\n\t\n\t cloneFolds.forEach(function(fold) {\n\t this.removeFold(fold);\n\t }, this);\n\t this.$modified = true;\n\t };\n\t\n\t this.expandFold = function(fold) {\n\t this.removeFold(fold);\n\t fold.subFolds.forEach(function(subFold) {\n\t fold.restoreRange(subFold);\n\t this.addFold(subFold);\n\t }, this);\n\t if (fold.collapseChildren > 0) {\n\t this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n\t }\n\t fold.subFolds = [];\n\t };\n\t\n\t this.expandFolds = function(folds) {\n\t folds.forEach(function(fold) {\n\t this.expandFold(fold);\n\t }, this);\n\t };\n\t\n\t this.unfold = function(location, expandInner) {\n\t var range, folds;\n\t if (location == null) {\n\t range = new Range(0, 0, this.getLength(), 0);\n\t expandInner = true;\n\t } else if (typeof location == \"number\")\n\t range = new Range(location, 0, location, this.getLine(location).length);\n\t else if (\"row\" in location)\n\t range = Range.fromPoints(location, location);\n\t else\n\t range = location;\n\t \n\t folds = this.getFoldsInRangeList(range);\n\t if (expandInner) {\n\t this.removeFolds(folds);\n\t } else {\n\t var subFolds = folds;\n\t while (subFolds.length) {\n\t this.expandFolds(subFolds);\n\t subFolds = this.getFoldsInRangeList(range);\n\t }\n\t }\n\t if (folds.length)\n\t return folds;\n\t };\n\t this.isRowFolded = function(docRow, startFoldRow) {\n\t return !!this.getFoldLine(docRow, startFoldRow);\n\t };\n\t\n\t this.getRowFoldEnd = function(docRow, startFoldRow) {\n\t var foldLine = this.getFoldLine(docRow, startFoldRow);\n\t return foldLine ? foldLine.end.row : docRow;\n\t };\n\t\n\t this.getRowFoldStart = function(docRow, startFoldRow) {\n\t var foldLine = this.getFoldLine(docRow, startFoldRow);\n\t return foldLine ? foldLine.start.row : docRow;\n\t };\n\t\n\t this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n\t if (startRow == null)\n\t startRow = foldLine.start.row;\n\t if (startColumn == null)\n\t startColumn = 0;\n\t if (endRow == null)\n\t endRow = foldLine.end.row;\n\t if (endColumn == null)\n\t endColumn = this.getLine(endRow).length;\n\t var doc = this.doc;\n\t var textLine = \"\";\n\t\n\t foldLine.walk(function(placeholder, row, column, lastColumn) {\n\t if (row < startRow)\n\t return;\n\t if (row == startRow) {\n\t if (column < startColumn)\n\t return;\n\t lastColumn = Math.max(startColumn, lastColumn);\n\t }\n\t\n\t if (placeholder != null) {\n\t textLine += placeholder;\n\t } else {\n\t textLine += doc.getLine(row).substring(lastColumn, column);\n\t }\n\t }, endRow, endColumn);\n\t return textLine;\n\t };\n\t\n\t this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n\t var foldLine = this.getFoldLine(row);\n\t\n\t if (!foldLine) {\n\t var line;\n\t line = this.doc.getLine(row);\n\t return line.substring(startColumn || 0, endColumn || line.length);\n\t } else {\n\t return this.getFoldDisplayLine(\n\t foldLine, row, endColumn, startRow, startColumn);\n\t }\n\t };\n\t\n\t this.$cloneFoldData = function() {\n\t var fd = [];\n\t fd = this.$foldData.map(function(foldLine) {\n\t var folds = foldLine.folds.map(function(fold) {\n\t return fold.clone();\n\t });\n\t return new FoldLine(fd, folds);\n\t });\n\t\n\t return fd;\n\t };\n\t\n\t this.toggleFold = function(tryToUnfold) {\n\t var selection = this.selection;\n\t var range = selection.getRange();\n\t var fold;\n\t var bracketPos;\n\t\n\t if (range.isEmpty()) {\n\t var cursor = range.start;\n\t fold = this.getFoldAt(cursor.row, cursor.column);\n\t\n\t if (fold) {\n\t this.expandFold(fold);\n\t return;\n\t } else if (bracketPos = this.findMatchingBracket(cursor)) {\n\t if (range.comparePoint(bracketPos) == 1) {\n\t range.end = bracketPos;\n\t } else {\n\t range.start = bracketPos;\n\t range.start.column++;\n\t range.end.column--;\n\t }\n\t } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n\t if (range.comparePoint(bracketPos) == 1)\n\t range.end = bracketPos;\n\t else\n\t range.start = bracketPos;\n\t\n\t range.start.column++;\n\t } else {\n\t range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n\t }\n\t } else {\n\t var folds = this.getFoldsInRange(range);\n\t if (tryToUnfold && folds.length) {\n\t this.expandFolds(folds);\n\t return;\n\t } else if (folds.length == 1 ) {\n\t fold = folds[0];\n\t }\n\t }\n\t\n\t if (!fold)\n\t fold = this.getFoldAt(range.start.row, range.start.column);\n\t\n\t if (fold && fold.range.toString() == range.toString()) {\n\t this.expandFold(fold);\n\t return;\n\t }\n\t\n\t var placeholder = \"...\";\n\t if (!range.isMultiLine()) {\n\t placeholder = this.getTextRange(range);\n\t if (placeholder.length < 4)\n\t return;\n\t placeholder = placeholder.trim().substring(0, 2) + \"..\";\n\t }\n\t\n\t this.addFold(placeholder, range);\n\t };\n\t\n\t this.getCommentFoldRange = function(row, column, dir) {\n\t var iterator = new TokenIterator(this, row, column);\n\t var token = iterator.getCurrentToken();\n\t if (token && /^comment|string/.test(token.type)) {\n\t var range = new Range();\n\t var re = new RegExp(token.type.replace(/\\..*/, \"\\\\.\"));\n\t if (dir != 1) {\n\t do {\n\t token = iterator.stepBackward();\n\t } while (token && re.test(token.type));\n\t iterator.stepForward();\n\t }\n\t \n\t range.start.row = iterator.getCurrentTokenRow();\n\t range.start.column = iterator.getCurrentTokenColumn() + 2;\n\t\n\t iterator = new TokenIterator(this, row, column);\n\t \n\t if (dir != -1) {\n\t do {\n\t token = iterator.stepForward();\n\t } while (token && re.test(token.type));\n\t token = iterator.stepBackward();\n\t } else\n\t token = iterator.getCurrentToken();\n\t\n\t range.end.row = iterator.getCurrentTokenRow();\n\t range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n\t return range;\n\t }\n\t };\n\t\n\t this.foldAll = function(startRow, endRow, depth) {\n\t if (depth == undefined)\n\t depth = 100000; // JSON.stringify doesn't hanle Infinity\n\t var foldWidgets = this.foldWidgets;\n\t if (!foldWidgets)\n\t return; // mode doesn't support folding\n\t endRow = endRow || this.getLength();\n\t startRow = startRow || 0;\n\t for (var row = startRow; row < endRow; row++) {\n\t if (foldWidgets[row] == null)\n\t foldWidgets[row] = this.getFoldWidget(row);\n\t if (foldWidgets[row] != \"start\")\n\t continue;\n\t\n\t var range = this.getFoldWidgetRange(row);\n\t if (range && range.isMultiLine()\n\t && range.end.row <= endRow\n\t && range.start.row >= startRow\n\t ) {\n\t row = range.end.row;\n\t try {\n\t var fold = this.addFold(\"...\", range);\n\t if (fold)\n\t fold.collapseChildren = depth;\n\t } catch(e) {}\n\t }\n\t }\n\t };\n\t this.$foldStyles = {\n\t \"manual\": 1,\n\t \"markbegin\": 1,\n\t \"markbeginend\": 1\n\t };\n\t this.$foldStyle = \"markbegin\";\n\t this.setFoldStyle = function(style) {\n\t if (!this.$foldStyles[style])\n\t throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n\t \n\t if (this.$foldStyle == style)\n\t return;\n\t\n\t this.$foldStyle = style;\n\t \n\t if (style == \"manual\")\n\t this.unfold();\n\t var mode = this.$foldMode;\n\t this.$setFolding(null);\n\t this.$setFolding(mode);\n\t };\n\t\n\t this.$setFolding = function(foldMode) {\n\t if (this.$foldMode == foldMode)\n\t return;\n\t \n\t this.$foldMode = foldMode;\n\t \n\t this.off('change', this.$updateFoldWidgets);\n\t this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n\t this._signal(\"changeAnnotation\");\n\t \n\t if (!foldMode || this.$foldStyle == \"manual\") {\n\t this.foldWidgets = null;\n\t return;\n\t }\n\t \n\t this.foldWidgets = [];\n\t this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n\t this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n\t \n\t this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n\t this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n\t this.on('change', this.$updateFoldWidgets);\n\t this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n\t };\n\t\n\t this.getParentFoldRangeData = function (row, ignoreCurrent) {\n\t var fw = this.foldWidgets;\n\t if (!fw || (ignoreCurrent && fw[row]))\n\t return {};\n\t\n\t var i = row - 1, firstRange;\n\t while (i >= 0) {\n\t var c = fw[i];\n\t if (c == null)\n\t c = fw[i] = this.getFoldWidget(i);\n\t\n\t if (c == \"start\") {\n\t var range = this.getFoldWidgetRange(i);\n\t if (!firstRange)\n\t firstRange = range;\n\t if (range && range.end.row >= row)\n\t break;\n\t }\n\t i--;\n\t }\n\t\n\t return {\n\t range: i !== -1 && range,\n\t firstRange: firstRange\n\t };\n\t };\n\t\n\t this.onFoldWidgetClick = function(row, e) {\n\t e = e.domEvent;\n\t var options = {\n\t children: e.shiftKey,\n\t all: e.ctrlKey || e.metaKey,\n\t siblings: e.altKey\n\t };\n\t \n\t var range = this.$toggleFoldWidget(row, options);\n\t if (!range) {\n\t var el = (e.target || e.srcElement);\n\t if (el && /ace_fold-widget/.test(el.className))\n\t el.className += \" ace_invalid\";\n\t }\n\t };\n\t \n\t this.$toggleFoldWidget = function(row, options) {\n\t if (!this.getFoldWidget)\n\t return;\n\t var type = this.getFoldWidget(row);\n\t var line = this.getLine(row);\n\t\n\t var dir = type === \"end\" ? -1 : 1;\n\t var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\t\n\t if (fold) {\n\t if (options.children || options.all)\n\t this.removeFold(fold);\n\t else\n\t this.expandFold(fold);\n\t return;\n\t }\n\t\n\t var range = this.getFoldWidgetRange(row, true);\n\t if (range && !range.isMultiLine()) {\n\t fold = this.getFoldAt(range.start.row, range.start.column, 1);\n\t if (fold && range.isEqual(fold.range)) {\n\t this.removeFold(fold);\n\t return;\n\t }\n\t }\n\t \n\t if (options.siblings) {\n\t var data = this.getParentFoldRangeData(row);\n\t if (data.range) {\n\t var startRow = data.range.start.row + 1;\n\t var endRow = data.range.end.row;\n\t }\n\t this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n\t } else if (options.children) {\n\t endRow = range ? range.end.row : this.getLength();\n\t this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n\t } else if (range) {\n\t if (options.all) \n\t range.collapseChildren = 10000;\n\t this.addFold(\"...\", range);\n\t }\n\t \n\t return range;\n\t };\n\t \n\t \n\t \n\t this.toggleFoldWidget = function(toggleParent) {\n\t var row = this.selection.getCursor().row;\n\t row = this.getRowFoldStart(row);\n\t var range = this.$toggleFoldWidget(row, {});\n\t \n\t if (range)\n\t return;\n\t var data = this.getParentFoldRangeData(row, true);\n\t range = data.range || data.firstRange;\n\t \n\t if (range) {\n\t row = range.start.row;\n\t var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\t\n\t if (fold) {\n\t this.removeFold(fold);\n\t } else {\n\t this.addFold(\"...\", range);\n\t }\n\t }\n\t };\n\t\n\t this.updateFoldWidgets = function(delta) {\n\t var firstRow = delta.start.row;\n\t var len = delta.end.row - firstRow;\n\t\n\t if (len === 0) {\n\t this.foldWidgets[firstRow] = null;\n\t } else if (delta.action == 'remove') {\n\t this.foldWidgets.splice(firstRow, len + 1, null);\n\t } else {\n\t var args = Array(len + 1);\n\t args.unshift(firstRow, 1);\n\t this.foldWidgets.splice.apply(this.foldWidgets, args);\n\t }\n\t };\n\t this.tokenizerUpdateFoldWidgets = function(e) {\n\t var rows = e.data;\n\t if (rows.first != rows.last) {\n\t if (this.foldWidgets.length > rows.first)\n\t this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n\t }\n\t };\n\t}\n\t\n\texports.Folding = Folding;\n\t\n\t});\n\t\n\tace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\tvar Range = acequire(\"../range\").Range;\n\t\n\t\n\tfunction BracketMatch() {\n\t\n\t this.findMatchingBracket = function(position, chr) {\n\t if (position.column == 0) return null;\n\t\n\t var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n\t if (charBeforeCursor == \"\") return null;\n\t\n\t var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n\t if (!match)\n\t return null;\n\t\n\t if (match[1])\n\t return this.$findClosingBracket(match[1], position);\n\t else\n\t return this.$findOpeningBracket(match[2], position);\n\t };\n\t \n\t this.getBracketRange = function(pos) {\n\t var line = this.getLine(pos.row);\n\t var before = true, range;\n\t\n\t var chr = line.charAt(pos.column-1);\n\t var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n\t if (!match) {\n\t chr = line.charAt(pos.column);\n\t pos = {row: pos.row, column: pos.column + 1};\n\t match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n\t before = false;\n\t }\n\t if (!match)\n\t return null;\n\t\n\t if (match[1]) {\n\t var bracketPos = this.$findClosingBracket(match[1], pos);\n\t if (!bracketPos)\n\t return null;\n\t range = Range.fromPoints(pos, bracketPos);\n\t if (!before) {\n\t range.end.column++;\n\t range.start.column--;\n\t }\n\t range.cursor = range.end;\n\t } else {\n\t var bracketPos = this.$findOpeningBracket(match[2], pos);\n\t if (!bracketPos)\n\t return null;\n\t range = Range.fromPoints(bracketPos, pos);\n\t if (!before) {\n\t range.start.column++;\n\t range.end.column--;\n\t }\n\t range.cursor = range.start;\n\t }\n\t \n\t return range;\n\t };\n\t\n\t this.$brackets = {\n\t \")\": \"(\",\n\t \"(\": \")\",\n\t \"]\": \"[\",\n\t \"[\": \"]\",\n\t \"{\": \"}\",\n\t \"}\": \"{\"\n\t };\n\t\n\t this.$findOpeningBracket = function(bracket, position, typeRe) {\n\t var openBracket = this.$brackets[bracket];\n\t var depth = 1;\n\t\n\t var iterator = new TokenIterator(this, position.row, position.column);\n\t var token = iterator.getCurrentToken();\n\t if (!token)\n\t token = iterator.stepForward();\n\t if (!token)\n\t return;\n\t \n\t if (!typeRe){\n\t typeRe = new RegExp(\n\t \"(\\\\.?\" +\n\t token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n\t .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n\t + \")+\"\n\t );\n\t }\n\t var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n\t var value = token.value;\n\t \n\t while (true) {\n\t \n\t while (valueIndex >= 0) {\n\t var chr = value.charAt(valueIndex);\n\t if (chr == openBracket) {\n\t depth -= 1;\n\t if (depth == 0) {\n\t return {row: iterator.getCurrentTokenRow(),\n\t column: valueIndex + iterator.getCurrentTokenColumn()};\n\t }\n\t }\n\t else if (chr == bracket) {\n\t depth += 1;\n\t }\n\t valueIndex -= 1;\n\t }\n\t do {\n\t token = iterator.stepBackward();\n\t } while (token && !typeRe.test(token.type));\n\t\n\t if (token == null)\n\t break;\n\t \n\t value = token.value;\n\t valueIndex = value.length - 1;\n\t }\n\t \n\t return null;\n\t };\n\t\n\t this.$findClosingBracket = function(bracket, position, typeRe) {\n\t var closingBracket = this.$brackets[bracket];\n\t var depth = 1;\n\t\n\t var iterator = new TokenIterator(this, position.row, position.column);\n\t var token = iterator.getCurrentToken();\n\t if (!token)\n\t token = iterator.stepForward();\n\t if (!token)\n\t return;\n\t\n\t if (!typeRe){\n\t typeRe = new RegExp(\n\t \"(\\\\.?\" +\n\t token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n\t .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n\t + \")+\"\n\t );\n\t }\n\t var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\t\n\t while (true) {\n\t\n\t var value = token.value;\n\t var valueLength = value.length;\n\t while (valueIndex < valueLength) {\n\t var chr = value.charAt(valueIndex);\n\t if (chr == closingBracket) {\n\t depth -= 1;\n\t if (depth == 0) {\n\t return {row: iterator.getCurrentTokenRow(),\n\t column: valueIndex + iterator.getCurrentTokenColumn()};\n\t }\n\t }\n\t else if (chr == bracket) {\n\t depth += 1;\n\t }\n\t valueIndex += 1;\n\t }\n\t do {\n\t token = iterator.stepForward();\n\t } while (token && !typeRe.test(token.type));\n\t\n\t if (token == null)\n\t break;\n\t\n\t valueIndex = 0;\n\t }\n\t \n\t return null;\n\t };\n\t}\n\texports.BracketMatch = BracketMatch;\n\t\n\t});\n\t\n\tace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar lang = acequire(\"./lib/lang\");\n\tvar config = acequire(\"./config\");\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar Selection = acequire(\"./selection\").Selection;\n\tvar TextMode = acequire(\"./mode/text\").Mode;\n\tvar Range = acequire(\"./range\").Range;\n\tvar Document = acequire(\"./document\").Document;\n\tvar BackgroundTokenizer = acequire(\"./background_tokenizer\").BackgroundTokenizer;\n\tvar SearchHighlight = acequire(\"./search_highlight\").SearchHighlight;\n\t\n\tvar EditSession = function(text, mode) {\n\t this.$breakpoints = [];\n\t this.$decorations = [];\n\t this.$frontMarkers = {};\n\t this.$backMarkers = {};\n\t this.$markerId = 1;\n\t this.$undoSelect = true;\n\t\n\t this.$foldData = [];\n\t this.$foldData.toString = function() {\n\t return this.join(\"\\n\");\n\t };\n\t this.on(\"changeFold\", this.onChangeFold.bind(this));\n\t this.$onChange = this.onChange.bind(this);\n\t\n\t if (typeof text != \"object\" || !text.getLine)\n\t text = new Document(text);\n\t\n\t this.setDocument(text);\n\t this.selection = new Selection(this);\n\t\n\t config.resetOptions(this);\n\t this.setMode(mode);\n\t config._signal(\"session\", this);\n\t};\n\t\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t this.setDocument = function(doc) {\n\t if (this.doc)\n\t this.doc.removeListener(\"change\", this.$onChange);\n\t\n\t this.doc = doc;\n\t doc.on(\"change\", this.$onChange);\n\t\n\t if (this.bgTokenizer)\n\t this.bgTokenizer.setDocument(this.getDocument());\n\t\n\t this.resetCaches();\n\t };\n\t this.getDocument = function() {\n\t return this.doc;\n\t };\n\t this.$resetRowCache = function(docRow) {\n\t if (!docRow) {\n\t this.$docRowCache = [];\n\t this.$screenRowCache = [];\n\t return;\n\t }\n\t var l = this.$docRowCache.length;\n\t var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n\t if (l > i) {\n\t this.$docRowCache.splice(i, l);\n\t this.$screenRowCache.splice(i, l);\n\t }\n\t };\n\t\n\t this.$getRowCacheIndex = function(cacheArray, val) {\n\t var low = 0;\n\t var hi = cacheArray.length - 1;\n\t\n\t while (low <= hi) {\n\t var mid = (low + hi) >> 1;\n\t var c = cacheArray[mid];\n\t\n\t if (val > c)\n\t low = mid + 1;\n\t else if (val < c)\n\t hi = mid - 1;\n\t else\n\t return mid;\n\t }\n\t\n\t return low -1;\n\t };\n\t\n\t this.resetCaches = function() {\n\t this.$modified = true;\n\t this.$wrapData = [];\n\t this.$rowLengthCache = [];\n\t this.$resetRowCache(0);\n\t if (this.bgTokenizer)\n\t this.bgTokenizer.start(0);\n\t };\n\t\n\t this.onChangeFold = function(e) {\n\t var fold = e.data;\n\t this.$resetRowCache(fold.start.row);\n\t };\n\t\n\t this.onChange = function(delta) {\n\t this.$modified = true;\n\t\n\t this.$resetRowCache(delta.start.row);\n\t\n\t var removedFolds = this.$updateInternalDataOnChange(delta);\n\t if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n\t this.$deltasDoc.push(delta);\n\t if (removedFolds && removedFolds.length != 0) {\n\t this.$deltasFold.push({\n\t action: \"removeFolds\",\n\t folds: removedFolds\n\t });\n\t }\n\t\n\t this.$informUndoManager.schedule();\n\t }\n\t\n\t this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n\t this._signal(\"change\", delta);\n\t };\n\t this.setValue = function(text) {\n\t this.doc.setValue(text);\n\t this.selection.moveTo(0, 0);\n\t\n\t this.$resetRowCache(0);\n\t this.$deltas = [];\n\t this.$deltasDoc = [];\n\t this.$deltasFold = [];\n\t this.setUndoManager(this.$undoManager);\n\t this.getUndoManager().reset();\n\t };\n\t this.getValue =\n\t this.toString = function() {\n\t return this.doc.getValue();\n\t };\n\t this.getSelection = function() {\n\t return this.selection;\n\t };\n\t this.getState = function(row) {\n\t return this.bgTokenizer.getState(row);\n\t };\n\t this.getTokens = function(row) {\n\t return this.bgTokenizer.getTokens(row);\n\t };\n\t this.getTokenAt = function(row, column) {\n\t var tokens = this.bgTokenizer.getTokens(row);\n\t var token, c = 0;\n\t if (column == null) {\n\t i = tokens.length - 1;\n\t c = this.getLine(row).length;\n\t } else {\n\t for (var i = 0; i < tokens.length; i++) {\n\t c += tokens[i].value.length;\n\t if (c >= column)\n\t break;\n\t }\n\t }\n\t token = tokens[i];\n\t if (!token)\n\t return null;\n\t token.index = i;\n\t token.start = c - token.value.length;\n\t return token;\n\t };\n\t this.setUndoManager = function(undoManager) {\n\t this.$undoManager = undoManager;\n\t this.$deltas = [];\n\t this.$deltasDoc = [];\n\t this.$deltasFold = [];\n\t\n\t if (this.$informUndoManager)\n\t this.$informUndoManager.cancel();\n\t\n\t if (undoManager) {\n\t var self = this;\n\t\n\t this.$syncInformUndoManager = function() {\n\t self.$informUndoManager.cancel();\n\t\n\t if (self.$deltasFold.length) {\n\t self.$deltas.push({\n\t group: \"fold\",\n\t deltas: self.$deltasFold\n\t });\n\t self.$deltasFold = [];\n\t }\n\t\n\t if (self.$deltasDoc.length) {\n\t self.$deltas.push({\n\t group: \"doc\",\n\t deltas: self.$deltasDoc\n\t });\n\t self.$deltasDoc = [];\n\t }\n\t\n\t if (self.$deltas.length > 0) {\n\t undoManager.execute({\n\t action: \"aceupdate\",\n\t args: [self.$deltas, self],\n\t merge: self.mergeUndoDeltas\n\t });\n\t }\n\t self.mergeUndoDeltas = false;\n\t self.$deltas = [];\n\t };\n\t this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n\t }\n\t };\n\t this.markUndoGroup = function() {\n\t if (this.$syncInformUndoManager)\n\t this.$syncInformUndoManager();\n\t };\n\t \n\t this.$defaultUndoManager = {\n\t undo: function() {},\n\t redo: function() {},\n\t reset: function() {}\n\t };\n\t this.getUndoManager = function() {\n\t return this.$undoManager || this.$defaultUndoManager;\n\t };\n\t this.getTabString = function() {\n\t if (this.getUseSoftTabs()) {\n\t return lang.stringRepeat(\" \", this.getTabSize());\n\t } else {\n\t return \"\\t\";\n\t }\n\t };\n\t this.setUseSoftTabs = function(val) {\n\t this.setOption(\"useSoftTabs\", val);\n\t };\n\t this.getUseSoftTabs = function() {\n\t return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n\t };\n\t this.setTabSize = function(tabSize) {\n\t this.setOption(\"tabSize\", tabSize);\n\t };\n\t this.getTabSize = function() {\n\t return this.$tabSize;\n\t };\n\t this.isTabStop = function(position) {\n\t return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n\t };\n\t\n\t this.$overwrite = false;\n\t this.setOverwrite = function(overwrite) {\n\t this.setOption(\"overwrite\", overwrite);\n\t };\n\t this.getOverwrite = function() {\n\t return this.$overwrite;\n\t };\n\t this.toggleOverwrite = function() {\n\t this.setOverwrite(!this.$overwrite);\n\t };\n\t this.addGutterDecoration = function(row, className) {\n\t if (!this.$decorations[row])\n\t this.$decorations[row] = \"\";\n\t this.$decorations[row] += \" \" + className;\n\t this._signal(\"changeBreakpoint\", {});\n\t };\n\t this.removeGutterDecoration = function(row, className) {\n\t this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n\t this._signal(\"changeBreakpoint\", {});\n\t };\n\t this.getBreakpoints = function() {\n\t return this.$breakpoints;\n\t };\n\t this.setBreakpoints = function(rows) {\n\t this.$breakpoints = [];\n\t for (var i=0; i 0)\n\t inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\t\n\t if (!inToken)\n\t inToken = !!line.charAt(column).match(this.tokenRe);\n\t\n\t if (inToken)\n\t var re = this.tokenRe;\n\t else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n\t var re = /\\s/;\n\t else\n\t var re = this.nonTokenRe;\n\t\n\t var start = column;\n\t if (start > 0) {\n\t do {\n\t start--;\n\t }\n\t while (start >= 0 && line.charAt(start).match(re));\n\t start++;\n\t }\n\t\n\t var end = column;\n\t while (end < line.length && line.charAt(end).match(re)) {\n\t end++;\n\t }\n\t\n\t return new Range(row, start, row, end);\n\t };\n\t this.getAWordRange = function(row, column) {\n\t var wordRange = this.getWordRange(row, column);\n\t var line = this.getLine(wordRange.end.row);\n\t\n\t while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n\t wordRange.end.column += 1;\n\t }\n\t return wordRange;\n\t };\n\t this.setNewLineMode = function(newLineMode) {\n\t this.doc.setNewLineMode(newLineMode);\n\t };\n\t this.getNewLineMode = function() {\n\t return this.doc.getNewLineMode();\n\t };\n\t this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n\t this.getUseWorker = function() { return this.$useWorker; };\n\t this.onReloadTokenizer = function(e) {\n\t var rows = e.data;\n\t this.bgTokenizer.start(rows.first);\n\t this._signal(\"tokenizerUpdate\", e);\n\t };\n\t\n\t this.$modes = {};\n\t this.$mode = null;\n\t this.$modeId = null;\n\t this.setMode = function(mode, cb) {\n\t if (mode && typeof mode === \"object\") {\n\t if (mode.getTokenizer)\n\t return this.$onChangeMode(mode);\n\t var options = mode;\n\t var path = options.path;\n\t } else {\n\t path = mode || \"ace/mode/text\";\n\t }\n\t if (!this.$modes[\"ace/mode/text\"])\n\t this.$modes[\"ace/mode/text\"] = new TextMode();\n\t\n\t if (this.$modes[path] && !options) {\n\t this.$onChangeMode(this.$modes[path]);\n\t cb && cb();\n\t return;\n\t }\n\t this.$modeId = path;\n\t config.loadModule([\"mode\", path], function(m) {\n\t if (this.$modeId !== path)\n\t return cb && cb();\n\t if (this.$modes[path] && !options) {\n\t this.$onChangeMode(this.$modes[path]);\n\t } else if (m && m.Mode) {\n\t m = new m.Mode(options);\n\t if (!options) {\n\t this.$modes[path] = m;\n\t m.$id = path;\n\t }\n\t this.$onChangeMode(m);\n\t }\n\t cb && cb();\n\t }.bind(this));\n\t if (!this.$mode)\n\t this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n\t };\n\t\n\t this.$onChangeMode = function(mode, $isPlaceholder) {\n\t if (!$isPlaceholder)\n\t this.$modeId = mode.$id;\n\t if (this.$mode === mode) \n\t return;\n\t\n\t this.$mode = mode;\n\t\n\t this.$stopWorker();\n\t\n\t if (this.$useWorker)\n\t this.$startWorker();\n\t\n\t var tokenizer = mode.getTokenizer();\n\t\n\t if(tokenizer.addEventListener !== undefined) {\n\t var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n\t tokenizer.addEventListener(\"update\", onReloadTokenizer);\n\t }\n\t\n\t if (!this.bgTokenizer) {\n\t this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n\t var _self = this;\n\t this.bgTokenizer.addEventListener(\"update\", function(e) {\n\t _self._signal(\"tokenizerUpdate\", e);\n\t });\n\t } else {\n\t this.bgTokenizer.setTokenizer(tokenizer);\n\t }\n\t\n\t this.bgTokenizer.setDocument(this.getDocument());\n\t\n\t this.tokenRe = mode.tokenRe;\n\t this.nonTokenRe = mode.nonTokenRe;\n\t\n\t \n\t if (!$isPlaceholder) {\n\t if (mode.attachToSession)\n\t mode.attachToSession(this);\n\t this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n\t this.$setFolding(mode.foldingRules);\n\t this.bgTokenizer.start(0);\n\t this._emit(\"changeMode\");\n\t }\n\t };\n\t\n\t this.$stopWorker = function() {\n\t if (this.$worker) {\n\t this.$worker.terminate();\n\t this.$worker = null;\n\t }\n\t };\n\t\n\t this.$startWorker = function() {\n\t try {\n\t this.$worker = this.$mode.createWorker(this);\n\t } catch (e) {\n\t config.warn(\"Could not load worker\", e);\n\t this.$worker = null;\n\t }\n\t };\n\t this.getMode = function() {\n\t return this.$mode;\n\t };\n\t\n\t this.$scrollTop = 0;\n\t this.setScrollTop = function(scrollTop) {\n\t if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n\t return;\n\t\n\t this.$scrollTop = scrollTop;\n\t this._signal(\"changeScrollTop\", scrollTop);\n\t };\n\t this.getScrollTop = function() {\n\t return this.$scrollTop;\n\t };\n\t\n\t this.$scrollLeft = 0;\n\t this.setScrollLeft = function(scrollLeft) {\n\t if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n\t return;\n\t\n\t this.$scrollLeft = scrollLeft;\n\t this._signal(\"changeScrollLeft\", scrollLeft);\n\t };\n\t this.getScrollLeft = function() {\n\t return this.$scrollLeft;\n\t };\n\t this.getScreenWidth = function() {\n\t this.$computeWidth();\n\t if (this.lineWidgets) \n\t return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n\t return this.screenWidth;\n\t };\n\t \n\t this.getLineWidgetMaxWidth = function() {\n\t if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n\t var width = 0;\n\t this.lineWidgets.forEach(function(w) {\n\t if (w && w.screenWidth > width)\n\t width = w.screenWidth;\n\t });\n\t return this.lineWidgetWidth = width;\n\t };\n\t\n\t this.$computeWidth = function(force) {\n\t if (this.$modified || force) {\n\t this.$modified = false;\n\t\n\t if (this.$useWrapMode)\n\t return this.screenWidth = this.$wrapLimit;\n\t\n\t var lines = this.doc.getAllLines();\n\t var cache = this.$rowLengthCache;\n\t var longestScreenLine = 0;\n\t var foldIndex = 0;\n\t var foldLine = this.$foldData[foldIndex];\n\t var foldStart = foldLine ? foldLine.start.row : Infinity;\n\t var len = lines.length;\n\t\n\t for (var i = 0; i < len; i++) {\n\t if (i > foldStart) {\n\t i = foldLine.end.row + 1;\n\t if (i >= len)\n\t break;\n\t foldLine = this.$foldData[foldIndex++];\n\t foldStart = foldLine ? foldLine.start.row : Infinity;\n\t }\n\t\n\t if (cache[i] == null)\n\t cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\t\n\t if (cache[i] > longestScreenLine)\n\t longestScreenLine = cache[i];\n\t }\n\t this.screenWidth = longestScreenLine;\n\t }\n\t };\n\t this.getLine = function(row) {\n\t return this.doc.getLine(row);\n\t };\n\t this.getLines = function(firstRow, lastRow) {\n\t return this.doc.getLines(firstRow, lastRow);\n\t };\n\t this.getLength = function() {\n\t return this.doc.getLength();\n\t };\n\t this.getTextRange = function(range) {\n\t return this.doc.getTextRange(range || this.selection.getRange());\n\t };\n\t this.insert = function(position, text) {\n\t return this.doc.insert(position, text);\n\t };\n\t this.remove = function(range) {\n\t return this.doc.remove(range);\n\t };\n\t this.removeFullLines = function(firstRow, lastRow){\n\t return this.doc.removeFullLines(firstRow, lastRow);\n\t };\n\t this.undoChanges = function(deltas, dontSelect) {\n\t if (!deltas.length)\n\t return;\n\t\n\t this.$fromUndo = true;\n\t var lastUndoRange = null;\n\t for (var i = deltas.length - 1; i != -1; i--) {\n\t var delta = deltas[i];\n\t if (delta.group == \"doc\") {\n\t this.doc.revertDeltas(delta.deltas);\n\t lastUndoRange =\n\t this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n\t } else {\n\t delta.deltas.forEach(function(foldDelta) {\n\t this.addFolds(foldDelta.folds);\n\t }, this);\n\t }\n\t }\n\t this.$fromUndo = false;\n\t lastUndoRange &&\n\t this.$undoSelect &&\n\t !dontSelect &&\n\t this.selection.setSelectionRange(lastUndoRange);\n\t return lastUndoRange;\n\t };\n\t this.redoChanges = function(deltas, dontSelect) {\n\t if (!deltas.length)\n\t return;\n\t\n\t this.$fromUndo = true;\n\t var lastUndoRange = null;\n\t for (var i = 0; i < deltas.length; i++) {\n\t var delta = deltas[i];\n\t if (delta.group == \"doc\") {\n\t this.doc.applyDeltas(delta.deltas);\n\t lastUndoRange =\n\t this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n\t }\n\t }\n\t this.$fromUndo = false;\n\t lastUndoRange &&\n\t this.$undoSelect &&\n\t !dontSelect &&\n\t this.selection.setSelectionRange(lastUndoRange);\n\t return lastUndoRange;\n\t };\n\t this.setUndoSelect = function(enable) {\n\t this.$undoSelect = enable;\n\t };\n\t\n\t this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n\t function isInsert(delta) {\n\t return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n\t }\n\t\n\t var delta = deltas[0];\n\t var range, point;\n\t var lastDeltaIsInsert = false;\n\t if (isInsert(delta)) {\n\t range = Range.fromPoints(delta.start, delta.end);\n\t lastDeltaIsInsert = true;\n\t } else {\n\t range = Range.fromPoints(delta.start, delta.start);\n\t lastDeltaIsInsert = false;\n\t }\n\t\n\t for (var i = 1; i < deltas.length; i++) {\n\t delta = deltas[i];\n\t if (isInsert(delta)) {\n\t point = delta.start;\n\t if (range.compare(point.row, point.column) == -1) {\n\t range.setStart(point);\n\t }\n\t point = delta.end;\n\t if (range.compare(point.row, point.column) == 1) {\n\t range.setEnd(point);\n\t }\n\t lastDeltaIsInsert = true;\n\t } else {\n\t point = delta.start;\n\t if (range.compare(point.row, point.column) == -1) {\n\t range = Range.fromPoints(delta.start, delta.start);\n\t }\n\t lastDeltaIsInsert = false;\n\t }\n\t }\n\t if (lastUndoRange != null) {\n\t if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n\t lastUndoRange.start.column += range.end.column - range.start.column;\n\t lastUndoRange.end.column += range.end.column - range.start.column;\n\t }\n\t\n\t var cmp = lastUndoRange.compareRange(range);\n\t if (cmp == 1) {\n\t range.setStart(lastUndoRange.start);\n\t } else if (cmp == -1) {\n\t range.setEnd(lastUndoRange.end);\n\t }\n\t }\n\t\n\t return range;\n\t };\n\t this.replace = function(range, text) {\n\t return this.doc.replace(range, text);\n\t };\n\t this.moveText = function(fromRange, toPosition, copy) {\n\t var text = this.getTextRange(fromRange);\n\t var folds = this.getFoldsInRange(fromRange);\n\t\n\t var toRange = Range.fromPoints(toPosition, toPosition);\n\t if (!copy) {\n\t this.remove(fromRange);\n\t var rowDiff = fromRange.start.row - fromRange.end.row;\n\t var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n\t if (collDiff) {\n\t if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n\t toRange.start.column += collDiff;\n\t if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n\t toRange.end.column += collDiff;\n\t }\n\t if (rowDiff && toRange.start.row >= fromRange.end.row) {\n\t toRange.start.row += rowDiff;\n\t toRange.end.row += rowDiff;\n\t }\n\t }\n\t\n\t toRange.end = this.insert(toRange.start, text);\n\t if (folds.length) {\n\t var oldStart = fromRange.start;\n\t var newStart = toRange.start;\n\t var rowDiff = newStart.row - oldStart.row;\n\t var collDiff = newStart.column - oldStart.column;\n\t this.addFolds(folds.map(function(x) {\n\t x = x.clone();\n\t if (x.start.row == oldStart.row)\n\t x.start.column += collDiff;\n\t if (x.end.row == oldStart.row)\n\t x.end.column += collDiff;\n\t x.start.row += rowDiff;\n\t x.end.row += rowDiff;\n\t return x;\n\t }));\n\t }\n\t\n\t return toRange;\n\t };\n\t this.indentRows = function(startRow, endRow, indentString) {\n\t indentString = indentString.replace(/\\t/g, this.getTabString());\n\t for (var row=startRow; row<=endRow; row++)\n\t this.doc.insertInLine({row: row, column: 0}, indentString);\n\t };\n\t this.outdentRows = function (range) {\n\t var rowRange = range.collapseRows();\n\t var deleteRange = new Range(0, 0, 0, 0);\n\t var size = this.getTabSize();\n\t\n\t for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n\t var line = this.getLine(i);\n\t\n\t deleteRange.start.row = i;\n\t deleteRange.end.row = i;\n\t for (var j = 0; j < size; ++j)\n\t if (line.charAt(j) != ' ')\n\t break;\n\t if (j < size && line.charAt(j) == '\\t') {\n\t deleteRange.start.column = j;\n\t deleteRange.end.column = j + 1;\n\t } else {\n\t deleteRange.start.column = 0;\n\t deleteRange.end.column = j;\n\t }\n\t this.remove(deleteRange);\n\t }\n\t };\n\t\n\t this.$moveLines = function(firstRow, lastRow, dir) {\n\t firstRow = this.getRowFoldStart(firstRow);\n\t lastRow = this.getRowFoldEnd(lastRow);\n\t if (dir < 0) {\n\t var row = this.getRowFoldStart(firstRow + dir);\n\t if (row < 0) return 0;\n\t var diff = row-firstRow;\n\t } else if (dir > 0) {\n\t var row = this.getRowFoldEnd(lastRow + dir);\n\t if (row > this.doc.getLength()-1) return 0;\n\t var diff = row-lastRow;\n\t } else {\n\t firstRow = this.$clipRowToDocument(firstRow);\n\t lastRow = this.$clipRowToDocument(lastRow);\n\t var diff = lastRow - firstRow + 1;\n\t }\n\t\n\t var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n\t var folds = this.getFoldsInRange(range).map(function(x){\n\t x = x.clone();\n\t x.start.row += diff;\n\t x.end.row += diff;\n\t return x;\n\t });\n\t \n\t var lines = dir == 0\n\t ? this.doc.getLines(firstRow, lastRow)\n\t : this.doc.removeFullLines(firstRow, lastRow);\n\t this.doc.insertFullLines(firstRow+diff, lines);\n\t folds.length && this.addFolds(folds);\n\t return diff;\n\t };\n\t this.moveLinesUp = function(firstRow, lastRow) {\n\t return this.$moveLines(firstRow, lastRow, -1);\n\t };\n\t this.moveLinesDown = function(firstRow, lastRow) {\n\t return this.$moveLines(firstRow, lastRow, 1);\n\t };\n\t this.duplicateLines = function(firstRow, lastRow) {\n\t return this.$moveLines(firstRow, lastRow, 0);\n\t };\n\t\n\t\n\t this.$clipRowToDocument = function(row) {\n\t return Math.max(0, Math.min(row, this.doc.getLength()-1));\n\t };\n\t\n\t this.$clipColumnToRow = function(row, column) {\n\t if (column < 0)\n\t return 0;\n\t return Math.min(this.doc.getLine(row).length, column);\n\t };\n\t\n\t\n\t this.$clipPositionToDocument = function(row, column) {\n\t column = Math.max(0, column);\n\t\n\t if (row < 0) {\n\t row = 0;\n\t column = 0;\n\t } else {\n\t var len = this.doc.getLength();\n\t if (row >= len) {\n\t row = len - 1;\n\t column = this.doc.getLine(len-1).length;\n\t } else {\n\t column = Math.min(this.doc.getLine(row).length, column);\n\t }\n\t }\n\t\n\t return {\n\t row: row,\n\t column: column\n\t };\n\t };\n\t\n\t this.$clipRangeToDocument = function(range) {\n\t if (range.start.row < 0) {\n\t range.start.row = 0;\n\t range.start.column = 0;\n\t } else {\n\t range.start.column = this.$clipColumnToRow(\n\t range.start.row,\n\t range.start.column\n\t );\n\t }\n\t\n\t var len = this.doc.getLength() - 1;\n\t if (range.end.row > len) {\n\t range.end.row = len;\n\t range.end.column = this.doc.getLine(len).length;\n\t } else {\n\t range.end.column = this.$clipColumnToRow(\n\t range.end.row,\n\t range.end.column\n\t );\n\t }\n\t return range;\n\t };\n\t this.$wrapLimit = 80;\n\t this.$useWrapMode = false;\n\t this.$wrapLimitRange = {\n\t min : null,\n\t max : null\n\t };\n\t this.setUseWrapMode = function(useWrapMode) {\n\t if (useWrapMode != this.$useWrapMode) {\n\t this.$useWrapMode = useWrapMode;\n\t this.$modified = true;\n\t this.$resetRowCache(0);\n\t if (useWrapMode) {\n\t var len = this.getLength();\n\t this.$wrapData = Array(len);\n\t this.$updateWrapData(0, len - 1);\n\t }\n\t\n\t this._signal(\"changeWrapMode\");\n\t }\n\t };\n\t this.getUseWrapMode = function() {\n\t return this.$useWrapMode;\n\t };\n\t this.setWrapLimitRange = function(min, max) {\n\t if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n\t this.$wrapLimitRange = { min: min, max: max };\n\t this.$modified = true;\n\t if (this.$useWrapMode)\n\t this._signal(\"changeWrapMode\");\n\t }\n\t };\n\t this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n\t var limits = this.$wrapLimitRange;\n\t if (limits.max < 0)\n\t limits = {min: $printMargin, max: $printMargin};\n\t var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n\t if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n\t this.$wrapLimit = wrapLimit;\n\t this.$modified = true;\n\t if (this.$useWrapMode) {\n\t this.$updateWrapData(0, this.getLength() - 1);\n\t this.$resetRowCache(0);\n\t this._signal(\"changeWrapLimit\");\n\t }\n\t return true;\n\t }\n\t return false;\n\t };\n\t\n\t this.$constrainWrapLimit = function(wrapLimit, min, max) {\n\t if (min)\n\t wrapLimit = Math.max(min, wrapLimit);\n\t\n\t if (max)\n\t wrapLimit = Math.min(max, wrapLimit);\n\t\n\t return wrapLimit;\n\t };\n\t this.getWrapLimit = function() {\n\t return this.$wrapLimit;\n\t };\n\t this.setWrapLimit = function (limit) {\n\t this.setWrapLimitRange(limit, limit);\n\t };\n\t this.getWrapLimitRange = function() {\n\t return {\n\t min : this.$wrapLimitRange.min,\n\t max : this.$wrapLimitRange.max\n\t };\n\t };\n\t\n\t this.$updateInternalDataOnChange = function(delta) {\n\t var useWrapMode = this.$useWrapMode;\n\t var action = delta.action;\n\t var start = delta.start;\n\t var end = delta.end;\n\t var firstRow = start.row;\n\t var lastRow = end.row;\n\t var len = lastRow - firstRow;\n\t var removedFolds = null;\n\t \n\t this.$updating = true;\n\t if (len != 0) {\n\t if (action === \"remove\") {\n\t this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\t\n\t var foldLines = this.$foldData;\n\t removedFolds = this.getFoldsInRange(delta);\n\t this.removeFolds(removedFolds);\n\t\n\t var foldLine = this.getFoldLine(end.row);\n\t var idx = 0;\n\t if (foldLine) {\n\t foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n\t foldLine.shiftRow(-len);\n\t\n\t var foldLineBefore = this.getFoldLine(firstRow);\n\t if (foldLineBefore && foldLineBefore !== foldLine) {\n\t foldLineBefore.merge(foldLine);\n\t foldLine = foldLineBefore;\n\t }\n\t idx = foldLines.indexOf(foldLine) + 1;\n\t }\n\t\n\t for (idx; idx < foldLines.length; idx++) {\n\t var foldLine = foldLines[idx];\n\t if (foldLine.start.row >= end.row) {\n\t foldLine.shiftRow(-len);\n\t }\n\t }\n\t\n\t lastRow = firstRow;\n\t } else {\n\t var args = Array(len);\n\t args.unshift(firstRow, 0);\n\t var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache\n\t arr.splice.apply(arr, args);\n\t var foldLines = this.$foldData;\n\t var foldLine = this.getFoldLine(firstRow);\n\t var idx = 0;\n\t if (foldLine) {\n\t var cmp = foldLine.range.compareInside(start.row, start.column);\n\t if (cmp == 0) {\n\t foldLine = foldLine.split(start.row, start.column);\n\t if (foldLine) {\n\t foldLine.shiftRow(len);\n\t foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n\t }\n\t } else\n\t if (cmp == -1) {\n\t foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n\t foldLine.shiftRow(len);\n\t }\n\t idx = foldLines.indexOf(foldLine) + 1;\n\t }\n\t\n\t for (idx; idx < foldLines.length; idx++) {\n\t var foldLine = foldLines[idx];\n\t if (foldLine.start.row >= firstRow) {\n\t foldLine.shiftRow(len);\n\t }\n\t }\n\t }\n\t } else {\n\t len = Math.abs(delta.start.column - delta.end.column);\n\t if (action === \"remove\") {\n\t removedFolds = this.getFoldsInRange(delta);\n\t this.removeFolds(removedFolds);\n\t\n\t len = -len;\n\t }\n\t var foldLine = this.getFoldLine(firstRow);\n\t if (foldLine) {\n\t foldLine.addRemoveChars(firstRow, start.column, len);\n\t }\n\t }\n\t\n\t if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n\t console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n\t }\n\t this.$updating = false;\n\t\n\t if (useWrapMode)\n\t this.$updateWrapData(firstRow, lastRow);\n\t else\n\t this.$updateRowLengthCache(firstRow, lastRow);\n\t\n\t return removedFolds;\n\t };\n\t\n\t this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n\t this.$rowLengthCache[firstRow] = null;\n\t this.$rowLengthCache[lastRow] = null;\n\t };\n\t\n\t this.$updateWrapData = function(firstRow, lastRow) {\n\t var lines = this.doc.getAllLines();\n\t var tabSize = this.getTabSize();\n\t var wrapData = this.$wrapData;\n\t var wrapLimit = this.$wrapLimit;\n\t var tokens;\n\t var foldLine;\n\t\n\t var row = firstRow;\n\t lastRow = Math.min(lastRow, lines.length - 1);\n\t while (row <= lastRow) {\n\t foldLine = this.getFoldLine(row, foldLine);\n\t if (!foldLine) {\n\t tokens = this.$getDisplayTokens(lines[row]);\n\t wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n\t row ++;\n\t } else {\n\t tokens = [];\n\t foldLine.walk(function(placeholder, row, column, lastColumn) {\n\t var walkTokens;\n\t if (placeholder != null) {\n\t walkTokens = this.$getDisplayTokens(\n\t placeholder, tokens.length);\n\t walkTokens[0] = PLACEHOLDER_START;\n\t for (var i = 1; i < walkTokens.length; i++) {\n\t walkTokens[i] = PLACEHOLDER_BODY;\n\t }\n\t } else {\n\t walkTokens = this.$getDisplayTokens(\n\t lines[row].substring(lastColumn, column),\n\t tokens.length);\n\t }\n\t tokens = tokens.concat(walkTokens);\n\t }.bind(this),\n\t foldLine.end.row,\n\t lines[foldLine.end.row].length + 1\n\t );\n\t\n\t wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n\t row = foldLine.end.row + 1;\n\t }\n\t }\n\t };\n\t var CHAR = 1,\n\t CHAR_EXT = 2,\n\t PLACEHOLDER_START = 3,\n\t PLACEHOLDER_BODY = 4,\n\t PUNCTUATION = 9,\n\t SPACE = 10,\n\t TAB = 11,\n\t TAB_SPACE = 12;\n\t\n\t\n\t this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n\t if (tokens.length == 0) {\n\t return [];\n\t }\n\t\n\t var splits = [];\n\t var displayLength = tokens.length;\n\t var lastSplit = 0, lastDocSplit = 0;\n\t\n\t var isCode = this.$wrapAsCode;\n\t\n\t var indentedSoftWrap = this.$indentedSoftWrap;\n\t var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n\t || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\t\n\t function getWrapIndent() {\n\t var indentation = 0;\n\t if (maxIndent === 0)\n\t return indentation;\n\t if (indentedSoftWrap) {\n\t for (var i = 0; i < tokens.length; i++) {\n\t var token = tokens[i];\n\t if (token == SPACE)\n\t indentation += 1;\n\t else if (token == TAB)\n\t indentation += tabSize;\n\t else if (token == TAB_SPACE)\n\t continue;\n\t else\n\t break;\n\t }\n\t }\n\t if (isCode && indentedSoftWrap !== false)\n\t indentation += tabSize;\n\t return Math.min(indentation, maxIndent);\n\t }\n\t function addSplit(screenPos) {\n\t var displayed = tokens.slice(lastSplit, screenPos);\n\t var len = displayed.length;\n\t displayed.join(\"\")\n\t .replace(/12/g, function() {\n\t len -= 1;\n\t })\n\t .replace(/2/g, function() {\n\t len -= 1;\n\t });\n\t\n\t if (!splits.length) {\n\t indent = getWrapIndent();\n\t splits.indent = indent;\n\t }\n\t lastDocSplit += len;\n\t splits.push(lastDocSplit);\n\t lastSplit = screenPos;\n\t }\n\t var indent = 0;\n\t while (displayLength - lastSplit > wrapLimit - indent) {\n\t var split = lastSplit + wrapLimit - indent;\n\t if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n\t addSplit(split);\n\t continue;\n\t }\n\t if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n\t for (split; split != lastSplit - 1; split--) {\n\t if (tokens[split] == PLACEHOLDER_START) {\n\t break;\n\t }\n\t }\n\t if (split > lastSplit) {\n\t addSplit(split);\n\t continue;\n\t }\n\t split = lastSplit + wrapLimit;\n\t for (split; split < tokens.length; split++) {\n\t if (tokens[split] != PLACEHOLDER_BODY) {\n\t break;\n\t }\n\t }\n\t if (split == tokens.length) {\n\t break; // Breaks the while-loop.\n\t }\n\t addSplit(split);\n\t continue;\n\t }\n\t var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n\t while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n\t split --;\n\t }\n\t if (isCode) {\n\t while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n\t split --;\n\t }\n\t while (split > minSplit && tokens[split] == PUNCTUATION) {\n\t split --;\n\t }\n\t } else {\n\t while (split > minSplit && tokens[split] < SPACE) {\n\t split --;\n\t }\n\t }\n\t if (split > minSplit) {\n\t addSplit(++split);\n\t continue;\n\t }\n\t split = lastSplit + wrapLimit;\n\t if (tokens[split] == CHAR_EXT)\n\t split--;\n\t addSplit(split - indent);\n\t }\n\t return splits;\n\t };\n\t this.$getDisplayTokens = function(str, offset) {\n\t var arr = [];\n\t var tabSize;\n\t offset = offset || 0;\n\t\n\t for (var i = 0; i < str.length; i++) {\n\t var c = str.charCodeAt(i);\n\t if (c == 9) {\n\t tabSize = this.getScreenTabSize(arr.length + offset);\n\t arr.push(TAB);\n\t for (var n = 1; n < tabSize; n++) {\n\t arr.push(TAB_SPACE);\n\t }\n\t }\n\t else if (c == 32) {\n\t arr.push(SPACE);\n\t } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n\t arr.push(PUNCTUATION);\n\t }\n\t else if (c >= 0x1100 && isFullWidth(c)) {\n\t arr.push(CHAR, CHAR_EXT);\n\t } else {\n\t arr.push(CHAR);\n\t }\n\t }\n\t return arr;\n\t };\n\t this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n\t if (maxScreenColumn == 0)\n\t return [0, 0];\n\t if (maxScreenColumn == null)\n\t maxScreenColumn = Infinity;\n\t screenColumn = screenColumn || 0;\n\t\n\t var c, column;\n\t for (column = 0; column < str.length; column++) {\n\t c = str.charCodeAt(column);\n\t if (c == 9) {\n\t screenColumn += this.getScreenTabSize(screenColumn);\n\t }\n\t else if (c >= 0x1100 && isFullWidth(c)) {\n\t screenColumn += 2;\n\t } else {\n\t screenColumn += 1;\n\t }\n\t if (screenColumn > maxScreenColumn) {\n\t break;\n\t }\n\t }\n\t\n\t return [screenColumn, column];\n\t };\n\t\n\t this.lineWidgets = null;\n\t this.getRowLength = function(row) {\n\t if (this.lineWidgets)\n\t var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n\t else \n\t h = 0\n\t if (!this.$useWrapMode || !this.$wrapData[row]) {\n\t return 1 + h;\n\t } else {\n\t return this.$wrapData[row].length + 1 + h;\n\t }\n\t };\n\t this.getRowLineCount = function(row) {\n\t if (!this.$useWrapMode || !this.$wrapData[row]) {\n\t return 1;\n\t } else {\n\t return this.$wrapData[row].length + 1;\n\t }\n\t };\n\t\n\t this.getRowWrapIndent = function(screenRow) {\n\t if (this.$useWrapMode) {\n\t var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n\t var splits = this.$wrapData[pos.row];\n\t return splits.length && splits[0] < pos.column ? splits.indent : 0;\n\t } else {\n\t return 0;\n\t }\n\t }\n\t this.getScreenLastRowColumn = function(screenRow) {\n\t var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n\t return this.documentToScreenColumn(pos.row, pos.column);\n\t };\n\t this.getDocumentLastRowColumn = function(docRow, docColumn) {\n\t var screenRow = this.documentToScreenRow(docRow, docColumn);\n\t return this.getScreenLastRowColumn(screenRow);\n\t };\n\t this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n\t var screenRow = this.documentToScreenRow(docRow, docColumn);\n\t return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n\t };\n\t this.getRowSplitData = function(row) {\n\t if (!this.$useWrapMode) {\n\t return undefined;\n\t } else {\n\t return this.$wrapData[row];\n\t }\n\t };\n\t this.getScreenTabSize = function(screenColumn) {\n\t return this.$tabSize - screenColumn % this.$tabSize;\n\t };\n\t\n\t\n\t this.screenToDocumentRow = function(screenRow, screenColumn) {\n\t return this.screenToDocumentPosition(screenRow, screenColumn).row;\n\t };\n\t\n\t\n\t this.screenToDocumentColumn = function(screenRow, screenColumn) {\n\t return this.screenToDocumentPosition(screenRow, screenColumn).column;\n\t };\n\t this.screenToDocumentPosition = function(screenRow, screenColumn) {\n\t if (screenRow < 0)\n\t return {row: 0, column: 0};\n\t\n\t var line;\n\t var docRow = 0;\n\t var docColumn = 0;\n\t var column;\n\t var row = 0;\n\t var rowLength = 0;\n\t\n\t var rowCache = this.$screenRowCache;\n\t var i = this.$getRowCacheIndex(rowCache, screenRow);\n\t var l = rowCache.length;\n\t if (l && i >= 0) {\n\t var row = rowCache[i];\n\t var docRow = this.$docRowCache[i];\n\t var doCache = screenRow > rowCache[l - 1];\n\t } else {\n\t var doCache = !l;\n\t }\n\t\n\t var maxRow = this.getLength() - 1;\n\t var foldLine = this.getNextFoldLine(docRow);\n\t var foldStart = foldLine ? foldLine.start.row : Infinity;\n\t\n\t while (row <= screenRow) {\n\t rowLength = this.getRowLength(docRow);\n\t if (row + rowLength > screenRow || docRow >= maxRow) {\n\t break;\n\t } else {\n\t row += rowLength;\n\t docRow++;\n\t if (docRow > foldStart) {\n\t docRow = foldLine.end.row+1;\n\t foldLine = this.getNextFoldLine(docRow, foldLine);\n\t foldStart = foldLine ? foldLine.start.row : Infinity;\n\t }\n\t }\n\t\n\t if (doCache) {\n\t this.$docRowCache.push(docRow);\n\t this.$screenRowCache.push(row);\n\t }\n\t }\n\t\n\t if (foldLine && foldLine.start.row <= docRow) {\n\t line = this.getFoldDisplayLine(foldLine);\n\t docRow = foldLine.start.row;\n\t } else if (row + rowLength <= screenRow || docRow > maxRow) {\n\t return {\n\t row: maxRow,\n\t column: this.getLine(maxRow).length\n\t };\n\t } else {\n\t line = this.getLine(docRow);\n\t foldLine = null;\n\t }\n\t var wrapIndent = 0;\n\t if (this.$useWrapMode) {\n\t var splits = this.$wrapData[docRow];\n\t if (splits) {\n\t var splitIndex = Math.floor(screenRow - row);\n\t column = splits[splitIndex];\n\t if(splitIndex > 0 && splits.length) {\n\t wrapIndent = splits.indent;\n\t docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n\t line = line.substring(docColumn);\n\t }\n\t }\n\t }\n\t\n\t docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n\t if (this.$useWrapMode && docColumn >= column)\n\t docColumn = column - 1;\n\t\n\t if (foldLine)\n\t return foldLine.idxToPosition(docColumn);\n\t\n\t return {row: docRow, column: docColumn};\n\t };\n\t this.documentToScreenPosition = function(docRow, docColumn) {\n\t if (typeof docColumn === \"undefined\")\n\t var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n\t else\n\t pos = this.$clipPositionToDocument(docRow, docColumn);\n\t\n\t docRow = pos.row;\n\t docColumn = pos.column;\n\t\n\t var screenRow = 0;\n\t var foldStartRow = null;\n\t var fold = null;\n\t fold = this.getFoldAt(docRow, docColumn, 1);\n\t if (fold) {\n\t docRow = fold.start.row;\n\t docColumn = fold.start.column;\n\t }\n\t\n\t var rowEnd, row = 0;\n\t\n\t\n\t var rowCache = this.$docRowCache;\n\t var i = this.$getRowCacheIndex(rowCache, docRow);\n\t var l = rowCache.length;\n\t if (l && i >= 0) {\n\t var row = rowCache[i];\n\t var screenRow = this.$screenRowCache[i];\n\t var doCache = docRow > rowCache[l - 1];\n\t } else {\n\t var doCache = !l;\n\t }\n\t\n\t var foldLine = this.getNextFoldLine(row);\n\t var foldStart = foldLine ?foldLine.start.row :Infinity;\n\t\n\t while (row < docRow) {\n\t if (row >= foldStart) {\n\t rowEnd = foldLine.end.row + 1;\n\t if (rowEnd > docRow)\n\t break;\n\t foldLine = this.getNextFoldLine(rowEnd, foldLine);\n\t foldStart = foldLine ?foldLine.start.row :Infinity;\n\t }\n\t else {\n\t rowEnd = row + 1;\n\t }\n\t\n\t screenRow += this.getRowLength(row);\n\t row = rowEnd;\n\t\n\t if (doCache) {\n\t this.$docRowCache.push(row);\n\t this.$screenRowCache.push(screenRow);\n\t }\n\t }\n\t var textLine = \"\";\n\t if (foldLine && row >= foldStart) {\n\t textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n\t foldStartRow = foldLine.start.row;\n\t } else {\n\t textLine = this.getLine(docRow).substring(0, docColumn);\n\t foldStartRow = docRow;\n\t }\n\t var wrapIndent = 0;\n\t if (this.$useWrapMode) {\n\t var wrapRow = this.$wrapData[foldStartRow];\n\t if (wrapRow) {\n\t var screenRowOffset = 0;\n\t while (textLine.length >= wrapRow[screenRowOffset]) {\n\t screenRow ++;\n\t screenRowOffset++;\n\t }\n\t textLine = textLine.substring(\n\t wrapRow[screenRowOffset - 1] || 0, textLine.length\n\t );\n\t wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n\t }\n\t }\n\t\n\t return {\n\t row: screenRow,\n\t column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n\t };\n\t };\n\t this.documentToScreenColumn = function(row, docColumn) {\n\t return this.documentToScreenPosition(row, docColumn).column;\n\t };\n\t this.documentToScreenRow = function(docRow, docColumn) {\n\t return this.documentToScreenPosition(docRow, docColumn).row;\n\t };\n\t this.getScreenLength = function() {\n\t var screenRows = 0;\n\t var fold = null;\n\t if (!this.$useWrapMode) {\n\t screenRows = this.getLength();\n\t var foldData = this.$foldData;\n\t for (var i = 0; i < foldData.length; i++) {\n\t fold = foldData[i];\n\t screenRows -= fold.end.row - fold.start.row;\n\t }\n\t } else {\n\t var lastRow = this.$wrapData.length;\n\t var row = 0, i = 0;\n\t var fold = this.$foldData[i++];\n\t var foldStart = fold ? fold.start.row :Infinity;\n\t\n\t while (row < lastRow) {\n\t var splits = this.$wrapData[row];\n\t screenRows += splits ? splits.length + 1 : 1;\n\t row ++;\n\t if (row > foldStart) {\n\t row = fold.end.row+1;\n\t fold = this.$foldData[i++];\n\t foldStart = fold ?fold.start.row :Infinity;\n\t }\n\t }\n\t }\n\t if (this.lineWidgets)\n\t screenRows += this.$getWidgetScreenLength();\n\t\n\t return screenRows;\n\t };\n\t this.$setFontMetrics = function(fm) {\n\t if (!this.$enableVarChar) return;\n\t this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n\t if (maxScreenColumn === 0)\n\t return [0, 0];\n\t if (!maxScreenColumn)\n\t maxScreenColumn = Infinity;\n\t screenColumn = screenColumn || 0;\n\t \n\t var c, column;\n\t for (column = 0; column < str.length; column++) {\n\t c = str.charAt(column);\n\t if (c === \"\\t\") {\n\t screenColumn += this.getScreenTabSize(screenColumn);\n\t } else {\n\t screenColumn += fm.getCharacterWidth(c);\n\t }\n\t if (screenColumn > maxScreenColumn) {\n\t break;\n\t }\n\t }\n\t \n\t return [screenColumn, column];\n\t };\n\t };\n\t \n\t this.destroy = function() {\n\t if (this.bgTokenizer) {\n\t this.bgTokenizer.setDocument(null);\n\t this.bgTokenizer = null;\n\t }\n\t this.$stopWorker();\n\t };\n\t function isFullWidth(c) {\n\t if (c < 0x1100)\n\t return false;\n\t return c >= 0x1100 && c <= 0x115F ||\n\t c >= 0x11A3 && c <= 0x11A7 ||\n\t c >= 0x11FA && c <= 0x11FF ||\n\t c >= 0x2329 && c <= 0x232A ||\n\t c >= 0x2E80 && c <= 0x2E99 ||\n\t c >= 0x2E9B && c <= 0x2EF3 ||\n\t c >= 0x2F00 && c <= 0x2FD5 ||\n\t c >= 0x2FF0 && c <= 0x2FFB ||\n\t c >= 0x3000 && c <= 0x303E ||\n\t c >= 0x3041 && c <= 0x3096 ||\n\t c >= 0x3099 && c <= 0x30FF ||\n\t c >= 0x3105 && c <= 0x312D ||\n\t c >= 0x3131 && c <= 0x318E ||\n\t c >= 0x3190 && c <= 0x31BA ||\n\t c >= 0x31C0 && c <= 0x31E3 ||\n\t c >= 0x31F0 && c <= 0x321E ||\n\t c >= 0x3220 && c <= 0x3247 ||\n\t c >= 0x3250 && c <= 0x32FE ||\n\t c >= 0x3300 && c <= 0x4DBF ||\n\t c >= 0x4E00 && c <= 0xA48C ||\n\t c >= 0xA490 && c <= 0xA4C6 ||\n\t c >= 0xA960 && c <= 0xA97C ||\n\t c >= 0xAC00 && c <= 0xD7A3 ||\n\t c >= 0xD7B0 && c <= 0xD7C6 ||\n\t c >= 0xD7CB && c <= 0xD7FB ||\n\t c >= 0xF900 && c <= 0xFAFF ||\n\t c >= 0xFE10 && c <= 0xFE19 ||\n\t c >= 0xFE30 && c <= 0xFE52 ||\n\t c >= 0xFE54 && c <= 0xFE66 ||\n\t c >= 0xFE68 && c <= 0xFE6B ||\n\t c >= 0xFF01 && c <= 0xFF60 ||\n\t c >= 0xFFE0 && c <= 0xFFE6;\n\t }\n\t\n\t}).call(EditSession.prototype);\n\t\n\tacequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\n\tacequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\t\n\t\n\tconfig.defineOptions(EditSession.prototype, \"session\", {\n\t wrap: {\n\t set: function(value) {\n\t if (!value || value == \"off\")\n\t value = false;\n\t else if (value == \"free\")\n\t value = true;\n\t else if (value == \"printMargin\")\n\t value = -1;\n\t else if (typeof value == \"string\")\n\t value = parseInt(value, 10) || false;\n\t\n\t if (this.$wrap == value)\n\t return;\n\t this.$wrap = value;\n\t if (!value) {\n\t this.setUseWrapMode(false);\n\t } else {\n\t var col = typeof value == \"number\" ? value : null;\n\t this.setWrapLimitRange(col, col);\n\t this.setUseWrapMode(true);\n\t }\n\t },\n\t get: function() {\n\t if (this.getUseWrapMode()) {\n\t if (this.$wrap == -1)\n\t return \"printMargin\";\n\t if (!this.getWrapLimitRange().min)\n\t return \"free\";\n\t return this.$wrap;\n\t }\n\t return \"off\";\n\t },\n\t handlesSet: true\n\t }, \n\t wrapMethod: {\n\t set: function(val) {\n\t val = val == \"auto\"\n\t ? this.$mode.type != \"text\"\n\t : val != \"text\";\n\t if (val != this.$wrapAsCode) {\n\t this.$wrapAsCode = val;\n\t if (this.$useWrapMode) {\n\t this.$modified = true;\n\t this.$resetRowCache(0);\n\t this.$updateWrapData(0, this.getLength() - 1);\n\t }\n\t }\n\t },\n\t initialValue: \"auto\"\n\t },\n\t indentedSoftWrap: { initialValue: true },\n\t firstLineNumber: {\n\t set: function() {this._signal(\"changeBreakpoint\");},\n\t initialValue: 1\n\t },\n\t useWorker: {\n\t set: function(useWorker) {\n\t this.$useWorker = useWorker;\n\t\n\t this.$stopWorker();\n\t if (useWorker)\n\t this.$startWorker();\n\t },\n\t initialValue: true\n\t },\n\t useSoftTabs: {initialValue: true},\n\t tabSize: {\n\t set: function(tabSize) {\n\t if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\t\n\t this.$modified = true;\n\t this.$rowLengthCache = [];\n\t this.$tabSize = tabSize;\n\t this._signal(\"changeTabSize\");\n\t },\n\t initialValue: 4,\n\t handlesSet: true\n\t },\n\t overwrite: {\n\t set: function(val) {this._signal(\"changeOverwrite\");},\n\t initialValue: false\n\t },\n\t newLineMode: {\n\t set: function(val) {this.doc.setNewLineMode(val)},\n\t get: function() {return this.doc.getNewLineMode()},\n\t handlesSet: true\n\t },\n\t mode: {\n\t set: function(val) { this.setMode(val) },\n\t get: function() { return this.$modeId }\n\t }\n\t});\n\t\n\texports.EditSession = EditSession;\n\t});\n\t\n\tace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar lang = acequire(\"./lib/lang\");\n\tvar oop = acequire(\"./lib/oop\");\n\tvar Range = acequire(\"./range\").Range;\n\t\n\tvar Search = function() {\n\t this.$options = {};\n\t};\n\t\n\t(function() {\n\t this.set = function(options) {\n\t oop.mixin(this.$options, options);\n\t return this;\n\t };\n\t this.getOptions = function() {\n\t return lang.copyObject(this.$options);\n\t };\n\t this.setOptions = function(options) {\n\t this.$options = options;\n\t };\n\t this.find = function(session) {\n\t var options = this.$options;\n\t var iterator = this.$matchIterator(session, options);\n\t if (!iterator)\n\t return false;\n\t\n\t var firstRange = null;\n\t iterator.forEach(function(range, row, offset) {\n\t if (!range.start) {\n\t var column = range.offset + (offset || 0);\n\t firstRange = new Range(row, column, row, column + range.length);\n\t if (!range.length && options.start && options.start.start\n\t && options.skipCurrent != false && firstRange.isEqual(options.start)\n\t ) {\n\t firstRange = null;\n\t return false;\n\t }\n\t } else\n\t firstRange = range;\n\t return true;\n\t });\n\t\n\t return firstRange;\n\t };\n\t this.findAll = function(session) {\n\t var options = this.$options;\n\t if (!options.needle)\n\t return [];\n\t this.$assembleRegExp(options);\n\t\n\t var range = options.range;\n\t var lines = range\n\t ? session.getLines(range.start.row, range.end.row)\n\t : session.doc.getAllLines();\n\t\n\t var ranges = [];\n\t var re = options.re;\n\t if (options.$isMultiLine) {\n\t var len = re.length;\n\t var maxRow = lines.length - len;\n\t var prevRange;\n\t outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n\t for (var j = 0; j < len; j++)\n\t if (lines[row + j].search(re[j]) == -1)\n\t continue outer;\n\t \n\t var startLine = lines[row];\n\t var line = lines[row + len - 1];\n\t var startIndex = startLine.length - startLine.match(re[0])[0].length;\n\t var endIndex = line.match(re[len - 1])[0].length;\n\t \n\t if (prevRange && prevRange.end.row === row &&\n\t prevRange.end.column > startIndex\n\t ) {\n\t continue;\n\t }\n\t ranges.push(prevRange = new Range(\n\t row, startIndex, row + len - 1, endIndex\n\t ));\n\t if (len > 2)\n\t row = row + len - 2;\n\t }\n\t } else {\n\t for (var i = 0; i < lines.length; i++) {\n\t var matches = lang.getMatchOffsets(lines[i], re);\n\t for (var j = 0; j < matches.length; j++) {\n\t var match = matches[j];\n\t ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n\t }\n\t }\n\t }\n\t\n\t if (range) {\n\t var startColumn = range.start.column;\n\t var endColumn = range.start.column;\n\t var i = 0, j = ranges.length - 1;\n\t while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n\t i++;\n\t\n\t while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n\t j--;\n\t \n\t ranges = ranges.slice(i, j + 1);\n\t for (i = 0, j = ranges.length; i < j; i++) {\n\t ranges[i].start.row += range.start.row;\n\t ranges[i].end.row += range.start.row;\n\t }\n\t }\n\t\n\t return ranges;\n\t };\n\t this.replace = function(input, replacement) {\n\t var options = this.$options;\n\t\n\t var re = this.$assembleRegExp(options);\n\t if (options.$isMultiLine)\n\t return replacement;\n\t\n\t if (!re)\n\t return;\n\t\n\t var match = re.exec(input);\n\t if (!match || match[0].length != input.length)\n\t return null;\n\t \n\t replacement = input.replace(re, replacement);\n\t if (options.preserveCase) {\n\t replacement = replacement.split(\"\");\n\t for (var i = Math.min(input.length, input.length); i--; ) {\n\t var ch = input[i];\n\t if (ch && ch.toLowerCase() != ch)\n\t replacement[i] = replacement[i].toUpperCase();\n\t else\n\t replacement[i] = replacement[i].toLowerCase();\n\t }\n\t replacement = replacement.join(\"\");\n\t }\n\t \n\t return replacement;\n\t };\n\t\n\t this.$matchIterator = function(session, options) {\n\t var re = this.$assembleRegExp(options);\n\t if (!re)\n\t return false;\n\t\n\t var callback;\n\t if (options.$isMultiLine) {\n\t var len = re.length;\n\t var matchIterator = function(line, row, offset) {\n\t var startIndex = line.search(re[0]);\n\t if (startIndex == -1)\n\t return;\n\t for (var i = 1; i < len; i++) {\n\t line = session.getLine(row + i);\n\t if (line.search(re[i]) == -1)\n\t return;\n\t }\n\t\n\t var endIndex = line.match(re[len - 1])[0].length;\n\t\n\t var range = new Range(row, startIndex, row + len - 1, endIndex);\n\t if (re.offset == 1) {\n\t range.start.row--;\n\t range.start.column = Number.MAX_VALUE;\n\t } else if (offset)\n\t range.start.column += offset;\n\t\n\t if (callback(range))\n\t return true;\n\t };\n\t } else if (options.backwards) {\n\t var matchIterator = function(line, row, startIndex) {\n\t var matches = lang.getMatchOffsets(line, re);\n\t for (var i = matches.length-1; i >= 0; i--)\n\t if (callback(matches[i], row, startIndex))\n\t return true;\n\t };\n\t } else {\n\t var matchIterator = function(line, row, startIndex) {\n\t var matches = lang.getMatchOffsets(line, re);\n\t for (var i = 0; i < matches.length; i++)\n\t if (callback(matches[i], row, startIndex))\n\t return true;\n\t };\n\t }\n\t \n\t var lineIterator = this.$lineIterator(session, options);\n\t\n\t return {\n\t forEach: function(_callback) {\n\t callback = _callback;\n\t lineIterator.forEach(matchIterator);\n\t }\n\t };\n\t };\n\t\n\t this.$assembleRegExp = function(options, $disableFakeMultiline) {\n\t if (options.needle instanceof RegExp)\n\t return options.re = options.needle;\n\t\n\t var needle = options.needle;\n\t\n\t if (!options.needle)\n\t return options.re = false;\n\t\n\t if (!options.regExp)\n\t needle = lang.escapeRegExp(needle);\n\t\n\t if (options.wholeWord)\n\t needle = \"\\\\b\" + needle + \"\\\\b\";\n\t\n\t var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\t\n\t options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n\t if (options.$isMultiLine)\n\t return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\t\n\t try {\n\t var re = new RegExp(needle, modifier);\n\t } catch(e) {\n\t re = false;\n\t }\n\t return options.re = re;\n\t };\n\t\n\t this.$assembleMultilineRegExp = function(needle, modifier) {\n\t var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n\t var re = [];\n\t for (var i = 0; i < parts.length; i++) try {\n\t re.push(new RegExp(parts[i], modifier));\n\t } catch(e) {\n\t return false;\n\t }\n\t if (parts[0] == \"\") {\n\t re.shift();\n\t re.offset = 1;\n\t } else {\n\t re.offset = 0;\n\t }\n\t return re;\n\t };\n\t\n\t this.$lineIterator = function(session, options) {\n\t var backwards = options.backwards == true;\n\t var skipCurrent = options.skipCurrent != false;\n\t\n\t var range = options.range;\n\t var start = options.start;\n\t if (!start)\n\t start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n\t \n\t if (start.start)\n\t start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\t\n\t var firstRow = range ? range.start.row : 0;\n\t var lastRow = range ? range.end.row : session.getLength() - 1;\n\t\n\t var forEach = backwards ? function(callback) {\n\t var row = start.row;\n\t\n\t var line = session.getLine(row).substring(0, start.column);\n\t if (callback(line, row))\n\t return;\n\t\n\t for (row--; row >= firstRow; row--)\n\t if (callback(session.getLine(row), row))\n\t return;\n\t\n\t if (options.wrap == false)\n\t return;\n\t\n\t for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n\t if (callback(session.getLine(row), row))\n\t return;\n\t } : function(callback) {\n\t var row = start.row;\n\t\n\t var line = session.getLine(row).substr(start.column);\n\t if (callback(line, row, start.column))\n\t return;\n\t\n\t for (row = row+1; row <= lastRow; row++)\n\t if (callback(session.getLine(row), row))\n\t return;\n\t\n\t if (options.wrap == false)\n\t return;\n\t\n\t for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n\t if (callback(session.getLine(row), row))\n\t return;\n\t };\n\t \n\t return {forEach: forEach};\n\t };\n\t\n\t}).call(Search.prototype);\n\t\n\texports.Search = Search;\n\t});\n\t\n\tace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar keyUtil = acequire(\"../lib/keys\");\n\tvar useragent = acequire(\"../lib/useragent\");\n\tvar KEY_MODS = keyUtil.KEY_MODS;\n\t\n\tfunction HashHandler(config, platform) {\n\t this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n\t this.commands = {};\n\t this.commandKeyBinding = {};\n\t this.addCommands(config);\n\t this.$singleCommand = true;\n\t}\n\t\n\tfunction MultiHashHandler(config, platform) {\n\t HashHandler.call(this, config, platform);\n\t this.$singleCommand = false;\n\t}\n\t\n\tMultiHashHandler.prototype = HashHandler.prototype;\n\t\n\t(function() {\n\t \n\t\n\t this.addCommand = function(command) {\n\t if (this.commands[command.name])\n\t this.removeCommand(command);\n\t\n\t this.commands[command.name] = command;\n\t\n\t if (command.bindKey)\n\t this._buildKeyHash(command);\n\t };\n\t\n\t this.removeCommand = function(command, keepCommand) {\n\t var name = command && (typeof command === 'string' ? command : command.name);\n\t command = this.commands[name];\n\t if (!keepCommand)\n\t delete this.commands[name];\n\t var ckb = this.commandKeyBinding;\n\t for (var keyId in ckb) {\n\t var cmdGroup = ckb[keyId];\n\t if (cmdGroup == command) {\n\t delete ckb[keyId];\n\t } else if (Array.isArray(cmdGroup)) {\n\t var i = cmdGroup.indexOf(command);\n\t if (i != -1) {\n\t cmdGroup.splice(i, 1);\n\t if (cmdGroup.length == 1)\n\t ckb[keyId] = cmdGroup[0];\n\t }\n\t }\n\t }\n\t };\n\t\n\t this.bindKey = function(key, command, position) {\n\t if (typeof key == \"object\" && key) {\n\t if (position == undefined)\n\t position = key.position;\n\t key = key[this.platform];\n\t }\n\t if (!key)\n\t return;\n\t if (typeof command == \"function\")\n\t return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n\t \n\t key.split(\"|\").forEach(function(keyPart) {\n\t var chain = \"\";\n\t if (keyPart.indexOf(\" \") != -1) {\n\t var parts = keyPart.split(/\\s+/);\n\t keyPart = parts.pop();\n\t parts.forEach(function(keyPart) {\n\t var binding = this.parseKeys(keyPart);\n\t var id = KEY_MODS[binding.hashId] + binding.key;\n\t chain += (chain ? \" \" : \"\") + id;\n\t this._addCommandToBinding(chain, \"chainKeys\");\n\t }, this);\n\t chain += \" \";\n\t }\n\t var binding = this.parseKeys(keyPart);\n\t var id = KEY_MODS[binding.hashId] + binding.key;\n\t this._addCommandToBinding(chain + id, command, position);\n\t }, this);\n\t };\n\t \n\t function getPosition(command) {\n\t return typeof command == \"object\" && command.bindKey\n\t && command.bindKey.position || 0;\n\t }\n\t this._addCommandToBinding = function(keyId, command, position) {\n\t var ckb = this.commandKeyBinding, i;\n\t if (!command) {\n\t delete ckb[keyId];\n\t } else if (!ckb[keyId] || this.$singleCommand) {\n\t ckb[keyId] = command;\n\t } else {\n\t if (!Array.isArray(ckb[keyId])) {\n\t ckb[keyId] = [ckb[keyId]];\n\t } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n\t ckb[keyId].splice(i, 1);\n\t }\n\t\n\t if (typeof position != \"number\") {\n\t if (position || command.isDefault)\n\t position = -100;\n\t else\n\t position = getPosition(command);\n\t }\n\t var commands = ckb[keyId];\n\t for (i = 0; i < commands.length; i++) {\n\t var other = commands[i];\n\t var otherPos = getPosition(other);\n\t if (otherPos > position)\n\t break;\n\t }\n\t commands.splice(i, 0, command);\n\t }\n\t };\n\t\n\t this.addCommands = function(commands) {\n\t commands && Object.keys(commands).forEach(function(name) {\n\t var command = commands[name];\n\t if (!command)\n\t return;\n\t \n\t if (typeof command === \"string\")\n\t return this.bindKey(command, name);\n\t\n\t if (typeof command === \"function\")\n\t command = { exec: command };\n\t\n\t if (typeof command !== \"object\")\n\t return;\n\t\n\t if (!command.name)\n\t command.name = name;\n\t\n\t this.addCommand(command);\n\t }, this);\n\t };\n\t\n\t this.removeCommands = function(commands) {\n\t Object.keys(commands).forEach(function(name) {\n\t this.removeCommand(commands[name]);\n\t }, this);\n\t };\n\t\n\t this.bindKeys = function(keyList) {\n\t Object.keys(keyList).forEach(function(key) {\n\t this.bindKey(key, keyList[key]);\n\t }, this);\n\t };\n\t\n\t this._buildKeyHash = function(command) {\n\t this.bindKey(command.bindKey, command);\n\t };\n\t this.parseKeys = function(keys) {\n\t var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x});\n\t var key = parts.pop();\n\t\n\t var keyCode = keyUtil[key];\n\t if (keyUtil.FUNCTION_KEYS[keyCode])\n\t key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n\t else if (!parts.length)\n\t return {key: key, hashId: -1};\n\t else if (parts.length == 1 && parts[0] == \"shift\")\n\t return {key: key.toUpperCase(), hashId: -1};\n\t\n\t var hashId = 0;\n\t for (var i = parts.length; i--;) {\n\t var modifier = keyUtil.KEY_MODS[parts[i]];\n\t if (modifier == null) {\n\t if (typeof console != \"undefined\")\n\t console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n\t return false;\n\t }\n\t hashId |= modifier;\n\t }\n\t return {key: key, hashId: hashId};\n\t };\n\t\n\t this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n\t var key = KEY_MODS[hashId] + keyString;\n\t return this.commandKeyBinding[key];\n\t };\n\t\n\t this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n\t if (keyCode < 0) return;\n\t var key = KEY_MODS[hashId] + keyString;\n\t var command = this.commandKeyBinding[key];\n\t if (data.$keyChain) {\n\t data.$keyChain += \" \" + key;\n\t command = this.commandKeyBinding[data.$keyChain] || command;\n\t }\n\t \n\t if (command) {\n\t if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n\t data.$keyChain = data.$keyChain || key;\n\t return {command: \"null\"};\n\t }\n\t }\n\t \n\t if (data.$keyChain) {\n\t if ((!hashId || hashId == 4) && keyString.length == 1)\n\t data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n\t else if (hashId == -1 || keyCode > 0)\n\t data.$keyChain = \"\"; // reset keyChain\n\t }\n\t return {command: command};\n\t };\n\t \n\t this.getStatusText = function(editor, data) {\n\t return data.$keyChain || \"\";\n\t };\n\t\n\t}).call(HashHandler.prototype);\n\t\n\texports.HashHandler = HashHandler;\n\texports.MultiHashHandler = MultiHashHandler;\n\t});\n\t\n\tace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../lib/oop\");\n\tvar MultiHashHandler = acequire(\"../keyboard/hash_handler\").MultiHashHandler;\n\tvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\t\n\tvar CommandManager = function(platform, commands) {\n\t MultiHashHandler.call(this, commands, platform);\n\t this.byName = this.commands;\n\t this.setDefaultHandler(\"exec\", function(e) {\n\t return e.command.exec(e.editor, e.args || {});\n\t });\n\t};\n\t\n\toop.inherits(CommandManager, MultiHashHandler);\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t\n\t this.exec = function(command, editor, args) {\n\t if (Array.isArray(command)) {\n\t for (var i = command.length; i--; ) {\n\t if (this.exec(command[i], editor, args)) return true;\n\t }\n\t return false;\n\t }\n\t \n\t if (typeof command === \"string\")\n\t command = this.commands[command];\n\t\n\t if (!command)\n\t return false;\n\t\n\t if (editor && editor.$readOnly && !command.readOnly)\n\t return false;\n\t\n\t var e = {editor: editor, command: command, args: args};\n\t e.returnValue = this._emit(\"exec\", e);\n\t this._signal(\"afterExec\", e);\n\t\n\t return e.returnValue === false ? false : true;\n\t };\n\t\n\t this.toggleRecording = function(editor) {\n\t if (this.$inReplay)\n\t return;\n\t\n\t editor && editor._emit(\"changeStatus\");\n\t if (this.recording) {\n\t this.macro.pop();\n\t this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\t\n\t if (!this.macro.length)\n\t this.macro = this.oldMacro;\n\t\n\t return this.recording = false;\n\t }\n\t if (!this.$addCommandToMacro) {\n\t this.$addCommandToMacro = function(e) {\n\t this.macro.push([e.command, e.args]);\n\t }.bind(this);\n\t }\n\t\n\t this.oldMacro = this.macro;\n\t this.macro = [];\n\t this.on(\"exec\", this.$addCommandToMacro);\n\t return this.recording = true;\n\t };\n\t\n\t this.replay = function(editor) {\n\t if (this.$inReplay || !this.macro)\n\t return;\n\t\n\t if (this.recording)\n\t return this.toggleRecording(editor);\n\t\n\t try {\n\t this.$inReplay = true;\n\t this.macro.forEach(function(x) {\n\t if (typeof x == \"string\")\n\t this.exec(x, editor);\n\t else\n\t this.exec(x[0], editor, x[1]);\n\t }, this);\n\t } finally {\n\t this.$inReplay = false;\n\t }\n\t };\n\t\n\t this.trimMacro = function(m) {\n\t return m.map(function(x){\n\t if (typeof x[0] != \"string\")\n\t x[0] = x[0].name;\n\t if (!x[1])\n\t x = x[0];\n\t return x;\n\t });\n\t };\n\t\n\t}).call(CommandManager.prototype);\n\t\n\texports.CommandManager = CommandManager;\n\t\n\t});\n\t\n\tace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar lang = acequire(\"../lib/lang\");\n\tvar config = acequire(\"../config\");\n\tvar Range = acequire(\"../range\").Range;\n\t\n\tfunction bindKey(win, mac) {\n\t return {win: win, mac: mac};\n\t}\n\texports.commands = [{\n\t name: \"showSettingsMenu\",\n\t bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n\t exec: function(editor) {\n\t config.loadModule(\"ace/ext/settings_menu\", function(module) {\n\t module.init(editor);\n\t editor.showSettingsMenu();\n\t });\n\t },\n\t readOnly: true\n\t}, {\n\t name: \"goToNextError\",\n\t bindKey: bindKey(\"Alt-E\", \"Ctrl-E\"),\n\t exec: function(editor) {\n\t config.loadModule(\"ace/ext/error_marker\", function(module) {\n\t module.showErrorMarker(editor, 1);\n\t });\n\t },\n\t scrollIntoView: \"animate\",\n\t readOnly: true\n\t}, {\n\t name: \"goToPreviousError\",\n\t bindKey: bindKey(\"Alt-Shift-E\", \"Ctrl-Shift-E\"),\n\t exec: function(editor) {\n\t config.loadModule(\"ace/ext/error_marker\", function(module) {\n\t module.showErrorMarker(editor, -1);\n\t });\n\t },\n\t scrollIntoView: \"animate\",\n\t readOnly: true\n\t}, {\n\t name: \"selectall\",\n\t bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n\t exec: function(editor) { editor.selectAll(); },\n\t readOnly: true\n\t}, {\n\t name: \"centerselection\",\n\t bindKey: bindKey(null, \"Ctrl-L\"),\n\t exec: function(editor) { editor.centerSelection(); },\n\t readOnly: true\n\t}, {\n\t name: \"gotoline\",\n\t bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n\t exec: function(editor) {\n\t var line = parseInt(prompt(\"Enter line number:\"), 10);\n\t if (!isNaN(line)) {\n\t editor.gotoLine(line);\n\t }\n\t },\n\t readOnly: true\n\t}, {\n\t name: \"fold\",\n\t bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n\t exec: function(editor) { editor.session.toggleFold(false); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"unfold\",\n\t bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n\t exec: function(editor) { editor.session.toggleFold(true); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"toggleFoldWidget\",\n\t bindKey: bindKey(\"F2\", \"F2\"),\n\t exec: function(editor) { editor.session.toggleFoldWidget(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"toggleParentFoldWidget\",\n\t bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n\t exec: function(editor) { editor.session.toggleFoldWidget(true); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"foldall\",\n\t bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n\t exec: function(editor) { editor.session.foldAll(); },\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"foldOther\",\n\t bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n\t exec: function(editor) { \n\t editor.session.foldAll();\n\t editor.session.unfold(editor.selection.getAllRanges());\n\t },\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"unfoldall\",\n\t bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n\t exec: function(editor) { editor.session.unfold(); },\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"findnext\",\n\t bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n\t exec: function(editor) { editor.findNext(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"findprevious\",\n\t bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n\t exec: function(editor) { editor.findPrevious(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"center\",\n\t readOnly: true\n\t}, {\n\t name: \"selectOrFindNext\",\n\t bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n\t exec: function(editor) {\n\t if (editor.selection.isEmpty())\n\t editor.selection.selectWord();\n\t else\n\t editor.findNext(); \n\t },\n\t readOnly: true\n\t}, {\n\t name: \"selectOrFindPrevious\",\n\t bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n\t exec: function(editor) { \n\t if (editor.selection.isEmpty())\n\t editor.selection.selectWord();\n\t else\n\t editor.findPrevious();\n\t },\n\t readOnly: true\n\t}, {\n\t name: \"find\",\n\t bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n\t exec: function(editor) {\n\t config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor)});\n\t },\n\t readOnly: true\n\t}, {\n\t name: \"overwrite\",\n\t bindKey: \"Insert\",\n\t exec: function(editor) { editor.toggleOverwrite(); },\n\t readOnly: true\n\t}, {\n\t name: \"selecttostart\",\n\t bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Up\"),\n\t exec: function(editor) { editor.getSelection().selectFileStart(); },\n\t multiSelectAction: \"forEach\",\n\t readOnly: true,\n\t scrollIntoView: \"animate\",\n\t aceCommandGroup: \"fileJump\"\n\t}, {\n\t name: \"gotostart\",\n\t bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n\t exec: function(editor) { editor.navigateFileStart(); },\n\t multiSelectAction: \"forEach\",\n\t readOnly: true,\n\t scrollIntoView: \"animate\",\n\t aceCommandGroup: \"fileJump\"\n\t}, {\n\t name: \"selectup\",\n\t bindKey: bindKey(\"Shift-Up\", \"Shift-Up\"),\n\t exec: function(editor) { editor.getSelection().selectUp(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"golineup\",\n\t bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n\t exec: function(editor, args) { editor.navigateUp(args.times); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selecttoend\",\n\t bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-Down\"),\n\t exec: function(editor) { editor.getSelection().selectFileEnd(); },\n\t multiSelectAction: \"forEach\",\n\t readOnly: true,\n\t scrollIntoView: \"animate\",\n\t aceCommandGroup: \"fileJump\"\n\t}, {\n\t name: \"gotoend\",\n\t bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n\t exec: function(editor) { editor.navigateFileEnd(); },\n\t multiSelectAction: \"forEach\",\n\t readOnly: true,\n\t scrollIntoView: \"animate\",\n\t aceCommandGroup: \"fileJump\"\n\t}, {\n\t name: \"selectdown\",\n\t bindKey: bindKey(\"Shift-Down\", \"Shift-Down\"),\n\t exec: function(editor) { editor.getSelection().selectDown(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"golinedown\",\n\t bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n\t exec: function(editor, args) { editor.navigateDown(args.times); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectwordleft\",\n\t bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n\t exec: function(editor) { editor.getSelection().selectWordLeft(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"gotowordleft\",\n\t bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n\t exec: function(editor) { editor.navigateWordLeft(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selecttolinestart\",\n\t bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left\"),\n\t exec: function(editor) { editor.getSelection().selectLineStart(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"gotolinestart\",\n\t bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n\t exec: function(editor) { editor.navigateLineStart(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectleft\",\n\t bindKey: bindKey(\"Shift-Left\", \"Shift-Left\"),\n\t exec: function(editor) { editor.getSelection().selectLeft(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"gotoleft\",\n\t bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n\t exec: function(editor, args) { editor.navigateLeft(args.times); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectwordright\",\n\t bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n\t exec: function(editor) { editor.getSelection().selectWordRight(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"gotowordright\",\n\t bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n\t exec: function(editor) { editor.navigateWordRight(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selecttolineend\",\n\t bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right\"),\n\t exec: function(editor) { editor.getSelection().selectLineEnd(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"gotolineend\",\n\t bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n\t exec: function(editor) { editor.navigateLineEnd(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectright\",\n\t bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n\t exec: function(editor) { editor.getSelection().selectRight(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"gotoright\",\n\t bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n\t exec: function(editor, args) { editor.navigateRight(args.times); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectpagedown\",\n\t bindKey: \"Shift-PageDown\",\n\t exec: function(editor) { editor.selectPageDown(); },\n\t readOnly: true\n\t}, {\n\t name: \"pagedown\",\n\t bindKey: bindKey(null, \"Option-PageDown\"),\n\t exec: function(editor) { editor.scrollPageDown(); },\n\t readOnly: true\n\t}, {\n\t name: \"gotopagedown\",\n\t bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n\t exec: function(editor) { editor.gotoPageDown(); },\n\t readOnly: true\n\t}, {\n\t name: \"selectpageup\",\n\t bindKey: \"Shift-PageUp\",\n\t exec: function(editor) { editor.selectPageUp(); },\n\t readOnly: true\n\t}, {\n\t name: \"pageup\",\n\t bindKey: bindKey(null, \"Option-PageUp\"),\n\t exec: function(editor) { editor.scrollPageUp(); },\n\t readOnly: true\n\t}, {\n\t name: \"gotopageup\",\n\t bindKey: \"PageUp\",\n\t exec: function(editor) { editor.gotoPageUp(); },\n\t readOnly: true\n\t}, {\n\t name: \"scrollup\",\n\t bindKey: bindKey(\"Ctrl-Up\", null),\n\t exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n\t readOnly: true\n\t}, {\n\t name: \"scrolldown\",\n\t bindKey: bindKey(\"Ctrl-Down\", null),\n\t exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n\t readOnly: true\n\t}, {\n\t name: \"selectlinestart\",\n\t bindKey: \"Shift-Home\",\n\t exec: function(editor) { editor.getSelection().selectLineStart(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectlineend\",\n\t bindKey: \"Shift-End\",\n\t exec: function(editor) { editor.getSelection().selectLineEnd(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"togglerecording\",\n\t bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n\t exec: function(editor) { editor.commands.toggleRecording(editor); },\n\t readOnly: true\n\t}, {\n\t name: \"replaymacro\",\n\t bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n\t exec: function(editor) { editor.commands.replay(editor); },\n\t readOnly: true\n\t}, {\n\t name: \"jumptomatching\",\n\t bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n\t exec: function(editor) { editor.jumpToMatching(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"animate\",\n\t readOnly: true\n\t}, {\n\t name: \"selecttomatching\",\n\t bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n\t exec: function(editor) { editor.jumpToMatching(true); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"animate\",\n\t readOnly: true\n\t}, {\n\t name: \"expandToMatching\",\n\t bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n\t exec: function(editor) { editor.jumpToMatching(true, true); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"animate\",\n\t readOnly: true\n\t}, {\n\t name: \"passKeysToBrowser\",\n\t bindKey: bindKey(null, null),\n\t exec: function() {},\n\t passEvent: true,\n\t readOnly: true\n\t}, {\n\t name: \"copy\",\n\t exec: function(editor) {\n\t },\n\t readOnly: true\n\t},\n\t{\n\t name: \"cut\",\n\t exec: function(editor) {\n\t var range = editor.getSelectionRange();\n\t editor._emit(\"cut\", range);\n\t\n\t if (!editor.selection.isEmpty()) {\n\t editor.session.remove(range);\n\t editor.clearSelection();\n\t }\n\t },\n\t scrollIntoView: \"cursor\",\n\t multiSelectAction: \"forEach\"\n\t}, {\n\t name: \"paste\",\n\t exec: function(editor, args) {\n\t editor.$handlePaste(args);\n\t },\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"removeline\",\n\t bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n\t exec: function(editor) { editor.removeLines(); },\n\t scrollIntoView: \"cursor\",\n\t multiSelectAction: \"forEachLine\"\n\t}, {\n\t name: \"duplicateSelection\",\n\t bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n\t exec: function(editor) { editor.duplicateSelection(); },\n\t scrollIntoView: \"cursor\",\n\t multiSelectAction: \"forEach\"\n\t}, {\n\t name: \"sortlines\",\n\t bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n\t exec: function(editor) { editor.sortLines(); },\n\t scrollIntoView: \"selection\",\n\t multiSelectAction: \"forEachLine\"\n\t}, {\n\t name: \"togglecomment\",\n\t bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n\t exec: function(editor) { editor.toggleCommentLines(); },\n\t multiSelectAction: \"forEachLine\",\n\t scrollIntoView: \"selectionPart\"\n\t}, {\n\t name: \"toggleBlockComment\",\n\t bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n\t exec: function(editor) { editor.toggleBlockComment(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"selectionPart\"\n\t}, {\n\t name: \"modifyNumberUp\",\n\t bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n\t exec: function(editor) { editor.modifyNumber(1); },\n\t scrollIntoView: \"cursor\",\n\t multiSelectAction: \"forEach\"\n\t}, {\n\t name: \"modifyNumberDown\",\n\t bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n\t exec: function(editor) { editor.modifyNumber(-1); },\n\t scrollIntoView: \"cursor\",\n\t multiSelectAction: \"forEach\"\n\t}, {\n\t name: \"replace\",\n\t bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n\t exec: function(editor) {\n\t config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true)});\n\t }\n\t}, {\n\t name: \"undo\",\n\t bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n\t exec: function(editor) { editor.undo(); }\n\t}, {\n\t name: \"redo\",\n\t bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n\t exec: function(editor) { editor.redo(); }\n\t}, {\n\t name: \"copylinesup\",\n\t bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n\t exec: function(editor) { editor.copyLinesUp(); },\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"movelinesup\",\n\t bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n\t exec: function(editor) { editor.moveLinesUp(); },\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"copylinesdown\",\n\t bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n\t exec: function(editor) { editor.copyLinesDown(); },\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"movelinesdown\",\n\t bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n\t exec: function(editor) { editor.moveLinesDown(); },\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"del\",\n\t bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n\t exec: function(editor) { editor.remove(\"right\"); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"backspace\",\n\t bindKey: bindKey(\n\t \"Shift-Backspace|Backspace\",\n\t \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n\t ),\n\t exec: function(editor) { editor.remove(\"left\"); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"cut_or_delete\",\n\t bindKey: bindKey(\"Shift-Delete\", null),\n\t exec: function(editor) { \n\t if (editor.selection.isEmpty()) {\n\t editor.remove(\"left\");\n\t } else {\n\t return false;\n\t }\n\t },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"removetolinestart\",\n\t bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n\t exec: function(editor) { editor.removeToLineStart(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"removetolineend\",\n\t bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K\"),\n\t exec: function(editor) { editor.removeToLineEnd(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"removewordleft\",\n\t bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n\t exec: function(editor) { editor.removeWordLeft(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"removewordright\",\n\t bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n\t exec: function(editor) { editor.removeWordRight(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"outdent\",\n\t bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n\t exec: function(editor) { editor.blockOutdent(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"selectionPart\"\n\t}, {\n\t name: \"indent\",\n\t bindKey: bindKey(\"Tab\", \"Tab\"),\n\t exec: function(editor) { editor.indent(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"selectionPart\"\n\t}, {\n\t name: \"blockoutdent\",\n\t bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n\t exec: function(editor) { editor.blockOutdent(); },\n\t multiSelectAction: \"forEachLine\",\n\t scrollIntoView: \"selectionPart\"\n\t}, {\n\t name: \"blockindent\",\n\t bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n\t exec: function(editor) { editor.blockIndent(); },\n\t multiSelectAction: \"forEachLine\",\n\t scrollIntoView: \"selectionPart\"\n\t}, {\n\t name: \"insertstring\",\n\t exec: function(editor, str) { editor.insert(str); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"inserttext\",\n\t exec: function(editor, args) {\n\t editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n\t },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"splitline\",\n\t bindKey: bindKey(null, \"Ctrl-O\"),\n\t exec: function(editor) { editor.splitLine(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"transposeletters\",\n\t bindKey: bindKey(\"Ctrl-T\", \"Ctrl-T\"),\n\t exec: function(editor) { editor.transposeLetters(); },\n\t multiSelectAction: function(editor) {editor.transposeSelections(1); },\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"touppercase\",\n\t bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n\t exec: function(editor) { editor.toUpperCase(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"tolowercase\",\n\t bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n\t exec: function(editor) { editor.toLowerCase(); },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"expandtoline\",\n\t bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n\t exec: function(editor) {\n\t var range = editor.selection.getRange();\n\t\n\t range.start.column = range.end.column = 0;\n\t range.end.row++;\n\t editor.selection.setRange(range, false);\n\t },\n\t multiSelectAction: \"forEach\",\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"joinlines\",\n\t bindKey: bindKey(null, null),\n\t exec: function(editor) {\n\t var isBackwards = editor.selection.isBackwards();\n\t var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n\t var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n\t var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n\t var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n\t var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n\t var insertLine = editor.session.doc.getLine(selectionStart.row);\n\t\n\t for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n\t var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n\t if (curLine.length !== 0) {\n\t curLine = \" \" + curLine;\n\t }\n\t insertLine += curLine;\n\t }\n\t\n\t if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n\t insertLine += editor.session.doc.getNewLineCharacter();\n\t }\n\t\n\t editor.clearSelection();\n\t editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\t\n\t if (selectedCount > 0) {\n\t editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n\t editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n\t } else {\n\t firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n\t editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n\t }\n\t },\n\t multiSelectAction: \"forEach\",\n\t readOnly: true\n\t}, {\n\t name: \"invertSelection\",\n\t bindKey: bindKey(null, null),\n\t exec: function(editor) {\n\t var endRow = editor.session.doc.getLength() - 1;\n\t var endCol = editor.session.doc.getLine(endRow).length;\n\t var ranges = editor.selection.rangeList.ranges;\n\t var newRanges = [];\n\t if (ranges.length < 1) {\n\t ranges = [editor.selection.getRange()];\n\t }\n\t\n\t for (var i = 0; i < ranges.length; i++) {\n\t if (i == (ranges.length - 1)) {\n\t if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n\t newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n\t }\n\t }\n\t\n\t if (i === 0) {\n\t if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n\t newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n\t }\n\t } else {\n\t newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n\t }\n\t }\n\t\n\t editor.exitMultiSelectMode();\n\t editor.clearSelection();\n\t\n\t for(var i = 0; i < newRanges.length; i++) {\n\t editor.selection.addRange(newRanges[i], false);\n\t }\n\t },\n\t readOnly: true,\n\t scrollIntoView: \"none\"\n\t}];\n\t\n\t});\n\t\n\tace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tacequire(\"./lib/fixoldbrowsers\");\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar dom = acequire(\"./lib/dom\");\n\tvar lang = acequire(\"./lib/lang\");\n\tvar useragent = acequire(\"./lib/useragent\");\n\tvar TextInput = acequire(\"./keyboard/textinput\").TextInput;\n\tvar MouseHandler = acequire(\"./mouse/mouse_handler\").MouseHandler;\n\tvar FoldHandler = acequire(\"./mouse/fold_handler\").FoldHandler;\n\tvar KeyBinding = acequire(\"./keyboard/keybinding\").KeyBinding;\n\tvar EditSession = acequire(\"./edit_session\").EditSession;\n\tvar Search = acequire(\"./search\").Search;\n\tvar Range = acequire(\"./range\").Range;\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar CommandManager = acequire(\"./commands/command_manager\").CommandManager;\n\tvar defaultCommands = acequire(\"./commands/default_commands\").commands;\n\tvar config = acequire(\"./config\");\n\tvar TokenIterator = acequire(\"./token_iterator\").TokenIterator;\n\tvar Editor = function(renderer, session) {\n\t var container = renderer.getContainerElement();\n\t this.container = container;\n\t this.renderer = renderer;\n\t\n\t this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n\t this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n\t this.renderer.textarea = this.textInput.getElement();\n\t this.keyBinding = new KeyBinding(this);\n\t this.$mouseHandler = new MouseHandler(this);\n\t new FoldHandler(this);\n\t\n\t this.$blockScrolling = 0;\n\t this.$search = new Search().set({\n\t wrap: true\n\t });\n\t\n\t this.$historyTracker = this.$historyTracker.bind(this);\n\t this.commands.on(\"exec\", this.$historyTracker);\n\t\n\t this.$initOperationListeners();\n\t \n\t this._$emitInputEvent = lang.delayedCall(function() {\n\t this._signal(\"input\", {});\n\t if (this.session && this.session.bgTokenizer)\n\t this.session.bgTokenizer.scheduleStart();\n\t }.bind(this));\n\t \n\t this.on(\"change\", function(_, _self) {\n\t _self._$emitInputEvent.schedule(31);\n\t });\n\t\n\t this.setSession(session || new EditSession(\"\"));\n\t config.resetOptions(this);\n\t config._signal(\"editor\", this);\n\t};\n\t\n\t(function(){\n\t\n\t oop.implement(this, EventEmitter);\n\t\n\t this.$initOperationListeners = function() {\n\t function last(a) {return a[a.length - 1]}\n\t\n\t this.selections = [];\n\t this.commands.on(\"exec\", this.startOperation.bind(this), true);\n\t this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\t\n\t this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\t\n\t this.on(\"change\", function() {\n\t this.curOp || this.startOperation();\n\t this.curOp.docChanged = true;\n\t }.bind(this), true);\n\t\n\t this.on(\"changeSelection\", function() {\n\t this.curOp || this.startOperation();\n\t this.curOp.selectionChanged = true;\n\t }.bind(this), true);\n\t };\n\t\n\t this.curOp = null;\n\t this.prevOp = {};\n\t this.startOperation = function(commadEvent) {\n\t if (this.curOp) {\n\t if (!commadEvent || this.curOp.command)\n\t return;\n\t this.prevOp = this.curOp;\n\t }\n\t if (!commadEvent) {\n\t this.previousCommand = null;\n\t commadEvent = {};\n\t }\n\t\n\t this.$opResetTimer.schedule();\n\t this.curOp = {\n\t command: commadEvent.command || {},\n\t args: commadEvent.args,\n\t scrollTop: this.renderer.scrollTop\n\t };\n\t if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\n\t this.$blockScrolling++;\n\t };\n\t\n\t this.endOperation = function(e) {\n\t if (this.curOp) {\n\t if (e && e.returnValue === false)\n\t return this.curOp = null;\n\t this._signal(\"beforeEndOperation\");\n\t var command = this.curOp.command;\n\t if (command.name && this.$blockScrolling > 0)\n\t this.$blockScrolling--;\n\t var scrollIntoView = command && command.scrollIntoView;\n\t if (scrollIntoView) {\n\t switch (scrollIntoView) {\n\t case \"center-animate\":\n\t scrollIntoView = \"animate\";\n\t case \"center\":\n\t this.renderer.scrollCursorIntoView(null, 0.5);\n\t break;\n\t case \"animate\":\n\t case \"cursor\":\n\t this.renderer.scrollCursorIntoView();\n\t break;\n\t case \"selectionPart\":\n\t var range = this.selection.getRange();\n\t var config = this.renderer.layerConfig;\n\t if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n\t this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n\t }\n\t break;\n\t default:\n\t break;\n\t }\n\t if (scrollIntoView == \"animate\")\n\t this.renderer.animateScrolling(this.curOp.scrollTop);\n\t }\n\t \n\t this.prevOp = this.curOp;\n\t this.curOp = null;\n\t }\n\t };\n\t this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n\t this.$historyTracker = function(e) {\n\t if (!this.$mergeUndoDeltas)\n\t return;\n\t\n\t var prev = this.prevOp;\n\t var mergeableCommands = this.$mergeableCommands;\n\t var shouldMerge = prev.command && (e.command.name == prev.command.name);\n\t if (e.command.name == \"insertstring\") {\n\t var text = e.args;\n\t if (this.mergeNextCommand === undefined)\n\t this.mergeNextCommand = true;\n\t\n\t shouldMerge = shouldMerge\n\t && this.mergeNextCommand // previous command allows to coalesce with\n\t && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\t\n\t this.mergeNextCommand = true;\n\t } else {\n\t shouldMerge = shouldMerge\n\t && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n\t }\n\t\n\t if (\n\t this.$mergeUndoDeltas != \"always\"\n\t && Date.now() - this.sequenceStartTime > 2000\n\t ) {\n\t shouldMerge = false; // the sequence is too long\n\t }\n\t\n\t if (shouldMerge)\n\t this.session.mergeUndoDeltas = true;\n\t else if (mergeableCommands.indexOf(e.command.name) !== -1)\n\t this.sequenceStartTime = Date.now();\n\t };\n\t this.setKeyboardHandler = function(keyboardHandler, cb) {\n\t if (keyboardHandler && typeof keyboardHandler === \"string\") {\n\t this.$keybindingId = keyboardHandler;\n\t var _self = this;\n\t config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n\t if (_self.$keybindingId == keyboardHandler)\n\t _self.keyBinding.setKeyboardHandler(module && module.handler);\n\t cb && cb();\n\t });\n\t } else {\n\t this.$keybindingId = null;\n\t this.keyBinding.setKeyboardHandler(keyboardHandler);\n\t cb && cb();\n\t }\n\t };\n\t this.getKeyboardHandler = function() {\n\t return this.keyBinding.getKeyboardHandler();\n\t };\n\t this.setSession = function(session) {\n\t if (this.session == session)\n\t return;\n\t if (this.curOp) this.endOperation();\n\t this.curOp = {};\n\t\n\t var oldSession = this.session;\n\t if (oldSession) {\n\t this.session.off(\"change\", this.$onDocumentChange);\n\t this.session.off(\"changeMode\", this.$onChangeMode);\n\t this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n\t this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n\t this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n\t this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n\t this.session.off(\"changeFold\", this.$onChangeFold);\n\t this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n\t this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n\t this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n\t this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n\t this.session.off(\"changeOverwrite\", this.$onCursorChange);\n\t this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n\t this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\t\n\t var selection = this.session.getSelection();\n\t selection.off(\"changeCursor\", this.$onCursorChange);\n\t selection.off(\"changeSelection\", this.$onSelectionChange);\n\t }\n\t\n\t this.session = session;\n\t if (session) {\n\t this.$onDocumentChange = this.onDocumentChange.bind(this);\n\t session.on(\"change\", this.$onDocumentChange);\n\t this.renderer.setSession(session);\n\t \n\t this.$onChangeMode = this.onChangeMode.bind(this);\n\t session.on(\"changeMode\", this.$onChangeMode);\n\t \n\t this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n\t session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n\t \n\t this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n\t session.on(\"changeTabSize\", this.$onChangeTabSize);\n\t \n\t this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n\t session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n\t \n\t this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n\t session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n\t \n\t this.$onChangeFold = this.onChangeFold.bind(this);\n\t session.on(\"changeFold\", this.$onChangeFold);\n\t \n\t this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n\t this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n\t \n\t this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n\t this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n\t \n\t this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n\t this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n\t \n\t this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n\t this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n\t \n\t this.$onCursorChange = this.onCursorChange.bind(this);\n\t this.session.on(\"changeOverwrite\", this.$onCursorChange);\n\t \n\t this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n\t this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n\t \n\t this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n\t this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n\t \n\t this.selection = session.getSelection();\n\t this.selection.on(\"changeCursor\", this.$onCursorChange);\n\t \n\t this.$onSelectionChange = this.onSelectionChange.bind(this);\n\t this.selection.on(\"changeSelection\", this.$onSelectionChange);\n\t \n\t this.onChangeMode();\n\t \n\t this.$blockScrolling += 1;\n\t this.onCursorChange();\n\t this.$blockScrolling -= 1;\n\t \n\t this.onScrollTopChange();\n\t this.onScrollLeftChange();\n\t this.onSelectionChange();\n\t this.onChangeFrontMarker();\n\t this.onChangeBackMarker();\n\t this.onChangeBreakpoint();\n\t this.onChangeAnnotation();\n\t this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n\t this.renderer.updateFull();\n\t } else {\n\t this.selection = null;\n\t this.renderer.setSession(session);\n\t }\n\t\n\t this._signal(\"changeSession\", {\n\t session: session,\n\t oldSession: oldSession\n\t });\n\t \n\t this.curOp = null;\n\t \n\t oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n\t session && session._signal(\"changeEditor\", {editor: this});\n\t };\n\t this.getSession = function() {\n\t return this.session;\n\t };\n\t this.setValue = function(val, cursorPos) {\n\t this.session.doc.setValue(val);\n\t\n\t if (!cursorPos)\n\t this.selectAll();\n\t else if (cursorPos == 1)\n\t this.navigateFileEnd();\n\t else if (cursorPos == -1)\n\t this.navigateFileStart();\n\t\n\t return val;\n\t };\n\t this.getValue = function() {\n\t return this.session.getValue();\n\t };\n\t this.getSelection = function() {\n\t return this.selection;\n\t };\n\t this.resize = function(force) {\n\t this.renderer.onResize(force);\n\t };\n\t this.setTheme = function(theme, cb) {\n\t this.renderer.setTheme(theme, cb);\n\t };\n\t this.getTheme = function() {\n\t return this.renderer.getTheme();\n\t };\n\t this.setStyle = function(style) {\n\t this.renderer.setStyle(style);\n\t };\n\t this.unsetStyle = function(style) {\n\t this.renderer.unsetStyle(style);\n\t };\n\t this.getFontSize = function () {\n\t return this.getOption(\"fontSize\") ||\n\t dom.computedStyle(this.container, \"fontSize\");\n\t };\n\t this.setFontSize = function(size) {\n\t this.setOption(\"fontSize\", size);\n\t };\n\t\n\t this.$highlightBrackets = function() {\n\t if (this.session.$bracketHighlight) {\n\t this.session.removeMarker(this.session.$bracketHighlight);\n\t this.session.$bracketHighlight = null;\n\t }\n\t\n\t if (this.$highlightPending) {\n\t return;\n\t }\n\t var self = this;\n\t this.$highlightPending = true;\n\t setTimeout(function() {\n\t self.$highlightPending = false;\n\t var session = self.session;\n\t if (!session || !session.bgTokenizer) return;\n\t var pos = session.findMatchingBracket(self.getCursorPosition());\n\t if (pos) {\n\t var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n\t } else if (session.$mode.getMatching) {\n\t var range = session.$mode.getMatching(self.session);\n\t }\n\t if (range)\n\t session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n\t }, 50);\n\t };\n\t this.$highlightTags = function() {\n\t if (this.$highlightTagPending)\n\t return;\n\t var self = this;\n\t this.$highlightTagPending = true;\n\t setTimeout(function() {\n\t self.$highlightTagPending = false;\n\t \n\t var session = self.session;\n\t if (!session || !session.bgTokenizer) return;\n\t \n\t var pos = self.getCursorPosition();\n\t var iterator = new TokenIterator(self.session, pos.row, pos.column);\n\t var token = iterator.getCurrentToken();\n\t \n\t if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n\t session.removeMarker(session.$tagHighlight);\n\t session.$tagHighlight = null;\n\t return;\n\t }\n\t \n\t if (token.type.indexOf(\"tag-open\") != -1) {\n\t token = iterator.stepForward();\n\t if (!token)\n\t return;\n\t }\n\t \n\t var tag = token.value;\n\t var depth = 0;\n\t var prevToken = iterator.stepBackward();\n\t \n\t if (prevToken.value == '<'){\n\t do {\n\t prevToken = token;\n\t token = iterator.stepForward();\n\t \n\t if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n\t if (prevToken.value === '<'){\n\t depth++;\n\t } else if (prevToken.value === '= 0);\n\t } else {\n\t do {\n\t token = prevToken;\n\t prevToken = iterator.stepBackward();\n\t \n\t if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n\t if (prevToken.value === '<') {\n\t depth++;\n\t } else if (prevToken.value === ' 1))\n\t highlight = false;\n\t }\n\t\n\t if (session.$highlightLineMarker && !highlight) {\n\t session.removeMarker(session.$highlightLineMarker.id);\n\t session.$highlightLineMarker = null;\n\t } else if (!session.$highlightLineMarker && highlight) {\n\t var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n\t range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n\t session.$highlightLineMarker = range;\n\t } else if (highlight) {\n\t session.$highlightLineMarker.start.row = highlight.row;\n\t session.$highlightLineMarker.end.row = highlight.row;\n\t session.$highlightLineMarker.start.column = highlight.column;\n\t session._signal(\"changeBackMarker\");\n\t }\n\t };\n\t\n\t this.onSelectionChange = function(e) {\n\t var session = this.session;\n\t\n\t if (session.$selectionMarker) {\n\t session.removeMarker(session.$selectionMarker);\n\t }\n\t session.$selectionMarker = null;\n\t\n\t if (!this.selection.isEmpty()) {\n\t var range = this.selection.getRange();\n\t var style = this.getSelectionStyle();\n\t session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n\t } else {\n\t this.$updateHighlightActiveLine();\n\t }\n\t\n\t var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n\t this.session.highlight(re);\n\t\n\t this._signal(\"changeSelection\");\n\t };\n\t\n\t this.$getSelectionHighLightRegexp = function() {\n\t var session = this.session;\n\t\n\t var selection = this.getSelectionRange();\n\t if (selection.isEmpty() || selection.isMultiLine())\n\t return;\n\t\n\t var startOuter = selection.start.column - 1;\n\t var endOuter = selection.end.column + 1;\n\t var line = session.getLine(selection.start.row);\n\t var lineCols = line.length;\n\t var needle = line.substring(Math.max(startOuter, 0),\n\t Math.min(endOuter, lineCols));\n\t if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n\t (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n\t return;\n\t\n\t needle = line.substring(selection.start.column, selection.end.column);\n\t if (!/^[\\w\\d]+$/.test(needle))\n\t return;\n\t\n\t var re = this.$search.$assembleRegExp({\n\t wholeWord: true,\n\t caseSensitive: true,\n\t needle: needle\n\t });\n\t\n\t return re;\n\t };\n\t\n\t\n\t this.onChangeFrontMarker = function() {\n\t this.renderer.updateFrontMarkers();\n\t };\n\t\n\t this.onChangeBackMarker = function() {\n\t this.renderer.updateBackMarkers();\n\t };\n\t\n\t\n\t this.onChangeBreakpoint = function() {\n\t this.renderer.updateBreakpoints();\n\t };\n\t\n\t this.onChangeAnnotation = function() {\n\t this.renderer.setAnnotations(this.session.getAnnotations());\n\t };\n\t\n\t\n\t this.onChangeMode = function(e) {\n\t this.renderer.updateText();\n\t this._emit(\"changeMode\", e);\n\t };\n\t\n\t\n\t this.onChangeWrapLimit = function() {\n\t this.renderer.updateFull();\n\t };\n\t\n\t this.onChangeWrapMode = function() {\n\t this.renderer.onResize(true);\n\t };\n\t\n\t\n\t this.onChangeFold = function() {\n\t this.$updateHighlightActiveLine();\n\t this.renderer.updateFull();\n\t };\n\t this.getSelectedText = function() {\n\t return this.session.getTextRange(this.getSelectionRange());\n\t };\n\t this.getCopyText = function() {\n\t var text = this.getSelectedText();\n\t this._signal(\"copy\", text);\n\t return text;\n\t };\n\t this.onCopy = function() {\n\t this.commands.exec(\"copy\", this);\n\t };\n\t this.onCut = function() {\n\t this.commands.exec(\"cut\", this);\n\t };\n\t this.onPaste = function(text, event) {\n\t var e = {text: text, event: event};\n\t this.commands.exec(\"paste\", this, e);\n\t };\n\t \n\t this.$handlePaste = function(e) {\n\t if (typeof e == \"string\") \n\t e = {text: e};\n\t this._signal(\"paste\", e);\n\t var text = e.text;\n\t if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n\t this.insert(text);\n\t } else {\n\t var lines = text.split(/\\r\\n|\\r|\\n/);\n\t var ranges = this.selection.rangeList.ranges;\n\t \n\t if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n\t return this.commands.exec(\"insertstring\", this, text);\n\t \n\t for (var i = ranges.length; i--;) {\n\t var range = ranges[i];\n\t if (!range.isEmpty())\n\t this.session.remove(range);\n\t \n\t this.session.insert(range.start, lines[i]);\n\t }\n\t }\n\t };\n\t\n\t this.execCommand = function(command, args) {\n\t return this.commands.exec(command, this, args);\n\t };\n\t this.insert = function(text, pasted) {\n\t var session = this.session;\n\t var mode = session.getMode();\n\t var cursor = this.getCursorPosition();\n\t\n\t if (this.getBehavioursEnabled() && !pasted) {\n\t var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n\t if (transform) {\n\t if (text !== transform.text) {\n\t this.session.mergeUndoDeltas = false;\n\t this.$mergeNextCommand = false;\n\t }\n\t text = transform.text;\n\t\n\t }\n\t }\n\t \n\t if (text == \"\\t\")\n\t text = this.session.getTabString();\n\t if (!this.selection.isEmpty()) {\n\t var range = this.getSelectionRange();\n\t cursor = this.session.remove(range);\n\t this.clearSelection();\n\t }\n\t else if (this.session.getOverwrite()) {\n\t var range = new Range.fromPoints(cursor, cursor);\n\t range.end.column += text.length;\n\t this.session.remove(range);\n\t }\n\t\n\t if (text == \"\\n\" || text == \"\\r\\n\") {\n\t var line = session.getLine(cursor.row);\n\t if (cursor.column > line.search(/\\S|$/)) {\n\t var d = line.substr(cursor.column).search(/\\S|$/);\n\t session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n\t }\n\t }\n\t this.clearSelection();\n\t\n\t var start = cursor.column;\n\t var lineState = session.getState(cursor.row);\n\t var line = session.getLine(cursor.row);\n\t var shouldOutdent = mode.checkOutdent(lineState, line, text);\n\t var end = session.insert(cursor, text);\n\t\n\t if (transform && transform.selection) {\n\t if (transform.selection.length == 2) { // Transform relative to the current column\n\t this.selection.setSelectionRange(\n\t new Range(cursor.row, start + transform.selection[0],\n\t cursor.row, start + transform.selection[1]));\n\t } else { // Transform relative to the current row.\n\t this.selection.setSelectionRange(\n\t new Range(cursor.row + transform.selection[0],\n\t transform.selection[1],\n\t cursor.row + transform.selection[2],\n\t transform.selection[3]));\n\t }\n\t }\n\t\n\t if (session.getDocument().isNewLine(text)) {\n\t var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\t\n\t session.insert({row: cursor.row+1, column: 0}, lineIndent);\n\t }\n\t if (shouldOutdent)\n\t mode.autoOutdent(lineState, session, cursor.row);\n\t };\n\t\n\t this.onTextInput = function(text) {\n\t this.keyBinding.onTextInput(text);\n\t };\n\t\n\t this.onCommandKey = function(e, hashId, keyCode) {\n\t this.keyBinding.onCommandKey(e, hashId, keyCode);\n\t };\n\t this.setOverwrite = function(overwrite) {\n\t this.session.setOverwrite(overwrite);\n\t };\n\t this.getOverwrite = function() {\n\t return this.session.getOverwrite();\n\t };\n\t this.toggleOverwrite = function() {\n\t this.session.toggleOverwrite();\n\t };\n\t this.setScrollSpeed = function(speed) {\n\t this.setOption(\"scrollSpeed\", speed);\n\t };\n\t this.getScrollSpeed = function() {\n\t return this.getOption(\"scrollSpeed\");\n\t };\n\t this.setDragDelay = function(dragDelay) {\n\t this.setOption(\"dragDelay\", dragDelay);\n\t };\n\t this.getDragDelay = function() {\n\t return this.getOption(\"dragDelay\");\n\t };\n\t this.setSelectionStyle = function(val) {\n\t this.setOption(\"selectionStyle\", val);\n\t };\n\t this.getSelectionStyle = function() {\n\t return this.getOption(\"selectionStyle\");\n\t };\n\t this.setHighlightActiveLine = function(shouldHighlight) {\n\t this.setOption(\"highlightActiveLine\", shouldHighlight);\n\t };\n\t this.getHighlightActiveLine = function() {\n\t return this.getOption(\"highlightActiveLine\");\n\t };\n\t this.setHighlightGutterLine = function(shouldHighlight) {\n\t this.setOption(\"highlightGutterLine\", shouldHighlight);\n\t };\n\t\n\t this.getHighlightGutterLine = function() {\n\t return this.getOption(\"highlightGutterLine\");\n\t };\n\t this.setHighlightSelectedWord = function(shouldHighlight) {\n\t this.setOption(\"highlightSelectedWord\", shouldHighlight);\n\t };\n\t this.getHighlightSelectedWord = function() {\n\t return this.$highlightSelectedWord;\n\t };\n\t\n\t this.setAnimatedScroll = function(shouldAnimate){\n\t this.renderer.setAnimatedScroll(shouldAnimate);\n\t };\n\t\n\t this.getAnimatedScroll = function(){\n\t return this.renderer.getAnimatedScroll();\n\t };\n\t this.setShowInvisibles = function(showInvisibles) {\n\t this.renderer.setShowInvisibles(showInvisibles);\n\t };\n\t this.getShowInvisibles = function() {\n\t return this.renderer.getShowInvisibles();\n\t };\n\t\n\t this.setDisplayIndentGuides = function(display) {\n\t this.renderer.setDisplayIndentGuides(display);\n\t };\n\t\n\t this.getDisplayIndentGuides = function() {\n\t return this.renderer.getDisplayIndentGuides();\n\t };\n\t this.setShowPrintMargin = function(showPrintMargin) {\n\t this.renderer.setShowPrintMargin(showPrintMargin);\n\t };\n\t this.getShowPrintMargin = function() {\n\t return this.renderer.getShowPrintMargin();\n\t };\n\t this.setPrintMarginColumn = function(showPrintMargin) {\n\t this.renderer.setPrintMarginColumn(showPrintMargin);\n\t };\n\t this.getPrintMarginColumn = function() {\n\t return this.renderer.getPrintMarginColumn();\n\t };\n\t this.setReadOnly = function(readOnly) {\n\t this.setOption(\"readOnly\", readOnly);\n\t };\n\t this.getReadOnly = function() {\n\t return this.getOption(\"readOnly\");\n\t };\n\t this.setBehavioursEnabled = function (enabled) {\n\t this.setOption(\"behavioursEnabled\", enabled);\n\t };\n\t this.getBehavioursEnabled = function () {\n\t return this.getOption(\"behavioursEnabled\");\n\t };\n\t this.setWrapBehavioursEnabled = function (enabled) {\n\t this.setOption(\"wrapBehavioursEnabled\", enabled);\n\t };\n\t this.getWrapBehavioursEnabled = function () {\n\t return this.getOption(\"wrapBehavioursEnabled\");\n\t };\n\t this.setShowFoldWidgets = function(show) {\n\t this.setOption(\"showFoldWidgets\", show);\n\t\n\t };\n\t this.getShowFoldWidgets = function() {\n\t return this.getOption(\"showFoldWidgets\");\n\t };\n\t\n\t this.setFadeFoldWidgets = function(fade) {\n\t this.setOption(\"fadeFoldWidgets\", fade);\n\t };\n\t\n\t this.getFadeFoldWidgets = function() {\n\t return this.getOption(\"fadeFoldWidgets\");\n\t };\n\t this.remove = function(dir) {\n\t if (this.selection.isEmpty()){\n\t if (dir == \"left\")\n\t this.selection.selectLeft();\n\t else\n\t this.selection.selectRight();\n\t }\n\t\n\t var range = this.getSelectionRange();\n\t if (this.getBehavioursEnabled()) {\n\t var session = this.session;\n\t var state = session.getState(range.start.row);\n\t var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\t\n\t if (range.end.column === 0) {\n\t var text = session.getTextRange(range);\n\t if (text[text.length - 1] == \"\\n\") {\n\t var line = session.getLine(range.end.row);\n\t if (/^\\s+$/.test(line)) {\n\t range.end.column = line.length;\n\t }\n\t }\n\t }\n\t if (new_range)\n\t range = new_range;\n\t }\n\t\n\t this.session.remove(range);\n\t this.clearSelection();\n\t };\n\t this.removeWordRight = function() {\n\t if (this.selection.isEmpty())\n\t this.selection.selectWordRight();\n\t\n\t this.session.remove(this.getSelectionRange());\n\t this.clearSelection();\n\t };\n\t this.removeWordLeft = function() {\n\t if (this.selection.isEmpty())\n\t this.selection.selectWordLeft();\n\t\n\t this.session.remove(this.getSelectionRange());\n\t this.clearSelection();\n\t };\n\t this.removeToLineStart = function() {\n\t if (this.selection.isEmpty())\n\t this.selection.selectLineStart();\n\t\n\t this.session.remove(this.getSelectionRange());\n\t this.clearSelection();\n\t };\n\t this.removeToLineEnd = function() {\n\t if (this.selection.isEmpty())\n\t this.selection.selectLineEnd();\n\t\n\t var range = this.getSelectionRange();\n\t if (range.start.column == range.end.column && range.start.row == range.end.row) {\n\t range.end.column = 0;\n\t range.end.row++;\n\t }\n\t\n\t this.session.remove(range);\n\t this.clearSelection();\n\t };\n\t this.splitLine = function() {\n\t if (!this.selection.isEmpty()) {\n\t this.session.remove(this.getSelectionRange());\n\t this.clearSelection();\n\t }\n\t\n\t var cursor = this.getCursorPosition();\n\t this.insert(\"\\n\");\n\t this.moveCursorToPosition(cursor);\n\t };\n\t this.transposeLetters = function() {\n\t if (!this.selection.isEmpty()) {\n\t return;\n\t }\n\t\n\t var cursor = this.getCursorPosition();\n\t var column = cursor.column;\n\t if (column === 0)\n\t return;\n\t\n\t var line = this.session.getLine(cursor.row);\n\t var swap, range;\n\t if (column < line.length) {\n\t swap = line.charAt(column) + line.charAt(column-1);\n\t range = new Range(cursor.row, column-1, cursor.row, column+1);\n\t }\n\t else {\n\t swap = line.charAt(column-1) + line.charAt(column-2);\n\t range = new Range(cursor.row, column-2, cursor.row, column);\n\t }\n\t this.session.replace(range, swap);\n\t };\n\t this.toLowerCase = function() {\n\t var originalRange = this.getSelectionRange();\n\t if (this.selection.isEmpty()) {\n\t this.selection.selectWord();\n\t }\n\t\n\t var range = this.getSelectionRange();\n\t var text = this.session.getTextRange(range);\n\t this.session.replace(range, text.toLowerCase());\n\t this.selection.setSelectionRange(originalRange);\n\t };\n\t this.toUpperCase = function() {\n\t var originalRange = this.getSelectionRange();\n\t if (this.selection.isEmpty()) {\n\t this.selection.selectWord();\n\t }\n\t\n\t var range = this.getSelectionRange();\n\t var text = this.session.getTextRange(range);\n\t this.session.replace(range, text.toUpperCase());\n\t this.selection.setSelectionRange(originalRange);\n\t };\n\t this.indent = function() {\n\t var session = this.session;\n\t var range = this.getSelectionRange();\n\t\n\t if (range.start.row < range.end.row) {\n\t var rows = this.$getSelectedRows();\n\t session.indentRows(rows.first, rows.last, \"\\t\");\n\t return;\n\t } else if (range.start.column < range.end.column) {\n\t var text = session.getTextRange(range);\n\t if (!/^\\s+$/.test(text)) {\n\t var rows = this.$getSelectedRows();\n\t session.indentRows(rows.first, rows.last, \"\\t\");\n\t return;\n\t }\n\t }\n\t \n\t var line = session.getLine(range.start.row);\n\t var position = range.start;\n\t var size = session.getTabSize();\n\t var column = session.documentToScreenColumn(position.row, position.column);\n\t\n\t if (this.session.getUseSoftTabs()) {\n\t var count = (size - column % size);\n\t var indentString = lang.stringRepeat(\" \", count);\n\t } else {\n\t var count = column % size;\n\t while (line[range.start.column] == \" \" && count) {\n\t range.start.column--;\n\t count--;\n\t }\n\t this.selection.setSelectionRange(range);\n\t indentString = \"\\t\";\n\t }\n\t return this.insert(indentString);\n\t };\n\t this.blockIndent = function() {\n\t var rows = this.$getSelectedRows();\n\t this.session.indentRows(rows.first, rows.last, \"\\t\");\n\t };\n\t this.blockOutdent = function() {\n\t var selection = this.session.getSelection();\n\t this.session.outdentRows(selection.getRange());\n\t };\n\t this.sortLines = function() {\n\t var rows = this.$getSelectedRows();\n\t var session = this.session;\n\t\n\t var lines = [];\n\t for (i = rows.first; i <= rows.last; i++)\n\t lines.push(session.getLine(i));\n\t\n\t lines.sort(function(a, b) {\n\t if (a.toLowerCase() < b.toLowerCase()) return -1;\n\t if (a.toLowerCase() > b.toLowerCase()) return 1;\n\t return 0;\n\t });\n\t\n\t var deleteRange = new Range(0, 0, 0, 0);\n\t for (var i = rows.first; i <= rows.last; i++) {\n\t var line = session.getLine(i);\n\t deleteRange.start.row = i;\n\t deleteRange.end.row = i;\n\t deleteRange.end.column = line.length;\n\t session.replace(deleteRange, lines[i-rows.first]);\n\t }\n\t };\n\t this.toggleCommentLines = function() {\n\t var state = this.session.getState(this.getCursorPosition().row);\n\t var rows = this.$getSelectedRows();\n\t this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n\t };\n\t\n\t this.toggleBlockComment = function() {\n\t var cursor = this.getCursorPosition();\n\t var state = this.session.getState(cursor.row);\n\t var range = this.getSelectionRange();\n\t this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n\t };\n\t this.getNumberAt = function(row, column) {\n\t var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n\t _numberRx.lastIndex = 0;\n\t\n\t var s = this.session.getLine(row);\n\t while (_numberRx.lastIndex < column) {\n\t var m = _numberRx.exec(s);\n\t if(m.index <= column && m.index+m[0].length >= column){\n\t var number = {\n\t value: m[0],\n\t start: m.index,\n\t end: m.index+m[0].length\n\t };\n\t return number;\n\t }\n\t }\n\t return null;\n\t };\n\t this.modifyNumber = function(amount) {\n\t var row = this.selection.getCursor().row;\n\t var column = this.selection.getCursor().column;\n\t var charRange = new Range(row, column-1, row, column);\n\t\n\t var c = this.session.getTextRange(charRange);\n\t if (!isNaN(parseFloat(c)) && isFinite(c)) {\n\t var nr = this.getNumberAt(row, column);\n\t if (nr) {\n\t var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n\t var decimals = nr.start + nr.value.length - fp;\n\t\n\t var t = parseFloat(nr.value);\n\t t *= Math.pow(10, decimals);\n\t\n\t\n\t if(fp !== nr.end && column < fp){\n\t amount *= Math.pow(10, nr.end - column - 1);\n\t } else {\n\t amount *= Math.pow(10, nr.end - column);\n\t }\n\t\n\t t += amount;\n\t t /= Math.pow(10, decimals);\n\t var nnr = t.toFixed(decimals);\n\t var replaceRange = new Range(row, nr.start, row, nr.end);\n\t this.session.replace(replaceRange, nnr);\n\t this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\t\n\t }\n\t }\n\t };\n\t this.removeLines = function() {\n\t var rows = this.$getSelectedRows();\n\t this.session.removeFullLines(rows.first, rows.last);\n\t this.clearSelection();\n\t };\n\t\n\t this.duplicateSelection = function() {\n\t var sel = this.selection;\n\t var doc = this.session;\n\t var range = sel.getRange();\n\t var reverse = sel.isBackwards();\n\t if (range.isEmpty()) {\n\t var row = range.start.row;\n\t doc.duplicateLines(row, row);\n\t } else {\n\t var point = reverse ? range.start : range.end;\n\t var endPoint = doc.insert(point, doc.getTextRange(range), false);\n\t range.start = point;\n\t range.end = endPoint;\n\t\n\t sel.setSelectionRange(range, reverse);\n\t }\n\t };\n\t this.moveLinesDown = function() {\n\t this.$moveLines(1, false);\n\t };\n\t this.moveLinesUp = function() {\n\t this.$moveLines(-1, false);\n\t };\n\t this.moveText = function(range, toPosition, copy) {\n\t return this.session.moveText(range, toPosition, copy);\n\t };\n\t this.copyLinesUp = function() {\n\t this.$moveLines(-1, true);\n\t };\n\t this.copyLinesDown = function() {\n\t this.$moveLines(1, true);\n\t };\n\t this.$moveLines = function(dir, copy) {\n\t var rows, moved;\n\t var selection = this.selection;\n\t if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n\t var range = selection.toOrientedRange();\n\t rows = this.$getSelectedRows(range);\n\t moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n\t if (copy && dir == -1) moved = 0;\n\t range.moveBy(moved, 0);\n\t selection.fromOrientedRange(range);\n\t } else {\n\t var ranges = selection.rangeList.ranges;\n\t selection.rangeList.detach(this.session);\n\t this.inVirtualSelectionMode = true;\n\t \n\t var diff = 0;\n\t var totalDiff = 0;\n\t var l = ranges.length;\n\t for (var i = 0; i < l; i++) {\n\t var rangeIndex = i;\n\t ranges[i].moveBy(diff, 0);\n\t rows = this.$getSelectedRows(ranges[i]);\n\t var first = rows.first;\n\t var last = rows.last;\n\t while (++i < l) {\n\t if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n\t var subRows = this.$getSelectedRows(ranges[i]);\n\t if (copy && subRows.first != last)\n\t break;\n\t else if (!copy && subRows.first > last + 1)\n\t break;\n\t last = subRows.last;\n\t }\n\t i--;\n\t diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n\t if (copy && dir == -1) rangeIndex = i + 1;\n\t while (rangeIndex <= i) {\n\t ranges[rangeIndex].moveBy(diff, 0);\n\t rangeIndex++;\n\t }\n\t if (!copy) diff = 0;\n\t totalDiff += diff;\n\t }\n\t \n\t selection.fromOrientedRange(selection.ranges[0]);\n\t selection.rangeList.attach(this.session);\n\t this.inVirtualSelectionMode = false;\n\t }\n\t };\n\t this.$getSelectedRows = function(range) {\n\t range = (range || this.getSelectionRange()).collapseRows();\n\t\n\t return {\n\t first: this.session.getRowFoldStart(range.start.row),\n\t last: this.session.getRowFoldEnd(range.end.row)\n\t };\n\t };\n\t\n\t this.onCompositionStart = function(text) {\n\t this.renderer.showComposition(this.getCursorPosition());\n\t };\n\t\n\t this.onCompositionUpdate = function(text) {\n\t this.renderer.setCompositionText(text);\n\t };\n\t\n\t this.onCompositionEnd = function() {\n\t this.renderer.hideComposition();\n\t };\n\t this.getFirstVisibleRow = function() {\n\t return this.renderer.getFirstVisibleRow();\n\t };\n\t this.getLastVisibleRow = function() {\n\t return this.renderer.getLastVisibleRow();\n\t };\n\t this.isRowVisible = function(row) {\n\t return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n\t };\n\t this.isRowFullyVisible = function(row) {\n\t return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n\t };\n\t this.$getVisibleRowCount = function() {\n\t return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n\t };\n\t\n\t this.$moveByPage = function(dir, select) {\n\t var renderer = this.renderer;\n\t var config = this.renderer.layerConfig;\n\t var rows = dir * Math.floor(config.height / config.lineHeight);\n\t\n\t this.$blockScrolling++;\n\t if (select === true) {\n\t this.selection.$moveSelection(function(){\n\t this.moveCursorBy(rows, 0);\n\t });\n\t } else if (select === false) {\n\t this.selection.moveCursorBy(rows, 0);\n\t this.selection.clearSelection();\n\t }\n\t this.$blockScrolling--;\n\t\n\t var scrollTop = renderer.scrollTop;\n\t\n\t renderer.scrollBy(0, rows * config.lineHeight);\n\t if (select != null)\n\t renderer.scrollCursorIntoView(null, 0.5);\n\t\n\t renderer.animateScrolling(scrollTop);\n\t };\n\t this.selectPageDown = function() {\n\t this.$moveByPage(1, true);\n\t };\n\t this.selectPageUp = function() {\n\t this.$moveByPage(-1, true);\n\t };\n\t this.gotoPageDown = function() {\n\t this.$moveByPage(1, false);\n\t };\n\t this.gotoPageUp = function() {\n\t this.$moveByPage(-1, false);\n\t };\n\t this.scrollPageDown = function() {\n\t this.$moveByPage(1);\n\t };\n\t this.scrollPageUp = function() {\n\t this.$moveByPage(-1);\n\t };\n\t this.scrollToRow = function(row) {\n\t this.renderer.scrollToRow(row);\n\t };\n\t this.scrollToLine = function(line, center, animate, callback) {\n\t this.renderer.scrollToLine(line, center, animate, callback);\n\t };\n\t this.centerSelection = function() {\n\t var range = this.getSelectionRange();\n\t var pos = {\n\t row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n\t column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n\t };\n\t this.renderer.alignCursor(pos, 0.5);\n\t };\n\t this.getCursorPosition = function() {\n\t return this.selection.getCursor();\n\t };\n\t this.getCursorPositionScreen = function() {\n\t return this.session.documentToScreenPosition(this.getCursorPosition());\n\t };\n\t this.getSelectionRange = function() {\n\t return this.selection.getRange();\n\t };\n\t this.selectAll = function() {\n\t this.$blockScrolling += 1;\n\t this.selection.selectAll();\n\t this.$blockScrolling -= 1;\n\t };\n\t this.clearSelection = function() {\n\t this.selection.clearSelection();\n\t };\n\t this.moveCursorTo = function(row, column) {\n\t this.selection.moveCursorTo(row, column);\n\t };\n\t this.moveCursorToPosition = function(pos) {\n\t this.selection.moveCursorToPosition(pos);\n\t };\n\t this.jumpToMatching = function(select, expand) {\n\t var cursor = this.getCursorPosition();\n\t var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n\t var prevToken = iterator.getCurrentToken();\n\t var token = prevToken || iterator.stepForward();\n\t\n\t if (!token) return;\n\t var matchType;\n\t var found = false;\n\t var depth = {};\n\t var i = cursor.column - token.start;\n\t var bracketType;\n\t var brackets = {\n\t \")\": \"(\",\n\t \"(\": \"(\",\n\t \"]\": \"[\",\n\t \"[\": \"[\",\n\t \"{\": \"{\",\n\t \"}\": \"{\"\n\t };\n\t \n\t do {\n\t if (token.value.match(/[{}()\\[\\]]/g)) {\n\t for (; i < token.value.length && !found; i++) {\n\t if (!brackets[token.value[i]]) {\n\t continue;\n\t }\n\t\n\t bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\t\n\t if (isNaN(depth[bracketType])) {\n\t depth[bracketType] = 0;\n\t }\n\t\n\t switch (token.value[i]) {\n\t case '(':\n\t case '[':\n\t case '{':\n\t depth[bracketType]++;\n\t break;\n\t case ')':\n\t case ']':\n\t case '}':\n\t depth[bracketType]--;\n\t\n\t if (depth[bracketType] === -1) {\n\t matchType = 'bracket';\n\t found = true;\n\t }\n\t break;\n\t }\n\t }\n\t }\n\t else if (token && token.type.indexOf('tag-name') !== -1) {\n\t if (isNaN(depth[token.value])) {\n\t depth[token.value] = 0;\n\t }\n\t \n\t if (prevToken.value === '<') {\n\t depth[token.value]++;\n\t }\n\t else if (prevToken.value === '= 0; --i) {\n\t if(this.$tryReplace(ranges[i], replacement)) {\n\t replaced++;\n\t }\n\t }\n\t\n\t this.selection.setSelectionRange(selection);\n\t this.$blockScrolling -= 1;\n\t\n\t return replaced;\n\t };\n\t\n\t this.$tryReplace = function(range, replacement) {\n\t var input = this.session.getTextRange(range);\n\t replacement = this.$search.replace(input, replacement);\n\t if (replacement !== null) {\n\t range.end = this.session.replace(range, replacement);\n\t return range;\n\t } else {\n\t return null;\n\t }\n\t };\n\t this.getLastSearchOptions = function() {\n\t return this.$search.getOptions();\n\t };\n\t this.find = function(needle, options, animate) {\n\t if (!options)\n\t options = {};\n\t\n\t if (typeof needle == \"string\" || needle instanceof RegExp)\n\t options.needle = needle;\n\t else if (typeof needle == \"object\")\n\t oop.mixin(options, needle);\n\t\n\t var range = this.selection.getRange();\n\t if (options.needle == null) {\n\t needle = this.session.getTextRange(range)\n\t || this.$search.$options.needle;\n\t if (!needle) {\n\t range = this.session.getWordRange(range.start.row, range.start.column);\n\t needle = this.session.getTextRange(range);\n\t }\n\t this.$search.set({needle: needle});\n\t }\n\t\n\t this.$search.set(options);\n\t if (!options.start)\n\t this.$search.set({start: range});\n\t\n\t var newRange = this.$search.find(this.session);\n\t if (options.preventScroll)\n\t return newRange;\n\t if (newRange) {\n\t this.revealRange(newRange, animate);\n\t return newRange;\n\t }\n\t if (options.backwards)\n\t range.start = range.end;\n\t else\n\t range.end = range.start;\n\t this.selection.setRange(range);\n\t };\n\t this.findNext = function(options, animate) {\n\t this.find({skipCurrent: true, backwards: false}, options, animate);\n\t };\n\t this.findPrevious = function(options, animate) {\n\t this.find(options, {skipCurrent: true, backwards: true}, animate);\n\t };\n\t\n\t this.revealRange = function(range, animate) {\n\t this.$blockScrolling += 1;\n\t this.session.unfold(range);\n\t this.selection.setSelectionRange(range);\n\t this.$blockScrolling -= 1;\n\t\n\t var scrollTop = this.renderer.scrollTop;\n\t this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n\t if (animate !== false)\n\t this.renderer.animateScrolling(scrollTop);\n\t };\n\t this.undo = function() {\n\t this.$blockScrolling++;\n\t this.session.getUndoManager().undo();\n\t this.$blockScrolling--;\n\t this.renderer.scrollCursorIntoView(null, 0.5);\n\t };\n\t this.redo = function() {\n\t this.$blockScrolling++;\n\t this.session.getUndoManager().redo();\n\t this.$blockScrolling--;\n\t this.renderer.scrollCursorIntoView(null, 0.5);\n\t };\n\t this.destroy = function() {\n\t this.renderer.destroy();\n\t this._signal(\"destroy\", this);\n\t if (this.session) {\n\t this.session.destroy();\n\t }\n\t };\n\t this.setAutoScrollEditorIntoView = function(enable) {\n\t if (!enable)\n\t return;\n\t var rect;\n\t var self = this;\n\t var shouldScroll = false;\n\t if (!this.$scrollAnchor)\n\t this.$scrollAnchor = document.createElement(\"div\");\n\t var scrollAnchor = this.$scrollAnchor;\n\t scrollAnchor.style.cssText = \"position:absolute\";\n\t this.container.insertBefore(scrollAnchor, this.container.firstChild);\n\t var onChangeSelection = this.on(\"changeSelection\", function() {\n\t shouldScroll = true;\n\t });\n\t var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n\t if (shouldScroll)\n\t rect = self.renderer.container.getBoundingClientRect();\n\t });\n\t var onAfterRender = this.renderer.on(\"afterRender\", function() {\n\t if (shouldScroll && rect && (self.isFocused()\n\t || self.searchBox && self.searchBox.isFocused())\n\t ) {\n\t var renderer = self.renderer;\n\t var pos = renderer.$cursorLayer.$pixelPos;\n\t var config = renderer.layerConfig;\n\t var top = pos.top - config.offset;\n\t if (pos.top >= 0 && top + rect.top < 0) {\n\t shouldScroll = true;\n\t } else if (pos.top < config.height &&\n\t pos.top + rect.top + config.lineHeight > window.innerHeight) {\n\t shouldScroll = false;\n\t } else {\n\t shouldScroll = null;\n\t }\n\t if (shouldScroll != null) {\n\t scrollAnchor.style.top = top + \"px\";\n\t scrollAnchor.style.left = pos.left + \"px\";\n\t scrollAnchor.style.height = config.lineHeight + \"px\";\n\t scrollAnchor.scrollIntoView(shouldScroll);\n\t }\n\t shouldScroll = rect = null;\n\t }\n\t });\n\t this.setAutoScrollEditorIntoView = function(enable) {\n\t if (enable)\n\t return;\n\t delete this.setAutoScrollEditorIntoView;\n\t this.off(\"changeSelection\", onChangeSelection);\n\t this.renderer.off(\"afterRender\", onAfterRender);\n\t this.renderer.off(\"beforeRender\", onBeforeRender);\n\t };\n\t };\n\t\n\t\n\t this.$resetCursorStyle = function() {\n\t var style = this.$cursorStyle || \"ace\";\n\t var cursorLayer = this.renderer.$cursorLayer;\n\t if (!cursorLayer)\n\t return;\n\t cursorLayer.setSmoothBlinking(/smooth/.test(style));\n\t cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n\t dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n\t };\n\t\n\t}).call(Editor.prototype);\n\t\n\t\n\t\n\tconfig.defineOptions(Editor.prototype, \"editor\", {\n\t selectionStyle: {\n\t set: function(style) {\n\t this.onSelectionChange();\n\t this._signal(\"changeSelectionStyle\", {data: style});\n\t },\n\t initialValue: \"line\"\n\t },\n\t highlightActiveLine: {\n\t set: function() {this.$updateHighlightActiveLine();},\n\t initialValue: true\n\t },\n\t highlightSelectedWord: {\n\t set: function(shouldHighlight) {this.$onSelectionChange();},\n\t initialValue: true\n\t },\n\t readOnly: {\n\t set: function(readOnly) {\n\t this.$resetCursorStyle(); \n\t },\n\t initialValue: false\n\t },\n\t cursorStyle: {\n\t set: function(val) { this.$resetCursorStyle(); },\n\t values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n\t initialValue: \"ace\"\n\t },\n\t mergeUndoDeltas: {\n\t values: [false, true, \"always\"],\n\t initialValue: true\n\t },\n\t behavioursEnabled: {initialValue: true},\n\t wrapBehavioursEnabled: {initialValue: true},\n\t autoScrollEditorIntoView: {\n\t set: function(val) {this.setAutoScrollEditorIntoView(val)}\n\t },\n\t keyboardHandler: {\n\t set: function(val) { this.setKeyboardHandler(val); },\n\t get: function() { return this.keybindingId; },\n\t handlesSet: true\n\t },\n\t\n\t hScrollBarAlwaysVisible: \"renderer\",\n\t vScrollBarAlwaysVisible: \"renderer\",\n\t highlightGutterLine: \"renderer\",\n\t animatedScroll: \"renderer\",\n\t showInvisibles: \"renderer\",\n\t showPrintMargin: \"renderer\",\n\t printMarginColumn: \"renderer\",\n\t printMargin: \"renderer\",\n\t fadeFoldWidgets: \"renderer\",\n\t showFoldWidgets: \"renderer\",\n\t showLineNumbers: \"renderer\",\n\t showGutter: \"renderer\",\n\t displayIndentGuides: \"renderer\",\n\t fontSize: \"renderer\",\n\t fontFamily: \"renderer\",\n\t maxLines: \"renderer\",\n\t minLines: \"renderer\",\n\t scrollPastEnd: \"renderer\",\n\t fixedWidthGutter: \"renderer\",\n\t theme: \"renderer\",\n\t\n\t scrollSpeed: \"$mouseHandler\",\n\t dragDelay: \"$mouseHandler\",\n\t dragEnabled: \"$mouseHandler\",\n\t focusTimout: \"$mouseHandler\",\n\t tooltipFollowsMouse: \"$mouseHandler\",\n\t\n\t firstLineNumber: \"session\",\n\t overwrite: \"session\",\n\t newLineMode: \"session\",\n\t useWorker: \"session\",\n\t useSoftTabs: \"session\",\n\t tabSize: \"session\",\n\t wrap: \"session\",\n\t indentedSoftWrap: \"session\",\n\t foldStyle: \"session\",\n\t mode: \"session\"\n\t});\n\t\n\texports.Editor = Editor;\n\t});\n\t\n\tace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\t\"use strict\";\n\tvar UndoManager = function() {\n\t this.reset();\n\t};\n\t\n\t(function() {\n\t this.execute = function(options) {\n\t var deltaSets = options.args[0];\n\t this.$doc = options.args[1];\n\t if (options.merge && this.hasUndo()){\n\t this.dirtyCounter--;\n\t deltaSets = this.$undoStack.pop().concat(deltaSets);\n\t }\n\t this.$undoStack.push(deltaSets);\n\t this.$redoStack = [];\n\t if (this.dirtyCounter < 0) {\n\t this.dirtyCounter = NaN;\n\t }\n\t this.dirtyCounter++;\n\t };\n\t this.undo = function(dontSelect) {\n\t var deltaSets = this.$undoStack.pop();\n\t var undoSelectionRange = null;\n\t if (deltaSets) {\n\t undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\n\t this.$redoStack.push(deltaSets);\n\t this.dirtyCounter--;\n\t }\n\t\n\t return undoSelectionRange;\n\t };\n\t this.redo = function(dontSelect) {\n\t var deltaSets = this.$redoStack.pop();\n\t var redoSelectionRange = null;\n\t if (deltaSets) {\n\t redoSelectionRange =\n\t this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\n\t this.$undoStack.push(deltaSets);\n\t this.dirtyCounter++;\n\t }\n\t return redoSelectionRange;\n\t };\n\t this.reset = function() {\n\t this.$undoStack = [];\n\t this.$redoStack = [];\n\t this.dirtyCounter = 0;\n\t };\n\t this.hasUndo = function() {\n\t return this.$undoStack.length > 0;\n\t };\n\t this.hasRedo = function() {\n\t return this.$redoStack.length > 0;\n\t };\n\t this.markClean = function() {\n\t this.dirtyCounter = 0;\n\t };\n\t this.isClean = function() {\n\t return this.dirtyCounter === 0;\n\t };\n\t this.$serializeDeltas = function(deltaSets) {\n\t return cloneDeltaSetsObj(deltaSets, $serializeDelta);\n\t };\n\t this.$deserializeDeltas = function(deltaSets) {\n\t return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\n\t };\n\t \n\t function $serializeDelta(delta){\n\t return {\n\t action: delta.action,\n\t start: delta.start,\n\t end: delta.end,\n\t lines: delta.lines.length == 1 ? null : delta.lines,\n\t text: delta.lines.length == 1 ? delta.lines[0] : null\n\t };\n\t }\n\t \n\t function $deserializeDelta(delta) {\n\t return {\n\t action: delta.action,\n\t start: delta.start,\n\t end: delta.end,\n\t lines: delta.lines || [delta.text]\n\t };\n\t }\n\t \n\t function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\n\t var deltaSets_new = new Array(deltaSets_old.length);\n\t for (var i = 0; i < deltaSets_old.length; i++) {\n\t var deltaSet_old = deltaSets_old[i];\n\t var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\n\t \n\t for (var j = 0; j < deltaSet_old.deltas.length; j++) {\n\t var delta_old = deltaSet_old.deltas[j];\n\t deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\n\t }\n\t \n\t deltaSets_new[i] = deltaSet_new;\n\t }\n\t return deltaSets_new;\n\t }\n\t \n\t}).call(UndoManager.prototype);\n\t\n\texports.UndoManager = UndoManager;\n\t});\n\t\n\tace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar dom = acequire(\"../lib/dom\");\n\tvar oop = acequire(\"../lib/oop\");\n\tvar lang = acequire(\"../lib/lang\");\n\tvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\t\n\tvar Gutter = function(parentEl) {\n\t this.element = dom.createElement(\"div\");\n\t this.element.className = \"ace_layer ace_gutter-layer\";\n\t parentEl.appendChild(this.element);\n\t this.setShowFoldWidgets(this.$showFoldWidgets);\n\t \n\t this.gutterWidth = 0;\n\t\n\t this.$annotations = [];\n\t this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\t\n\t this.$cells = [];\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t\n\t this.setSession = function(session) {\n\t if (this.session)\n\t this.session.removeEventListener(\"change\", this.$updateAnnotations);\n\t this.session = session;\n\t if (session)\n\t session.on(\"change\", this.$updateAnnotations);\n\t };\n\t\n\t this.addGutterDecoration = function(row, className){\n\t if (window.console)\n\t console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n\t this.session.addGutterDecoration(row, className);\n\t };\n\t\n\t this.removeGutterDecoration = function(row, className){\n\t if (window.console)\n\t console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n\t this.session.removeGutterDecoration(row, className);\n\t };\n\t\n\t this.setAnnotations = function(annotations) {\n\t this.$annotations = [];\n\t for (var i = 0; i < annotations.length; i++) {\n\t var annotation = annotations[i];\n\t var row = annotation.row;\n\t var rowInfo = this.$annotations[row];\n\t if (!rowInfo)\n\t rowInfo = this.$annotations[row] = {text: []};\n\t \n\t var annoText = annotation.text;\n\t annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\t\n\t if (rowInfo.text.indexOf(annoText) === -1)\n\t rowInfo.text.push(annoText);\n\t\n\t var type = annotation.type;\n\t if (type == \"error\")\n\t rowInfo.className = \" ace_error\";\n\t else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n\t rowInfo.className = \" ace_warning\";\n\t else if (type == \"info\" && (!rowInfo.className))\n\t rowInfo.className = \" ace_info\";\n\t }\n\t };\n\t\n\t this.$updateAnnotations = function (delta) {\n\t if (!this.$annotations.length)\n\t return;\n\t var firstRow = delta.start.row;\n\t var len = delta.end.row - firstRow;\n\t if (len === 0) {\n\t } else if (delta.action == 'remove') {\n\t this.$annotations.splice(firstRow, len + 1, null);\n\t } else {\n\t var args = new Array(len + 1);\n\t args.unshift(firstRow, 1);\n\t this.$annotations.splice.apply(this.$annotations, args);\n\t }\n\t };\n\t\n\t this.update = function(config) {\n\t var session = this.session;\n\t var firstRow = config.firstRow;\n\t var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n\t session.getLength() - 1);\n\t var fold = session.getNextFoldLine(firstRow);\n\t var foldStart = fold ? fold.start.row : Infinity;\n\t var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n\t var breakpoints = session.$breakpoints;\n\t var decorations = session.$decorations;\n\t var firstLineNumber = session.$firstLineNumber;\n\t var lastLineNumber = 0;\n\t \n\t var gutterRenderer = session.gutterRenderer || this.$renderer;\n\t\n\t var cell = null;\n\t var index = -1;\n\t var row = firstRow;\n\t while (true) {\n\t if (row > foldStart) {\n\t row = fold.end.row + 1;\n\t fold = session.getNextFoldLine(row, fold);\n\t foldStart = fold ? fold.start.row : Infinity;\n\t }\n\t if (row > lastRow) {\n\t while (this.$cells.length > index + 1) {\n\t cell = this.$cells.pop();\n\t this.element.removeChild(cell.element);\n\t }\n\t break;\n\t }\n\t\n\t cell = this.$cells[++index];\n\t if (!cell) {\n\t cell = {element: null, textNode: null, foldWidget: null};\n\t cell.element = dom.createElement(\"div\");\n\t cell.textNode = document.createTextNode('');\n\t cell.element.appendChild(cell.textNode);\n\t this.element.appendChild(cell.element);\n\t this.$cells[index] = cell;\n\t }\n\t\n\t var className = \"ace_gutter-cell \";\n\t if (breakpoints[row])\n\t className += breakpoints[row];\n\t if (decorations[row])\n\t className += decorations[row];\n\t if (this.$annotations[row])\n\t className += this.$annotations[row].className;\n\t if (cell.element.className != className)\n\t cell.element.className = className;\n\t\n\t var height = session.getRowLength(row) * config.lineHeight + \"px\";\n\t if (height != cell.element.style.height)\n\t cell.element.style.height = height;\n\t\n\t if (foldWidgets) {\n\t var c = foldWidgets[row];\n\t if (c == null)\n\t c = foldWidgets[row] = session.getFoldWidget(row);\n\t }\n\t\n\t if (c) {\n\t if (!cell.foldWidget) {\n\t cell.foldWidget = dom.createElement(\"span\");\n\t cell.element.appendChild(cell.foldWidget);\n\t }\n\t var className = \"ace_fold-widget ace_\" + c;\n\t if (c == \"start\" && row == foldStart && row < fold.end.row)\n\t className += \" ace_closed\";\n\t else\n\t className += \" ace_open\";\n\t if (cell.foldWidget.className != className)\n\t cell.foldWidget.className = className;\n\t\n\t var height = config.lineHeight + \"px\";\n\t if (cell.foldWidget.style.height != height)\n\t cell.foldWidget.style.height = height;\n\t } else {\n\t if (cell.foldWidget) {\n\t cell.element.removeChild(cell.foldWidget);\n\t cell.foldWidget = null;\n\t }\n\t }\n\t \n\t var text = lastLineNumber = gutterRenderer\n\t ? gutterRenderer.getText(session, row)\n\t : row + firstLineNumber;\n\t if (text != cell.textNode.data)\n\t cell.textNode.data = text;\n\t\n\t row++;\n\t }\n\t\n\t this.element.style.height = config.minHeight + \"px\";\n\t\n\t if (this.$fixedWidth || session.$useWrapMode)\n\t lastLineNumber = session.getLength() + firstLineNumber;\n\t\n\t var gutterWidth = gutterRenderer \n\t ? gutterRenderer.getWidth(session, lastLineNumber, config)\n\t : lastLineNumber.toString().length * config.characterWidth;\n\t \n\t var padding = this.$padding || this.$computePadding();\n\t gutterWidth += padding.left + padding.right;\n\t if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n\t this.gutterWidth = gutterWidth;\n\t this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n\t this._emit(\"changeGutterWidth\", gutterWidth);\n\t }\n\t };\n\t\n\t this.$fixedWidth = false;\n\t \n\t this.$showLineNumbers = true;\n\t this.$renderer = \"\";\n\t this.setShowLineNumbers = function(show) {\n\t this.$renderer = !show && {\n\t getWidth: function() {return \"\"},\n\t getText: function() {return \"\"}\n\t };\n\t };\n\t \n\t this.getShowLineNumbers = function() {\n\t return this.$showLineNumbers;\n\t };\n\t \n\t this.$showFoldWidgets = true;\n\t this.setShowFoldWidgets = function(show) {\n\t if (show)\n\t dom.addCssClass(this.element, \"ace_folding-enabled\");\n\t else\n\t dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\t\n\t this.$showFoldWidgets = show;\n\t this.$padding = null;\n\t };\n\t \n\t this.getShowFoldWidgets = function() {\n\t return this.$showFoldWidgets;\n\t };\n\t\n\t this.$computePadding = function() {\n\t if (!this.element.firstChild)\n\t return {left: 0, right: 0};\n\t var style = dom.computedStyle(this.element.firstChild);\n\t this.$padding = {};\n\t this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n\t this.$padding.right = parseInt(style.paddingRight) || 0;\n\t return this.$padding;\n\t };\n\t\n\t this.getRegion = function(point) {\n\t var padding = this.$padding || this.$computePadding();\n\t var rect = this.element.getBoundingClientRect();\n\t if (point.x < padding.left + rect.left)\n\t return \"markers\";\n\t if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n\t return \"foldWidgets\";\n\t };\n\t\n\t}).call(Gutter.prototype);\n\t\n\texports.Gutter = Gutter;\n\t\n\t});\n\t\n\tace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"../range\").Range;\n\tvar dom = acequire(\"../lib/dom\");\n\t\n\tvar Marker = function(parentEl) {\n\t this.element = dom.createElement(\"div\");\n\t this.element.className = \"ace_layer ace_marker-layer\";\n\t parentEl.appendChild(this.element);\n\t};\n\t\n\t(function() {\n\t\n\t this.$padding = 0;\n\t\n\t this.setPadding = function(padding) {\n\t this.$padding = padding;\n\t };\n\t this.setSession = function(session) {\n\t this.session = session;\n\t };\n\t \n\t this.setMarkers = function(markers) {\n\t this.markers = markers;\n\t };\n\t\n\t this.update = function(config) {\n\t var config = config || this.config;\n\t if (!config)\n\t return;\n\t\n\t this.config = config;\n\t\n\t\n\t var html = [];\n\t for (var key in this.markers) {\n\t var marker = this.markers[key];\n\t\n\t if (!marker.range) {\n\t marker.update(html, this, this.session, config);\n\t continue;\n\t }\n\t\n\t var range = marker.range.clipRows(config.firstRow, config.lastRow);\n\t if (range.isEmpty()) continue;\n\t\n\t range = range.toScreenRange(this.session);\n\t if (marker.renderer) {\n\t var top = this.$getTop(range.start.row, config);\n\t var left = this.$padding + range.start.column * config.characterWidth;\n\t marker.renderer(html, range, left, top, config);\n\t } else if (marker.type == \"fullLine\") {\n\t this.drawFullLineMarker(html, range, marker.clazz, config);\n\t } else if (marker.type == \"screenLine\") {\n\t this.drawScreenLineMarker(html, range, marker.clazz, config);\n\t } else if (range.isMultiLine()) {\n\t if (marker.type == \"text\")\n\t this.drawTextMarker(html, range, marker.clazz, config);\n\t else\n\t this.drawMultiLineMarker(html, range, marker.clazz, config);\n\t } else {\n\t this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n\t }\n\t }\n\t this.element.innerHTML = html.join(\"\");\n\t };\n\t\n\t this.$getTop = function(row, layerConfig) {\n\t return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n\t };\n\t\n\t function getBorderClass(tl, tr, br, bl) {\n\t return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n\t }\n\t this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n\t var session = this.session;\n\t var start = range.start.row;\n\t var end = range.end.row;\n\t var row = start;\n\t var prev = 0; \n\t var curr = 0;\n\t var next = session.getScreenLastRowColumn(row);\n\t var lineRange = new Range(row, range.start.column, row, curr);\n\t for (; row <= end; row++) {\n\t lineRange.start.row = lineRange.end.row = row;\n\t lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n\t lineRange.end.column = next;\n\t prev = curr;\n\t curr = next;\n\t next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n\t this.drawSingleLineMarker(stringBuilder, lineRange, \n\t clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n\t + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),\n\t layerConfig, row == end ? 0 : 1, extraStyle);\n\t }\n\t };\n\t this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n\t var padding = this.$padding;\n\t var height = config.lineHeight;\n\t var top = this.$getTop(range.start.row, config);\n\t var left = padding + range.start.column * config.characterWidth;\n\t extraStyle = extraStyle || \"\";\n\t\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t top = this.$getTop(range.end.row, config);\n\t var width = range.end.column * config.characterWidth;\n\t\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t height = (range.end.row - range.start.row - 1) * config.lineHeight;\n\t if (height <= 0)\n\t return;\n\t top = this.$getTop(range.start.row + 1, config);\n\t \n\t var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\t\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t };\n\t this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n\t var height = config.lineHeight;\n\t var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\t\n\t var top = this.$getTop(range.start.row, config);\n\t var left = this.$padding + range.start.column * config.characterWidth;\n\t\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t };\n\t\n\t this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n\t var top = this.$getTop(range.start.row, config);\n\t var height = config.lineHeight;\n\t if (range.start.row != range.end.row)\n\t height += this.$getTop(range.end.row, config) - top;\n\t\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t };\n\t \n\t this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n\t var top = this.$getTop(range.start.row, config);\n\t var height = config.lineHeight;\n\t\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t };\n\t\n\t}).call(Marker.prototype);\n\t\n\texports.Marker = Marker;\n\t\n\t});\n\t\n\tace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../lib/oop\");\n\tvar dom = acequire(\"../lib/dom\");\n\tvar lang = acequire(\"../lib/lang\");\n\tvar useragent = acequire(\"../lib/useragent\");\n\tvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\t\n\tvar Text = function(parentEl) {\n\t this.element = dom.createElement(\"div\");\n\t this.element.className = \"ace_layer ace_text-layer\";\n\t parentEl.appendChild(this.element);\n\t this.$updateEolChar = this.$updateEolChar.bind(this);\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t\n\t this.EOF_CHAR = \"\\xB6\";\n\t this.EOL_CHAR_LF = \"\\xAC\";\n\t this.EOL_CHAR_CRLF = \"\\xa4\";\n\t this.EOL_CHAR = this.EOL_CHAR_LF;\n\t this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n\t this.SPACE_CHAR = \"\\xB7\";\n\t this.$padding = 0;\n\t\n\t this.$updateEolChar = function() {\n\t var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n\t ? this.EOL_CHAR_LF\n\t : this.EOL_CHAR_CRLF;\n\t if (this.EOL_CHAR != EOL_CHAR) {\n\t this.EOL_CHAR = EOL_CHAR;\n\t return true;\n\t }\n\t }\n\t\n\t this.setPadding = function(padding) {\n\t this.$padding = padding;\n\t this.element.style.padding = \"0 \" + padding + \"px\";\n\t };\n\t\n\t this.getLineHeight = function() {\n\t return this.$fontMetrics.$characterSize.height || 0;\n\t };\n\t\n\t this.getCharacterWidth = function() {\n\t return this.$fontMetrics.$characterSize.width || 0;\n\t };\n\t \n\t this.$setFontMetrics = function(measure) {\n\t this.$fontMetrics = measure;\n\t this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n\t this._signal(\"changeCharacterSize\", e);\n\t }.bind(this));\n\t this.$pollSizeChanges();\n\t }\n\t\n\t this.checkForSizeChanges = function() {\n\t this.$fontMetrics.checkForSizeChanges();\n\t };\n\t this.$pollSizeChanges = function() {\n\t return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n\t };\n\t this.setSession = function(session) {\n\t this.session = session;\n\t if (session)\n\t this.$computeTabString();\n\t };\n\t\n\t this.showInvisibles = false;\n\t this.setShowInvisibles = function(showInvisibles) {\n\t if (this.showInvisibles == showInvisibles)\n\t return false;\n\t\n\t this.showInvisibles = showInvisibles;\n\t this.$computeTabString();\n\t return true;\n\t };\n\t\n\t this.displayIndentGuides = true;\n\t this.setDisplayIndentGuides = function(display) {\n\t if (this.displayIndentGuides == display)\n\t return false;\n\t\n\t this.displayIndentGuides = display;\n\t this.$computeTabString();\n\t return true;\n\t };\n\t\n\t this.$tabStrings = [];\n\t this.onChangeTabSize =\n\t this.$computeTabString = function() {\n\t var tabSize = this.session.getTabSize();\n\t this.tabSize = tabSize;\n\t var tabStr = this.$tabStrings = [0];\n\t for (var i = 1; i < tabSize + 1; i++) {\n\t if (this.showInvisibles) {\n\t tabStr.push(\"\"\n\t + lang.stringRepeat(this.TAB_CHAR, i)\n\t + \"\");\n\t } else {\n\t tabStr.push(lang.stringRepeat(\" \", i));\n\t }\n\t }\n\t if (this.displayIndentGuides) {\n\t this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n\t var className = \"ace_indent-guide\";\n\t var spaceClass = \"\";\n\t var tabClass = \"\";\n\t if (this.showInvisibles) {\n\t className += \" ace_invisible\";\n\t spaceClass = \" ace_invisible_space\";\n\t tabClass = \" ace_invisible_tab\";\n\t var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n\t var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\n\t } else{\n\t var spaceContent = lang.stringRepeat(\" \", this.tabSize);\n\t var tabContent = spaceContent;\n\t }\n\t\n\t this.$tabStrings[\" \"] = \"\" + spaceContent + \"\";\n\t this.$tabStrings[\"\\t\"] = \"\" + tabContent + \"\";\n\t }\n\t };\n\t\n\t this.updateLines = function(config, firstRow, lastRow) {\n\t if (this.config.lastRow != config.lastRow ||\n\t this.config.firstRow != config.firstRow) {\n\t this.scrollLines(config);\n\t }\n\t this.config = config;\n\t\n\t var first = Math.max(firstRow, config.firstRow);\n\t var last = Math.min(lastRow, config.lastRow);\n\t\n\t var lineElements = this.element.childNodes;\n\t var lineElementsIdx = 0;\n\t\n\t for (var row = config.firstRow; row < first; row++) {\n\t var foldLine = this.session.getFoldLine(row);\n\t if (foldLine) {\n\t if (foldLine.containsRow(first)) {\n\t first = foldLine.start.row;\n\t break;\n\t } else {\n\t row = foldLine.end.row;\n\t }\n\t }\n\t lineElementsIdx ++;\n\t }\n\t\n\t var row = first;\n\t var foldLine = this.session.getNextFoldLine(row);\n\t var foldStart = foldLine ? foldLine.start.row : Infinity;\n\t\n\t while (true) {\n\t if (row > foldStart) {\n\t row = foldLine.end.row+1;\n\t foldLine = this.session.getNextFoldLine(row, foldLine);\n\t foldStart = foldLine ? foldLine.start.row :Infinity;\n\t }\n\t if (row > last)\n\t break;\n\t\n\t var lineElement = lineElements[lineElementsIdx++];\n\t if (lineElement) {\n\t var html = [];\n\t this.$renderLine(\n\t html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n\t );\n\t lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\t lineElement.innerHTML = html.join(\"\");\n\t }\n\t row++;\n\t }\n\t };\n\t\n\t this.scrollLines = function(config) {\n\t var oldConfig = this.config;\n\t this.config = config;\n\t\n\t if (!oldConfig || oldConfig.lastRow < config.firstRow)\n\t return this.update(config);\n\t\n\t if (config.lastRow < oldConfig.firstRow)\n\t return this.update(config);\n\t\n\t var el = this.element;\n\t if (oldConfig.firstRow < config.firstRow)\n\t for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n\t el.removeChild(el.firstChild);\n\t\n\t if (oldConfig.lastRow > config.lastRow)\n\t for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n\t el.removeChild(el.lastChild);\n\t\n\t if (config.firstRow < oldConfig.firstRow) {\n\t var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n\t if (el.firstChild)\n\t el.insertBefore(fragment, el.firstChild);\n\t else\n\t el.appendChild(fragment);\n\t }\n\t\n\t if (config.lastRow > oldConfig.lastRow) {\n\t var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n\t el.appendChild(fragment);\n\t }\n\t };\n\t\n\t this.$renderLinesFragment = function(config, firstRow, lastRow) {\n\t var fragment = this.element.ownerDocument.createDocumentFragment();\n\t var row = firstRow;\n\t var foldLine = this.session.getNextFoldLine(row);\n\t var foldStart = foldLine ? foldLine.start.row : Infinity;\n\t\n\t while (true) {\n\t if (row > foldStart) {\n\t row = foldLine.end.row+1;\n\t foldLine = this.session.getNextFoldLine(row, foldLine);\n\t foldStart = foldLine ? foldLine.start.row : Infinity;\n\t }\n\t if (row > lastRow)\n\t break;\n\t\n\t var container = dom.createElement(\"div\");\n\t\n\t var html = [];\n\t this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\t container.innerHTML = html.join(\"\");\n\t if (this.$useLineGroups()) {\n\t container.className = 'ace_line_group';\n\t fragment.appendChild(container);\n\t container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\t\n\t } else {\n\t while(container.firstChild)\n\t fragment.appendChild(container.firstChild);\n\t }\n\t\n\t row++;\n\t }\n\t return fragment;\n\t };\n\t\n\t this.update = function(config) {\n\t this.config = config;\n\t\n\t var html = [];\n\t var firstRow = config.firstRow, lastRow = config.lastRow;\n\t\n\t var row = firstRow;\n\t var foldLine = this.session.getNextFoldLine(row);\n\t var foldStart = foldLine ? foldLine.start.row : Infinity;\n\t\n\t while (true) {\n\t if (row > foldStart) {\n\t row = foldLine.end.row+1;\n\t foldLine = this.session.getNextFoldLine(row, foldLine);\n\t foldStart = foldLine ? foldLine.start.row :Infinity;\n\t }\n\t if (row > lastRow)\n\t break;\n\t\n\t if (this.$useLineGroups())\n\t html.push(\"
\")\n\t\n\t this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\t\n\t if (this.$useLineGroups())\n\t html.push(\"
\"); // end the line group\n\t\n\t row++;\n\t }\n\t this.element.innerHTML = html.join(\"\");\n\t };\n\t\n\t this.$textToken = {\n\t \"text\": true,\n\t \"rparen\": true,\n\t \"lparen\": true\n\t };\n\t\n\t this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n\t var self = this;\n\t 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]/g;\n\t var replaceFunc = function(c, a, b, tabIdx, idx4) {\n\t if (a) {\n\t return self.showInvisibles\n\t ? \"\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"\"\n\t : c;\n\t } else if (c == \"&\") {\n\t return \"&\";\n\t } else if (c == \"<\") {\n\t return \"<\";\n\t } else if (c == \">\") {\n\t return \">\";\n\t } else if (c == \"\\t\") {\n\t var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n\t screenColumn += tabSize - 1;\n\t return self.$tabStrings[tabSize];\n\t } else if (c == \"\\u3000\") {\n\t var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n\t var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n\t screenColumn += 1;\n\t return \"\" + space + \"\";\n\t } else if (b) {\n\t return \"\" + self.SPACE_CHAR + \"\";\n\t } else {\n\t screenColumn += 1;\n\t return \"\" + c + \"\";\n\t }\n\t };\n\t\n\t var output = value.replace(replaceReg, replaceFunc);\n\t\n\t if (!this.$textToken[token.type]) {\n\t var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n\t var style = \"\";\n\t if (token.type == \"fold\")\n\t style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n\t stringBuilder.push(\"\", output, \"\");\n\t }\n\t else {\n\t stringBuilder.push(output);\n\t }\n\t return screenColumn + value.length;\n\t };\n\t\n\t this.renderIndentGuide = function(stringBuilder, value, max) {\n\t var cols = value.search(this.$indentGuideRe);\n\t if (cols <= 0 || cols >= max)\n\t return value;\n\t if (value[0] == \" \") {\n\t cols -= cols % this.tabSize;\n\t stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n\t return value.substr(cols);\n\t } else if (value[0] == \"\\t\") {\n\t stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n\t return value.substr(cols);\n\t }\n\t return value;\n\t };\n\t\n\t this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n\t var chars = 0;\n\t var split = 0;\n\t var splitChars = splits[0];\n\t var screenColumn = 0;\n\t\n\t for (var i = 0; i < tokens.length; i++) {\n\t var token = tokens[i];\n\t var value = token.value;\n\t if (i == 0 && this.displayIndentGuides) {\n\t chars = value.length;\n\t value = this.renderIndentGuide(stringBuilder, value, splitChars);\n\t if (!value)\n\t continue;\n\t chars -= value.length;\n\t }\n\t\n\t if (chars + value.length < splitChars) {\n\t screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n\t chars += value.length;\n\t } else {\n\t while (chars + value.length >= splitChars) {\n\t screenColumn = this.$renderToken(\n\t stringBuilder, screenColumn,\n\t token, value.substring(0, splitChars - chars)\n\t );\n\t value = value.substring(splitChars - chars);\n\t chars = splitChars;\n\t\n\t if (!onlyContents) {\n\t stringBuilder.push(\"\",\n\t \"
\"\n\t );\n\t }\n\t\n\t stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\t\n\t split ++;\n\t screenColumn = 0;\n\t splitChars = splits[split] || Number.MAX_VALUE;\n\t }\n\t if (value.length != 0) {\n\t chars += value.length;\n\t screenColumn = this.$renderToken(\n\t stringBuilder, screenColumn, token, value\n\t );\n\t }\n\t }\n\t }\n\t };\n\t\n\t this.$renderSimpleLine = function(stringBuilder, tokens) {\n\t var screenColumn = 0;\n\t var token = tokens[0];\n\t var value = token.value;\n\t if (this.displayIndentGuides)\n\t value = this.renderIndentGuide(stringBuilder, value);\n\t if (value)\n\t screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n\t for (var i = 1; i < tokens.length; i++) {\n\t token = tokens[i];\n\t value = token.value;\n\t screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n\t }\n\t };\n\t this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n\t if (!foldLine && foldLine != false)\n\t foldLine = this.session.getFoldLine(row);\n\t\n\t if (foldLine)\n\t var tokens = this.$getFoldLineTokens(row, foldLine);\n\t else\n\t var tokens = this.session.getTokens(row);\n\t\n\t\n\t if (!onlyContents) {\n\t stringBuilder.push(\n\t \"
\"\n\t );\n\t }\n\t\n\t if (tokens.length) {\n\t var splits = this.session.getRowSplitData(row);\n\t if (splits && splits.length)\n\t this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n\t else\n\t this.$renderSimpleLine(stringBuilder, tokens);\n\t }\n\t\n\t if (this.showInvisibles) {\n\t if (foldLine)\n\t row = foldLine.end.row\n\t\n\t stringBuilder.push(\n\t \"\",\n\t row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n\t \"\"\n\t );\n\t }\n\t if (!onlyContents)\n\t stringBuilder.push(\"
\");\n\t };\n\t\n\t this.$getFoldLineTokens = function(row, foldLine) {\n\t var session = this.session;\n\t var renderTokens = [];\n\t\n\t function addTokens(tokens, from, to) {\n\t var idx = 0, col = 0;\n\t while ((col + tokens[idx].value.length) < from) {\n\t col += tokens[idx].value.length;\n\t idx++;\n\t\n\t if (idx == tokens.length)\n\t return;\n\t }\n\t if (col != from) {\n\t var value = tokens[idx].value.substring(from - col);\n\t if (value.length > (to - from))\n\t value = value.substring(0, to - from);\n\t\n\t renderTokens.push({\n\t type: tokens[idx].type,\n\t value: value\n\t });\n\t\n\t col = from + value.length;\n\t idx += 1;\n\t }\n\t\n\t while (col < to && idx < tokens.length) {\n\t var value = tokens[idx].value;\n\t if (value.length + col > to) {\n\t renderTokens.push({\n\t type: tokens[idx].type,\n\t value: value.substring(0, to - col)\n\t });\n\t } else\n\t renderTokens.push(tokens[idx]);\n\t col += value.length;\n\t idx += 1;\n\t }\n\t }\n\t\n\t var tokens = session.getTokens(row);\n\t foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n\t if (placeholder != null) {\n\t renderTokens.push({\n\t type: \"fold\",\n\t value: placeholder\n\t });\n\t } else {\n\t if (isNewRow)\n\t tokens = session.getTokens(row);\n\t\n\t if (tokens.length)\n\t addTokens(tokens, lastColumn, column);\n\t }\n\t }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\t\n\t return renderTokens;\n\t };\n\t\n\t this.$useLineGroups = function() {\n\t return this.session.getUseWrapMode();\n\t };\n\t\n\t this.destroy = function() {\n\t clearInterval(this.$pollSizeChangesTimer);\n\t if (this.$measureNode)\n\t this.$measureNode.parentNode.removeChild(this.$measureNode);\n\t delete this.$measureNode;\n\t };\n\t\n\t}).call(Text.prototype);\n\t\n\texports.Text = Text;\n\t\n\t});\n\t\n\tace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar dom = acequire(\"../lib/dom\");\n\tvar isIE8;\n\t\n\tvar Cursor = function(parentEl) {\n\t this.element = dom.createElement(\"div\");\n\t this.element.className = \"ace_layer ace_cursor-layer\";\n\t parentEl.appendChild(this.element);\n\t \n\t if (isIE8 === undefined)\n\t isIE8 = !(\"opacity\" in this.element.style);\n\t\n\t this.isVisible = false;\n\t this.isBlinking = true;\n\t this.blinkInterval = 1000;\n\t this.smoothBlinking = false;\n\t\n\t this.cursors = [];\n\t this.cursor = this.addCursor();\n\t dom.addCssClass(this.element, \"ace_hidden-cursors\");\n\t this.$updateCursors = (isIE8\n\t ? this.$updateVisibility\n\t : this.$updateOpacity).bind(this);\n\t};\n\t\n\t(function() {\n\t \n\t this.$updateVisibility = function(val) {\n\t var cursors = this.cursors;\n\t for (var i = cursors.length; i--; )\n\t cursors[i].style.visibility = val ? \"\" : \"hidden\";\n\t };\n\t this.$updateOpacity = function(val) {\n\t var cursors = this.cursors;\n\t for (var i = cursors.length; i--; )\n\t cursors[i].style.opacity = val ? \"\" : \"0\";\n\t };\n\t \n\t\n\t this.$padding = 0;\n\t this.setPadding = function(padding) {\n\t this.$padding = padding;\n\t };\n\t\n\t this.setSession = function(session) {\n\t this.session = session;\n\t };\n\t\n\t this.setBlinking = function(blinking) {\n\t if (blinking != this.isBlinking){\n\t this.isBlinking = blinking;\n\t this.restartTimer();\n\t }\n\t };\n\t\n\t this.setBlinkInterval = function(blinkInterval) {\n\t if (blinkInterval != this.blinkInterval){\n\t this.blinkInterval = blinkInterval;\n\t this.restartTimer();\n\t }\n\t };\n\t\n\t this.setSmoothBlinking = function(smoothBlinking) {\n\t if (smoothBlinking != this.smoothBlinking && !isIE8) {\n\t this.smoothBlinking = smoothBlinking;\n\t dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n\t this.$updateCursors(true);\n\t this.$updateCursors = (this.$updateOpacity).bind(this);\n\t this.restartTimer();\n\t }\n\t };\n\t\n\t this.addCursor = function() {\n\t var el = dom.createElement(\"div\");\n\t el.className = \"ace_cursor\";\n\t this.element.appendChild(el);\n\t this.cursors.push(el);\n\t return el;\n\t };\n\t\n\t this.removeCursor = function() {\n\t if (this.cursors.length > 1) {\n\t var el = this.cursors.pop();\n\t el.parentNode.removeChild(el);\n\t return el;\n\t }\n\t };\n\t\n\t this.hideCursor = function() {\n\t this.isVisible = false;\n\t dom.addCssClass(this.element, \"ace_hidden-cursors\");\n\t this.restartTimer();\n\t };\n\t\n\t this.showCursor = function() {\n\t this.isVisible = true;\n\t dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n\t this.restartTimer();\n\t };\n\t\n\t this.restartTimer = function() {\n\t var update = this.$updateCursors;\n\t clearInterval(this.intervalId);\n\t clearTimeout(this.timeoutId);\n\t if (this.smoothBlinking) {\n\t dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n\t }\n\t \n\t update(true);\n\t\n\t if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n\t return;\n\t\n\t if (this.smoothBlinking) {\n\t setTimeout(function(){\n\t dom.addCssClass(this.element, \"ace_smooth-blinking\");\n\t }.bind(this));\n\t }\n\t \n\t var blink = function(){\n\t this.timeoutId = setTimeout(function() {\n\t update(false);\n\t }, 0.6 * this.blinkInterval);\n\t }.bind(this);\n\t\n\t this.intervalId = setInterval(function() {\n\t update(true);\n\t blink();\n\t }, this.blinkInterval);\n\t\n\t blink();\n\t };\n\t\n\t this.getPixelPosition = function(position, onScreen) {\n\t if (!this.config || !this.session)\n\t return {left : 0, top : 0};\n\t\n\t if (!position)\n\t position = this.session.selection.getCursor();\n\t var pos = this.session.documentToScreenPosition(position);\n\t var cursorLeft = this.$padding + pos.column * this.config.characterWidth;\n\t var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n\t this.config.lineHeight;\n\t\n\t return {left : cursorLeft, top : cursorTop};\n\t };\n\t\n\t this.update = function(config) {\n\t this.config = config;\n\t\n\t var selections = this.session.$selectionMarkers;\n\t var i = 0, cursorIndex = 0;\n\t\n\t if (selections === undefined || selections.length === 0){\n\t selections = [{cursor: null}];\n\t }\n\t\n\t for (var i = 0, n = selections.length; i < n; i++) {\n\t var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n\t if ((pixelPos.top > config.height + config.offset ||\n\t pixelPos.top < 0) && i > 1) {\n\t continue;\n\t }\n\t\n\t var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n\t \n\t if (!this.drawCursor) {\n\t style.left = pixelPos.left + \"px\";\n\t style.top = pixelPos.top + \"px\";\n\t style.width = config.characterWidth + \"px\";\n\t style.height = config.lineHeight + \"px\";\n\t } else {\n\t this.drawCursor(style, pixelPos, config, selections[i], this.session);\n\t }\n\t }\n\t while (this.cursors.length > cursorIndex)\n\t this.removeCursor();\n\t\n\t var overwrite = this.session.getOverwrite();\n\t this.$setOverwrite(overwrite);\n\t this.$pixelPos = pixelPos;\n\t this.restartTimer();\n\t };\n\t \n\t this.drawCursor = null;\n\t\n\t this.$setOverwrite = function(overwrite) {\n\t if (overwrite != this.overwrite) {\n\t this.overwrite = overwrite;\n\t if (overwrite)\n\t dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n\t else\n\t dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n\t }\n\t };\n\t\n\t this.destroy = function() {\n\t clearInterval(this.intervalId);\n\t clearTimeout(this.timeoutId);\n\t };\n\t\n\t}).call(Cursor.prototype);\n\t\n\texports.Cursor = Cursor;\n\t\n\t});\n\t\n\tace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar dom = acequire(\"./lib/dom\");\n\tvar event = acequire(\"./lib/event\");\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar ScrollBar = function(parent) {\n\t this.element = dom.createElement(\"div\");\n\t this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\t\n\t this.inner = dom.createElement(\"div\");\n\t this.inner.className = \"ace_scrollbar-inner\";\n\t this.element.appendChild(this.inner);\n\t\n\t parent.appendChild(this.element);\n\t\n\t this.setVisible(false);\n\t this.skipEvent = false;\n\t\n\t event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n\t event.addListener(this.element, \"mousedown\", event.preventDefault);\n\t};\n\t\n\t(function() {\n\t oop.implement(this, EventEmitter);\n\t\n\t this.setVisible = function(isVisible) {\n\t this.element.style.display = isVisible ? \"\" : \"none\";\n\t this.isVisible = isVisible;\n\t };\n\t}).call(ScrollBar.prototype);\n\tvar VScrollBar = function(parent, renderer) {\n\t ScrollBar.call(this, parent);\n\t this.scrollTop = 0;\n\t renderer.$scrollbarWidth = \n\t this.width = dom.scrollbarWidth(parent.ownerDocument);\n\t this.inner.style.width =\n\t this.element.style.width = (this.width || 15) + 5 + \"px\";\n\t};\n\t\n\toop.inherits(VScrollBar, ScrollBar);\n\t\n\t(function() {\n\t\n\t this.classSuffix = '-v';\n\t this.onScroll = function() {\n\t if (!this.skipEvent) {\n\t this.scrollTop = this.element.scrollTop;\n\t this._emit(\"scroll\", {data: this.scrollTop});\n\t }\n\t this.skipEvent = false;\n\t };\n\t this.getWidth = function() {\n\t return this.isVisible ? this.width : 0;\n\t };\n\t this.setHeight = function(height) {\n\t this.element.style.height = height + \"px\";\n\t };\n\t this.setInnerHeight = function(height) {\n\t this.inner.style.height = height + \"px\";\n\t };\n\t this.setScrollHeight = function(height) {\n\t this.inner.style.height = height + \"px\";\n\t };\n\t this.setScrollTop = function(scrollTop) {\n\t if (this.scrollTop != scrollTop) {\n\t this.skipEvent = true;\n\t this.scrollTop = this.element.scrollTop = scrollTop;\n\t }\n\t };\n\t\n\t}).call(VScrollBar.prototype);\n\tvar HScrollBar = function(parent, renderer) {\n\t ScrollBar.call(this, parent);\n\t this.scrollLeft = 0;\n\t this.height = renderer.$scrollbarWidth;\n\t this.inner.style.height =\n\t this.element.style.height = (this.height || 15) + 5 + \"px\";\n\t};\n\t\n\toop.inherits(HScrollBar, ScrollBar);\n\t\n\t(function() {\n\t\n\t this.classSuffix = '-h';\n\t this.onScroll = function() {\n\t if (!this.skipEvent) {\n\t this.scrollLeft = this.element.scrollLeft;\n\t this._emit(\"scroll\", {data: this.scrollLeft});\n\t }\n\t this.skipEvent = false;\n\t };\n\t this.getHeight = function() {\n\t return this.isVisible ? this.height : 0;\n\t };\n\t this.setWidth = function(width) {\n\t this.element.style.width = width + \"px\";\n\t };\n\t this.setInnerWidth = function(width) {\n\t this.inner.style.width = width + \"px\";\n\t };\n\t this.setScrollWidth = function(width) {\n\t this.inner.style.width = width + \"px\";\n\t };\n\t this.setScrollLeft = function(scrollLeft) {\n\t if (this.scrollLeft != scrollLeft) {\n\t this.skipEvent = true;\n\t this.scrollLeft = this.element.scrollLeft = scrollLeft;\n\t }\n\t };\n\t\n\t}).call(HScrollBar.prototype);\n\t\n\t\n\texports.ScrollBar = VScrollBar; // backward compatibility\n\texports.ScrollBarV = VScrollBar; // backward compatibility\n\texports.ScrollBarH = HScrollBar; // backward compatibility\n\t\n\texports.VScrollBar = VScrollBar;\n\texports.HScrollBar = HScrollBar;\n\t});\n\t\n\tace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar event = acequire(\"./lib/event\");\n\t\n\t\n\tvar RenderLoop = function(onRender, win) {\n\t this.onRender = onRender;\n\t this.pending = false;\n\t this.changes = 0;\n\t this.window = win || window;\n\t};\n\t\n\t(function() {\n\t\n\t\n\t this.schedule = function(change) {\n\t this.changes = this.changes | change;\n\t if (!this.pending && this.changes) {\n\t this.pending = true;\n\t var _self = this;\n\t event.nextFrame(function() {\n\t _self.pending = false;\n\t var changes;\n\t while (changes = _self.changes) {\n\t _self.changes = 0;\n\t _self.onRender(changes);\n\t }\n\t }, this.window);\n\t }\n\t };\n\t\n\t}).call(RenderLoop.prototype);\n\t\n\texports.RenderLoop = RenderLoop;\n\t});\n\t\n\tace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\n\tvar oop = acequire(\"../lib/oop\");\n\tvar dom = acequire(\"../lib/dom\");\n\tvar lang = acequire(\"../lib/lang\");\n\tvar useragent = acequire(\"../lib/useragent\");\n\tvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\t\n\tvar CHAR_COUNT = 0;\n\t\n\tvar FontMetrics = exports.FontMetrics = function(parentEl) {\n\t this.el = dom.createElement(\"div\");\n\t this.$setMeasureNodeStyles(this.el.style, true);\n\t \n\t this.$main = dom.createElement(\"div\");\n\t this.$setMeasureNodeStyles(this.$main.style);\n\t \n\t this.$measureNode = dom.createElement(\"div\");\n\t this.$setMeasureNodeStyles(this.$measureNode.style);\n\t \n\t \n\t this.el.appendChild(this.$main);\n\t this.el.appendChild(this.$measureNode);\n\t parentEl.appendChild(this.el);\n\t \n\t if (!CHAR_COUNT)\n\t this.$testFractionalRect();\n\t this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n\t \n\t this.$characterSize = {width: 0, height: 0};\n\t this.checkForSizeChanges();\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t \n\t this.$characterSize = {width: 0, height: 0};\n\t \n\t this.$testFractionalRect = function() {\n\t var el = dom.createElement(\"div\");\n\t this.$setMeasureNodeStyles(el.style);\n\t el.style.width = \"0.2px\";\n\t document.documentElement.appendChild(el);\n\t var w = el.getBoundingClientRect().width;\n\t if (w > 0 && w < 1)\n\t CHAR_COUNT = 50;\n\t else\n\t CHAR_COUNT = 100;\n\t el.parentNode.removeChild(el);\n\t };\n\t \n\t this.$setMeasureNodeStyles = function(style, isRoot) {\n\t style.width = style.height = \"auto\";\n\t style.left = style.top = \"0px\";\n\t style.visibility = \"hidden\";\n\t style.position = \"absolute\";\n\t style.whiteSpace = \"pre\";\n\t\n\t if (useragent.isIE < 8) {\n\t style[\"font-family\"] = \"inherit\";\n\t } else {\n\t style.font = \"inherit\";\n\t }\n\t style.overflow = isRoot ? \"hidden\" : \"visible\";\n\t };\n\t\n\t this.checkForSizeChanges = function() {\n\t var size = this.$measureSizes();\n\t if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n\t this.$measureNode.style.fontWeight = \"bold\";\n\t var boldSize = this.$measureSizes();\n\t this.$measureNode.style.fontWeight = \"\";\n\t this.$characterSize = size;\n\t this.charSizes = Object.create(null);\n\t this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n\t this._emit(\"changeCharacterSize\", {data: size});\n\t }\n\t };\n\t\n\t this.$pollSizeChanges = function() {\n\t if (this.$pollSizeChangesTimer)\n\t return this.$pollSizeChangesTimer;\n\t var self = this;\n\t return this.$pollSizeChangesTimer = setInterval(function() {\n\t self.checkForSizeChanges();\n\t }, 500);\n\t };\n\t \n\t this.setPolling = function(val) {\n\t if (val) {\n\t this.$pollSizeChanges();\n\t } else if (this.$pollSizeChangesTimer) {\n\t clearInterval(this.$pollSizeChangesTimer);\n\t this.$pollSizeChangesTimer = 0;\n\t }\n\t };\n\t\n\t this.$measureSizes = function() {\n\t if (CHAR_COUNT === 50) {\n\t var rect = null;\n\t try { \n\t rect = this.$measureNode.getBoundingClientRect();\n\t } catch(e) {\n\t rect = {width: 0, height:0 };\n\t }\n\t var size = {\n\t height: rect.height,\n\t width: rect.width / CHAR_COUNT\n\t };\n\t } else {\n\t var size = {\n\t height: this.$measureNode.clientHeight,\n\t width: this.$measureNode.clientWidth / CHAR_COUNT\n\t };\n\t }\n\t if (size.width === 0 || size.height === 0)\n\t return null;\n\t return size;\n\t };\n\t\n\t this.$measureCharWidth = function(ch) {\n\t this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n\t var rect = this.$main.getBoundingClientRect();\n\t return rect.width / CHAR_COUNT;\n\t };\n\t \n\t this.getCharacterWidth = function(ch) {\n\t var w = this.charSizes[ch];\n\t if (w === undefined) {\n\t w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n\t }\n\t return w;\n\t };\n\t\n\t this.destroy = function() {\n\t clearInterval(this.$pollSizeChangesTimer);\n\t if (this.el && this.el.parentNode)\n\t this.el.parentNode.removeChild(this.el);\n\t };\n\t\n\t}).call(FontMetrics.prototype);\n\t\n\t});\n\t\n\tace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar dom = acequire(\"./lib/dom\");\n\tvar config = acequire(\"./config\");\n\tvar useragent = acequire(\"./lib/useragent\");\n\tvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\n\tvar MarkerLayer = acequire(\"./layer/marker\").Marker;\n\tvar TextLayer = acequire(\"./layer/text\").Text;\n\tvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\n\tvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\n\tvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\n\tvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\n\tvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar editorCss = \".ace_editor {\\\n\tposition: relative;\\\n\toverflow: hidden;\\\n\tfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\n\tdirection: ltr;\\\n\t}\\\n\t.ace_scroller {\\\n\tposition: absolute;\\\n\toverflow: hidden;\\\n\ttop: 0;\\\n\tbottom: 0;\\\n\tbackground-color: inherit;\\\n\t-ms-user-select: none;\\\n\t-moz-user-select: none;\\\n\t-webkit-user-select: none;\\\n\tuser-select: none;\\\n\tcursor: text;\\\n\t}\\\n\t.ace_content {\\\n\tposition: absolute;\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tmin-width: 100%;\\\n\t}\\\n\t.ace_dragging .ace_scroller:before{\\\n\tposition: absolute;\\\n\ttop: 0;\\\n\tleft: 0;\\\n\tright: 0;\\\n\tbottom: 0;\\\n\tcontent: '';\\\n\tbackground: rgba(250, 250, 250, 0.01);\\\n\tz-index: 1000;\\\n\t}\\\n\t.ace_dragging.ace_dark .ace_scroller:before{\\\n\tbackground: rgba(0, 0, 0, 0.01);\\\n\t}\\\n\t.ace_selecting, .ace_selecting * {\\\n\tcursor: text !important;\\\n\t}\\\n\t.ace_gutter {\\\n\tposition: absolute;\\\n\toverflow : hidden;\\\n\twidth: auto;\\\n\ttop: 0;\\\n\tbottom: 0;\\\n\tleft: 0;\\\n\tcursor: default;\\\n\tz-index: 4;\\\n\t-ms-user-select: none;\\\n\t-moz-user-select: none;\\\n\t-webkit-user-select: none;\\\n\tuser-select: none;\\\n\t}\\\n\t.ace_gutter-active-line {\\\n\tposition: absolute;\\\n\tleft: 0;\\\n\tright: 0;\\\n\t}\\\n\t.ace_scroller.ace_scroll-left {\\\n\tbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n\t}\\\n\t.ace_gutter-cell {\\\n\tpadding-left: 19px;\\\n\tpadding-right: 6px;\\\n\tbackground-repeat: no-repeat;\\\n\t}\\\n\t.ace_gutter-cell.ace_error {\\\n\tbackground-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==\\\");\\\n\tbackground-repeat: no-repeat;\\\n\tbackground-position: 2px center;\\\n\t}\\\n\t.ace_gutter-cell.ace_warning {\\\n\tbackground-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==\\\");\\\n\tbackground-position: 2px center;\\\n\t}\\\n\t.ace_gutter-cell.ace_info {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\n\tbackground-position: 2px center;\\\n\t}\\\n\t.ace_dark .ace_gutter-cell.ace_info {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n\t}\\\n\t.ace_scrollbar {\\\n\tposition: absolute;\\\n\tright: 0;\\\n\tbottom: 0;\\\n\tz-index: 6;\\\n\t}\\\n\t.ace_scrollbar-inner {\\\n\tposition: absolute;\\\n\tcursor: text;\\\n\tleft: 0;\\\n\ttop: 0;\\\n\t}\\\n\t.ace_scrollbar-v{\\\n\toverflow-x: hidden;\\\n\toverflow-y: scroll;\\\n\ttop: 0;\\\n\t}\\\n\t.ace_scrollbar-h {\\\n\toverflow-x: scroll;\\\n\toverflow-y: hidden;\\\n\tleft: 0;\\\n\t}\\\n\t.ace_print-margin {\\\n\tposition: absolute;\\\n\theight: 100%;\\\n\t}\\\n\t.ace_text-input {\\\n\tposition: absolute;\\\n\tz-index: 0;\\\n\twidth: 0.5em;\\\n\theight: 1em;\\\n\topacity: 0;\\\n\tbackground: transparent;\\\n\t-moz-appearance: none;\\\n\tappearance: none;\\\n\tborder: none;\\\n\tresize: none;\\\n\toutline: none;\\\n\toverflow: hidden;\\\n\tfont: inherit;\\\n\tpadding: 0 1px;\\\n\tmargin: 0 -1px;\\\n\ttext-indent: -1em;\\\n\t-ms-user-select: text;\\\n\t-moz-user-select: text;\\\n\t-webkit-user-select: text;\\\n\tuser-select: text;\\\n\twhite-space: pre!important;\\\n\t}\\\n\t.ace_text-input.ace_composition {\\\n\tbackground: inherit;\\\n\tcolor: inherit;\\\n\tz-index: 1000;\\\n\topacity: 1;\\\n\ttext-indent: 0;\\\n\t}\\\n\t.ace_layer {\\\n\tz-index: 1;\\\n\tposition: absolute;\\\n\toverflow: hidden;\\\n\tword-wrap: normal;\\\n\twhite-space: pre;\\\n\theight: 100%;\\\n\twidth: 100%;\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tpointer-events: none;\\\n\t}\\\n\t.ace_gutter-layer {\\\n\tposition: relative;\\\n\twidth: auto;\\\n\ttext-align: right;\\\n\tpointer-events: auto;\\\n\t}\\\n\t.ace_text-layer {\\\n\tfont: inherit !important;\\\n\t}\\\n\t.ace_cjk {\\\n\tdisplay: inline-block;\\\n\ttext-align: center;\\\n\t}\\\n\t.ace_cursor-layer {\\\n\tz-index: 4;\\\n\t}\\\n\t.ace_cursor {\\\n\tz-index: 4;\\\n\tposition: absolute;\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tborder-left: 2px solid;\\\n\ttransform: translatez(0);\\\n\t}\\\n\t.ace_slim-cursors .ace_cursor {\\\n\tborder-left-width: 1px;\\\n\t}\\\n\t.ace_overwrite-cursors .ace_cursor {\\\n\tborder-left-width: 0;\\\n\tborder-bottom: 1px solid;\\\n\t}\\\n\t.ace_hidden-cursors .ace_cursor {\\\n\topacity: 0.2;\\\n\t}\\\n\t.ace_smooth-blinking .ace_cursor {\\\n\t-webkit-transition: opacity 0.18s;\\\n\ttransition: opacity 0.18s;\\\n\t}\\\n\t.ace_editor.ace_multiselect .ace_cursor {\\\n\tborder-left-width: 1px;\\\n\t}\\\n\t.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\n\tposition: absolute;\\\n\tz-index: 3;\\\n\t}\\\n\t.ace_marker-layer .ace_selection {\\\n\tposition: absolute;\\\n\tz-index: 5;\\\n\t}\\\n\t.ace_marker-layer .ace_bracket {\\\n\tposition: absolute;\\\n\tz-index: 6;\\\n\t}\\\n\t.ace_marker-layer .ace_active-line {\\\n\tposition: absolute;\\\n\tz-index: 2;\\\n\t}\\\n\t.ace_marker-layer .ace_selected-word {\\\n\tposition: absolute;\\\n\tz-index: 4;\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\t}\\\n\t.ace_line .ace_fold {\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tdisplay: inline-block;\\\n\theight: 11px;\\\n\tmargin-top: -2px;\\\n\tvertical-align: middle;\\\n\tbackground-image:\\\n\turl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\n\turl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\n\tbackground-repeat: no-repeat, repeat-x;\\\n\tbackground-position: center center, top left;\\\n\tcolor: transparent;\\\n\tborder: 1px solid black;\\\n\tborder-radius: 2px;\\\n\tcursor: pointer;\\\n\tpointer-events: auto;\\\n\t}\\\n\t.ace_dark .ace_fold {\\\n\t}\\\n\t.ace_fold:hover{\\\n\tbackground-image:\\\n\turl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\n\turl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n\t}\\\n\t.ace_tooltip {\\\n\tbackground-color: #FFF;\\\n\tbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\n\tbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\n\tborder: 1px solid gray;\\\n\tborder-radius: 1px;\\\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\n\tcolor: black;\\\n\tmax-width: 100%;\\\n\tpadding: 3px 4px;\\\n\tposition: fixed;\\\n\tz-index: 999999;\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tcursor: default;\\\n\twhite-space: pre;\\\n\tword-wrap: break-word;\\\n\tline-height: normal;\\\n\tfont-style: normal;\\\n\tfont-weight: normal;\\\n\tletter-spacing: normal;\\\n\tpointer-events: none;\\\n\t}\\\n\t.ace_folding-enabled > .ace_gutter-cell {\\\n\tpadding-right: 13px;\\\n\t}\\\n\t.ace_fold-widget {\\\n\t-moz-box-sizing: border-box;\\\n\t-webkit-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tmargin: 0 -12px 0 1px;\\\n\tdisplay: none;\\\n\twidth: 11px;\\\n\tvertical-align: top;\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\n\tbackground-repeat: no-repeat;\\\n\tbackground-position: center;\\\n\tborder-radius: 3px;\\\n\tborder: 1px solid transparent;\\\n\tcursor: pointer;\\\n\t}\\\n\t.ace_folding-enabled .ace_fold-widget {\\\n\tdisplay: inline-block; \\\n\t}\\\n\t.ace_fold-widget.ace_end {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n\t}\\\n\t.ace_fold-widget.ace_closed {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n\t}\\\n\t.ace_fold-widget:hover {\\\n\tborder: 1px solid rgba(0, 0, 0, 0.3);\\\n\tbackground-color: rgba(255, 255, 255, 0.2);\\\n\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n\t}\\\n\t.ace_fold-widget:active {\\\n\tborder: 1px solid rgba(0, 0, 0, 0.4);\\\n\tbackground-color: rgba(0, 0, 0, 0.05);\\\n\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n\t}\\\n\t.ace_dark .ace_fold-widget {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n\t}\\\n\t.ace_dark .ace_fold-widget.ace_end {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n\t}\\\n\t.ace_dark .ace_fold-widget.ace_closed {\\\n\tbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n\t}\\\n\t.ace_dark .ace_fold-widget:hover {\\\n\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n\tbackground-color: rgba(255, 255, 255, 0.1);\\\n\t}\\\n\t.ace_dark .ace_fold-widget:active {\\\n\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n\t}\\\n\t.ace_fold-widget.ace_invalid {\\\n\tbackground-color: #FFB4B4;\\\n\tborder-color: #DE5555;\\\n\t}\\\n\t.ace_fade-fold-widgets .ace_fold-widget {\\\n\t-webkit-transition: opacity 0.4s ease 0.05s;\\\n\ttransition: opacity 0.4s ease 0.05s;\\\n\topacity: 0;\\\n\t}\\\n\t.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n\t-webkit-transition: opacity 0.05s ease 0.05s;\\\n\ttransition: opacity 0.05s ease 0.05s;\\\n\topacity:1;\\\n\t}\\\n\t.ace_underline {\\\n\ttext-decoration: underline;\\\n\t}\\\n\t.ace_bold {\\\n\tfont-weight: bold;\\\n\t}\\\n\t.ace_nobold .ace_bold {\\\n\tfont-weight: normal;\\\n\t}\\\n\t.ace_italic {\\\n\tfont-style: italic;\\\n\t}\\\n\t.ace_error-marker {\\\n\tbackground-color: rgba(255, 0, 0,0.2);\\\n\tposition: absolute;\\\n\tz-index: 9;\\\n\t}\\\n\t.ace_highlight-marker {\\\n\tbackground-color: rgba(255, 255, 0,0.2);\\\n\tposition: absolute;\\\n\tz-index: 8;\\\n\t}\\\n\t.ace_br1 {border-top-left-radius : 3px;}\\\n\t.ace_br2 {border-top-right-radius : 3px;}\\\n\t.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n\t.ace_br4 {border-bottom-right-radius: 3px;}\\\n\t.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n\t.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n\t.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n\t.ace_br8 {border-bottom-left-radius : 3px;}\\\n\t.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n\t.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n\t.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n\t.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n\t.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n\t.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n\t.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n\t\";\n\t\n\tdom.importCssString(editorCss, \"ace_editor.css\");\n\t\n\tvar VirtualRenderer = function(container, theme) {\n\t var _self = this;\n\t\n\t this.container = container || dom.createElement(\"div\");\n\t this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\t\n\t dom.addCssClass(this.container, \"ace_editor\");\n\t\n\t this.setTheme(theme);\n\t\n\t this.$gutter = dom.createElement(\"div\");\n\t this.$gutter.className = \"ace_gutter\";\n\t this.container.appendChild(this.$gutter);\n\t\n\t this.scroller = dom.createElement(\"div\");\n\t this.scroller.className = \"ace_scroller\";\n\t this.container.appendChild(this.scroller);\n\t\n\t this.content = dom.createElement(\"div\");\n\t this.content.className = \"ace_content\";\n\t this.scroller.appendChild(this.content);\n\t\n\t this.$gutterLayer = new GutterLayer(this.$gutter);\n\t this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\t\n\t this.$markerBack = new MarkerLayer(this.content);\n\t\n\t var textLayer = this.$textLayer = new TextLayer(this.content);\n\t this.canvas = textLayer.element;\n\t\n\t this.$markerFront = new MarkerLayer(this.content);\n\t\n\t this.$cursorLayer = new CursorLayer(this.content);\n\t this.$horizScroll = false;\n\t this.$vScroll = false;\n\t\n\t this.scrollBar = \n\t this.scrollBarV = new VScrollBar(this.container, this);\n\t this.scrollBarH = new HScrollBar(this.container, this);\n\t this.scrollBarV.addEventListener(\"scroll\", function(e) {\n\t if (!_self.$scrollAnimation)\n\t _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n\t });\n\t this.scrollBarH.addEventListener(\"scroll\", function(e) {\n\t if (!_self.$scrollAnimation)\n\t _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n\t });\n\t\n\t this.scrollTop = 0;\n\t this.scrollLeft = 0;\n\t\n\t this.cursorPos = {\n\t row : 0,\n\t column : 0\n\t };\n\t\n\t this.$fontMetrics = new FontMetrics(this.container);\n\t this.$textLayer.$setFontMetrics(this.$fontMetrics);\n\t this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n\t _self.updateCharacterSize();\n\t _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n\t _self._signal(\"changeCharacterSize\", e);\n\t });\n\t\n\t this.$size = {\n\t width: 0,\n\t height: 0,\n\t scrollerHeight: 0,\n\t scrollerWidth: 0,\n\t $dirty: true\n\t };\n\t\n\t this.layerConfig = {\n\t width : 1,\n\t padding : 0,\n\t firstRow : 0,\n\t firstRowScreen: 0,\n\t lastRow : 0,\n\t lineHeight : 0,\n\t characterWidth : 0,\n\t minHeight : 1,\n\t maxHeight : 1,\n\t offset : 0,\n\t height : 1,\n\t gutterOffset: 1\n\t };\n\t \n\t this.scrollMargin = {\n\t left: 0,\n\t right: 0,\n\t top: 0,\n\t bottom: 0,\n\t v: 0,\n\t h: 0\n\t };\n\t\n\t this.$loop = new RenderLoop(\n\t this.$renderChanges.bind(this),\n\t this.container.ownerDocument.defaultView\n\t );\n\t this.$loop.schedule(this.CHANGE_FULL);\n\t\n\t this.updateCharacterSize();\n\t this.setPadding(4);\n\t config.resetOptions(this);\n\t config._emit(\"renderer\", this);\n\t};\n\t\n\t(function() {\n\t\n\t this.CHANGE_CURSOR = 1;\n\t this.CHANGE_MARKER = 2;\n\t this.CHANGE_GUTTER = 4;\n\t this.CHANGE_SCROLL = 8;\n\t this.CHANGE_LINES = 16;\n\t this.CHANGE_TEXT = 32;\n\t this.CHANGE_SIZE = 64;\n\t this.CHANGE_MARKER_BACK = 128;\n\t this.CHANGE_MARKER_FRONT = 256;\n\t this.CHANGE_FULL = 512;\n\t this.CHANGE_H_SCROLL = 1024;\n\t\n\t oop.implement(this, EventEmitter);\n\t\n\t this.updateCharacterSize = function() {\n\t if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n\t this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n\t this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n\t }\n\t\n\t this.layerConfig.characterWidth =\n\t this.characterWidth = this.$textLayer.getCharacterWidth();\n\t this.layerConfig.lineHeight =\n\t this.lineHeight = this.$textLayer.getLineHeight();\n\t this.$updatePrintMargin();\n\t };\n\t this.setSession = function(session) {\n\t if (this.session)\n\t this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n\t \n\t this.session = session;\n\t if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n\t session.setScrollTop(-this.scrollMargin.top);\n\t\n\t this.$cursorLayer.setSession(session);\n\t this.$markerBack.setSession(session);\n\t this.$markerFront.setSession(session);\n\t this.$gutterLayer.setSession(session);\n\t this.$textLayer.setSession(session);\n\t if (!session)\n\t return;\n\t \n\t this.$loop.schedule(this.CHANGE_FULL);\n\t this.session.$setFontMetrics(this.$fontMetrics);\n\t \n\t this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n\t this.onChangeNewLineMode()\n\t this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n\t };\n\t this.updateLines = function(firstRow, lastRow, force) {\n\t if (lastRow === undefined)\n\t lastRow = Infinity;\n\t\n\t if (!this.$changedLines) {\n\t this.$changedLines = {\n\t firstRow: firstRow,\n\t lastRow: lastRow\n\t };\n\t }\n\t else {\n\t if (this.$changedLines.firstRow > firstRow)\n\t this.$changedLines.firstRow = firstRow;\n\t\n\t if (this.$changedLines.lastRow < lastRow)\n\t this.$changedLines.lastRow = lastRow;\n\t }\n\t if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n\t if (force)\n\t this.$changedLines.lastRow = this.layerConfig.lastRow;\n\t else\n\t return;\n\t }\n\t if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n\t return;\n\t this.$loop.schedule(this.CHANGE_LINES);\n\t };\n\t\n\t this.onChangeNewLineMode = function() {\n\t this.$loop.schedule(this.CHANGE_TEXT);\n\t this.$textLayer.$updateEolChar();\n\t };\n\t \n\t this.onChangeTabSize = function() {\n\t this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n\t this.$textLayer.onChangeTabSize();\n\t };\n\t this.updateText = function() {\n\t this.$loop.schedule(this.CHANGE_TEXT);\n\t };\n\t this.updateFull = function(force) {\n\t if (force)\n\t this.$renderChanges(this.CHANGE_FULL, true);\n\t else\n\t this.$loop.schedule(this.CHANGE_FULL);\n\t };\n\t this.updateFontSize = function() {\n\t this.$textLayer.checkForSizeChanges();\n\t };\n\t\n\t this.$changes = 0;\n\t this.$updateSizeAsync = function() {\n\t if (this.$loop.pending)\n\t this.$size.$dirty = true;\n\t else\n\t this.onResize();\n\t };\n\t this.onResize = function(force, gutterWidth, width, height) {\n\t if (this.resizing > 2)\n\t return;\n\t else if (this.resizing > 0)\n\t this.resizing++;\n\t else\n\t this.resizing = force ? 1 : 0;\n\t var el = this.container;\n\t if (!height)\n\t height = el.clientHeight || el.scrollHeight;\n\t if (!width)\n\t width = el.clientWidth || el.scrollWidth;\n\t var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\t\n\t \n\t if (!this.$size.scrollerHeight || (!width && !height))\n\t return this.resizing = 0;\n\t\n\t if (force)\n\t this.$gutterLayer.$padding = null;\n\t\n\t if (force)\n\t this.$renderChanges(changes | this.$changes, true);\n\t else\n\t this.$loop.schedule(changes | this.$changes);\n\t\n\t if (this.resizing)\n\t this.resizing = 0;\n\t this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n\t };\n\t \n\t this.$updateCachedSize = function(force, gutterWidth, width, height) {\n\t height -= (this.$extraHeight || 0);\n\t var changes = 0;\n\t var size = this.$size;\n\t var oldSize = {\n\t width: size.width,\n\t height: size.height,\n\t scrollerHeight: size.scrollerHeight,\n\t scrollerWidth: size.scrollerWidth\n\t };\n\t if (height && (force || size.height != height)) {\n\t size.height = height;\n\t changes |= this.CHANGE_SIZE;\n\t\n\t size.scrollerHeight = size.height;\n\t if (this.$horizScroll)\n\t size.scrollerHeight -= this.scrollBarH.getHeight();\n\t this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\t\n\t changes = changes | this.CHANGE_SCROLL;\n\t }\n\t\n\t if (width && (force || size.width != width)) {\n\t changes |= this.CHANGE_SIZE;\n\t size.width = width;\n\t \n\t if (gutterWidth == null)\n\t gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n\t \n\t this.gutterWidth = gutterWidth;\n\t \n\t this.scrollBarH.element.style.left = \n\t this.scroller.style.left = gutterWidth + \"px\";\n\t size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \n\t \n\t this.scrollBarH.element.style.right = \n\t this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n\t this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\t\n\t if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n\t changes |= this.CHANGE_FULL;\n\t }\n\t \n\t size.$dirty = !width || !height;\n\t\n\t if (changes)\n\t this._signal(\"resize\", oldSize);\n\t\n\t return changes;\n\t };\n\t\n\t this.onGutterResize = function() {\n\t var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n\t if (gutterWidth != this.gutterWidth)\n\t this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\t\n\t if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n\t this.$loop.schedule(this.CHANGE_FULL);\n\t } else if (this.$size.$dirty) {\n\t this.$loop.schedule(this.CHANGE_FULL);\n\t } else {\n\t this.$computeLayerConfig();\n\t this.$loop.schedule(this.CHANGE_MARKER);\n\t }\n\t };\n\t this.adjustWrapLimit = function() {\n\t var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n\t var limit = Math.floor(availableWidth / this.characterWidth);\n\t return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n\t };\n\t this.setAnimatedScroll = function(shouldAnimate){\n\t this.setOption(\"animatedScroll\", shouldAnimate);\n\t };\n\t this.getAnimatedScroll = function() {\n\t return this.$animatedScroll;\n\t };\n\t this.setShowInvisibles = function(showInvisibles) {\n\t this.setOption(\"showInvisibles\", showInvisibles);\n\t };\n\t this.getShowInvisibles = function() {\n\t return this.getOption(\"showInvisibles\");\n\t };\n\t this.getDisplayIndentGuides = function() {\n\t return this.getOption(\"displayIndentGuides\");\n\t };\n\t\n\t this.setDisplayIndentGuides = function(display) {\n\t this.setOption(\"displayIndentGuides\", display);\n\t };\n\t this.setShowPrintMargin = function(showPrintMargin) {\n\t this.setOption(\"showPrintMargin\", showPrintMargin);\n\t };\n\t this.getShowPrintMargin = function() {\n\t return this.getOption(\"showPrintMargin\");\n\t };\n\t this.setPrintMarginColumn = function(showPrintMargin) {\n\t this.setOption(\"printMarginColumn\", showPrintMargin);\n\t };\n\t this.getPrintMarginColumn = function() {\n\t return this.getOption(\"printMarginColumn\");\n\t };\n\t this.getShowGutter = function(){\n\t return this.getOption(\"showGutter\");\n\t };\n\t this.setShowGutter = function(show){\n\t return this.setOption(\"showGutter\", show);\n\t };\n\t\n\t this.getFadeFoldWidgets = function(){\n\t return this.getOption(\"fadeFoldWidgets\")\n\t };\n\t\n\t this.setFadeFoldWidgets = function(show) {\n\t this.setOption(\"fadeFoldWidgets\", show);\n\t };\n\t\n\t this.setHighlightGutterLine = function(shouldHighlight) {\n\t this.setOption(\"highlightGutterLine\", shouldHighlight);\n\t };\n\t\n\t this.getHighlightGutterLine = function() {\n\t return this.getOption(\"highlightGutterLine\");\n\t };\n\t\n\t this.$updateGutterLineHighlight = function() {\n\t var pos = this.$cursorLayer.$pixelPos;\n\t var height = this.layerConfig.lineHeight;\n\t if (this.session.getUseWrapMode()) {\n\t var cursor = this.session.selection.getCursor();\n\t cursor.column = 0;\n\t pos = this.$cursorLayer.getPixelPosition(cursor, true);\n\t height *= this.session.getRowLength(cursor.row);\n\t }\n\t this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n\t this.$gutterLineHighlight.style.height = height + \"px\";\n\t };\n\t\n\t this.$updatePrintMargin = function() {\n\t if (!this.$showPrintMargin && !this.$printMarginEl)\n\t return;\n\t\n\t if (!this.$printMarginEl) {\n\t var containerEl = dom.createElement(\"div\");\n\t containerEl.className = \"ace_layer ace_print-margin-layer\";\n\t this.$printMarginEl = dom.createElement(\"div\");\n\t this.$printMarginEl.className = \"ace_print-margin\";\n\t containerEl.appendChild(this.$printMarginEl);\n\t this.content.insertBefore(containerEl, this.content.firstChild);\n\t }\n\t\n\t var style = this.$printMarginEl.style;\n\t style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n\t style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n\t \n\t if (this.session && this.session.$wrap == -1)\n\t this.adjustWrapLimit();\n\t };\n\t this.getContainerElement = function() {\n\t return this.container;\n\t };\n\t this.getMouseEventTarget = function() {\n\t return this.scroller;\n\t };\n\t this.getTextAreaContainer = function() {\n\t return this.container;\n\t };\n\t this.$moveTextAreaToCursor = function() {\n\t if (!this.$keepTextAreaAtCursor)\n\t return;\n\t var config = this.layerConfig;\n\t var posTop = this.$cursorLayer.$pixelPos.top;\n\t var posLeft = this.$cursorLayer.$pixelPos.left;\n\t posTop -= config.offset;\n\t\n\t var style = this.textarea.style;\n\t var h = this.lineHeight;\n\t if (posTop < 0 || posTop > config.height - h) {\n\t style.top = style.left = \"0\";\n\t return;\n\t }\n\t\n\t var w = this.characterWidth;\n\t if (this.$composition) {\n\t var val = this.textarea.value.replace(/^\\x01+/, \"\");\n\t w *= (this.session.$getStringScreenWidth(val)[0]+2);\n\t h += 2;\n\t }\n\t posLeft -= this.scrollLeft;\n\t if (posLeft > this.$size.scrollerWidth - w)\n\t posLeft = this.$size.scrollerWidth - w;\n\t\n\t posLeft += this.gutterWidth;\n\t style.height = h + \"px\";\n\t style.width = w + \"px\";\n\t style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n\t style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n\t };\n\t this.getFirstVisibleRow = function() {\n\t return this.layerConfig.firstRow;\n\t };\n\t this.getFirstFullyVisibleRow = function() {\n\t return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n\t };\n\t this.getLastFullyVisibleRow = function() {\n\t var config = this.layerConfig;\n\t var lastRow = config.lastRow\n\t var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n\t if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n\t return lastRow - 1;\n\t return lastRow;\n\t };\n\t this.getLastVisibleRow = function() {\n\t return this.layerConfig.lastRow;\n\t };\n\t\n\t this.$padding = null;\n\t this.setPadding = function(padding) {\n\t this.$padding = padding;\n\t this.$textLayer.setPadding(padding);\n\t this.$cursorLayer.setPadding(padding);\n\t this.$markerFront.setPadding(padding);\n\t this.$markerBack.setPadding(padding);\n\t this.$loop.schedule(this.CHANGE_FULL);\n\t this.$updatePrintMargin();\n\t };\n\t \n\t this.setScrollMargin = function(top, bottom, left, right) {\n\t var sm = this.scrollMargin;\n\t sm.top = top|0;\n\t sm.bottom = bottom|0;\n\t sm.right = right|0;\n\t sm.left = left|0;\n\t sm.v = sm.top + sm.bottom;\n\t sm.h = sm.left + sm.right;\n\t if (sm.top && this.scrollTop <= 0 && this.session)\n\t this.session.setScrollTop(-sm.top);\n\t this.updateFull();\n\t };\n\t this.getHScrollBarAlwaysVisible = function() {\n\t return this.$hScrollBarAlwaysVisible;\n\t };\n\t this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n\t this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n\t };\n\t this.getVScrollBarAlwaysVisible = function() {\n\t return this.$vScrollBarAlwaysVisible;\n\t };\n\t this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n\t this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n\t };\n\t\n\t this.$updateScrollBarV = function() {\n\t var scrollHeight = this.layerConfig.maxHeight;\n\t var scrollerHeight = this.$size.scrollerHeight;\n\t if (!this.$maxLines && this.$scrollPastEnd) {\n\t scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n\t if (this.scrollTop > scrollHeight - scrollerHeight) {\n\t scrollHeight = this.scrollTop + scrollerHeight;\n\t this.scrollBarV.scrollTop = null;\n\t }\n\t }\n\t this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n\t this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n\t };\n\t this.$updateScrollBarH = function() {\n\t this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n\t this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n\t };\n\t \n\t this.$frozen = false;\n\t this.freeze = function() {\n\t this.$frozen = true;\n\t };\n\t \n\t this.unfreeze = function() {\n\t this.$frozen = false;\n\t };\n\t\n\t this.$renderChanges = function(changes, force) {\n\t if (this.$changes) {\n\t changes |= this.$changes;\n\t this.$changes = 0;\n\t }\n\t if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n\t this.$changes |= changes;\n\t return; \n\t } \n\t if (this.$size.$dirty) {\n\t this.$changes |= changes;\n\t return this.onResize(true);\n\t }\n\t if (!this.lineHeight) {\n\t this.$textLayer.checkForSizeChanges();\n\t }\n\t \n\t this._signal(\"beforeRender\");\n\t var config = this.layerConfig;\n\t if (changes & this.CHANGE_FULL ||\n\t changes & this.CHANGE_SIZE ||\n\t changes & this.CHANGE_TEXT ||\n\t changes & this.CHANGE_LINES ||\n\t changes & this.CHANGE_SCROLL ||\n\t changes & this.CHANGE_H_SCROLL\n\t ) {\n\t changes |= this.$computeLayerConfig();\n\t if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n\t var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n\t if (st > 0) {\n\t this.scrollTop = st;\n\t changes = changes | this.CHANGE_SCROLL;\n\t changes |= this.$computeLayerConfig();\n\t }\n\t }\n\t config = this.layerConfig;\n\t this.$updateScrollBarV();\n\t if (changes & this.CHANGE_H_SCROLL)\n\t this.$updateScrollBarH();\n\t this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n\t this.content.style.marginTop = (-config.offset) + \"px\";\n\t this.content.style.width = config.width + 2 * this.$padding + \"px\";\n\t this.content.style.height = config.minHeight + \"px\";\n\t }\n\t if (changes & this.CHANGE_H_SCROLL) {\n\t this.content.style.marginLeft = -this.scrollLeft + \"px\";\n\t this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n\t }\n\t if (changes & this.CHANGE_FULL) {\n\t this.$textLayer.update(config);\n\t if (this.$showGutter)\n\t this.$gutterLayer.update(config);\n\t this.$markerBack.update(config);\n\t this.$markerFront.update(config);\n\t this.$cursorLayer.update(config);\n\t this.$moveTextAreaToCursor();\n\t this.$highlightGutterLine && this.$updateGutterLineHighlight();\n\t this._signal(\"afterRender\");\n\t return;\n\t }\n\t if (changes & this.CHANGE_SCROLL) {\n\t if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n\t this.$textLayer.update(config);\n\t else\n\t this.$textLayer.scrollLines(config);\n\t\n\t if (this.$showGutter)\n\t this.$gutterLayer.update(config);\n\t this.$markerBack.update(config);\n\t this.$markerFront.update(config);\n\t this.$cursorLayer.update(config);\n\t this.$highlightGutterLine && this.$updateGutterLineHighlight();\n\t this.$moveTextAreaToCursor();\n\t this._signal(\"afterRender\");\n\t return;\n\t }\n\t\n\t if (changes & this.CHANGE_TEXT) {\n\t this.$textLayer.update(config);\n\t if (this.$showGutter)\n\t this.$gutterLayer.update(config);\n\t }\n\t else if (changes & this.CHANGE_LINES) {\n\t if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n\t this.$gutterLayer.update(config);\n\t }\n\t else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n\t if (this.$showGutter)\n\t this.$gutterLayer.update(config);\n\t }\n\t\n\t if (changes & this.CHANGE_CURSOR) {\n\t this.$cursorLayer.update(config);\n\t this.$moveTextAreaToCursor();\n\t this.$highlightGutterLine && this.$updateGutterLineHighlight();\n\t }\n\t\n\t if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n\t this.$markerFront.update(config);\n\t }\n\t\n\t if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n\t this.$markerBack.update(config);\n\t }\n\t\n\t this._signal(\"afterRender\");\n\t };\n\t\n\t \n\t this.$autosize = function() {\n\t var height = this.session.getScreenLength() * this.lineHeight;\n\t var maxHeight = this.$maxLines * this.lineHeight;\n\t var desiredHeight = Math.max(\n\t (this.$minLines||1) * this.lineHeight,\n\t Math.min(maxHeight, height)\n\t ) + this.scrollMargin.v + (this.$extraHeight || 0);\n\t if (this.$horizScroll)\n\t desiredHeight += this.scrollBarH.getHeight();\n\t var vScroll = height > maxHeight;\n\t \n\t if (desiredHeight != this.desiredHeight ||\n\t this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n\t if (vScroll != this.$vScroll) {\n\t this.$vScroll = vScroll;\n\t this.scrollBarV.setVisible(vScroll);\n\t }\n\t \n\t var w = this.container.clientWidth;\n\t this.container.style.height = desiredHeight + \"px\";\n\t this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n\t this.desiredHeight = desiredHeight;\n\t \n\t this._signal(\"autosize\");\n\t }\n\t };\n\t \n\t this.$computeLayerConfig = function() {\n\t var session = this.session;\n\t var size = this.$size;\n\t \n\t var hideScrollbars = size.height <= 2 * this.lineHeight;\n\t var screenLines = this.session.getScreenLength();\n\t var maxHeight = screenLines * this.lineHeight;\n\t\n\t var longestLine = this.$getLongestLine();\n\t \n\t var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n\t size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\t\n\t var hScrollChanged = this.$horizScroll !== horizScroll;\n\t if (hScrollChanged) {\n\t this.$horizScroll = horizScroll;\n\t this.scrollBarH.setVisible(horizScroll);\n\t }\n\t var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n\t if (this.$maxLines && this.lineHeight > 1)\n\t this.$autosize();\n\t\n\t var offset = this.scrollTop % this.lineHeight;\n\t var minHeight = size.scrollerHeight + this.lineHeight;\n\t \n\t var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n\t ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n\t : 0;\n\t maxHeight += scrollPastEnd;\n\t \n\t var sm = this.scrollMargin;\n\t this.session.setScrollTop(Math.max(-sm.top,\n\t Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\t\n\t this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n\t longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n\t \n\t var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n\t size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n\t var vScrollChanged = vScrollBefore !== vScroll;\n\t if (vScrollChanged) {\n\t this.$vScroll = vScroll;\n\t this.scrollBarV.setVisible(vScroll);\n\t }\n\t\n\t var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n\t var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n\t var lastRow = firstRow + lineCount;\n\t var firstRowScreen, firstRowHeight;\n\t var lineHeight = this.lineHeight;\n\t firstRow = session.screenToDocumentRow(firstRow, 0);\n\t var foldLine = session.getFoldLine(firstRow);\n\t if (foldLine) {\n\t firstRow = foldLine.start.row;\n\t }\n\t\n\t firstRowScreen = session.documentToScreenRow(firstRow, 0);\n\t firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\t\n\t lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n\t minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n\t firstRowHeight;\n\t\n\t offset = this.scrollTop - firstRowScreen * lineHeight;\n\t\n\t var changes = 0;\n\t if (this.layerConfig.width != longestLine) \n\t changes = this.CHANGE_H_SCROLL;\n\t if (hScrollChanged || vScrollChanged) {\n\t changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n\t this._signal(\"scrollbarVisibilityChanged\");\n\t if (vScrollChanged)\n\t longestLine = this.$getLongestLine();\n\t }\n\t \n\t this.layerConfig = {\n\t width : longestLine,\n\t padding : this.$padding,\n\t firstRow : firstRow,\n\t firstRowScreen: firstRowScreen,\n\t lastRow : lastRow,\n\t lineHeight : lineHeight,\n\t characterWidth : this.characterWidth,\n\t minHeight : minHeight,\n\t maxHeight : maxHeight,\n\t offset : offset,\n\t gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)),\n\t height : this.$size.scrollerHeight\n\t };\n\t\n\t return changes;\n\t };\n\t\n\t this.$updateLines = function() {\n\t var firstRow = this.$changedLines.firstRow;\n\t var lastRow = this.$changedLines.lastRow;\n\t this.$changedLines = null;\n\t\n\t var layerConfig = this.layerConfig;\n\t\n\t if (firstRow > layerConfig.lastRow + 1) { return; }\n\t if (lastRow < layerConfig.firstRow) { return; }\n\t if (lastRow === Infinity) {\n\t if (this.$showGutter)\n\t this.$gutterLayer.update(layerConfig);\n\t this.$textLayer.update(layerConfig);\n\t return;\n\t }\n\t this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n\t return true;\n\t };\n\t\n\t this.$getLongestLine = function() {\n\t var charCount = this.session.getScreenWidth();\n\t if (this.showInvisibles && !this.session.$useWrapMode)\n\t charCount += 1;\n\t\n\t return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n\t };\n\t this.updateFrontMarkers = function() {\n\t this.$markerFront.setMarkers(this.session.getMarkers(true));\n\t this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n\t };\n\t this.updateBackMarkers = function() {\n\t this.$markerBack.setMarkers(this.session.getMarkers());\n\t this.$loop.schedule(this.CHANGE_MARKER_BACK);\n\t };\n\t this.addGutterDecoration = function(row, className){\n\t this.$gutterLayer.addGutterDecoration(row, className);\n\t };\n\t this.removeGutterDecoration = function(row, className){\n\t this.$gutterLayer.removeGutterDecoration(row, className);\n\t };\n\t this.updateBreakpoints = function(rows) {\n\t this.$loop.schedule(this.CHANGE_GUTTER);\n\t };\n\t this.setAnnotations = function(annotations) {\n\t this.$gutterLayer.setAnnotations(annotations);\n\t this.$loop.schedule(this.CHANGE_GUTTER);\n\t };\n\t this.updateCursor = function() {\n\t this.$loop.schedule(this.CHANGE_CURSOR);\n\t };\n\t this.hideCursor = function() {\n\t this.$cursorLayer.hideCursor();\n\t };\n\t this.showCursor = function() {\n\t this.$cursorLayer.showCursor();\n\t };\n\t\n\t this.scrollSelectionIntoView = function(anchor, lead, offset) {\n\t this.scrollCursorIntoView(anchor, offset);\n\t this.scrollCursorIntoView(lead, offset);\n\t };\n\t this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n\t if (this.$size.scrollerHeight === 0)\n\t return;\n\t\n\t var pos = this.$cursorLayer.getPixelPosition(cursor);\n\t\n\t var left = pos.left;\n\t var top = pos.top;\n\t \n\t var topMargin = $viewMargin && $viewMargin.top || 0;\n\t var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n\t \n\t var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n\t \n\t if (scrollTop + topMargin > top) {\n\t if (offset && scrollTop + topMargin > top + this.lineHeight)\n\t top -= offset * this.$size.scrollerHeight;\n\t if (top === 0)\n\t top = -this.scrollMargin.top;\n\t this.session.setScrollTop(top);\n\t } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n\t if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n\t top += offset * this.$size.scrollerHeight;\n\t this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n\t }\n\t\n\t var scrollLeft = this.scrollLeft;\n\t\n\t if (scrollLeft > left) {\n\t if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n\t left = -this.scrollMargin.left;\n\t this.session.setScrollLeft(left);\n\t } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n\t this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n\t } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n\t this.session.setScrollLeft(0);\n\t }\n\t };\n\t this.getScrollTop = function() {\n\t return this.session.getScrollTop();\n\t };\n\t this.getScrollLeft = function() {\n\t return this.session.getScrollLeft();\n\t };\n\t this.getScrollTopRow = function() {\n\t return this.scrollTop / this.lineHeight;\n\t };\n\t this.getScrollBottomRow = function() {\n\t return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n\t };\n\t this.scrollToRow = function(row) {\n\t this.session.setScrollTop(row * this.lineHeight);\n\t };\n\t\n\t this.alignCursor = function(cursor, alignment) {\n\t if (typeof cursor == \"number\")\n\t cursor = {row: cursor, column: 0};\n\t\n\t var pos = this.$cursorLayer.getPixelPosition(cursor);\n\t var h = this.$size.scrollerHeight - this.lineHeight;\n\t var offset = pos.top - h * (alignment || 0);\n\t\n\t this.session.setScrollTop(offset);\n\t return offset;\n\t };\n\t\n\t this.STEPS = 8;\n\t this.$calcSteps = function(fromValue, toValue){\n\t var i = 0;\n\t var l = this.STEPS;\n\t var steps = [];\n\t\n\t var func = function(t, x_min, dx) {\n\t return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n\t };\n\t\n\t for (i = 0; i < l; ++i)\n\t steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\t\n\t return steps;\n\t };\n\t this.scrollToLine = function(line, center, animate, callback) {\n\t var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n\t var offset = pos.top;\n\t if (center)\n\t offset -= this.$size.scrollerHeight / 2;\n\t\n\t var initialScroll = this.scrollTop;\n\t this.session.setScrollTop(offset);\n\t if (animate !== false)\n\t this.animateScrolling(initialScroll, callback);\n\t };\n\t\n\t this.animateScrolling = function(fromValue, callback) {\n\t var toValue = this.scrollTop;\n\t if (!this.$animatedScroll)\n\t return;\n\t var _self = this;\n\t \n\t if (fromValue == toValue)\n\t return;\n\t \n\t if (this.$scrollAnimation) {\n\t var oldSteps = this.$scrollAnimation.steps;\n\t if (oldSteps.length) {\n\t fromValue = oldSteps[0];\n\t if (fromValue == toValue)\n\t return;\n\t }\n\t }\n\t \n\t var steps = _self.$calcSteps(fromValue, toValue);\n\t this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\t\n\t clearInterval(this.$timer);\n\t\n\t _self.session.setScrollTop(steps.shift());\n\t _self.session.$scrollTop = toValue;\n\t this.$timer = setInterval(function() {\n\t if (steps.length) {\n\t _self.session.setScrollTop(steps.shift());\n\t _self.session.$scrollTop = toValue;\n\t } else if (toValue != null) {\n\t _self.session.$scrollTop = -1;\n\t _self.session.setScrollTop(toValue);\n\t toValue = null;\n\t } else {\n\t _self.$timer = clearInterval(_self.$timer);\n\t _self.$scrollAnimation = null;\n\t callback && callback();\n\t }\n\t }, 10);\n\t };\n\t this.scrollToY = function(scrollTop) {\n\t if (this.scrollTop !== scrollTop) {\n\t this.$loop.schedule(this.CHANGE_SCROLL);\n\t this.scrollTop = scrollTop;\n\t }\n\t };\n\t this.scrollToX = function(scrollLeft) {\n\t if (this.scrollLeft !== scrollLeft)\n\t this.scrollLeft = scrollLeft;\n\t this.$loop.schedule(this.CHANGE_H_SCROLL);\n\t };\n\t this.scrollTo = function(x, y) {\n\t this.session.setScrollTop(y);\n\t this.session.setScrollLeft(y);\n\t };\n\t this.scrollBy = function(deltaX, deltaY) {\n\t deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n\t deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n\t };\n\t this.isScrollableBy = function(deltaX, deltaY) {\n\t if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n\t return true;\n\t if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n\t - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n\t return true;\n\t if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n\t return true;\n\t if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n\t - this.layerConfig.width < -1 + this.scrollMargin.right)\n\t return true;\n\t };\n\t\n\t this.pixelToScreenCoordinates = function(x, y) {\n\t var canvasPos = this.scroller.getBoundingClientRect();\n\t\n\t var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;\n\t var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n\t var col = Math.round(offset);\n\t\n\t return {row: row, column: col, side: offset - col > 0 ? 1 : -1};\n\t };\n\t\n\t this.screenToTextCoordinates = function(x, y) {\n\t var canvasPos = this.scroller.getBoundingClientRect();\n\t\n\t var col = Math.round(\n\t (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n\t );\n\t\n\t var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\t\n\t return this.session.screenToDocumentPosition(row, Math.max(col, 0));\n\t };\n\t this.textToScreenCoordinates = function(row, column) {\n\t var canvasPos = this.scroller.getBoundingClientRect();\n\t var pos = this.session.documentToScreenPosition(row, column);\n\t\n\t var x = this.$padding + Math.round(pos.column * this.characterWidth);\n\t var y = pos.row * this.lineHeight;\n\t\n\t return {\n\t pageX: canvasPos.left + x - this.scrollLeft,\n\t pageY: canvasPos.top + y - this.scrollTop\n\t };\n\t };\n\t this.visualizeFocus = function() {\n\t dom.addCssClass(this.container, \"ace_focus\");\n\t };\n\t this.visualizeBlur = function() {\n\t dom.removeCssClass(this.container, \"ace_focus\");\n\t };\n\t this.showComposition = function(position) {\n\t if (!this.$composition)\n\t this.$composition = {\n\t keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n\t cssText: this.textarea.style.cssText\n\t };\n\t\n\t this.$keepTextAreaAtCursor = true;\n\t dom.addCssClass(this.textarea, \"ace_composition\");\n\t this.textarea.style.cssText = \"\";\n\t this.$moveTextAreaToCursor();\n\t };\n\t this.setCompositionText = function(text) {\n\t this.$moveTextAreaToCursor();\n\t };\n\t this.hideComposition = function() {\n\t if (!this.$composition)\n\t return;\n\t\n\t dom.removeCssClass(this.textarea, \"ace_composition\");\n\t this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n\t this.textarea.style.cssText = this.$composition.cssText;\n\t this.$composition = null;\n\t };\n\t this.setTheme = function(theme, cb) {\n\t var _self = this;\n\t this.$themeId = theme;\n\t _self._dispatchEvent('themeChange',{theme:theme});\n\t\n\t if (!theme || typeof theme == \"string\") {\n\t var moduleName = theme || this.$options.theme.initialValue;\n\t config.loadModule([\"theme\", moduleName], afterLoad);\n\t } else {\n\t afterLoad(theme);\n\t }\n\t\n\t function afterLoad(module) {\n\t if (_self.$themeId != theme)\n\t return cb && cb();\n\t if (!module.cssClass)\n\t return;\n\t dom.importCssString(\n\t module.cssText,\n\t module.cssClass,\n\t _self.container.ownerDocument\n\t );\n\t\n\t if (_self.theme)\n\t dom.removeCssClass(_self.container, _self.theme.cssClass);\n\t\n\t var padding = \"padding\" in module ? module.padding \n\t : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n\t if (_self.$padding && padding != _self.$padding)\n\t _self.setPadding(padding);\n\t _self.$theme = module.cssClass;\n\t\n\t _self.theme = module;\n\t dom.addCssClass(_self.container, module.cssClass);\n\t dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n\t if (_self.$size) {\n\t _self.$size.width = 0;\n\t _self.$updateSizeAsync();\n\t }\n\t\n\t _self._dispatchEvent('themeLoaded', {theme:module});\n\t cb && cb();\n\t }\n\t };\n\t this.getTheme = function() {\n\t return this.$themeId;\n\t };\n\t this.setStyle = function(style, include) {\n\t dom.setCssClass(this.container, style, include !== false);\n\t };\n\t this.unsetStyle = function(style) {\n\t dom.removeCssClass(this.container, style);\n\t };\n\t \n\t this.setCursorStyle = function(style) {\n\t if (this.scroller.style.cursor != style)\n\t this.scroller.style.cursor = style;\n\t };\n\t this.setMouseCursor = function(cursorStyle) {\n\t this.scroller.style.cursor = cursorStyle;\n\t };\n\t this.destroy = function() {\n\t this.$textLayer.destroy();\n\t this.$cursorLayer.destroy();\n\t };\n\t\n\t}).call(VirtualRenderer.prototype);\n\t\n\t\n\tconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n\t animatedScroll: {initialValue: false},\n\t showInvisibles: {\n\t set: function(value) {\n\t if (this.$textLayer.setShowInvisibles(value))\n\t this.$loop.schedule(this.CHANGE_TEXT);\n\t },\n\t initialValue: false\n\t },\n\t showPrintMargin: {\n\t set: function() { this.$updatePrintMargin(); },\n\t initialValue: true\n\t },\n\t printMarginColumn: {\n\t set: function() { this.$updatePrintMargin(); },\n\t initialValue: 80\n\t },\n\t printMargin: {\n\t set: function(val) {\n\t if (typeof val == \"number\")\n\t this.$printMarginColumn = val;\n\t this.$showPrintMargin = !!val;\n\t this.$updatePrintMargin();\n\t },\n\t get: function() {\n\t return this.$showPrintMargin && this.$printMarginColumn; \n\t }\n\t },\n\t showGutter: {\n\t set: function(show){\n\t this.$gutter.style.display = show ? \"block\" : \"none\";\n\t this.$loop.schedule(this.CHANGE_FULL);\n\t this.onGutterResize();\n\t },\n\t initialValue: true\n\t },\n\t fadeFoldWidgets: {\n\t set: function(show) {\n\t dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n\t },\n\t initialValue: false\n\t },\n\t showFoldWidgets: {\n\t set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},\n\t initialValue: true\n\t },\n\t showLineNumbers: {\n\t set: function(show) {\n\t this.$gutterLayer.setShowLineNumbers(show);\n\t this.$loop.schedule(this.CHANGE_GUTTER);\n\t },\n\t initialValue: true\n\t },\n\t displayIndentGuides: {\n\t set: function(show) {\n\t if (this.$textLayer.setDisplayIndentGuides(show))\n\t this.$loop.schedule(this.CHANGE_TEXT);\n\t },\n\t initialValue: true\n\t },\n\t highlightGutterLine: {\n\t set: function(shouldHighlight) {\n\t if (!this.$gutterLineHighlight) {\n\t this.$gutterLineHighlight = dom.createElement(\"div\");\n\t this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n\t this.$gutter.appendChild(this.$gutterLineHighlight);\n\t return;\n\t }\n\t\n\t this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n\t if (this.$cursorLayer.$pixelPos)\n\t this.$updateGutterLineHighlight();\n\t },\n\t initialValue: false,\n\t value: true\n\t },\n\t hScrollBarAlwaysVisible: {\n\t set: function(val) {\n\t if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n\t this.$loop.schedule(this.CHANGE_SCROLL);\n\t },\n\t initialValue: false\n\t },\n\t vScrollBarAlwaysVisible: {\n\t set: function(val) {\n\t if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n\t this.$loop.schedule(this.CHANGE_SCROLL);\n\t },\n\t initialValue: false\n\t },\n\t fontSize: {\n\t set: function(size) {\n\t if (typeof size == \"number\")\n\t size = size + \"px\";\n\t this.container.style.fontSize = size;\n\t this.updateFontSize();\n\t },\n\t initialValue: 12\n\t },\n\t fontFamily: {\n\t set: function(name) {\n\t this.container.style.fontFamily = name;\n\t this.updateFontSize();\n\t }\n\t },\n\t maxLines: {\n\t set: function(val) {\n\t this.updateFull();\n\t }\n\t },\n\t minLines: {\n\t set: function(val) {\n\t this.updateFull();\n\t }\n\t },\n\t scrollPastEnd: {\n\t set: function(val) {\n\t val = +val || 0;\n\t if (this.$scrollPastEnd == val)\n\t return;\n\t this.$scrollPastEnd = val;\n\t this.$loop.schedule(this.CHANGE_SCROLL);\n\t },\n\t initialValue: 0,\n\t handlesSet: true\n\t },\n\t fixedWidthGutter: {\n\t set: function(val) {\n\t this.$gutterLayer.$fixedWidth = !!val;\n\t this.$loop.schedule(this.CHANGE_GUTTER);\n\t }\n\t },\n\t theme: {\n\t set: function(val) { this.setTheme(val) },\n\t get: function() { return this.$themeId || this.theme; },\n\t initialValue: \"./theme/textmate\",\n\t handlesSet: true\n\t }\n\t});\n\t\n\texports.VirtualRenderer = VirtualRenderer;\n\t});\n\t\n\tace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../lib/oop\");\n\tvar net = acequire(\"../lib/net\");\n\tvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\tvar config = acequire(\"../config\");\n\t\n\tvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) {\n\t this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n\t this.changeListener = this.changeListener.bind(this);\n\t this.onMessage = this.onMessage.bind(this);\n\t if (acequire.nameToUrl && !acequire.toUrl)\n\t acequire.toUrl = acequire.nameToUrl;\n\t \n\t if (config.get(\"packaged\") || !acequire.toUrl) {\n\t workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\")\n\t } else {\n\t var normalizePath = this.$normalizePath;\n\t workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\t\n\t var tlns = {};\n\t topLevelNamespaces.forEach(function(ns) {\n\t tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n\t });\n\t }\n\t\n\t try {\n\t var workerSrc = mod.src;\n\t var Blob = __webpack_require__(77);\n\t var blob = new Blob([ workerSrc ], { type: 'application/javascript' });\n\t var blobUrl = (window.URL || window.webkitURL).createObjectURL(blob);\n\t\n\t this.$worker = new Worker(blobUrl);\n\t\n\t } catch(e) {\n\t if (e instanceof window.DOMException) {\n\t var blob = this.$workerBlob(workerUrl);\n\t var URL = window.URL || window.webkitURL;\n\t var blobURL = URL.createObjectURL(blob);\n\t\n\t this.$worker = new Worker(blobURL);\n\t URL.revokeObjectURL(blobURL);\n\t } else {\n\t throw e;\n\t }\n\t }\n\t this.$worker.postMessage({\n\t init : true,\n\t tlns : tlns,\n\t module : mod.id,\n\t classname : classname\n\t });\n\t\n\t this.callbackId = 1;\n\t this.callbacks = {};\n\t\n\t this.$worker.onmessage = this.onMessage;\n\t};\n\t\n\t(function(){\n\t\n\t oop.implement(this, EventEmitter);\n\t\n\t this.onMessage = function(e) {\n\t var msg = e.data;\n\t switch(msg.type) {\n\t case \"event\":\n\t this._signal(msg.name, {data: msg.data});\n\t break;\n\t case \"call\":\n\t var callback = this.callbacks[msg.id];\n\t if (callback) {\n\t callback(msg.data);\n\t delete this.callbacks[msg.id];\n\t }\n\t break;\n\t case \"error\":\n\t this.reportError(msg.data);\n\t break;\n\t case \"log\":\n\t window.console && console.log && console.log.apply(console, msg.data);\n\t break;\n\t }\n\t };\n\t \n\t this.reportError = function(err) {\n\t window.console && console.error && console.error(err);\n\t };\n\t\n\t this.$normalizePath = function(path) {\n\t return net.qualifyURL(path);\n\t };\n\t\n\t this.terminate = function() {\n\t this._signal(\"terminate\", {});\n\t this.deltaQueue = null;\n\t this.$worker.terminate();\n\t this.$worker = null;\n\t if (this.$doc)\n\t this.$doc.off(\"change\", this.changeListener);\n\t this.$doc = null;\n\t };\n\t\n\t this.send = function(cmd, args) {\n\t this.$worker.postMessage({command: cmd, args: args});\n\t };\n\t\n\t this.call = function(cmd, args, callback) {\n\t if (callback) {\n\t var id = this.callbackId++;\n\t this.callbacks[id] = callback;\n\t args.push(id);\n\t }\n\t this.send(cmd, args);\n\t };\n\t\n\t this.emit = function(event, data) {\n\t try {\n\t this.$worker.postMessage({event: event, data: {data: data.data}});\n\t }\n\t catch(ex) {\n\t console.error(ex.stack);\n\t }\n\t };\n\t\n\t this.attachToDocument = function(doc) {\n\t if(this.$doc)\n\t this.terminate();\n\t\n\t this.$doc = doc;\n\t this.call(\"setValue\", [doc.getValue()]);\n\t doc.on(\"change\", this.changeListener);\n\t };\n\t\n\t this.changeListener = function(delta) {\n\t if (!this.deltaQueue) {\n\t this.deltaQueue = [];\n\t setTimeout(this.$sendDeltaQueue, 0);\n\t }\n\t if (delta.action == \"insert\")\n\t this.deltaQueue.push(delta.start, delta.lines);\n\t else\n\t this.deltaQueue.push(delta.start, delta.end);\n\t };\n\t\n\t this.$sendDeltaQueue = function() {\n\t var q = this.deltaQueue;\n\t if (!q) return;\n\t this.deltaQueue = null;\n\t if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n\t this.call(\"setValue\", [this.$doc.getValue()]);\n\t } else\n\t this.emit(\"change\", {data: q});\n\t };\n\t\n\t this.$workerBlob = function(workerUrl) {\n\t var script = \"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n\t try {\n\t return new Blob([script], {\"type\": \"application/javascript\"});\n\t } catch (e) { // Backwards-compatibility\n\t var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n\t var blobBuilder = new BlobBuilder();\n\t blobBuilder.append(script);\n\t return blobBuilder.getBlob(\"application/javascript\");\n\t }\n\t };\n\t\n\t}).call(WorkerClient.prototype);\n\t\n\t\n\tvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n\t this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n\t this.changeListener = this.changeListener.bind(this);\n\t this.callbackId = 1;\n\t this.callbacks = {};\n\t this.messageBuffer = [];\n\t\n\t var main = null;\n\t var emitSync = false;\n\t var sender = Object.create(EventEmitter);\n\t var _self = this;\n\t\n\t this.$worker = {};\n\t this.$worker.terminate = function() {};\n\t this.$worker.postMessage = function(e) {\n\t _self.messageBuffer.push(e);\n\t if (main) {\n\t if (emitSync)\n\t setTimeout(processNext);\n\t else\n\t processNext();\n\t }\n\t };\n\t this.setEmitSync = function(val) { emitSync = val };\n\t\n\t var processNext = function() {\n\t var msg = _self.messageBuffer.shift();\n\t if (msg.command)\n\t main[msg.command].apply(main, msg.args);\n\t else if (msg.event)\n\t sender._signal(msg.event, msg.data);\n\t };\n\t\n\t sender.postMessage = function(msg) {\n\t _self.onMessage({data: msg});\n\t };\n\t sender.callback = function(data, callbackId) {\n\t this.postMessage({type: \"call\", id: callbackId, data: data});\n\t };\n\t sender.emit = function(name, data) {\n\t this.postMessage({type: \"event\", name: name, data: data});\n\t };\n\t\n\t config.loadModule([\"worker\", mod], function(Main) {\n\t main = new Main[classname](sender);\n\t while (_self.messageBuffer.length)\n\t processNext();\n\t });\n\t};\n\t\n\tUIWorkerClient.prototype = WorkerClient.prototype;\n\t\n\texports.UIWorkerClient = UIWorkerClient;\n\texports.WorkerClient = WorkerClient;\n\t\n\t});\n\t\n\tace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"./range\").Range;\n\tvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\tvar oop = acequire(\"./lib/oop\");\n\t\n\tvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n\t var _self = this;\n\t this.length = length;\n\t this.session = session;\n\t this.doc = session.getDocument();\n\t this.mainClass = mainClass;\n\t this.othersClass = othersClass;\n\t this.$onUpdate = this.onUpdate.bind(this);\n\t this.doc.on(\"change\", this.$onUpdate);\n\t this.$others = others;\n\t \n\t this.$onCursorChange = function() {\n\t setTimeout(function() {\n\t _self.onCursorChange();\n\t });\n\t };\n\t \n\t this.$pos = pos;\n\t var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n\t this.$undoStackDepth = undoStack.length;\n\t this.setup();\n\t\n\t session.selection.on(\"changeCursor\", this.$onCursorChange);\n\t};\n\t\n\t(function() {\n\t\n\t oop.implement(this, EventEmitter);\n\t this.setup = function() {\n\t var _self = this;\n\t var doc = this.doc;\n\t var session = this.session;\n\t \n\t this.selectionBefore = session.selection.toJSON();\n\t if (session.selection.inMultiSelectMode)\n\t session.selection.toSingleRange();\n\t\n\t this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n\t var pos = this.pos;\n\t pos.$insertRight = true;\n\t pos.detach();\n\t pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n\t this.others = [];\n\t this.$others.forEach(function(other) {\n\t var anchor = doc.createAnchor(other.row, other.column);\n\t anchor.$insertRight = true;\n\t anchor.detach();\n\t _self.others.push(anchor);\n\t });\n\t session.setUndoSelect(false);\n\t };\n\t this.showOtherMarkers = function() {\n\t if (this.othersActive) return;\n\t var session = this.session;\n\t var _self = this;\n\t this.othersActive = true;\n\t this.others.forEach(function(anchor) {\n\t anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n\t });\n\t };\n\t this.hideOtherMarkers = function() {\n\t if (!this.othersActive) return;\n\t this.othersActive = false;\n\t for (var i = 0; i < this.others.length; i++) {\n\t this.session.removeMarker(this.others[i].markerId);\n\t }\n\t };\n\t this.onUpdate = function(delta) {\n\t if (this.$updating)\n\t return this.updateAnchors(delta);\n\t \n\t var range = delta;\n\t if (range.start.row !== range.end.row) return;\n\t if (range.start.row !== this.pos.row) return;\n\t this.$updating = true;\n\t var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n\t var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n\t var distanceFromStart = range.start.column - this.pos.column;\n\t \n\t this.updateAnchors(delta);\n\t \n\t if (inMainRange)\n\t this.length += lengthDiff;\n\t\n\t if (inMainRange && !this.session.$fromUndo) {\n\t if (delta.action === 'insert') {\n\t for (var i = this.others.length - 1; i >= 0; i--) {\n\t var otherPos = this.others[i];\n\t var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n\t this.doc.insertMergedLines(newPos, delta.lines);\n\t }\n\t } else if (delta.action === 'remove') {\n\t for (var i = this.others.length - 1; i >= 0; i--) {\n\t var otherPos = this.others[i];\n\t var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n\t this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n\t }\n\t }\n\t }\n\t \n\t this.$updating = false;\n\t this.updateMarkers();\n\t };\n\t \n\t this.updateAnchors = function(delta) {\n\t this.pos.onChange(delta);\n\t for (var i = this.others.length; i--;)\n\t this.others[i].onChange(delta);\n\t this.updateMarkers();\n\t };\n\t \n\t this.updateMarkers = function() {\n\t if (this.$updating)\n\t return;\n\t var _self = this;\n\t var session = this.session;\n\t var updateMarker = function(pos, className) {\n\t session.removeMarker(pos.markerId);\n\t pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n\t };\n\t updateMarker(this.pos, this.mainClass);\n\t for (var i = this.others.length; i--;)\n\t updateMarker(this.others[i], this.othersClass);\n\t };\n\t\n\t this.onCursorChange = function(event) {\n\t if (this.$updating || !this.session) return;\n\t var pos = this.session.selection.getCursor();\n\t if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n\t this.showOtherMarkers();\n\t this._emit(\"cursorEnter\", event);\n\t } else {\n\t this.hideOtherMarkers();\n\t this._emit(\"cursorLeave\", event);\n\t }\n\t }; \n\t this.detach = function() {\n\t this.session.removeMarker(this.pos && this.pos.markerId);\n\t this.hideOtherMarkers();\n\t this.doc.removeEventListener(\"change\", this.$onUpdate);\n\t this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n\t this.session.setUndoSelect(true);\n\t this.session = null;\n\t };\n\t this.cancel = function() {\n\t if (this.$undoStackDepth === -1)\n\t return;\n\t var undoManager = this.session.getUndoManager();\n\t var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n\t for (var i = 0; i < undosRequired; i++) {\n\t undoManager.undo(true);\n\t }\n\t if (this.selectionBefore)\n\t this.session.selection.fromJSON(this.selectionBefore);\n\t };\n\t}).call(PlaceHolder.prototype);\n\t\n\t\n\texports.PlaceHolder = PlaceHolder;\n\t});\n\t\n\tace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\t\n\tvar event = acequire(\"../lib/event\");\n\tvar useragent = acequire(\"../lib/useragent\");\n\tfunction isSamePoint(p1, p2) {\n\t return p1.row == p2.row && p1.column == p2.column;\n\t}\n\t\n\tfunction onMouseDown(e) {\n\t var ev = e.domEvent;\n\t var alt = ev.altKey;\n\t var shift = ev.shiftKey;\n\t var ctrl = ev.ctrlKey;\n\t var accel = e.getAccelKey();\n\t var button = e.getButton();\n\t \n\t if (ctrl && useragent.isMac)\n\t button = ev.button;\n\t\n\t if (e.editor.inMultiSelectMode && button == 2) {\n\t e.editor.textInput.onContextMenu(e.domEvent);\n\t return;\n\t }\n\t \n\t if (!ctrl && !alt && !accel) {\n\t if (button === 0 && e.editor.inMultiSelectMode)\n\t e.editor.exitMultiSelectMode();\n\t return;\n\t }\n\t \n\t if (button !== 0)\n\t return;\n\t\n\t var editor = e.editor;\n\t var selection = editor.selection;\n\t var isMultiSelect = editor.inMultiSelectMode;\n\t var pos = e.getDocumentPosition();\n\t var cursor = selection.getCursor();\n\t var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\t\n\t var mouseX = e.x, mouseY = e.y;\n\t var onMouseSelection = function(e) {\n\t mouseX = e.clientX;\n\t mouseY = e.clientY;\n\t };\n\t \n\t var session = editor.session;\n\t var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n\t var screenCursor = screenAnchor;\n\t \n\t var selectionMode;\n\t if (editor.$mouseHandler.$enableJumpToDef) {\n\t if (ctrl && alt || accel && alt)\n\t selectionMode = shift ? \"block\" : \"add\";\n\t else if (alt && editor.$blockSelectEnabled)\n\t selectionMode = \"block\";\n\t } else {\n\t if (accel && !alt) {\n\t selectionMode = \"add\";\n\t if (!isMultiSelect && shift)\n\t return;\n\t } else if (alt && editor.$blockSelectEnabled) {\n\t selectionMode = \"block\";\n\t }\n\t }\n\t \n\t if (selectionMode && useragent.isMac && ev.ctrlKey) {\n\t editor.$mouseHandler.cancelContextMenu();\n\t }\n\t\n\t if (selectionMode == \"add\") {\n\t if (!isMultiSelect && inSelection)\n\t return; // dragging\n\t\n\t if (!isMultiSelect) {\n\t var range = selection.toOrientedRange();\n\t editor.addSelectionMarker(range);\n\t }\n\t\n\t var oldRange = selection.rangeList.rangeAtPoint(pos);\n\t \n\t \n\t editor.$blockScrolling++;\n\t editor.inVirtualSelectionMode = true;\n\t \n\t if (shift) {\n\t oldRange = null;\n\t range = selection.ranges[0] || range;\n\t editor.removeSelectionMarker(range);\n\t }\n\t editor.once(\"mouseup\", function() {\n\t var tmpSel = selection.toOrientedRange();\n\t\n\t if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n\t selection.substractPoint(tmpSel.cursor);\n\t else {\n\t if (shift) {\n\t selection.substractPoint(range.cursor);\n\t } else if (range) {\n\t editor.removeSelectionMarker(range);\n\t selection.addRange(range);\n\t }\n\t selection.addRange(tmpSel);\n\t }\n\t editor.$blockScrolling--;\n\t editor.inVirtualSelectionMode = false;\n\t });\n\t\n\t } else if (selectionMode == \"block\") {\n\t e.stop();\n\t editor.inVirtualSelectionMode = true; \n\t var initialRange;\n\t var rectSel = [];\n\t var blockSelect = function() {\n\t var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n\t var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);\n\t\n\t if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n\t return;\n\t screenCursor = newCursor;\n\t \n\t editor.$blockScrolling++;\n\t editor.selection.moveToPosition(cursor);\n\t editor.renderer.scrollCursorIntoView();\n\t\n\t editor.removeSelectionMarkers(rectSel);\n\t rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n\t if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n\t rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n\t rectSel.forEach(editor.addSelectionMarker, editor);\n\t editor.updateSelectionMarkers();\n\t editor.$blockScrolling--;\n\t };\n\t editor.$blockScrolling++;\n\t if (isMultiSelect && !accel) {\n\t selection.toSingleRange();\n\t } else if (!isMultiSelect && accel) {\n\t initialRange = selection.toOrientedRange();\n\t editor.addSelectionMarker(initialRange);\n\t }\n\t \n\t if (shift)\n\t screenAnchor = session.documentToScreenPosition(selection.lead); \n\t else\n\t selection.moveToPosition(pos);\n\t editor.$blockScrolling--;\n\t \n\t screenCursor = {row: -1, column: -1};\n\t\n\t var onMouseSelectionEnd = function(e) {\n\t clearInterval(timerId);\n\t editor.removeSelectionMarkers(rectSel);\n\t if (!rectSel.length)\n\t rectSel = [selection.toOrientedRange()];\n\t editor.$blockScrolling++;\n\t if (initialRange) {\n\t editor.removeSelectionMarker(initialRange);\n\t selection.toSingleRange(initialRange);\n\t }\n\t for (var i = 0; i < rectSel.length; i++)\n\t selection.addRange(rectSel[i]);\n\t editor.inVirtualSelectionMode = false;\n\t editor.$mouseHandler.$clickSelection = null;\n\t editor.$blockScrolling--;\n\t };\n\t\n\t var onSelectionInterval = blockSelect;\n\t\n\t event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n\t var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\t\n\t return e.preventDefault();\n\t }\n\t}\n\t\n\t\n\texports.onMouseDown = onMouseDown;\n\t\n\t});\n\t\n\tace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(acequire, exports, module) {\n\texports.defaultCommands = [{\n\t name: \"addCursorAbove\",\n\t exec: function(editor) { editor.selectMoreLines(-1); },\n\t bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"addCursorBelow\",\n\t exec: function(editor) { editor.selectMoreLines(1); },\n\t bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"addCursorAboveSkipCurrent\",\n\t exec: function(editor) { editor.selectMoreLines(-1, true); },\n\t bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"addCursorBelowSkipCurrent\",\n\t exec: function(editor) { editor.selectMoreLines(1, true); },\n\t bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectMoreBefore\",\n\t exec: function(editor) { editor.selectMore(-1); },\n\t bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectMoreAfter\",\n\t exec: function(editor) { editor.selectMore(1); },\n\t bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectNextBefore\",\n\t exec: function(editor) { editor.selectMore(-1, true); },\n\t bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"selectNextAfter\",\n\t exec: function(editor) { editor.selectMore(1, true); },\n\t bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}, {\n\t name: \"splitIntoLines\",\n\t exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n\t bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n\t readOnly: true\n\t}, {\n\t name: \"alignCursors\",\n\t exec: function(editor) { editor.alignCursors(); },\n\t bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n\t scrollIntoView: \"cursor\"\n\t}, {\n\t name: \"findAll\",\n\t exec: function(editor) { editor.findAll(); },\n\t bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n\t scrollIntoView: \"cursor\",\n\t readOnly: true\n\t}];\n\texports.multiSelectCommands = [{\n\t name: \"singleSelection\",\n\t bindKey: \"esc\",\n\t exec: function(editor) { editor.exitMultiSelectMode(); },\n\t scrollIntoView: \"cursor\",\n\t readOnly: true,\n\t isAvailable: function(editor) {return editor && editor.inMultiSelectMode}\n\t}];\n\t\n\tvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\n\texports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\t\n\t});\n\t\n\tace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\t\n\tvar RangeList = acequire(\"./range_list\").RangeList;\n\tvar Range = acequire(\"./range\").Range;\n\tvar Selection = acequire(\"./selection\").Selection;\n\tvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\n\tvar event = acequire(\"./lib/event\");\n\tvar lang = acequire(\"./lib/lang\");\n\tvar commands = acequire(\"./commands/multi_select_commands\");\n\texports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\n\tvar Search = acequire(\"./search\").Search;\n\tvar search = new Search();\n\t\n\tfunction find(session, needle, dir) {\n\t search.$options.wrap = true;\n\t search.$options.needle = needle;\n\t search.$options.backwards = dir == -1;\n\t return search.find(session);\n\t}\n\tvar EditSession = acequire(\"./edit_session\").EditSession;\n\t(function() {\n\t this.getSelectionMarkers = function() {\n\t return this.$selectionMarkers;\n\t };\n\t}).call(EditSession.prototype);\n\t(function() {\n\t this.ranges = null;\n\t this.rangeList = null;\n\t this.addRange = function(range, $blockChangeEvents) {\n\t if (!range)\n\t return;\n\t\n\t if (!this.inMultiSelectMode && this.rangeCount === 0) {\n\t var oldRange = this.toOrientedRange();\n\t this.rangeList.add(oldRange);\n\t this.rangeList.add(range);\n\t if (this.rangeList.ranges.length != 2) {\n\t this.rangeList.removeAll();\n\t return $blockChangeEvents || this.fromOrientedRange(range);\n\t }\n\t this.rangeList.removeAll();\n\t this.rangeList.add(oldRange);\n\t this.$onAddRange(oldRange);\n\t }\n\t\n\t if (!range.cursor)\n\t range.cursor = range.end;\n\t\n\t var removed = this.rangeList.add(range);\n\t\n\t this.$onAddRange(range);\n\t\n\t if (removed.length)\n\t this.$onRemoveRange(removed);\n\t\n\t if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n\t this._signal(\"multiSelect\");\n\t this.inMultiSelectMode = true;\n\t this.session.$undoSelect = false;\n\t this.rangeList.attach(this.session);\n\t }\n\t\n\t return $blockChangeEvents || this.fromOrientedRange(range);\n\t };\n\t\n\t this.toSingleRange = function(range) {\n\t range = range || this.ranges[0];\n\t var removed = this.rangeList.removeAll();\n\t if (removed.length)\n\t this.$onRemoveRange(removed);\n\t\n\t range && this.fromOrientedRange(range);\n\t };\n\t this.substractPoint = function(pos) {\n\t var removed = this.rangeList.substractPoint(pos);\n\t if (removed) {\n\t this.$onRemoveRange(removed);\n\t return removed[0];\n\t }\n\t };\n\t this.mergeOverlappingRanges = function() {\n\t var removed = this.rangeList.merge();\n\t if (removed.length)\n\t this.$onRemoveRange(removed);\n\t else if(this.ranges[0])\n\t this.fromOrientedRange(this.ranges[0]);\n\t };\n\t\n\t this.$onAddRange = function(range) {\n\t this.rangeCount = this.rangeList.ranges.length;\n\t this.ranges.unshift(range);\n\t this._signal(\"addRange\", {range: range});\n\t };\n\t\n\t this.$onRemoveRange = function(removed) {\n\t this.rangeCount = this.rangeList.ranges.length;\n\t if (this.rangeCount == 1 && this.inMultiSelectMode) {\n\t var lastRange = this.rangeList.ranges.pop();\n\t removed.push(lastRange);\n\t this.rangeCount = 0;\n\t }\n\t\n\t for (var i = removed.length; i--; ) {\n\t var index = this.ranges.indexOf(removed[i]);\n\t this.ranges.splice(index, 1);\n\t }\n\t\n\t this._signal(\"removeRange\", {ranges: removed});\n\t\n\t if (this.rangeCount === 0 && this.inMultiSelectMode) {\n\t this.inMultiSelectMode = false;\n\t this._signal(\"singleSelect\");\n\t this.session.$undoSelect = true;\n\t this.rangeList.detach(this.session);\n\t }\n\t\n\t lastRange = lastRange || this.ranges[0];\n\t if (lastRange && !lastRange.isEqual(this.getRange()))\n\t this.fromOrientedRange(lastRange);\n\t };\n\t this.$initRangeList = function() {\n\t if (this.rangeList)\n\t return;\n\t\n\t this.rangeList = new RangeList();\n\t this.ranges = [];\n\t this.rangeCount = 0;\n\t };\n\t this.getAllRanges = function() {\n\t return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n\t };\n\t\n\t this.splitIntoLines = function () {\n\t if (this.rangeCount > 1) {\n\t var ranges = this.rangeList.ranges;\n\t var lastRange = ranges[ranges.length - 1];\n\t var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\t\n\t this.toSingleRange();\n\t this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n\t } else {\n\t var range = this.getRange();\n\t var isBackwards = this.isBackwards();\n\t var startRow = range.start.row;\n\t var endRow = range.end.row;\n\t if (startRow == endRow) {\n\t if (isBackwards)\n\t var start = range.end, end = range.start;\n\t else\n\t var start = range.start, end = range.end;\n\t \n\t this.addRange(Range.fromPoints(end, end));\n\t this.addRange(Range.fromPoints(start, start));\n\t return;\n\t }\n\t\n\t var rectSel = [];\n\t var r = this.getLineRange(startRow, true);\n\t r.start.column = range.start.column;\n\t rectSel.push(r);\n\t\n\t for (var i = startRow + 1; i < endRow; i++)\n\t rectSel.push(this.getLineRange(i, true));\n\t\n\t r = this.getLineRange(endRow, true);\n\t r.end.column = range.end.column;\n\t rectSel.push(r);\n\t\n\t rectSel.forEach(this.addRange, this);\n\t }\n\t };\n\t this.toggleBlockSelection = function () {\n\t if (this.rangeCount > 1) {\n\t var ranges = this.rangeList.ranges;\n\t var lastRange = ranges[ranges.length - 1];\n\t var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\t\n\t this.toSingleRange();\n\t this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n\t } else {\n\t var cursor = this.session.documentToScreenPosition(this.selectionLead);\n\t var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\t\n\t var rectSel = this.rectangularRangeBlock(cursor, anchor);\n\t rectSel.forEach(this.addRange, this);\n\t }\n\t };\n\t this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n\t var rectSel = [];\n\t\n\t var xBackwards = screenCursor.column < screenAnchor.column;\n\t if (xBackwards) {\n\t var startColumn = screenCursor.column;\n\t var endColumn = screenAnchor.column;\n\t } else {\n\t var startColumn = screenAnchor.column;\n\t var endColumn = screenCursor.column;\n\t }\n\t\n\t var yBackwards = screenCursor.row < screenAnchor.row;\n\t if (yBackwards) {\n\t var startRow = screenCursor.row;\n\t var endRow = screenAnchor.row;\n\t } else {\n\t var startRow = screenAnchor.row;\n\t var endRow = screenCursor.row;\n\t }\n\t\n\t if (startColumn < 0)\n\t startColumn = 0;\n\t if (startRow < 0)\n\t startRow = 0;\n\t\n\t if (startRow == endRow)\n\t includeEmptyLines = true;\n\t\n\t for (var row = startRow; row <= endRow; row++) {\n\t var range = Range.fromPoints(\n\t this.session.screenToDocumentPosition(row, startColumn),\n\t this.session.screenToDocumentPosition(row, endColumn)\n\t );\n\t if (range.isEmpty()) {\n\t if (docEnd && isSamePoint(range.end, docEnd))\n\t break;\n\t var docEnd = range.end;\n\t }\n\t range.cursor = xBackwards ? range.start : range.end;\n\t rectSel.push(range);\n\t }\n\t\n\t if (yBackwards)\n\t rectSel.reverse();\n\t\n\t if (!includeEmptyLines) {\n\t var end = rectSel.length - 1;\n\t while (rectSel[end].isEmpty() && end > 0)\n\t end--;\n\t if (end > 0) {\n\t var start = 0;\n\t while (rectSel[start].isEmpty())\n\t start++;\n\t }\n\t for (var i = end; i >= start; i--) {\n\t if (rectSel[i].isEmpty())\n\t rectSel.splice(i, 1);\n\t }\n\t }\n\t\n\t return rectSel;\n\t };\n\t}).call(Selection.prototype);\n\tvar Editor = acequire(\"./editor\").Editor;\n\t(function() {\n\t this.updateSelectionMarkers = function() {\n\t this.renderer.updateCursor();\n\t this.renderer.updateBackMarkers();\n\t };\n\t this.addSelectionMarker = function(orientedRange) {\n\t if (!orientedRange.cursor)\n\t orientedRange.cursor = orientedRange.end;\n\t\n\t var style = this.getSelectionStyle();\n\t orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\t\n\t this.session.$selectionMarkers.push(orientedRange);\n\t this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n\t return orientedRange;\n\t };\n\t this.removeSelectionMarker = function(range) {\n\t if (!range.marker)\n\t return;\n\t this.session.removeMarker(range.marker);\n\t var index = this.session.$selectionMarkers.indexOf(range);\n\t if (index != -1)\n\t this.session.$selectionMarkers.splice(index, 1);\n\t this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n\t };\n\t\n\t this.removeSelectionMarkers = function(ranges) {\n\t var markerList = this.session.$selectionMarkers;\n\t for (var i = ranges.length; i--; ) {\n\t var range = ranges[i];\n\t if (!range.marker)\n\t continue;\n\t this.session.removeMarker(range.marker);\n\t var index = markerList.indexOf(range);\n\t if (index != -1)\n\t markerList.splice(index, 1);\n\t }\n\t this.session.selectionMarkerCount = markerList.length;\n\t };\n\t\n\t this.$onAddRange = function(e) {\n\t this.addSelectionMarker(e.range);\n\t this.renderer.updateCursor();\n\t this.renderer.updateBackMarkers();\n\t };\n\t\n\t this.$onRemoveRange = function(e) {\n\t this.removeSelectionMarkers(e.ranges);\n\t this.renderer.updateCursor();\n\t this.renderer.updateBackMarkers();\n\t };\n\t\n\t this.$onMultiSelect = function(e) {\n\t if (this.inMultiSelectMode)\n\t return;\n\t this.inMultiSelectMode = true;\n\t\n\t this.setStyle(\"ace_multiselect\");\n\t this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n\t this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\t\n\t this.renderer.updateCursor();\n\t this.renderer.updateBackMarkers();\n\t };\n\t\n\t this.$onSingleSelect = function(e) {\n\t if (this.session.multiSelect.inVirtualMode)\n\t return;\n\t this.inMultiSelectMode = false;\n\t\n\t this.unsetStyle(\"ace_multiselect\");\n\t this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\t\n\t this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\t this.renderer.updateCursor();\n\t this.renderer.updateBackMarkers();\n\t this._emit(\"changeSelection\");\n\t };\n\t\n\t this.$onMultiSelectExec = function(e) {\n\t var command = e.command;\n\t var editor = e.editor;\n\t if (!editor.multiSelect)\n\t return;\n\t if (!command.multiSelectAction) {\n\t var result = command.exec(editor, e.args || {});\n\t editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n\t editor.multiSelect.mergeOverlappingRanges();\n\t } else if (command.multiSelectAction == \"forEach\") {\n\t result = editor.forEachSelection(command, e.args);\n\t } else if (command.multiSelectAction == \"forEachLine\") {\n\t result = editor.forEachSelection(command, e.args, true);\n\t } else if (command.multiSelectAction == \"single\") {\n\t editor.exitMultiSelectMode();\n\t result = command.exec(editor, e.args || {});\n\t } else {\n\t result = command.multiSelectAction(editor, e.args || {});\n\t }\n\t return result;\n\t }; \n\t this.forEachSelection = function(cmd, args, options) {\n\t if (this.inVirtualSelectionMode)\n\t return;\n\t var keepOrder = options && options.keepOrder;\n\t var $byLines = options == true || options && options.$byLines\n\t var session = this.session;\n\t var selection = this.selection;\n\t var rangeList = selection.rangeList;\n\t var ranges = (keepOrder ? selection : rangeList).ranges;\n\t var result;\n\t \n\t if (!ranges.length)\n\t return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n\t \n\t var reg = selection._eventRegistry;\n\t selection._eventRegistry = {};\n\t\n\t var tmpSel = new Selection(session);\n\t this.inVirtualSelectionMode = true;\n\t for (var i = ranges.length; i--;) {\n\t if ($byLines) {\n\t while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n\t i--;\n\t }\n\t tmpSel.fromOrientedRange(ranges[i]);\n\t tmpSel.index = i;\n\t this.selection = session.selection = tmpSel;\n\t var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n\t if (!result && cmdResult !== undefined)\n\t result = cmdResult;\n\t tmpSel.toOrientedRange(ranges[i]);\n\t }\n\t tmpSel.detach();\n\t\n\t this.selection = session.selection = selection;\n\t this.inVirtualSelectionMode = false;\n\t selection._eventRegistry = reg;\n\t selection.mergeOverlappingRanges();\n\t \n\t var anim = this.renderer.$scrollAnimation;\n\t this.onCursorChange();\n\t this.onSelectionChange();\n\t if (anim && anim.from == anim.to)\n\t this.renderer.animateScrolling(anim.from);\n\t \n\t return result;\n\t };\n\t this.exitMultiSelectMode = function() {\n\t if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n\t return;\n\t this.multiSelect.toSingleRange();\n\t };\n\t\n\t this.getSelectedText = function() {\n\t var text = \"\";\n\t if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n\t var ranges = this.multiSelect.rangeList.ranges;\n\t var buf = [];\n\t for (var i = 0; i < ranges.length; i++) {\n\t buf.push(this.session.getTextRange(ranges[i]));\n\t }\n\t var nl = this.session.getDocument().getNewLineCharacter();\n\t text = buf.join(nl);\n\t if (text.length == (buf.length - 1) * nl.length)\n\t text = \"\";\n\t } else if (!this.selection.isEmpty()) {\n\t text = this.session.getTextRange(this.getSelectionRange());\n\t }\n\t return text;\n\t };\n\t \n\t this.$checkMultiselectChange = function(e, anchor) {\n\t if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n\t var range = this.multiSelect.ranges[0];\n\t if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n\t return;\n\t var pos = anchor == this.multiSelect.anchor\n\t ? range.cursor == range.start ? range.end : range.start\n\t : range.cursor;\n\t if (pos.row != anchor.row \n\t || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n\t this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n\t }\n\t };\n\t this.findAll = function(needle, options, additive) {\n\t options = options || {};\n\t options.needle = needle || options.needle;\n\t if (options.needle == undefined) {\n\t var range = this.selection.isEmpty()\n\t ? this.selection.getWordRange()\n\t : this.selection.getRange();\n\t options.needle = this.session.getTextRange(range);\n\t } \n\t this.$search.set(options);\n\t \n\t var ranges = this.$search.findAll(this.session);\n\t if (!ranges.length)\n\t return 0;\n\t\n\t this.$blockScrolling += 1;\n\t var selection = this.multiSelect;\n\t\n\t if (!additive)\n\t selection.toSingleRange(ranges[0]);\n\t\n\t for (var i = ranges.length; i--; )\n\t selection.addRange(ranges[i], true);\n\t if (range && selection.rangeList.rangeAtPoint(range.start))\n\t selection.addRange(range, true);\n\t \n\t this.$blockScrolling -= 1;\n\t\n\t return ranges.length;\n\t };\n\t this.selectMoreLines = function(dir, skip) {\n\t var range = this.selection.toOrientedRange();\n\t var isBackwards = range.cursor == range.end;\n\t\n\t var screenLead = this.session.documentToScreenPosition(range.cursor);\n\t if (this.selection.$desiredColumn)\n\t screenLead.column = this.selection.$desiredColumn;\n\t\n\t var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\t\n\t if (!range.isEmpty()) {\n\t var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n\t var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n\t } else {\n\t var anchor = lead;\n\t }\n\t\n\t if (isBackwards) {\n\t var newRange = Range.fromPoints(lead, anchor);\n\t newRange.cursor = newRange.start;\n\t } else {\n\t var newRange = Range.fromPoints(anchor, lead);\n\t newRange.cursor = newRange.end;\n\t }\n\t\n\t newRange.desiredColumn = screenLead.column;\n\t if (!this.selection.inMultiSelectMode) {\n\t this.selection.addRange(range);\n\t } else {\n\t if (skip)\n\t var toRemove = range.cursor;\n\t }\n\t\n\t this.selection.addRange(newRange);\n\t if (toRemove)\n\t this.selection.substractPoint(toRemove);\n\t };\n\t this.transposeSelections = function(dir) {\n\t var session = this.session;\n\t var sel = session.multiSelect;\n\t var all = sel.ranges;\n\t\n\t for (var i = all.length; i--; ) {\n\t var range = all[i];\n\t if (range.isEmpty()) {\n\t var tmp = session.getWordRange(range.start.row, range.start.column);\n\t range.start.row = tmp.start.row;\n\t range.start.column = tmp.start.column;\n\t range.end.row = tmp.end.row;\n\t range.end.column = tmp.end.column;\n\t }\n\t }\n\t sel.mergeOverlappingRanges();\n\t\n\t var words = [];\n\t for (var i = all.length; i--; ) {\n\t var range = all[i];\n\t words.unshift(session.getTextRange(range));\n\t }\n\t\n\t if (dir < 0)\n\t words.unshift(words.pop());\n\t else\n\t words.push(words.shift());\n\t\n\t for (var i = all.length; i--; ) {\n\t var range = all[i];\n\t var tmp = range.clone();\n\t session.replace(range, words[i]);\n\t range.start.row = tmp.start.row;\n\t range.start.column = tmp.start.column;\n\t }\n\t };\n\t this.selectMore = function(dir, skip, stopAtFirst) {\n\t var session = this.session;\n\t var sel = session.multiSelect;\n\t\n\t var range = sel.toOrientedRange();\n\t if (range.isEmpty()) {\n\t range = session.getWordRange(range.start.row, range.start.column);\n\t range.cursor = dir == -1 ? range.start : range.end;\n\t this.multiSelect.addRange(range);\n\t if (stopAtFirst)\n\t return;\n\t }\n\t var needle = session.getTextRange(range);\n\t\n\t var newRange = find(session, needle, dir);\n\t if (newRange) {\n\t newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n\t this.$blockScrolling += 1;\n\t this.session.unfold(newRange);\n\t this.multiSelect.addRange(newRange);\n\t this.$blockScrolling -= 1;\n\t this.renderer.scrollCursorIntoView(null, 0.5);\n\t }\n\t if (skip)\n\t this.multiSelect.substractPoint(range.cursor);\n\t };\n\t this.alignCursors = function() {\n\t var session = this.session;\n\t var sel = session.multiSelect;\n\t var ranges = sel.ranges;\n\t var row = -1;\n\t var sameRowRanges = ranges.filter(function(r) {\n\t if (r.cursor.row == row)\n\t return true;\n\t row = r.cursor.row;\n\t });\n\t \n\t if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n\t var range = this.selection.getRange();\n\t var fr = range.start.row, lr = range.end.row;\n\t var guessRange = fr == lr;\n\t if (guessRange) {\n\t var max = this.session.getLength();\n\t var line;\n\t do {\n\t line = this.session.getLine(lr);\n\t } while (/[=:]/.test(line) && ++lr < max);\n\t do {\n\t line = this.session.getLine(fr);\n\t } while (/[=:]/.test(line) && --fr > 0);\n\t \n\t if (fr < 0) fr = 0;\n\t if (lr >= max) lr = max - 1;\n\t }\n\t var lines = this.session.removeFullLines(fr, lr);\n\t lines = this.$reAlignText(lines, guessRange);\n\t this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n\t if (!guessRange) {\n\t range.start.column = 0;\n\t range.end.column = lines[lines.length - 1].length;\n\t }\n\t this.selection.setRange(range);\n\t } else {\n\t sameRowRanges.forEach(function(r) {\n\t sel.substractPoint(r.cursor);\n\t });\n\t\n\t var maxCol = 0;\n\t var minSpace = Infinity;\n\t var spaceOffsets = ranges.map(function(r) {\n\t var p = r.cursor;\n\t var line = session.getLine(p.row);\n\t var spaceOffset = line.substr(p.column).search(/\\S/g);\n\t if (spaceOffset == -1)\n\t spaceOffset = 0;\n\t\n\t if (p.column > maxCol)\n\t maxCol = p.column;\n\t if (spaceOffset < minSpace)\n\t minSpace = spaceOffset;\n\t return spaceOffset;\n\t });\n\t ranges.forEach(function(r, i) {\n\t var p = r.cursor;\n\t var l = maxCol - p.column;\n\t var d = spaceOffsets[i] - minSpace;\n\t if (l > d)\n\t session.insert(p, lang.stringRepeat(\" \", l - d));\n\t else\n\t session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\t\n\t r.start.column = r.end.column = maxCol;\n\t r.start.row = r.end.row = p.row;\n\t r.cursor = r.end;\n\t });\n\t sel.fromOrientedRange(ranges[0]);\n\t this.renderer.updateCursor();\n\t this.renderer.updateBackMarkers();\n\t }\n\t };\n\t\n\t this.$reAlignText = function(lines, forceLeft) {\n\t var isLeftAligned = true, isRightAligned = true;\n\t var startW, textW, endW;\n\t\n\t return lines.map(function(line) {\n\t var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n\t if (!m)\n\t return [line];\n\t\n\t if (startW == null) {\n\t startW = m[1].length;\n\t textW = m[2].length;\n\t endW = m[3].length;\n\t return m;\n\t }\n\t\n\t if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n\t isRightAligned = false;\n\t if (startW != m[1].length)\n\t isLeftAligned = false;\n\t\n\t if (startW > m[1].length)\n\t startW = m[1].length;\n\t if (textW < m[2].length)\n\t textW = m[2].length;\n\t if (endW > m[3].length)\n\t endW = m[3].length;\n\t\n\t return m;\n\t }).map(forceLeft ? alignLeft :\n\t isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\t\n\t function spaces(n) {\n\t return lang.stringRepeat(\" \", n);\n\t }\n\t\n\t function alignLeft(m) {\n\t return !m[2] ? m[0] : spaces(startW) + m[2]\n\t + spaces(textW - m[2].length + endW)\n\t + m[4].replace(/^([=:])\\s+/, \"$1 \");\n\t }\n\t function alignRight(m) {\n\t return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n\t + spaces(endW, \" \")\n\t + m[4].replace(/^([=:])\\s+/, \"$1 \");\n\t }\n\t function unAlign(m) {\n\t return !m[2] ? m[0] : spaces(startW) + m[2]\n\t + spaces(endW)\n\t + m[4].replace(/^([=:])\\s+/, \"$1 \");\n\t }\n\t };\n\t}).call(Editor.prototype);\n\t\n\t\n\tfunction isSamePoint(p1, p2) {\n\t return p1.row == p2.row && p1.column == p2.column;\n\t}\n\texports.onSessionChange = function(e) {\n\t var session = e.session;\n\t if (session && !session.multiSelect) {\n\t session.$selectionMarkers = [];\n\t session.selection.$initRangeList();\n\t session.multiSelect = session.selection;\n\t }\n\t this.multiSelect = session && session.multiSelect;\n\t\n\t var oldSession = e.oldSession;\n\t if (oldSession) {\n\t oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n\t oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n\t oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n\t oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n\t oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n\t oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n\t }\n\t\n\t if (session) {\n\t session.multiSelect.on(\"addRange\", this.$onAddRange);\n\t session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n\t session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n\t session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n\t session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n\t session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n\t }\n\t\n\t if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n\t if (session.selection.inMultiSelectMode)\n\t this.$onMultiSelect();\n\t else\n\t this.$onSingleSelect();\n\t }\n\t};\n\tfunction MultiSelect(editor) {\n\t if (editor.$multiselectOnSessionChange)\n\t return;\n\t editor.$onAddRange = editor.$onAddRange.bind(editor);\n\t editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n\t editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n\t editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n\t editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n\t editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\t\n\t editor.$multiselectOnSessionChange(editor);\n\t editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\t\n\t editor.on(\"mousedown\", onMouseDown);\n\t editor.commands.addCommands(commands.defaultCommands);\n\t\n\t addAltCursorListeners(editor);\n\t}\n\t\n\tfunction addAltCursorListeners(editor){\n\t var el = editor.textInput.getElement();\n\t var altCursor = false;\n\t event.addListener(el, \"keydown\", function(e) {\n\t var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n\t if (editor.$blockSelectEnabled && altDown) {\n\t if (!altCursor) {\n\t editor.renderer.setMouseCursor(\"crosshair\");\n\t altCursor = true;\n\t }\n\t } else if (altCursor) {\n\t reset();\n\t }\n\t });\n\t\n\t event.addListener(el, \"keyup\", reset);\n\t event.addListener(el, \"blur\", reset);\n\t function reset(e) {\n\t if (altCursor) {\n\t editor.renderer.setMouseCursor(\"\");\n\t altCursor = false;\n\t }\n\t }\n\t}\n\t\n\texports.MultiSelect = MultiSelect;\n\t\n\t\n\tacequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n\t enableMultiselect: {\n\t set: function(val) {\n\t MultiSelect(this);\n\t if (val) {\n\t this.on(\"changeSession\", this.$multiselectOnSessionChange);\n\t this.on(\"mousedown\", onMouseDown);\n\t } else {\n\t this.off(\"changeSession\", this.$multiselectOnSessionChange);\n\t this.off(\"mousedown\", onMouseDown);\n\t }\n\t },\n\t value: true\n\t },\n\t enableBlockSelect: {\n\t set: function(val) {\n\t this.$blockSelectEnabled = val;\n\t },\n\t value: true\n\t }\n\t});\n\t\n\t\n\t\n\t});\n\t\n\tace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"../../range\").Range;\n\t\n\tvar FoldMode = exports.FoldMode = function() {};\n\t\n\t(function() {\n\t\n\t this.foldingStartMarker = null;\n\t this.foldingStopMarker = null;\n\t this.getFoldWidget = function(session, foldStyle, row) {\n\t var line = session.getLine(row);\n\t if (this.foldingStartMarker.test(line))\n\t return \"start\";\n\t if (foldStyle == \"markbeginend\"\n\t && this.foldingStopMarker\n\t && this.foldingStopMarker.test(line))\n\t return \"end\";\n\t return \"\";\n\t };\n\t\n\t this.getFoldWidgetRange = function(session, foldStyle, row) {\n\t return null;\n\t };\n\t\n\t this.indentationBlock = function(session, row, column) {\n\t var re = /\\S/;\n\t var line = session.getLine(row);\n\t var startLevel = line.search(re);\n\t if (startLevel == -1)\n\t return;\n\t\n\t var startColumn = column || line.length;\n\t var maxRow = session.getLength();\n\t var startRow = row;\n\t var endRow = row;\n\t\n\t while (++row < maxRow) {\n\t var level = session.getLine(row).search(re);\n\t\n\t if (level == -1)\n\t continue;\n\t\n\t if (level <= startLevel)\n\t break;\n\t\n\t endRow = row;\n\t }\n\t\n\t if (endRow > startRow) {\n\t var endColumn = session.getLine(endRow).length;\n\t return new Range(startRow, startColumn, endRow, endColumn);\n\t }\n\t };\n\t\n\t this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n\t var start = {row: row, column: column + 1};\n\t var end = session.$findClosingBracket(bracket, start, typeRe);\n\t if (!end)\n\t return;\n\t\n\t var fw = session.foldWidgets[end.row];\n\t if (fw == null)\n\t fw = session.getFoldWidget(end.row);\n\t\n\t if (fw == \"start\" && end.row > start.row) {\n\t end.row --;\n\t end.column = session.getLine(end.row).length;\n\t }\n\t return Range.fromPoints(start, end);\n\t };\n\t\n\t this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n\t var end = {row: row, column: column};\n\t var start = session.$findOpeningBracket(bracket, end);\n\t\n\t if (!start)\n\t return;\n\t\n\t start.column++;\n\t end.column--;\n\t\n\t return Range.fromPoints(start, end);\n\t };\n\t}).call(FoldMode.prototype);\n\t\n\t});\n\t\n\tace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\texports.isDark = false;\n\texports.cssClass = \"ace-tm\";\n\texports.cssText = \".ace-tm .ace_gutter {\\\n\tbackground: #f0f0f0;\\\n\tcolor: #333;\\\n\t}\\\n\t.ace-tm .ace_print-margin {\\\n\twidth: 1px;\\\n\tbackground: #e8e8e8;\\\n\t}\\\n\t.ace-tm .ace_fold {\\\n\tbackground-color: #6B72E6;\\\n\t}\\\n\t.ace-tm {\\\n\tbackground-color: #FFFFFF;\\\n\tcolor: black;\\\n\t}\\\n\t.ace-tm .ace_cursor {\\\n\tcolor: black;\\\n\t}\\\n\t.ace-tm .ace_invisible {\\\n\tcolor: rgb(191, 191, 191);\\\n\t}\\\n\t.ace-tm .ace_storage,\\\n\t.ace-tm .ace_keyword {\\\n\tcolor: blue;\\\n\t}\\\n\t.ace-tm .ace_constant {\\\n\tcolor: rgb(197, 6, 11);\\\n\t}\\\n\t.ace-tm .ace_constant.ace_buildin {\\\n\tcolor: rgb(88, 72, 246);\\\n\t}\\\n\t.ace-tm .ace_constant.ace_language {\\\n\tcolor: rgb(88, 92, 246);\\\n\t}\\\n\t.ace-tm .ace_constant.ace_library {\\\n\tcolor: rgb(6, 150, 14);\\\n\t}\\\n\t.ace-tm .ace_invalid {\\\n\tbackground-color: rgba(255, 0, 0, 0.1);\\\n\tcolor: red;\\\n\t}\\\n\t.ace-tm .ace_support.ace_function {\\\n\tcolor: rgb(60, 76, 114);\\\n\t}\\\n\t.ace-tm .ace_support.ace_constant {\\\n\tcolor: rgb(6, 150, 14);\\\n\t}\\\n\t.ace-tm .ace_support.ace_type,\\\n\t.ace-tm .ace_support.ace_class {\\\n\tcolor: rgb(109, 121, 222);\\\n\t}\\\n\t.ace-tm .ace_keyword.ace_operator {\\\n\tcolor: rgb(104, 118, 135);\\\n\t}\\\n\t.ace-tm .ace_string {\\\n\tcolor: rgb(3, 106, 7);\\\n\t}\\\n\t.ace-tm .ace_comment {\\\n\tcolor: rgb(76, 136, 107);\\\n\t}\\\n\t.ace-tm .ace_comment.ace_doc {\\\n\tcolor: rgb(0, 102, 255);\\\n\t}\\\n\t.ace-tm .ace_comment.ace_doc.ace_tag {\\\n\tcolor: rgb(128, 159, 191);\\\n\t}\\\n\t.ace-tm .ace_constant.ace_numeric {\\\n\tcolor: rgb(0, 0, 205);\\\n\t}\\\n\t.ace-tm .ace_variable {\\\n\tcolor: rgb(49, 132, 149);\\\n\t}\\\n\t.ace-tm .ace_xml-pe {\\\n\tcolor: rgb(104, 104, 91);\\\n\t}\\\n\t.ace-tm .ace_entity.ace_name.ace_function {\\\n\tcolor: #0000A2;\\\n\t}\\\n\t.ace-tm .ace_heading {\\\n\tcolor: rgb(12, 7, 255);\\\n\t}\\\n\t.ace-tm .ace_list {\\\n\tcolor:rgb(185, 6, 144);\\\n\t}\\\n\t.ace-tm .ace_meta.ace_tag {\\\n\tcolor:rgb(0, 22, 142);\\\n\t}\\\n\t.ace-tm .ace_string.ace_regex {\\\n\tcolor: rgb(255, 0, 0)\\\n\t}\\\n\t.ace-tm .ace_marker-layer .ace_selection {\\\n\tbackground: rgb(181, 213, 255);\\\n\t}\\\n\t.ace-tm.ace_multiselect .ace_selection.ace_start {\\\n\tbox-shadow: 0 0 3px 0px white;\\\n\t}\\\n\t.ace-tm .ace_marker-layer .ace_step {\\\n\tbackground: rgb(252, 255, 0);\\\n\t}\\\n\t.ace-tm .ace_marker-layer .ace_stack {\\\n\tbackground: rgb(164, 229, 101);\\\n\t}\\\n\t.ace-tm .ace_marker-layer .ace_bracket {\\\n\tmargin: -1px 0 0 -1px;\\\n\tborder: 1px solid rgb(192, 192, 192);\\\n\t}\\\n\t.ace-tm .ace_marker-layer .ace_active-line {\\\n\tbackground: rgba(0, 0, 0, 0.07);\\\n\t}\\\n\t.ace-tm .ace_gutter-active-line {\\\n\tbackground-color : #dcdcdc;\\\n\t}\\\n\t.ace-tm .ace_marker-layer .ace_selected-word {\\\n\tbackground: rgb(250, 250, 255);\\\n\tborder: 1px solid rgb(200, 200, 250);\\\n\t}\\\n\t.ace-tm .ace_indent-guide {\\\n\tbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n\t}\\\n\t\";\n\t\n\tvar dom = acequire(\"../lib/dom\");\n\tdom.importCssString(exports.cssText, exports.cssClass);\n\t});\n\t\n\tace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"./lib/oop\");\n\tvar dom = acequire(\"./lib/dom\");\n\tvar Range = acequire(\"./range\").Range;\n\t\n\t\n\tfunction LineWidgets(session) {\n\t this.session = session;\n\t this.session.widgetManager = this;\n\t this.session.getRowLength = this.getRowLength;\n\t this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n\t this.updateOnChange = this.updateOnChange.bind(this);\n\t this.renderWidgets = this.renderWidgets.bind(this);\n\t this.measureWidgets = this.measureWidgets.bind(this);\n\t this.session._changedWidgets = [];\n\t this.$onChangeEditor = this.$onChangeEditor.bind(this);\n\t \n\t this.session.on(\"change\", this.updateOnChange);\n\t this.session.on(\"changeFold\", this.updateOnFold);\n\t this.session.on(\"changeEditor\", this.$onChangeEditor);\n\t}\n\t\n\t(function() {\n\t this.getRowLength = function(row) {\n\t var h;\n\t if (this.lineWidgets)\n\t h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n\t else \n\t h = 0;\n\t if (!this.$useWrapMode || !this.$wrapData[row]) {\n\t return 1 + h;\n\t } else {\n\t return this.$wrapData[row].length + 1 + h;\n\t }\n\t };\n\t\n\t this.$getWidgetScreenLength = function() {\n\t var screenRows = 0;\n\t this.lineWidgets.forEach(function(w){\n\t if (w && w.rowCount && !w.hidden)\n\t screenRows += w.rowCount;\n\t });\n\t return screenRows;\n\t }; \n\t \n\t this.$onChangeEditor = function(e) {\n\t this.attach(e.editor);\n\t };\n\t \n\t this.attach = function(editor) {\n\t if (editor && editor.widgetManager && editor.widgetManager != this)\n\t editor.widgetManager.detach();\n\t\n\t if (this.editor == editor)\n\t return;\n\t\n\t this.detach();\n\t this.editor = editor;\n\t \n\t if (editor) {\n\t editor.widgetManager = this;\n\t editor.renderer.on(\"beforeRender\", this.measureWidgets);\n\t editor.renderer.on(\"afterRender\", this.renderWidgets);\n\t }\n\t };\n\t this.detach = function(e) {\n\t var editor = this.editor;\n\t if (!editor)\n\t return;\n\t \n\t this.editor = null;\n\t editor.widgetManager = null;\n\t \n\t editor.renderer.off(\"beforeRender\", this.measureWidgets);\n\t editor.renderer.off(\"afterRender\", this.renderWidgets);\n\t var lineWidgets = this.session.lineWidgets;\n\t lineWidgets && lineWidgets.forEach(function(w) {\n\t if (w && w.el && w.el.parentNode) {\n\t w._inDocument = false;\n\t w.el.parentNode.removeChild(w.el);\n\t }\n\t });\n\t };\n\t\n\t this.updateOnFold = function(e, session) {\n\t var lineWidgets = session.lineWidgets;\n\t if (!lineWidgets || !e.action)\n\t return;\n\t var fold = e.data;\n\t var start = fold.start.row;\n\t var end = fold.end.row;\n\t var hide = e.action == \"add\";\n\t for (var i = start + 1; i < end; i++) {\n\t if (lineWidgets[i])\n\t lineWidgets[i].hidden = hide;\n\t }\n\t if (lineWidgets[end]) {\n\t if (hide) {\n\t if (!lineWidgets[start])\n\t lineWidgets[start] = lineWidgets[end];\n\t else\n\t lineWidgets[end].hidden = hide;\n\t } else {\n\t if (lineWidgets[start] == lineWidgets[end])\n\t lineWidgets[start] = undefined;\n\t lineWidgets[end].hidden = hide;\n\t }\n\t }\n\t };\n\t \n\t this.updateOnChange = function(delta) {\n\t var lineWidgets = this.session.lineWidgets;\n\t if (!lineWidgets) return;\n\t \n\t var startRow = delta.start.row;\n\t var len = delta.end.row - startRow;\n\t\n\t if (len === 0) {\n\t } else if (delta.action == 'remove') {\n\t var removed = lineWidgets.splice(startRow + 1, len);\n\t removed.forEach(function(w) {\n\t w && this.removeLineWidget(w);\n\t }, this);\n\t this.$updateRows();\n\t } else {\n\t var args = new Array(len);\n\t args.unshift(startRow, 0);\n\t lineWidgets.splice.apply(lineWidgets, args);\n\t this.$updateRows();\n\t }\n\t };\n\t \n\t this.$updateRows = function() {\n\t var lineWidgets = this.session.lineWidgets;\n\t if (!lineWidgets) return;\n\t var noWidgets = true;\n\t lineWidgets.forEach(function(w, i) {\n\t if (w) {\n\t noWidgets = false;\n\t w.row = i;\n\t while (w.$oldWidget) {\n\t w.$oldWidget.row = i;\n\t w = w.$oldWidget;\n\t }\n\t }\n\t });\n\t if (noWidgets)\n\t this.session.lineWidgets = null;\n\t };\n\t\n\t this.addLineWidget = function(w) {\n\t if (!this.session.lineWidgets)\n\t this.session.lineWidgets = new Array(this.session.getLength());\n\t \n\t var old = this.session.lineWidgets[w.row];\n\t if (old) {\n\t w.$oldWidget = old;\n\t if (old.el && old.el.parentNode) {\n\t old.el.parentNode.removeChild(old.el);\n\t old._inDocument = false;\n\t }\n\t }\n\t \n\t this.session.lineWidgets[w.row] = w;\n\t \n\t w.session = this.session;\n\t \n\t var renderer = this.editor.renderer;\n\t if (w.html && !w.el) {\n\t w.el = dom.createElement(\"div\");\n\t w.el.innerHTML = w.html;\n\t }\n\t if (w.el) {\n\t dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n\t w.el.style.position = \"absolute\";\n\t w.el.style.zIndex = 5;\n\t renderer.container.appendChild(w.el);\n\t w._inDocument = true;\n\t }\n\t \n\t if (!w.coverGutter) {\n\t w.el.style.zIndex = 3;\n\t }\n\t if (!w.pixelHeight) {\n\t w.pixelHeight = w.el.offsetHeight;\n\t }\n\t if (w.rowCount == null) {\n\t w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n\t }\n\t \n\t var fold = this.session.getFoldAt(w.row, 0);\n\t w.$fold = fold;\n\t if (fold) {\n\t var lineWidgets = this.session.lineWidgets;\n\t if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n\t lineWidgets[fold.start.row] = w;\n\t else\n\t w.hidden = true;\n\t }\n\t \n\t this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n\t \n\t this.$updateRows();\n\t this.renderWidgets(null, renderer);\n\t this.onWidgetChanged(w);\n\t return w;\n\t };\n\t \n\t this.removeLineWidget = function(w) {\n\t w._inDocument = false;\n\t w.session = null;\n\t if (w.el && w.el.parentNode)\n\t w.el.parentNode.removeChild(w.el);\n\t if (w.editor && w.editor.destroy) try {\n\t w.editor.destroy();\n\t } catch(e){}\n\t if (this.session.lineWidgets) {\n\t var w1 = this.session.lineWidgets[w.row]\n\t if (w1 == w) {\n\t this.session.lineWidgets[w.row] = w.$oldWidget;\n\t if (w.$oldWidget)\n\t this.onWidgetChanged(w.$oldWidget);\n\t } else {\n\t while (w1) {\n\t if (w1.$oldWidget == w) {\n\t w1.$oldWidget = w.$oldWidget;\n\t break;\n\t }\n\t w1 = w1.$oldWidget;\n\t }\n\t }\n\t }\n\t this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n\t this.$updateRows();\n\t };\n\t \n\t this.getWidgetsAtRow = function(row) {\n\t var lineWidgets = this.session.lineWidgets;\n\t var w = lineWidgets && lineWidgets[row];\n\t var list = [];\n\t while (w) {\n\t list.push(w);\n\t w = w.$oldWidget;\n\t }\n\t return list;\n\t };\n\t \n\t this.onWidgetChanged = function(w) {\n\t this.session._changedWidgets.push(w);\n\t this.editor && this.editor.renderer.updateFull();\n\t };\n\t \n\t this.measureWidgets = function(e, renderer) {\n\t var changedWidgets = this.session._changedWidgets;\n\t var config = renderer.layerConfig;\n\t \n\t if (!changedWidgets || !changedWidgets.length) return;\n\t var min = Infinity;\n\t for (var i = 0; i < changedWidgets.length; i++) {\n\t var w = changedWidgets[i];\n\t if (!w || !w.el) continue;\n\t if (w.session != this.session) continue;\n\t if (!w._inDocument) {\n\t if (this.session.lineWidgets[w.row] != w)\n\t continue;\n\t w._inDocument = true;\n\t renderer.container.appendChild(w.el);\n\t }\n\t \n\t w.h = w.el.offsetHeight;\n\t \n\t if (!w.fixedWidth) {\n\t w.w = w.el.offsetWidth;\n\t w.screenWidth = Math.ceil(w.w / config.characterWidth);\n\t }\n\t \n\t var rowCount = w.h / config.lineHeight;\n\t if (w.coverLine) {\n\t rowCount -= this.session.getRowLineCount(w.row);\n\t if (rowCount < 0)\n\t rowCount = 0;\n\t }\n\t if (w.rowCount != rowCount) {\n\t w.rowCount = rowCount;\n\t if (w.row < min)\n\t min = w.row;\n\t }\n\t }\n\t if (min != Infinity) {\n\t this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n\t this.session.lineWidgetWidth = null;\n\t }\n\t this.session._changedWidgets = [];\n\t };\n\t \n\t this.renderWidgets = function(e, renderer) {\n\t var config = renderer.layerConfig;\n\t var lineWidgets = this.session.lineWidgets;\n\t if (!lineWidgets)\n\t return;\n\t var first = Math.min(this.firstRow, config.firstRow);\n\t var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n\t \n\t while (first > 0 && !lineWidgets[first])\n\t first--;\n\t \n\t this.firstRow = config.firstRow;\n\t this.lastRow = config.lastRow;\n\t\n\t renderer.$cursorLayer.config = config;\n\t for (var i = first; i <= last; i++) {\n\t var w = lineWidgets[i];\n\t if (!w || !w.el) continue;\n\t if (w.hidden) {\n\t w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n\t continue;\n\t }\n\t if (!w._inDocument) {\n\t w._inDocument = true;\n\t renderer.container.appendChild(w.el);\n\t }\n\t var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n\t if (!w.coverLine)\n\t top += config.lineHeight * this.session.getRowLineCount(w.row);\n\t w.el.style.top = top - config.offset + \"px\";\n\t \n\t var left = w.coverGutter ? 0 : renderer.gutterWidth;\n\t if (!w.fixedWidth)\n\t left -= renderer.scrollLeft;\n\t w.el.style.left = left + \"px\";\n\t \n\t if (w.fullWidth && w.screenWidth) {\n\t w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n\t }\n\t \n\t if (w.fixedWidth) {\n\t w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n\t } else {\n\t w.el.style.right = \"\";\n\t }\n\t }\n\t };\n\t \n\t}).call(LineWidgets.prototype);\n\t\n\t\n\texports.LineWidgets = LineWidgets;\n\t\n\t});\n\t\n\tace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\tvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\n\tvar dom = acequire(\"../lib/dom\");\n\tvar Range = acequire(\"../range\").Range;\n\t\n\tfunction binarySearch(array, needle, comparator) {\n\t var first = 0;\n\t var last = array.length - 1;\n\t\n\t while (first <= last) {\n\t var mid = (first + last) >> 1;\n\t var c = comparator(needle, array[mid]);\n\t if (c > 0)\n\t first = mid + 1;\n\t else if (c < 0)\n\t last = mid - 1;\n\t else\n\t return mid;\n\t }\n\t return -(first + 1);\n\t}\n\t\n\tfunction findAnnotations(session, row, dir) {\n\t var annotations = session.getAnnotations().sort(Range.comparePoints);\n\t if (!annotations.length)\n\t return;\n\t \n\t var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n\t if (i < 0)\n\t i = -i - 1;\n\t \n\t if (i >= annotations.length)\n\t i = dir > 0 ? 0 : annotations.length - 1;\n\t else if (i === 0 && dir < 0)\n\t i = annotations.length - 1;\n\t \n\t var annotation = annotations[i];\n\t if (!annotation || !dir)\n\t return;\n\t\n\t if (annotation.row === row) {\n\t do {\n\t annotation = annotations[i += dir];\n\t } while (annotation && annotation.row === row);\n\t if (!annotation)\n\t return annotations.slice();\n\t }\n\t \n\t \n\t var matched = [];\n\t row = annotation.row;\n\t do {\n\t matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n\t annotation = annotations[i += dir];\n\t } while (annotation && annotation.row == row);\n\t return matched.length && matched;\n\t}\n\t\n\texports.showErrorMarker = function(editor, dir) {\n\t var session = editor.session;\n\t if (!session.widgetManager) {\n\t session.widgetManager = new LineWidgets(session);\n\t session.widgetManager.attach(editor);\n\t }\n\t \n\t var pos = editor.getCursorPosition();\n\t var row = pos.row;\n\t var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n\t return w.type == \"errorMarker\";\n\t })[0];\n\t if (oldWidget) {\n\t oldWidget.destroy();\n\t } else {\n\t row -= dir;\n\t }\n\t var annotations = findAnnotations(session, row, dir);\n\t var gutterAnno;\n\t if (annotations) {\n\t var annotation = annotations[0];\n\t pos.column = (annotation.pos && typeof annotation.column != \"number\"\n\t ? annotation.pos.sc\n\t : annotation.column) || 0;\n\t pos.row = annotation.row;\n\t gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n\t } else if (oldWidget) {\n\t return;\n\t } else {\n\t gutterAnno = {\n\t text: [\"Looks good!\"],\n\t className: \"ace_ok\"\n\t };\n\t }\n\t editor.session.unfold(pos.row);\n\t editor.selection.moveToPosition(pos);\n\t \n\t var w = {\n\t row: pos.row, \n\t fixedWidth: true,\n\t coverGutter: true,\n\t el: dom.createElement(\"div\"),\n\t type: \"errorMarker\"\n\t };\n\t var el = w.el.appendChild(dom.createElement(\"div\"));\n\t var arrow = w.el.appendChild(dom.createElement(\"div\"));\n\t arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n\t \n\t var left = editor.renderer.$cursorLayer\n\t .getPixelPosition(pos).left;\n\t arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n\t \n\t w.el.className = \"error_widget_wrapper\";\n\t el.className = \"error_widget \" + gutterAnno.className;\n\t el.innerHTML = gutterAnno.text.join(\"
\");\n\t \n\t el.appendChild(dom.createElement(\"div\"));\n\t \n\t var kb = function(_, hashId, keyString) {\n\t if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n\t w.destroy();\n\t return {command: \"null\"};\n\t }\n\t };\n\t \n\t w.destroy = function() {\n\t if (editor.$mouseHandler.isMousePressed)\n\t return;\n\t editor.keyBinding.removeKeyboardHandler(kb);\n\t session.widgetManager.removeLineWidget(w);\n\t editor.off(\"changeSelection\", w.destroy);\n\t editor.off(\"changeSession\", w.destroy);\n\t editor.off(\"mouseup\", w.destroy);\n\t editor.off(\"change\", w.destroy);\n\t };\n\t \n\t editor.keyBinding.addKeyboardHandler(kb);\n\t editor.on(\"changeSelection\", w.destroy);\n\t editor.on(\"changeSession\", w.destroy);\n\t editor.on(\"mouseup\", w.destroy);\n\t editor.on(\"change\", w.destroy);\n\t \n\t editor.session.widgetManager.addLineWidget(w);\n\t \n\t w.el.onmousedown = editor.focus.bind(editor);\n\t \n\t editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n\t};\n\t\n\t\n\tdom.importCssString(\"\\\n\t .error_widget_wrapper {\\\n\t background: inherit;\\\n\t color: inherit;\\\n\t border:none\\\n\t }\\\n\t .error_widget {\\\n\t border-top: solid 2px;\\\n\t border-bottom: solid 2px;\\\n\t margin: 5px 0;\\\n\t padding: 10px 40px;\\\n\t white-space: pre-wrap;\\\n\t }\\\n\t .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n\t border-color: #ff5a5a\\\n\t }\\\n\t .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n\t border-color: #F1D817\\\n\t }\\\n\t .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n\t border-color: #5a5a5a\\\n\t }\\\n\t .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n\t border-color: #5aaa5a\\\n\t }\\\n\t .error_widget_arrow {\\\n\t position: absolute;\\\n\t border: solid 5px;\\\n\t border-top-color: transparent!important;\\\n\t border-right-color: transparent!important;\\\n\t border-left-color: transparent!important;\\\n\t top: -5px;\\\n\t }\\\n\t\", \"\");\n\t\n\t});\n\t\n\tace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tacequire(\"./lib/fixoldbrowsers\");\n\t\n\tvar dom = acequire(\"./lib/dom\");\n\tvar event = acequire(\"./lib/event\");\n\t\n\tvar Editor = acequire(\"./editor\").Editor;\n\tvar EditSession = acequire(\"./edit_session\").EditSession;\n\tvar UndoManager = acequire(\"./undomanager\").UndoManager;\n\tvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\n\tacequire(\"./worker/worker_client\");\n\tacequire(\"./keyboard/hash_handler\");\n\tacequire(\"./placeholder\");\n\tacequire(\"./multi_select\");\n\tacequire(\"./mode/folding/fold_mode\");\n\tacequire(\"./theme/textmate\");\n\tacequire(\"./ext/error_marker\");\n\t\n\texports.config = acequire(\"./config\");\n\texports.acequire = acequire;\n\texports.edit = function(el) {\n\t if (typeof el == \"string\") {\n\t var _id = el;\n\t el = document.getElementById(_id);\n\t if (!el)\n\t throw new Error(\"ace.edit can't find div #\" + _id);\n\t }\n\t\n\t if (el && el.env && el.env.editor instanceof Editor)\n\t return el.env.editor;\n\t\n\t var value = \"\";\n\t if (el && /input|textarea/i.test(el.tagName)) {\n\t var oldNode = el;\n\t value = oldNode.value;\n\t el = dom.createElement(\"pre\");\n\t oldNode.parentNode.replaceChild(el, oldNode);\n\t } else if (el) {\n\t value = dom.getInnerText(el);\n\t el.innerHTML = \"\";\n\t }\n\t\n\t var doc = exports.createEditSession(value);\n\t\n\t var editor = new Editor(new Renderer(el));\n\t editor.setSession(doc);\n\t\n\t var env = {\n\t document: doc,\n\t editor: editor,\n\t onResize: editor.resize.bind(editor, null)\n\t };\n\t if (oldNode) env.textarea = oldNode;\n\t event.addListener(window, \"resize\", env.onResize);\n\t editor.on(\"destroy\", function() {\n\t event.removeListener(window, \"resize\", env.onResize);\n\t env.editor.container.env = null; // prevent memory leak on old ie\n\t });\n\t editor.container.env = editor.env = env;\n\t return editor;\n\t};\n\texports.createEditSession = function(text, mode) {\n\t var doc = new EditSession(text, mode);\n\t doc.setUndoManager(new UndoManager());\n\t return doc;\n\t}\n\texports.EditSession = EditSession;\n\texports.UndoManager = UndoManager;\n\texports.version = \"1.2.3\";\n\t});\n\t (function() {\n\t ace.acequire([\"ace/ace\"], function(a) {\n\t a && a.config.init(true);\n\t if (!window.ace)\n\t window.ace = a;\n\t for (var key in a) if (a.hasOwnProperty(key))\n\t window.ace[key] = a[key];\n\t });\n\t })();\n\t \n\tmodule.exports = window.ace.acequire(\"ace/ace\");\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tace.define(\"ace/mode/json_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../lib/oop\");\n\tvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\t\n\tvar JsonHighlightRules = function() {\n\t this.$rules = {\n\t \"start\" : [\n\t {\n\t token : \"variable\", // single line\n\t regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n\t }, {\n\t token : \"string\", // single line\n\t regex : '\"',\n\t next : \"string\"\n\t }, {\n\t token : \"constant.numeric\", // hex\n\t regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n\t }, {\n\t token : \"constant.numeric\", // float\n\t regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n\t }, {\n\t token : \"constant.language.boolean\",\n\t regex : \"(?:true|false)\\\\b\"\n\t }, {\n\t token : \"invalid.illegal\", // single quoted strings are not allowed\n\t regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n\t }, {\n\t token : \"invalid.illegal\", // comments are not allowed\n\t regex : \"\\\\/\\\\/.*$\"\n\t }, {\n\t token : \"paren.lparen\",\n\t regex : \"[[({]\"\n\t }, {\n\t token : \"paren.rparen\",\n\t regex : \"[\\\\])}]\"\n\t }, {\n\t token : \"text\",\n\t regex : \"\\\\s+\"\n\t }\n\t ],\n\t \"string\" : [\n\t {\n\t token : \"constant.language.escape\",\n\t regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n\t }, {\n\t token : \"string\",\n\t regex : '[^\"\\\\\\\\]+'\n\t }, {\n\t token : \"string\",\n\t regex : '\"',\n\t next : \"start\"\n\t }, {\n\t token : \"string\",\n\t regex : \"\",\n\t next : \"start\"\n\t }\n\t ]\n\t };\n\t \n\t};\n\t\n\toop.inherits(JsonHighlightRules, TextHighlightRules);\n\t\n\texports.JsonHighlightRules = JsonHighlightRules;\n\t});\n\t\n\tace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar Range = acequire(\"../range\").Range;\n\t\n\tvar MatchingBraceOutdent = function() {};\n\t\n\t(function() {\n\t\n\t this.checkOutdent = function(line, input) {\n\t if (! /^\\s+$/.test(line))\n\t return false;\n\t\n\t return /^\\s*\\}/.test(input);\n\t };\n\t\n\t this.autoOutdent = function(doc, row) {\n\t var line = doc.getLine(row);\n\t var match = line.match(/^(\\s*\\})/);\n\t\n\t if (!match) return 0;\n\t\n\t var column = match[1].length;\n\t var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\t\n\t if (!openBracePos || openBracePos.row == row) return 0;\n\t\n\t var indent = this.$getIndent(doc.getLine(openBracePos.row));\n\t doc.replace(new Range(row, 0, row, column-1), indent);\n\t };\n\t\n\t this.$getIndent = function(line) {\n\t return line.match(/^\\s*/)[0];\n\t };\n\t\n\t}).call(MatchingBraceOutdent.prototype);\n\t\n\texports.MatchingBraceOutdent = MatchingBraceOutdent;\n\t});\n\t\n\tace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../../lib/oop\");\n\tvar Behaviour = acequire(\"../behaviour\").Behaviour;\n\tvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\n\tvar lang = acequire(\"../../lib/lang\");\n\t\n\tvar SAFE_INSERT_IN_TOKENS =\n\t [\"text\", \"paren.rparen\", \"punctuation.operator\"];\n\tvar SAFE_INSERT_BEFORE_TOKENS =\n\t [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\t\n\tvar context;\n\tvar contextCache = {};\n\tvar initContext = function(editor) {\n\t var id = -1;\n\t if (editor.multiSelect) {\n\t id = editor.selection.index;\n\t if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n\t contextCache = {rangeCount: editor.multiSelect.rangeCount};\n\t }\n\t if (contextCache[id])\n\t return context = contextCache[id];\n\t context = contextCache[id] = {\n\t autoInsertedBrackets: 0,\n\t autoInsertedRow: -1,\n\t autoInsertedLineEnd: \"\",\n\t maybeInsertedBrackets: 0,\n\t maybeInsertedRow: -1,\n\t maybeInsertedLineStart: \"\",\n\t maybeInsertedLineEnd: \"\"\n\t };\n\t};\n\t\n\tvar getWrapped = function(selection, selected, opening, closing) {\n\t var rowDiff = selection.end.row - selection.start.row;\n\t return {\n\t text: opening + selected + closing,\n\t selection: [\n\t 0,\n\t selection.start.column + 1,\n\t rowDiff,\n\t selection.end.column + (rowDiff ? 0 : 1)\n\t ]\n\t };\n\t};\n\t\n\tvar CstyleBehaviour = function() {\n\t this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t if (text == '{') {\n\t initContext(editor);\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, '{', '}');\n\t } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n\t if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n\t CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n\t return {\n\t text: '{}',\n\t selection: [1, 1]\n\t };\n\t } else {\n\t CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n\t return {\n\t text: '{',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t } else if (text == '}') {\n\t initContext(editor);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar == '}') {\n\t var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n\t if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n\t CstyleBehaviour.popAutoInsertedClosing();\n\t return {\n\t text: '',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t } else if (text == \"\\n\" || text == \"\\r\\n\") {\n\t initContext(editor);\n\t var closing = \"\";\n\t if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n\t closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n\t CstyleBehaviour.clearMaybeInsertedClosing();\n\t }\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar === '}') {\n\t var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n\t if (!openBracePos)\n\t return null;\n\t var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n\t } else if (closing) {\n\t var next_indent = this.$getIndent(line);\n\t } else {\n\t CstyleBehaviour.clearMaybeInsertedClosing();\n\t return;\n\t }\n\t var indent = next_indent + session.getTabString();\n\t\n\t return {\n\t text: '\\n' + indent + '\\n' + next_indent + closing,\n\t selection: [1, indent.length, 1, indent.length]\n\t };\n\t } else {\n\t CstyleBehaviour.clearMaybeInsertedClosing();\n\t }\n\t });\n\t\n\t this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && selected == '{') {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.end.column, range.end.column + 1);\n\t if (rightChar == '}') {\n\t range.end.column++;\n\t return range;\n\t } else {\n\t context.maybeInsertedBrackets--;\n\t }\n\t }\n\t });\n\t\n\t this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n\t if (text == '(') {\n\t initContext(editor);\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, '(', ')');\n\t } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n\t CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n\t return {\n\t text: '()',\n\t selection: [1, 1]\n\t };\n\t }\n\t } else if (text == ')') {\n\t initContext(editor);\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar == ')') {\n\t var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n\t if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n\t CstyleBehaviour.popAutoInsertedClosing();\n\t return {\n\t text: '',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t }\n\t });\n\t\n\t this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && selected == '(') {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n\t if (rightChar == ')') {\n\t range.end.column++;\n\t return range;\n\t }\n\t }\n\t });\n\t\n\t this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n\t if (text == '[') {\n\t initContext(editor);\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, '[', ']');\n\t } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n\t CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n\t return {\n\t text: '[]',\n\t selection: [1, 1]\n\t };\n\t }\n\t } else if (text == ']') {\n\t initContext(editor);\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar == ']') {\n\t var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n\t if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n\t CstyleBehaviour.popAutoInsertedClosing();\n\t return {\n\t text: '',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t }\n\t });\n\t\n\t this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && selected == '[') {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n\t if (rightChar == ']') {\n\t range.end.column++;\n\t return range;\n\t }\n\t }\n\t });\n\t\n\t this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n\t if (text == '\"' || text == \"'\") {\n\t initContext(editor);\n\t var quote = text;\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, quote, quote);\n\t } else if (!selected) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t var leftChar = line.substring(cursor.column-1, cursor.column);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t \n\t var token = session.getTokenAt(cursor.row, cursor.column);\n\t var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n\t if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n\t return null;\n\t \n\t var stringBefore = token && /string|escape/.test(token.type);\n\t var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n\t \n\t var pair;\n\t if (rightChar == quote) {\n\t pair = stringBefore !== stringAfter;\n\t } else {\n\t if (stringBefore && !stringAfter)\n\t return null; // wrap string with different quote\n\t if (stringBefore && stringAfter)\n\t return null; // do not pair quotes inside strings\n\t var wordRe = session.$mode.tokenRe;\n\t wordRe.lastIndex = 0;\n\t var isWordBefore = wordRe.test(leftChar);\n\t wordRe.lastIndex = 0;\n\t var isWordAfter = wordRe.test(leftChar);\n\t if (isWordBefore || isWordAfter)\n\t return null; // before or after alphanumeric\n\t if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n\t return null; // there is rightChar and it isn't closing\n\t pair = true;\n\t }\n\t return {\n\t text: pair ? quote + quote : \"\",\n\t selection: [1,1]\n\t };\n\t }\n\t }\n\t });\n\t\n\t this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n\t if (rightChar == selected) {\n\t range.end.column++;\n\t return range;\n\t }\n\t }\n\t });\n\t\n\t};\n\t\n\t \n\tCstyleBehaviour.isSaneInsertion = function(editor, session) {\n\t var cursor = editor.getCursorPosition();\n\t var iterator = new TokenIterator(session, cursor.row, cursor.column);\n\t if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n\t var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n\t if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n\t return false;\n\t }\n\t iterator.stepForward();\n\t return iterator.getCurrentTokenRow() !== cursor.row ||\n\t this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n\t};\n\t\n\tCstyleBehaviour.$matchTokenType = function(token, types) {\n\t return types.indexOf(token.type || token) > -1;\n\t};\n\t\n\tCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n\t context.autoInsertedBrackets = 0;\n\t context.autoInsertedRow = cursor.row;\n\t context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n\t context.autoInsertedBrackets++;\n\t};\n\t\n\tCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t if (!this.isMaybeInsertedClosing(cursor, line))\n\t context.maybeInsertedBrackets = 0;\n\t context.maybeInsertedRow = cursor.row;\n\t context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n\t context.maybeInsertedLineEnd = line.substr(cursor.column);\n\t context.maybeInsertedBrackets++;\n\t};\n\t\n\tCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n\t return context.autoInsertedBrackets > 0 &&\n\t cursor.row === context.autoInsertedRow &&\n\t bracket === context.autoInsertedLineEnd[0] &&\n\t line.substr(cursor.column) === context.autoInsertedLineEnd;\n\t};\n\t\n\tCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n\t return context.maybeInsertedBrackets > 0 &&\n\t cursor.row === context.maybeInsertedRow &&\n\t line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n\t line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n\t};\n\t\n\tCstyleBehaviour.popAutoInsertedClosing = function() {\n\t context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n\t context.autoInsertedBrackets--;\n\t};\n\t\n\tCstyleBehaviour.clearMaybeInsertedClosing = function() {\n\t if (context) {\n\t context.maybeInsertedBrackets = 0;\n\t context.maybeInsertedRow = -1;\n\t }\n\t};\n\t\n\t\n\t\n\toop.inherits(CstyleBehaviour, Behaviour);\n\t\n\texports.CstyleBehaviour = CstyleBehaviour;\n\t});\n\t\n\tace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../../lib/oop\");\n\tvar Range = acequire(\"../../range\").Range;\n\tvar BaseFoldMode = acequire(\"./fold_mode\").FoldMode;\n\t\n\tvar FoldMode = exports.FoldMode = function(commentRegex) {\n\t if (commentRegex) {\n\t this.foldingStartMarker = new RegExp(\n\t this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n\t );\n\t this.foldingStopMarker = new RegExp(\n\t this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n\t );\n\t }\n\t};\n\toop.inherits(FoldMode, BaseFoldMode);\n\t\n\t(function() {\n\t \n\t this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n\t this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\t this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n\t this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n\t this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n\t this._getFoldWidgetBase = this.getFoldWidget;\n\t this.getFoldWidget = function(session, foldStyle, row) {\n\t var line = session.getLine(row);\n\t \n\t if (this.singleLineBlockCommentRe.test(line)) {\n\t if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n\t return \"\";\n\t }\n\t \n\t var fw = this._getFoldWidgetBase(session, foldStyle, row);\n\t \n\t if (!fw && this.startRegionRe.test(line))\n\t return \"start\"; // lineCommentRegionStart\n\t \n\t return fw;\n\t };\n\t\n\t this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n\t var line = session.getLine(row);\n\t \n\t if (this.startRegionRe.test(line))\n\t return this.getCommentRegionBlock(session, line, row);\n\t \n\t var match = line.match(this.foldingStartMarker);\n\t if (match) {\n\t var i = match.index;\n\t\n\t if (match[1])\n\t return this.openingBracketBlock(session, match[1], row, i);\n\t \n\t var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n\t \n\t if (range && !range.isMultiLine()) {\n\t if (forceMultiline) {\n\t range = this.getSectionRange(session, row);\n\t } else if (foldStyle != \"all\")\n\t range = null;\n\t }\n\t \n\t return range;\n\t }\n\t\n\t if (foldStyle === \"markbegin\")\n\t return;\n\t\n\t var match = line.match(this.foldingStopMarker);\n\t if (match) {\n\t var i = match.index + match[0].length;\n\t\n\t if (match[1])\n\t return this.closingBracketBlock(session, match[1], row, i);\n\t\n\t return session.getCommentFoldRange(row, i, -1);\n\t }\n\t };\n\t \n\t this.getSectionRange = function(session, row) {\n\t var line = session.getLine(row);\n\t var startIndent = line.search(/\\S/);\n\t var startRow = row;\n\t var startColumn = line.length;\n\t row = row + 1;\n\t var endRow = row;\n\t var maxRow = session.getLength();\n\t while (++row < maxRow) {\n\t line = session.getLine(row);\n\t var indent = line.search(/\\S/);\n\t if (indent === -1)\n\t continue;\n\t if (startIndent > indent)\n\t break;\n\t var subRange = this.getFoldWidgetRange(session, \"all\", row);\n\t \n\t if (subRange) {\n\t if (subRange.start.row <= startRow) {\n\t break;\n\t } else if (subRange.isMultiLine()) {\n\t row = subRange.end.row;\n\t } else if (startIndent == indent) {\n\t break;\n\t }\n\t }\n\t endRow = row;\n\t }\n\t \n\t return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n\t };\n\t this.getCommentRegionBlock = function(session, line, row) {\n\t var startColumn = line.search(/\\s*$/);\n\t var maxRow = session.getLength();\n\t var startRow = row;\n\t \n\t var re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/;\n\t var depth = 1;\n\t while (++row < maxRow) {\n\t line = session.getLine(row);\n\t var m = re.exec(line);\n\t if (!m) continue;\n\t if (m[1]) depth--;\n\t else depth++;\n\t\n\t if (!depth) break;\n\t }\n\t\n\t var endRow = row;\n\t if (endRow > startRow) {\n\t return new Range(startRow, startColumn, endRow, line.length);\n\t }\n\t };\n\t\n\t}).call(FoldMode.prototype);\n\t\n\t});\n\t\n\tace.define(\"ace/mode/json\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/json_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/worker/worker_client\"], function(acequire, exports, module) {\n\t\"use strict\";\n\t\n\tvar oop = acequire(\"../lib/oop\");\n\tvar TextMode = acequire(\"./text\").Mode;\n\tvar HighlightRules = acequire(\"./json_highlight_rules\").JsonHighlightRules;\n\tvar MatchingBraceOutdent = acequire(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\tvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\n\tvar CStyleFoldMode = acequire(\"./folding/cstyle\").FoldMode;\n\tvar WorkerClient = acequire(\"../worker/worker_client\").WorkerClient;\n\t\n\tvar Mode = function() {\n\t this.HighlightRules = HighlightRules;\n\t this.$outdent = new MatchingBraceOutdent();\n\t this.$behaviour = new CstyleBehaviour();\n\t this.foldingRules = new CStyleFoldMode();\n\t};\n\toop.inherits(Mode, TextMode);\n\t\n\t(function() {\n\t\n\t this.getNextLineIndent = function(state, line, tab) {\n\t var indent = this.$getIndent(line);\n\t\n\t if (state == \"start\") {\n\t var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n\t if (match) {\n\t indent += tab;\n\t }\n\t }\n\t\n\t return indent;\n\t };\n\t\n\t this.checkOutdent = function(state, line, input) {\n\t return this.$outdent.checkOutdent(line, input);\n\t };\n\t\n\t this.autoOutdent = function(state, doc, row) {\n\t this.$outdent.autoOutdent(doc, row);\n\t };\n\t\n\t this.createWorker = function(session) {\n\t var worker = new WorkerClient([\"ace\"], __webpack_require__(47), \"JsonWorker\");\n\t worker.attachToDocument(session.getDocument());\n\t\n\t worker.on(\"annotate\", function(e) {\n\t session.setAnnotations(e.data);\n\t });\n\t\n\t worker.on(\"terminate\", function() {\n\t session.clearAnnotations();\n\t });\n\t\n\t return worker;\n\t };\n\t\n\t\n\t this.$id = \"ace/mode/json\";\n\t}).call(Mode.prototype);\n\t\n\texports.Mode = Mode;\n\t});\n\n\n/***/ },\n/* 47 */\n/***/ function(module, exports) {\n\n\tmodule.exports.id = 'ace/mode/json_worker';\n\tmodule.exports.src = \"\\\"no use strict\\\";(function(window){function resolveModuleId(id,paths){for(var testPath=id,tail=\\\"\\\";testPath;){var alias=paths[testPath];if(\\\"string\\\"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\\\/*$/,\\\"/\\\")+(tail||alias.main||alias.name);if(alias===!1)return\\\"\\\";var i=testPath.lastIndexOf(\\\"/\\\");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:\\\"log\\\",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:\\\"error\\\",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf(\\\"!\\\")){var chunks=moduleName.split(\\\"!\\\");return window.normalizeModule(parentId,chunks[0])+\\\"!\\\"+window.normalizeModule(parentId,chunks[1])}if(\\\".\\\"==moduleName.charAt(0)){var base=parentId.split(\\\"/\\\").slice(0,-1).join(\\\"/\\\");for(moduleName=(base?base+\\\"/\\\":\\\"\\\")+moduleName;-1!==moduleName.indexOf(\\\".\\\")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\\\.\\\\//,\\\"\\\").replace(/\\\\/\\\\.\\\\//,\\\"/\\\").replace(/[^\\\\/]+\\\\/\\\\.\\\\.\\\\//,\\\"\\\")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error(\\\"worker.js acequire() accepts only (parentId, id) as arguments\\\");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log(\\\"unable to load \\\"+id);var path=resolveModuleId(id,window.acequire.tlns);return\\\".js\\\"!=path.slice(-3)&&(path+=\\\".js\\\"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,\\\"string\\\"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),\\\"function\\\"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=[\\\"require\\\",\\\"exports\\\",\\\"module\\\"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case\\\"require\\\":return req;case\\\"exports\\\":return module.exports;case\\\"module\\\":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire(\\\"ace/lib/event_emitter\\\").EventEmitter,oop=window.acequire(\\\"ace/lib/oop\\\"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:\\\"call\\\",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:\\\"event\\\",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error(\\\"Unknown command:\\\"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire(\\\"ace/lib/es5-shim\\\"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}})(this),ace.define(\\\"ace/lib/oop\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define(\\\"ace/range\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return\\\"Range: [\\\"+this.start.row+\\\"/\\\"+this.start.column+\\\"] -> [\\\"+this.end.row+\\\"/\\\"+this.end.column+\\\"]\\\"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){\\\"object\\\"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){\\\"object\\\"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define(\\\"ace/apply_delta\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||\\\"\\\";switch(delta.action){case\\\"insert\\\":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case\\\"remove\\\":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define(\\\"ace/lib/event_emitter\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){\\\"object\\\"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?\\\"unshift\\\":\\\"push\\\"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define(\\\"ace/anchor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/event_emitter\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"./lib/oop\\\"),EventEmitter=acequire(\\\"./lib/event_emitter\\\").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal(\\\"change\\\",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener(\\\"change\\\",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on(\\\"change\\\",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define(\\\"ace/document\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/apply_delta\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/range\\\",\\\"ace/anchor\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"./lib/oop\\\"),applyDelta=acequire(\\\"./apply_delta\\\").applyDelta,EventEmitter=acequire(\\\"./lib/event_emitter\\\").EventEmitter,Range=acequire(\\\"./range\\\").Range,Anchor=acequire(\\\"./anchor\\\").Anchor,Document=function(textOrLines){this.$lines=[\\\"\\\"],0===textOrLines.length?this.$lines=[\\\"\\\"]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0===\\\"aaa\\\".split(/a/).length?function(text){return text.replace(/\\\\r\\\\n|\\\\r/g,\\\"\\\\n\\\").split(\\\"\\\\n\\\")}:function(text){return text.split(/\\\\r\\\\n|\\\\r|\\\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\\\r\\\\n|\\\\r|\\\\n)/m);this.$autoNewLine=match?match[1]:\\\"\\\\n\\\",this._signal(\\\"changeNewLineMode\\\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\\\"windows\\\":return\\\"\\\\r\\\\n\\\";case\\\"unix\\\":return\\\"\\\\n\\\";default:return this.$autoNewLine||\\\"\\\\n\\\"}},this.$autoNewLine=\\\"\\\",this.$newLineMode=\\\"auto\\\",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal(\\\"changeNewLineMode\\\"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return\\\"\\\\r\\\\n\\\"==text||\\\"\\\\r\\\"==text||\\\"\\\\n\\\"==text},this.getLine=function(row){return this.$lines[row]||\\\"\\\"},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||\\\"\\\").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn(\\\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\\\"),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn(\\\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\\\"),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn(\\\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\\\"),this.insertMergedLines(position,[\\\"\\\",\\\"\\\"])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:\\\"insert\\\",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([\\\"\\\"]),column=0):(lines=[\\\"\\\"].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:\\\"insert\\\",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:\\\"remove\\\",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:\\\"remove\\\",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:\\\"remove\\\",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:\\\"remove\\\",lines:[\\\"\\\",\\\"\\\"]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert=\\\"insert\\\"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal(\\\"change\\\",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(\\\"\\\"),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:\\\"insert\\\"==delta.action?\\\"remove\\\":\\\"insert\\\",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define(\\\"ace/lib/lang\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split(\\\"\\\").reverse().join(\\\"\\\")},exports.stringRepeat=function(string,count){for(var result=\\\"\\\";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\\\s\\\\s*/,trimEndRegexp=/\\\\s\\\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,\\\"\\\")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,\\\"\\\")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&\\\"object\\\"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if(\\\"object\\\"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}var cons=obj.constructor;if(cons===RegExp)return obj;copy=cons();for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\\\]\\\\/\\\\\\\\])/g,\\\"\\\\\\\\$1\\\")},exports.escapeHTML=function(str){return str.replace(/&/g,\\\"&\\\").replace(/\\\"/g,\\\""\\\").replace(/'/g,\\\"'\\\").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:\\\"insert\\\",start:data[i],lines:data[i+1]};else var d={action:\\\"remove\\\",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define(\\\"ace/mode/json/json_parse\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(){\\\"use strict\\\";var at,ch,text,value,escapee={'\\\"':'\\\"',\\\"\\\\\\\\\\\":\\\"\\\\\\\\\\\",\\\"/\\\":\\\"/\\\",b:\\\"\\\\b\\\",f:\\\"\\\\f\\\",n:\\\"\\\\n\\\",r:\\\"\\\\r\\\",t:\\\"\\t\\\"},error=function(m){throw{name:\\\"SyntaxError\\\",message:m,at:at,text:text}},next=function(c){return c&&c!==ch&&error(\\\"Expected '\\\"+c+\\\"' instead of '\\\"+ch+\\\"'\\\"),ch=text.charAt(at),at+=1,ch},number=function(){var number,string=\\\"\\\";for(\\\"-\\\"===ch&&(string=\\\"-\\\",next(\\\"-\\\"));ch>=\\\"0\\\"&&\\\"9\\\">=ch;)string+=ch,next();if(\\\".\\\"===ch)for(string+=\\\".\\\";next()&&ch>=\\\"0\\\"&&\\\"9\\\">=ch;)string+=ch;if(\\\"e\\\"===ch||\\\"E\\\"===ch)for(string+=ch,next(),(\\\"-\\\"===ch||\\\"+\\\"===ch)&&(string+=ch,next());ch>=\\\"0\\\"&&\\\"9\\\">=ch;)string+=ch,next();return number=+string,isNaN(number)?(error(\\\"Bad number\\\"),void 0):number},string=function(){var hex,i,uffff,string=\\\"\\\";if('\\\"'===ch)for(;next();){if('\\\"'===ch)return next(),string;if(\\\"\\\\\\\\\\\"===ch)if(next(),\\\"u\\\"===ch){for(uffff=0,i=0;4>i&&(hex=parseInt(next(),16),isFinite(hex));i+=1)uffff=16*uffff+hex;string+=String.fromCharCode(uffff)}else{if(\\\"string\\\"!=typeof escapee[ch])break;string+=escapee[ch]}else string+=ch}error(\\\"Bad string\\\")},white=function(){for(;ch&&\\\" \\\">=ch;)next()},word=function(){switch(ch){case\\\"t\\\":return next(\\\"t\\\"),next(\\\"r\\\"),next(\\\"u\\\"),next(\\\"e\\\"),!0;case\\\"f\\\":return next(\\\"f\\\"),next(\\\"a\\\"),next(\\\"l\\\"),next(\\\"s\\\"),next(\\\"e\\\"),!1;case\\\"n\\\":return next(\\\"n\\\"),next(\\\"u\\\"),next(\\\"l\\\"),next(\\\"l\\\"),null}error(\\\"Unexpected '\\\"+ch+\\\"'\\\")},array=function(){var array=[];if(\\\"[\\\"===ch){if(next(\\\"[\\\"),white(),\\\"]\\\"===ch)return next(\\\"]\\\"),array;for(;ch;){if(array.push(value()),white(),\\\"]\\\"===ch)return next(\\\"]\\\"),array;next(\\\",\\\"),white()}}error(\\\"Bad array\\\")},object=function(){var key,object={};if(\\\"{\\\"===ch){if(next(\\\"{\\\"),white(),\\\"}\\\"===ch)return next(\\\"}\\\"),object;for(;ch;){if(key=string(),white(),next(\\\":\\\"),Object.hasOwnProperty.call(object,key)&&error('Duplicate key \\\"'+key+'\\\"'),object[key]=value(),white(),\\\"}\\\"===ch)return next(\\\"}\\\"),object;next(\\\",\\\"),white()}}error(\\\"Bad object\\\")};return value=function(){switch(white(),ch){case\\\"{\\\":return object();case\\\"[\\\":return array();case'\\\"':return string();case\\\"-\\\":return number();default:return ch>=\\\"0\\\"&&\\\"9\\\">=ch?number():word()}},function(source,reviver){var result;return text=source,at=0,ch=\\\" \\\",result=value(),white(),ch&&error(\\\"Syntax error\\\"),\\\"function\\\"==typeof reviver?function walk(holder,key){var k,v,value=holder[key];if(value&&\\\"object\\\"==typeof value)for(k in value)Object.hasOwnProperty.call(value,k)&&(v=walk(value,k),void 0!==v?value[k]=v:delete value[k]);return reviver.call(holder,key,value)}({\\\"\\\":result},\\\"\\\"):result}}),ace.define(\\\"ace/mode/json_worker\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/worker/mirror\\\",\\\"ace/mode/json/json_parse\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"../lib/oop\\\"),Mirror=acequire(\\\"../worker/mirror\\\").Mirror,parse=acequire(\\\"./json/json_parse\\\"),JsonWorker=exports.JsonWorker=function(sender){Mirror.call(this,sender),this.setTimeout(200)};oop.inherits(JsonWorker,Mirror),function(){this.onUpdate=function(){var value=this.doc.getValue(),errors=[];try{value&&parse(value)}catch(e){var pos=this.doc.indexToPosition(e.at-1);errors.push({row:pos.row,column:pos.column,text:e.message,type:\\\"error\\\"})}this.sender.emit(\\\"annotate\\\",errors)}}.call(JsonWorker.prototype)}),ace.define(\\\"ace/lib/es5-shim\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,\\\"sentinel\\\",{}),\\\"sentinel\\\"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if(\\\"function\\\"!=typeof target)throw new TypeError(\\\"Function.prototype.bind called on incompatible \\\"+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,\\\"__defineGetter__\\\"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,\\\"XXX\\\"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0\\n}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return\\\"[object Array]\\\"==_toString(obj)});var boxedString=Object(\\\"a\\\"),splitString=\\\"a\\\"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,thisp=arguments[1],i=-1,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,result=[],thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");if(!length&&1==arguments.length)throw new TypeError(\\\"reduce of empty array with no initial value\\\");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError(\\\"reduce of empty array with no initial value\\\")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");if(!length&&1==arguments.length)throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError(\\\"reduceRight of empty array with no initial value\\\")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT=\\\"Object.getOwnPropertyDescriptor called on a non-object: \\\";Object.getOwnPropertyDescriptor=function(object,property){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if(\\\"object\\\"!=typeof prototype)throw new TypeError(\\\"typeof prototype[\\\"+typeof prototype+\\\"] != 'object'\\\");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom=\\\"undefined\\\"==typeof document||doesDefinePropertyWork(document.createElement(\\\"div\\\"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR=\\\"Property description must be an object: \\\",ERR_NON_OBJECT_TARGET=\\\"Object.defineProperty called on non-object: \\\",ERR_ACCESSORS_NOT_SUPPORTED=\\\"getters & setters can not be defined on this javascript engine\\\";Object.defineProperty=function(object,property,descriptor){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if(\\\"object\\\"!=typeof descriptor&&\\\"function\\\"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,\\\"value\\\"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,\\\"get\\\")&&defineGetter(object,property,descriptor.get),owns(descriptor,\\\"set\\\")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return\\\"function\\\"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name=\\\"\\\";owns(object,name);)name+=\\\"?\\\";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=[\\\"toString\\\",\\\"toLocaleString\\\",\\\"valueOf\\\",\\\"hasOwnProperty\\\",\\\"isPrototypeOf\\\",\\\"propertyIsEnumerable\\\",\\\"constructor\\\"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(\\\"Object.keys called on a non-object\\\");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws=\\\"\\t\\\\n\\u000b\\\\f\\\\r   ᠎              \\\\u2028\\\\u2029\\\";if(!String.prototype.trim||ws.trim()){ws=\\\"[\\\"+ws+\\\"]\\\";var trimBeginRegexp=RegExp(\\\"^\\\"+ws+ws+\\\"*\\\"),trimEndRegexp=RegExp(ws+ws+\\\"*$\\\");String.prototype.trim=function(){return(this+\\\"\\\").replace(trimBeginRegexp,\\\"\\\").replace(trimEndRegexp,\\\"\\\")}}var toObject=function(o){if(null==o)throw new TypeError(\\\"can't convert \\\"+o+\\\" to object\\\");return Object(o)}});\";\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(49)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \"div.jsoneditor .jsoneditor-search input{height:auto;border:inherit}div.jsoneditor .jsoneditor-search input:focus{border:none!important;box-shadow:none!important}div.jsoneditor table{border-collapse:collapse;width:auto}div.jsoneditor td,div.jsoneditor th{padding:0;display:table-cell;text-align:left;vertical-align:inherit;border-radius:inherit}div.jsoneditor-field,div.jsoneditor-readonly,div.jsoneditor-value{border:1px solid transparent;min-height:16px;min-width:32px;padding:2px;margin:1px;word-wrap:break-word;float:left}div.jsoneditor-field p,div.jsoneditor-value p{margin:0}div.jsoneditor-value{word-break:break-word}div.jsoneditor-readonly{min-width:16px;color:gray}div.jsoneditor-empty{border-color:#d3d3d3;border-style:dashed;border-radius:2px}div.jsoneditor-field.jsoneditor-empty:after,div.jsoneditor-value.jsoneditor-empty:after{pointer-events:none;color:#d3d3d3;font-size:8pt}div.jsoneditor-field.jsoneditor-empty:after{content:\\\"field\\\"}div.jsoneditor-value.jsoneditor-empty:after{content:\\\"value\\\"}a.jsoneditor-value.jsoneditor-url,div.jsoneditor-value.jsoneditor-url{color:green;text-decoration:underline}a.jsoneditor-value.jsoneditor-url{display:inline-block;padding:2px;margin:2px}a.jsoneditor-value.jsoneditor-url:focus,a.jsoneditor-value.jsoneditor-url:hover{color:#ee422e}div.jsoneditor td.jsoneditor-separator{padding:3px 0;vertical-align:top;color:gray}div.jsoneditor-field.jsoneditor-highlight,div.jsoneditor-field[contenteditable=true]:focus,div.jsoneditor-field[contenteditable=true]:hover,div.jsoneditor-value.jsoneditor-highlight,div.jsoneditor-value[contenteditable=true]:focus,div.jsoneditor-value[contenteditable=true]:hover{background-color:#ffffab;border:1px solid #ff0;border-radius:2px}div.jsoneditor-field.jsoneditor-highlight-active,div.jsoneditor-field.jsoneditor-highlight-active:focus,div.jsoneditor-field.jsoneditor-highlight-active:hover,div.jsoneditor-value.jsoneditor-highlight-active,div.jsoneditor-value.jsoneditor-highlight-active:focus,div.jsoneditor-value.jsoneditor-highlight-active:hover{background-color:#fe0;border:1px solid #ffc700;border-radius:2px}div.jsoneditor-value.jsoneditor-string{color:green}div.jsoneditor-value.jsoneditor-array,div.jsoneditor-value.jsoneditor-object{min-width:16px;color:gray}div.jsoneditor-value.jsoneditor-number{color:#ee422e}div.jsoneditor-value.jsoneditor-boolean{color:#ff8c00}div.jsoneditor-value.jsoneditor-null{color:#004ed0}div.jsoneditor-value.jsoneditor-invalid{color:#000}div.jsoneditor-tree button{width:24px;height:24px;padding:0;margin:0;border:none;cursor:pointer;background:transparent url(\" + __webpack_require__(1) + \")}div.jsoneditor-mode-form tr.jsoneditor-expandable td.jsoneditor-tree,div.jsoneditor-mode-view tr.jsoneditor-expandable td.jsoneditor-tree{cursor:pointer}div.jsoneditor-tree button.jsoneditor-collapsed{background-position:0 -48px}div.jsoneditor-tree button.jsoneditor-expanded{background-position:0 -72px}div.jsoneditor-tree button.jsoneditor-contextmenu{background-position:-48px -72px}div.jsoneditor-tree button.jsoneditor-contextmenu.jsoneditor-selected,div.jsoneditor-tree button.jsoneditor-contextmenu:focus,div.jsoneditor-tree button.jsoneditor-contextmenu:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu{background-position:-48px -48px}div.jsoneditor-tree :focus{outline:none}div.jsoneditor-tree button:focus{background-color:#f5f5f5;outline:1px solid #e5e5e5}div.jsoneditor-tree button.jsoneditor-invisible{visibility:hidden;background:none}div.jsoneditor{color:#1a1a1a;border:1px solid #3883fa;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;overflow:hidden;position:relative;padding:0;line-height:100%}div.jsoneditor-tree table.jsoneditor-tree{border-collapse:collapse;border-spacing:0;width:100%;margin:0}div.jsoneditor-outer{position:static;width:100%;height:100%;margin:-35px 0 0;padding:35px 0 0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.ace-jsoneditor,textarea.jsoneditor-text{min-height:150px}div.jsoneditor-tree{width:100%;height:100%;position:relative;overflow:auto}textarea.jsoneditor-text{width:100%;height:100%;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;outline-width:0;border:none;background-color:#fff;resize:none}tr.jsoneditor-highlight,tr.jsoneditor-selected{background-color:#e6e6e6}tr.jsoneditor-selected button.jsoneditor-contextmenu,tr.jsoneditor-selected button.jsoneditor-dragarea{visibility:hidden}tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{visibility:visible}div.jsoneditor-tree button.jsoneditor-dragarea{background:url(\" + __webpack_require__(1) + \") -72px -72px;cursor:move}div.jsoneditor-tree button.jsoneditor-dragarea:focus,div.jsoneditor-tree button.jsoneditor-dragarea:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{background-position:-72px -48px}div.jsoneditor td,div.jsoneditor th,div.jsoneditor tr{padding:0;margin:0}div.jsoneditor td,div.jsoneditor td.jsoneditor-tree{vertical-align:top}.jsoneditor-schema-error,div.jsoneditor-field,div.jsoneditor-value,div.jsoneditor td,div.jsoneditor textarea,div.jsoneditor th{font-family:droid sans mono,consolas,monospace,courier new,courier,sans-serif;font-size:10pt;color:#1a1a1a}.jsoneditor-schema-error{cursor:default;display:inline-block;height:24px;line-height:24px;position:relative;text-align:center;width:24px}div.jsoneditor-tree .jsoneditor-schema-error{width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(\" + __webpack_require__(1) + \") -168px -48px}.jsoneditor-schema-error .jsoneditor-popover{background-color:#4c4c4c;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.4);color:#fff;display:none;padding:7px 10px;position:absolute;width:200px;z-index:4}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above{bottom:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below{top:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left{top:-7px;right:32px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right{top:-7px;left:32px}.jsoneditor-schema-error .jsoneditor-popover:before{border-right:7px solid transparent;border-left:7px solid transparent;content:\\\"\\\";display:block;left:50%;margin-left:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above:before{border-top:7px solid #4c4c4c;bottom:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below:before{border-bottom:7px solid #4c4c4c;top:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before{border-left:7px solid #4c4c4c;right:-14px;left:inherit}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before,.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-top:7px solid transparent;border-bottom:7px solid transparent;content:\\\"\\\";top:19px;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-right:7px solid #4c4c4c;left:-14px}.jsoneditor-schema-error:focus .jsoneditor-popover,.jsoneditor-schema-error:hover .jsoneditor-popover{display:block;-webkit-animation:fade-in .3s linear 1,move-up .3s linear 1;-moz-animation:fade-in .3s linear 1,move-up .3s linear 1;-ms-animation:fade-in .3s linear 1,move-up .3s linear 1}@-webkit-keyframes fade-in{0%{opacity:0}to{opacity:1}}@-moz-keyframes fade-in{0%{opacity:0}to{opacity:1}}@-ms-keyframes fade-in{0%{opacity:0}to{opacity:1}}.jsoneditor .jsoneditor-text-errors{width:100%;border-collapse:collapse;background-color:#ffef8b;border-top:1px solid gold}.jsoneditor .jsoneditor-text-errors td{padding:3px 6px;vertical-align:middle}.jsoneditor-text-errors .jsoneditor-schema-error{border:none;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(\" + __webpack_require__(1) + \") -168px -48px}div.jsoneditor-contextmenu-root{position:relative;width:0;height:0}div.jsoneditor-contextmenu{position:absolute;box-sizing:content-box;z-index:99999}div.jsoneditor-contextmenu li,div.jsoneditor-contextmenu ul{box-sizing:content-box}div.jsoneditor-contextmenu ul{position:relative;left:0;top:0;width:124px;background:#fff;border:1px solid #d3d3d3;box-shadow:2px 2px 12px hsla(0,0%,50%,.3);list-style:none;margin:0;padding:0}div.jsoneditor-contextmenu ul li button{padding:0;margin:0;width:124px;height:24px;border:none;cursor:pointer;color:#4d4d4d;background:transparent;font-size:10pt;font-family:arial,sans-serif;box-sizing:border-box;line-height:26px;text-align:left}div.jsoneditor-contextmenu ul li button::-moz-focus-inner{padding:0;border:0}div.jsoneditor-contextmenu ul li button:focus,div.jsoneditor-contextmenu ul li button:hover{color:#1a1a1a;background-color:#f5f5f5;outline:none}div.jsoneditor-contextmenu ul li button.jsoneditor-default{width:92px}div.jsoneditor-contextmenu ul li button.jsoneditor-expand{float:right;width:32px;height:24px;border-left:1px solid #e5e5e5}div.jsoneditor-contextmenu div.jsoneditor-icon{float:left;width:24px;height:24px;border:none;padding:0;margin:0;background-image:url(\" + __webpack_require__(1) + \")}div.jsoneditor-contextmenu ul li button div.jsoneditor-expand{float:right;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(\" + __webpack_require__(1) + \") 0 -72px;opacity:.4}div.jsoneditor-contextmenu ul li.jsoneditor-selected div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button.jsoneditor-expand:focus div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button.jsoneditor-expand:hover div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button:focus div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button:hover div.jsoneditor-expand{opacity:1}div.jsoneditor-contextmenu div.jsoneditor-separator{height:0;border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}div.jsoneditor-contextmenu button.jsoneditor-remove>div.jsoneditor-icon{background-position:-24px -24px}div.jsoneditor-contextmenu button.jsoneditor-remove:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-remove:hover>div.jsoneditor-icon{background-position:-24px 0}div.jsoneditor-contextmenu button.jsoneditor-append>div.jsoneditor-icon{background-position:0 -24px}div.jsoneditor-contextmenu button.jsoneditor-append:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-append:hover>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-insert>div.jsoneditor-icon{background-position:0 -24px}div.jsoneditor-contextmenu button.jsoneditor-insert:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-insert:hover>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-duplicate>div.jsoneditor-icon{background-position:-48px -24px}div.jsoneditor-contextmenu button.jsoneditor-duplicate:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-duplicate:hover>div.jsoneditor-icon{background-position:-48px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-asc>div.jsoneditor-icon{background-position:-168px -24px}div.jsoneditor-contextmenu button.jsoneditor-sort-asc:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-sort-asc:hover>div.jsoneditor-icon{background-position:-168px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-desc>div.jsoneditor-icon{background-position:-192px -24px}div.jsoneditor-contextmenu button.jsoneditor-sort-desc:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-sort-desc:hover>div.jsoneditor-icon{background-position:-192px 0}div.jsoneditor-contextmenu ul li button.jsoneditor-selected,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover{color:#fff;background-color:#ee422e}div.jsoneditor-contextmenu ul li{overflow:hidden}div.jsoneditor-contextmenu ul li ul{display:none;position:relative;left:-10px;top:0;border:none;box-shadow:inset 0 0 10px hsla(0,0%,50%,.5);padding:0 10px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}div.jsoneditor-contextmenu ul li ul li button{padding-left:24px;animation:all ease-in-out 1s}div.jsoneditor-contextmenu ul li ul li button:focus,div.jsoneditor-contextmenu ul li ul li button:hover{background-color:#f5f5f5}div.jsoneditor-contextmenu button.jsoneditor-type-string>div.jsoneditor-icon{background-position:-144px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-string.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-string:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-string:hover>div.jsoneditor-icon{background-position:-144px 0}div.jsoneditor-contextmenu button.jsoneditor-type-auto>div.jsoneditor-icon{background-position:-120px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-auto.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-auto:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-auto:hover>div.jsoneditor-icon{background-position:-120px 0}div.jsoneditor-contextmenu button.jsoneditor-type-object>div.jsoneditor-icon{background-position:-72px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-object.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-object:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-object:hover>div.jsoneditor-icon{background-position:-72px 0}div.jsoneditor-contextmenu button.jsoneditor-type-array>div.jsoneditor-icon{background-position:-96px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-array.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-array:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-array:hover>div.jsoneditor-icon{background-position:-96px 0}div.jsoneditor-contextmenu button.jsoneditor-type-modes>div.jsoneditor-icon{background-image:none;width:6px}div.jsoneditor-menu{width:100%;height:35px;padding:2px;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-color:#3883fa;border-bottom:1px solid #3883fa}div.jsoneditor-menu>button,div.jsoneditor-menu>div.jsoneditor-modes>button{width:26px;height:26px;margin:2px;padding:0;border-radius:2px;border:1px solid transparent;background:transparent url(\" + __webpack_require__(1) + \");color:#fff;opacity:.8;font-family:arial,sans-serif;font-size:10pt;float:left}div.jsoneditor-menu>button:hover,div.jsoneditor-menu>div.jsoneditor-modes>button:hover{background-color:hsla(0,0%,100%,.2);border:1px solid hsla(0,0%,100%,.4)}div.jsoneditor-menu>button:active,div.jsoneditor-menu>button:focus,div.jsoneditor-menu>div.jsoneditor-modes>button:active,div.jsoneditor-menu>div.jsoneditor-modes>button:focus{background-color:hsla(0,0%,100%,.3)}div.jsoneditor-menu>button:disabled,div.jsoneditor-menu>div.jsoneditor-modes>button:disabled{opacity:.5}div.jsoneditor-menu>button.jsoneditor-collapse-all{background-position:0 -96px}div.jsoneditor-menu>button.jsoneditor-expand-all{background-position:0 -120px}div.jsoneditor-menu>button.jsoneditor-undo{background-position:-24px -96px}div.jsoneditor-menu>button.jsoneditor-undo:disabled{background-position:-24px -120px}div.jsoneditor-menu>button.jsoneditor-redo{background-position:-48px -96px}div.jsoneditor-menu>button.jsoneditor-redo:disabled{background-position:-48px -120px}div.jsoneditor-menu>button.jsoneditor-compact{background-position:-72px -96px}div.jsoneditor-menu>button.jsoneditor-format{background-position:-72px -120px}div.jsoneditor-menu>div.jsoneditor-modes{display:inline-block;float:left}div.jsoneditor-menu>div.jsoneditor-modes>button{background-image:none;width:auto;padding-left:6px;padding-right:6px}div.jsoneditor-menu>button.jsoneditor-separator,div.jsoneditor-menu>div.jsoneditor-modes>button.jsoneditor-separator{margin-left:10px}div.jsoneditor-menu a{font-family:arial,sans-serif;font-size:10pt;color:#fff;opacity:.8;vertical-align:middle}div.jsoneditor-menu a:hover{opacity:1}div.jsoneditor-menu a.jsoneditor-poweredBy{font-size:8pt;position:absolute;right:0;top:0;padding:10px}table.jsoneditor-search div.jsoneditor-results,table.jsoneditor-search input{font-family:arial,sans-serif;font-size:10pt;color:#1a1a1a;background:transparent}table.jsoneditor-search div.jsoneditor-results{color:#fff;padding-right:5px;line-height:24px}table.jsoneditor-search{position:absolute;right:4px;top:4px;border-collapse:collapse;border-spacing:0}table.jsoneditor-search div.jsoneditor-frame{border:1px solid transparent;background-color:#fff;padding:0 2px;margin:0}table.jsoneditor-search div.jsoneditor-frame table{border-collapse:collapse}table.jsoneditor-search input{width:120px;border:none;outline:none;margin:1px;line-height:20px}table.jsoneditor-search button{width:16px;height:24px;padding:0;margin:0;border:none;background:url(\" + __webpack_require__(1) + \");vertical-align:top}table.jsoneditor-search button:hover{background-color:transparent}table.jsoneditor-search button.jsoneditor-refresh{width:18px;background-position:-99px -73px}table.jsoneditor-search button.jsoneditor-next{cursor:pointer;background-position:-124px -73px}table.jsoneditor-search button.jsoneditor-next:hover{background-position:-124px -49px}table.jsoneditor-search button.jsoneditor-previous{cursor:pointer;background-position:-148px -73px;margin-right:2px}table.jsoneditor-search button.jsoneditor-previous:hover{background-position:-148px -49px}\", \"\"]);\n\t\n\t// exports\n\n\n/***/ },\n/* 49 */\n/***/ function(module, exports) {\n\n\t/*\r\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\t\tAuthor Tobias Koppers @sokra\r\n\t*/\r\n\t// css base code, injected by the css-loader\r\n\tmodule.exports = function() {\r\n\t\tvar list = [];\r\n\t\r\n\t\t// return the list of modules as css string\r\n\t\tlist.toString = function toString() {\r\n\t\t\tvar result = [];\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar item = this[i];\r\n\t\t\t\tif(item[2]) {\r\n\t\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult.push(item[1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result.join(\"\");\r\n\t\t};\r\n\t\r\n\t\t// import a list of modules into the list\r\n\t\tlist.i = function(modules, mediaQuery) {\r\n\t\t\tif(typeof modules === \"string\")\r\n\t\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\t\tvar alreadyImportedModules = {};\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar id = this[i][0];\r\n\t\t\t\tif(typeof id === \"number\")\r\n\t\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t\t}\r\n\t\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\t\tvar item = modules[i];\r\n\t\t\t\t// skip already imported module\r\n\t\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t\t// when a module is imported multiple times with different media queries.\r\n\t\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlist.push(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn list;\r\n\t};\r\n\n\n/***/ },\n/* 50 */\n/***/ function(module, exports) {\n\n\t/*\r\n\t * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license\r\n\t * Author: Jim Palmer (based on chunking idea from Dave Koelle)\r\n\t */\r\n\t/*jshint unused:false */\r\n\tmodule.exports = function naturalSort (a, b) {\r\n\t\t\"use strict\";\r\n\t\tvar re = /(^([+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi,\r\n\t\t\tsre = /(^[ ]*|[ ]*$)/g,\r\n\t\t\tdre = /(^([\\w ]+,?[\\w ]+)?[\\w ]+,?[\\w ]+\\d+:\\d+(:\\d+)?[\\w ]?|^\\d{1,4}[\\/\\-]\\d{1,4}[\\/\\-]\\d{1,4}|^\\w+, \\w+ \\d+, \\d{4})/,\r\n\t\t\thre = /^0x[0-9a-f]+$/i,\r\n\t\t\tore = /^0/,\r\n\t\t\ti = function(s) { return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; },\r\n\t\t\t// convert all to strings strip whitespace\r\n\t\t\tx = i(a).replace(sre, '') || '',\r\n\t\t\ty = i(b).replace(sre, '') || '',\r\n\t\t\t// chunk/tokenize\r\n\t\t\txN = x.replace(re, '\\0$1\\0').replace(/\\0$/,'').replace(/^\\0/,'').split('\\0'),\r\n\t\t\tyN = y.replace(re, '\\0$1\\0').replace(/\\0$/,'').replace(/^\\0/,'').split('\\0'),\r\n\t\t\t// numeric, hex or date detection\r\n\t\t\txD = parseInt(x.match(hre), 16) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),\r\n\t\t\tyD = parseInt(y.match(hre), 16) || xD && y.match(dre) && Date.parse(y) || null,\r\n\t\t\toFxNcL, oFyNcL;\r\n\t\t// first try and sort Hex codes or Dates\r\n\t\tif (yD) {\r\n\t\t\tif ( xD < yD ) { return -1; }\r\n\t\t\telse if ( xD > yD ) { return 1; }\r\n\t\t}\r\n\t\t// natural sorting through split numeric strings and default strings\r\n\t\tfor(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {\r\n\t\t\t// find floats not starting with '0', string or 0 if not defined (Clint Priest)\r\n\t\t\toFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;\r\n\t\t\toFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;\r\n\t\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\r\n\t\t\tif (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }\r\n\t\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\r\n\t\t\telse if (typeof oFxNcL !== typeof oFyNcL) {\r\n\t\t\t\toFxNcL += '';\r\n\t\t\t\toFyNcL += '';\r\n\t\t\t}\r\n\t\t\tif (oFxNcL < oFyNcL) { return -1; }\r\n\t\t\tif (oFxNcL > oFyNcL) { return 1; }\r\n\t\t}\r\n\t\treturn 0;\r\n\t};\r\n\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(54);\n\n\n/***/ },\n/* 52 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * The highlighter can highlight/unhighlight a node, and\n\t * animate the visibility of a context menu.\n\t * @constructor Highlighter\n\t */\n\tfunction Highlighter () {\n\t this.locked = false;\n\t}\n\t\n\t/**\n\t * Hightlight given node and its childs\n\t * @param {Node} node\n\t */\n\tHighlighter.prototype.highlight = function (node) {\n\t if (this.locked) {\n\t return;\n\t }\n\t\n\t if (this.node != node) {\n\t // unhighlight current node\n\t if (this.node) {\n\t this.node.setHighlight(false);\n\t }\n\t\n\t // highlight new node\n\t this.node = node;\n\t this.node.setHighlight(true);\n\t }\n\t\n\t // cancel any current timeout\n\t this._cancelUnhighlight();\n\t};\n\t\n\t/**\n\t * Unhighlight currently highlighted node.\n\t * Will be done after a delay\n\t */\n\tHighlighter.prototype.unhighlight = function () {\n\t if (this.locked) {\n\t return;\n\t }\n\t\n\t var me = this;\n\t if (this.node) {\n\t this._cancelUnhighlight();\n\t\n\t // do the unhighlighting after a small delay, to prevent re-highlighting\n\t // the same node when moving from the drag-icon to the contextmenu-icon\n\t // or vice versa.\n\t this.unhighlightTimer = setTimeout(function () {\n\t me.node.setHighlight(false);\n\t me.node = undefined;\n\t me.unhighlightTimer = undefined;\n\t }, 0);\n\t }\n\t};\n\t\n\t/**\n\t * Cancel an unhighlight action (if before the timeout of the unhighlight action)\n\t * @private\n\t */\n\tHighlighter.prototype._cancelUnhighlight = function () {\n\t if (this.unhighlightTimer) {\n\t clearTimeout(this.unhighlightTimer);\n\t this.unhighlightTimer = undefined;\n\t }\n\t};\n\t\n\t/**\n\t * Lock highlighting or unhighlighting nodes.\n\t * methods highlight and unhighlight do not work while locked.\n\t */\n\tHighlighter.prototype.lock = function () {\n\t this.locked = true;\n\t};\n\t\n\t/**\n\t * Unlock highlighting or unhighlighting nodes\n\t */\n\tHighlighter.prototype.unlock = function () {\n\t this.locked = false;\n\t};\n\t\n\tmodule.exports = Highlighter;\n\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar util = __webpack_require__(3);\n\t\n\t/**\n\t * @constructor History\n\t * Store action history, enables undo and redo\n\t * @param {JSONEditor} editor\n\t */\n\tfunction History (editor) {\n\t this.editor = editor;\n\t this.history = [];\n\t this.index = -1;\n\t\n\t this.clear();\n\t\n\t // map with all supported actions\n\t this.actions = {\n\t 'editField': {\n\t 'undo': function (params) {\n\t params.node.updateField(params.oldValue);\n\t },\n\t 'redo': function (params) {\n\t params.node.updateField(params.newValue);\n\t }\n\t },\n\t 'editValue': {\n\t 'undo': function (params) {\n\t params.node.updateValue(params.oldValue);\n\t },\n\t 'redo': function (params) {\n\t params.node.updateValue(params.newValue);\n\t }\n\t },\n\t 'changeType': {\n\t 'undo': function (params) {\n\t params.node.changeType(params.oldType);\n\t },\n\t 'redo': function (params) {\n\t params.node.changeType(params.newType);\n\t }\n\t },\n\t\n\t 'appendNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.appendChild(node);\n\t });\n\t }\n\t },\n\t 'insertBeforeNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.insertBefore(node, params.beforeNode);\n\t });\n\t }\n\t },\n\t 'insertAfterNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t var afterNode = params.afterNode;\n\t params.nodes.forEach(function (node) {\n\t params.parent.insertAfter(params.node, afterNode);\n\t afterNode = node;\n\t });\n\t }\n\t },\n\t 'removeNodes': {\n\t 'undo': function (params) {\n\t var parent = params.parent;\n\t var beforeNode = parent.childs[params.index] || parent.append;\n\t params.nodes.forEach(function (node) {\n\t parent.insertBefore(node, beforeNode);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t }\n\t },\n\t 'duplicateNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t var afterNode = params.afterNode;\n\t params.nodes.forEach(function (node) {\n\t params.parent.insertAfter(node, afterNode);\n\t afterNode = node;\n\t });\n\t }\n\t },\n\t 'moveNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.oldBeforeNode.parent.moveBefore(node, params.oldBeforeNode);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.newBeforeNode.parent.moveBefore(node, params.newBeforeNode);\n\t });\n\t }\n\t },\n\t\n\t 'sort': {\n\t 'undo': function (params) {\n\t var node = params.node;\n\t node.hideChilds();\n\t node.sort = params.oldSort;\n\t node.childs = params.oldChilds;\n\t node.showChilds();\n\t },\n\t 'redo': function (params) {\n\t var node = params.node;\n\t node.hideChilds();\n\t node.sort = params.newSort;\n\t node.childs = params.newChilds;\n\t node.showChilds();\n\t }\n\t }\n\t\n\t // TODO: restore the original caret position and selection with each undo\n\t // TODO: implement history for actions \"expand\", \"collapse\", \"scroll\", \"setDocument\"\n\t };\n\t}\n\t\n\t/**\n\t * The method onChange is executed when the History is changed, and can\n\t * be overloaded.\n\t */\n\tHistory.prototype.onChange = function () {};\n\t\n\t/**\n\t * Add a new action to the history\n\t * @param {String} action The executed action. Available actions: \"editField\",\n\t * \"editValue\", \"changeType\", \"appendNode\",\n\t * \"removeNode\", \"duplicateNode\", \"moveNode\"\n\t * @param {Object} params Object containing parameters describing the change.\n\t * The parameters in params depend on the action (for\n\t * example for \"editValue\" the Node, old value, and new\n\t * value are provided). params contains all information\n\t * needed to undo or redo the action.\n\t */\n\tHistory.prototype.add = function (action, params) {\n\t this.index++;\n\t this.history[this.index] = {\n\t 'action': action,\n\t 'params': params,\n\t 'timestamp': new Date()\n\t };\n\t\n\t // remove redo actions which are invalid now\n\t if (this.index < this.history.length - 1) {\n\t this.history.splice(this.index + 1, this.history.length - this.index - 1);\n\t }\n\t\n\t // fire onchange event\n\t this.onChange();\n\t};\n\t\n\t/**\n\t * Clear history\n\t */\n\tHistory.prototype.clear = function () {\n\t this.history = [];\n\t this.index = -1;\n\t\n\t // fire onchange event\n\t this.onChange();\n\t};\n\t\n\t/**\n\t * Check if there is an action available for undo\n\t * @return {Boolean} canUndo\n\t */\n\tHistory.prototype.canUndo = function () {\n\t return (this.index >= 0);\n\t};\n\t\n\t/**\n\t * Check if there is an action available for redo\n\t * @return {Boolean} canRedo\n\t */\n\tHistory.prototype.canRedo = function () {\n\t return (this.index < this.history.length - 1);\n\t};\n\t\n\t/**\n\t * Undo the last action\n\t */\n\tHistory.prototype.undo = function () {\n\t if (this.canUndo()) {\n\t var obj = this.history[this.index];\n\t if (obj) {\n\t var action = this.actions[obj.action];\n\t if (action && action.undo) {\n\t action.undo(obj.params);\n\t if (obj.params.oldSelection) {\n\t this.editor.setSelection(obj.params.oldSelection);\n\t }\n\t }\n\t else {\n\t console.error(new Error('unknown action \"' + obj.action + '\"'));\n\t }\n\t }\n\t this.index--;\n\t\n\t // fire onchange event\n\t this.onChange();\n\t }\n\t};\n\t\n\t/**\n\t * Redo the last action\n\t */\n\tHistory.prototype.redo = function () {\n\t if (this.canRedo()) {\n\t this.index++;\n\t\n\t var obj = this.history[this.index];\n\t if (obj) {\n\t var action = this.actions[obj.action];\n\t if (action && action.redo) {\n\t action.redo(obj.params);\n\t if (obj.params.newSelection) {\n\t this.editor.setSelection(obj.params.newSelection);\n\t }\n\t }\n\t else {\n\t console.error(new Error('unknown action \"' + obj.action + '\"'));\n\t }\n\t }\n\t\n\t // fire onchange event\n\t this.onChange();\n\t }\n\t};\n\t\n\t/**\n\t * Destroy history\n\t */\n\tHistory.prototype.destroy = function () {\n\t this.editor = null;\n\t\n\t this.history = [];\n\t this.index = -1;\n\t};\n\t\n\tmodule.exports = History;\n\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar Ajv;\n\ttry {\n\t Ajv = __webpack_require__(18);\n\t}\n\tcatch (err) {\n\t // no problem... when we need Ajv we will throw a neat exception\n\t}\n\t\n\tvar treemode = __webpack_require__(62);\n\tvar textmode = __webpack_require__(61);\n\tvar util = __webpack_require__(3);\n\t\n\t/**\n\t * @constructor JSONEditor\n\t * @param {Element} container Container element\n\t * @param {Object} [options] Object with options. available options:\n\t * {String} mode Editor mode. Available values:\n\t * 'tree' (default), 'view',\n\t * 'form', 'text', and 'code'.\n\t * {function} onChange Callback method, triggered\n\t * on change of contents\n\t * {function} onError Callback method, triggered\n\t * when an error occurs\n\t * {Boolean} search Enable search box.\n\t * True by default\n\t * Only applicable for modes\n\t * 'tree', 'view', and 'form'\n\t * {Boolean} history Enable history (undo/redo).\n\t * True by default\n\t * Only applicable for modes\n\t * 'tree', 'view', and 'form'\n\t * {String} name Field name for the root node.\n\t * Only applicable for modes\n\t * 'tree', 'view', and 'form'\n\t * {Number} indentation Number of indentation\n\t * spaces. 4 by default.\n\t * Only applicable for\n\t * modes 'text' and 'code'\n\t * {boolean} escapeUnicode If true, unicode\n\t * characters are escaped.\n\t * false by default.\n\t * {boolean} sortObjectKeys If true, object keys are\n\t * sorted before display.\n\t * false by default.\n\t * @param {Object | undefined} json JSON object\n\t */\n\tfunction JSONEditor (container, options, json) {\n\t if (!(this instanceof JSONEditor)) {\n\t throw new Error('JSONEditor constructor called without \"new\".');\n\t }\n\t\n\t // check for unsupported browser (IE8 and older)\n\t var ieVersion = util.getInternetExplorerVersion();\n\t if (ieVersion != -1 && ieVersion < 9) {\n\t throw new Error('Unsupported browser, IE9 or newer required. ' +\n\t 'Please install the newest version of your browser.');\n\t }\n\t\n\t if (options) {\n\t // check for deprecated options\n\t if (options.error) {\n\t console.warn('Option \"error\" has been renamed to \"onError\"');\n\t options.onError = options.error;\n\t delete options.error;\n\t }\n\t if (options.change) {\n\t console.warn('Option \"change\" has been renamed to \"onChange\"');\n\t options.onChange = options.change;\n\t delete options.change;\n\t }\n\t if (options.editable) {\n\t console.warn('Option \"editable\" has been renamed to \"onEditable\"');\n\t options.onEditable = options.editable;\n\t delete options.editable;\n\t }\n\t\n\t // validate options\n\t if (options) {\n\t var VALID_OPTIONS = [\n\t 'ace', 'theme',\n\t 'ajv', 'schema',\n\t 'onChange', 'onEditable', 'onError', 'onModeChange',\n\t 'escapeUnicode', 'history', 'search', 'mode', 'modes', 'name', 'indentation', 'sortObjectKeys'\n\t ];\n\t\n\t Object.keys(options).forEach(function (option) {\n\t if (VALID_OPTIONS.indexOf(option) === -1) {\n\t console.warn('Unknown option \"' + option + '\". This option will be ignored');\n\t }\n\t });\n\t }\n\t }\n\t\n\t if (arguments.length) {\n\t this._create(container, options, json);\n\t }\n\t}\n\t\n\t/**\n\t * Configuration for all registered modes. Example:\n\t * {\n\t * tree: {\n\t * mixin: TreeEditor,\n\t * data: 'json'\n\t * },\n\t * text: {\n\t * mixin: TextEditor,\n\t * data: 'text'\n\t * }\n\t * }\n\t *\n\t * @type { Object. }\n\t */\n\tJSONEditor.modes = {};\n\t\n\t// debounce interval for JSON schema vaidation in milliseconds\n\tJSONEditor.prototype.DEBOUNCE_INTERVAL = 150;\n\t\n\t/**\n\t * Create the JSONEditor\n\t * @param {Element} container Container element\n\t * @param {Object} [options] See description in constructor\n\t * @param {Object | undefined} json JSON object\n\t * @private\n\t */\n\tJSONEditor.prototype._create = function (container, options, json) {\n\t this.container = container;\n\t this.options = options || {};\n\t this.json = json || {};\n\t\n\t var mode = this.options.mode || 'tree';\n\t this.setMode(mode);\n\t};\n\t\n\t/**\n\t * Destroy the editor. Clean up DOM, event listeners, and web workers.\n\t */\n\tJSONEditor.prototype.destroy = function () {};\n\t\n\t/**\n\t * Set JSON object in editor\n\t * @param {Object | undefined} json JSON data\n\t */\n\tJSONEditor.prototype.set = function (json) {\n\t this.json = json;\n\t};\n\t\n\t/**\n\t * Get JSON from the editor\n\t * @returns {Object} json\n\t */\n\tJSONEditor.prototype.get = function () {\n\t return this.json;\n\t};\n\t\n\t/**\n\t * Set string containing JSON for the editor\n\t * @param {String | undefined} jsonText\n\t */\n\tJSONEditor.prototype.setText = function (jsonText) {\n\t this.json = util.parse(jsonText);\n\t};\n\t\n\t/**\n\t * Get stringified JSON contents from the editor\n\t * @returns {String} jsonText\n\t */\n\tJSONEditor.prototype.getText = function () {\n\t return JSON.stringify(this.json);\n\t};\n\t\n\t/**\n\t * Set a field name for the root node.\n\t * @param {String | undefined} name\n\t */\n\tJSONEditor.prototype.setName = function (name) {\n\t if (!this.options) {\n\t this.options = {};\n\t }\n\t this.options.name = name;\n\t};\n\t\n\t/**\n\t * Get the field name for the root node.\n\t * @return {String | undefined} name\n\t */\n\tJSONEditor.prototype.getName = function () {\n\t return this.options && this.options.name;\n\t};\n\t\n\t/**\n\t * Change the mode of the editor.\n\t * JSONEditor will be extended with all methods needed for the chosen mode.\n\t * @param {String} mode Available modes: 'tree' (default), 'view', 'form',\n\t * 'text', and 'code'.\n\t */\n\tJSONEditor.prototype.setMode = function (mode) {\n\t var container = this.container;\n\t var options = util.extend({}, this.options);\n\t var oldMode = options.mode;\n\t var data;\n\t var name;\n\t\n\t options.mode = mode;\n\t var config = JSONEditor.modes[mode];\n\t if (config) {\n\t try {\n\t var asText = (config.data == 'text');\n\t name = this.getName();\n\t data = this[asText ? 'getText' : 'get'](); // get text or json\n\t\n\t this.destroy();\n\t util.clear(this);\n\t util.extend(this, config.mixin);\n\t this.create(container, options);\n\t\n\t this.setName(name);\n\t this[asText ? 'setText' : 'set'](data); // set text or json\n\t\n\t if (typeof config.load === 'function') {\n\t try {\n\t config.load.call(this);\n\t }\n\t catch (err) {\n\t console.error(err);\n\t }\n\t }\n\t\n\t if (typeof options.onModeChange === 'function' && mode !== oldMode) {\n\t try {\n\t options.onModeChange(mode, oldMode);\n\t }\n\t catch (err) {\n\t console.error(err);\n\t }\n\t }\n\t }\n\t catch (err) {\n\t this._onError(err);\n\t }\n\t }\n\t else {\n\t throw new Error('Unknown mode \"' + options.mode + '\"');\n\t }\n\t};\n\t\n\t/**\n\t * Get the current mode\n\t * @return {string}\n\t */\n\tJSONEditor.prototype.getMode = function () {\n\t return this.options.mode;\n\t};\n\t\n\t/**\n\t * Throw an error. If an error callback is configured in options.error, this\n\t * callback will be invoked. Else, a regular error is thrown.\n\t * @param {Error} err\n\t * @private\n\t */\n\tJSONEditor.prototype._onError = function(err) {\n\t if (this.options && typeof this.options.onError === 'function') {\n\t this.options.onError(err);\n\t }\n\t else {\n\t throw err;\n\t }\n\t};\n\t\n\t/**\n\t * Set a JSON schema for validation of the JSON object.\n\t * To remove the schema, call JSONEditor.setSchema(null)\n\t * @param {Object | null} schema\n\t */\n\tJSONEditor.prototype.setSchema = function (schema) {\n\t // compile a JSON schema validator if a JSON schema is provided\n\t if (schema) {\n\t var ajv;\n\t try {\n\t // grab ajv from options if provided, else create a new instance\n\t ajv = this.options.ajv || Ajv({ allErrors: true, verbose: true });\n\t\n\t }\n\t catch (err) {\n\t console.warn('Failed to create an instance of Ajv, JSON Schema validation is not available. Please use a JSONEditor bundle including Ajv, or pass an instance of Ajv as via the configuration option `ajv`.');\n\t }\n\t\n\t if (ajv) {\n\t this.validateSchema = ajv.compile(schema);\n\t\n\t // add schema to the options, so that when switching to an other mode,\n\t // the set schema is not lost\n\t this.options.schema = schema;\n\t\n\t // validate now\n\t this.validate();\n\t }\n\t\n\t this.refresh(); // update DOM\n\t }\n\t else {\n\t // remove current schema\n\t this.validateSchema = null;\n\t this.options.schema = null;\n\t this.validate(); // to clear current error messages\n\t this.refresh(); // update DOM\n\t }\n\t};\n\t\n\t/**\n\t * Validate current JSON object against the configured JSON schema\n\t * Throws an exception when no JSON schema is configured\n\t */\n\tJSONEditor.prototype.validate = function () {\n\t // must be implemented by treemode and textmode\n\t};\n\t\n\t/**\n\t * Refresh the rendered contents\n\t */\n\tJSONEditor.prototype.refresh = function () {\n\t // can be implemented by treemode and textmode\n\t};\n\t\n\t/**\n\t * Register a plugin with one ore multiple modes for the JSON Editor.\n\t *\n\t * A mode is described as an object with properties:\n\t *\n\t * - `mode: String` The name of the mode.\n\t * - `mixin: Object` An object containing the mixin functions which\n\t * will be added to the JSONEditor. Must contain functions\n\t * create, get, getText, set, and setText. May have\n\t * additional functions.\n\t * When the JSONEditor switches to a mixin, all mixin\n\t * functions are added to the JSONEditor, and then\n\t * the function `create(container, options)` is executed.\n\t * - `data: 'text' | 'json'` The type of data that will be used to load the mixin.\n\t * - `[load: function]` An optional function called after the mixin\n\t * has been loaded.\n\t *\n\t * @param {Object | Array} mode A mode object or an array with multiple mode objects.\n\t */\n\tJSONEditor.registerMode = function (mode) {\n\t var i, prop;\n\t\n\t if (util.isArray(mode)) {\n\t // multiple modes\n\t for (i = 0; i < mode.length; i++) {\n\t JSONEditor.registerMode(mode[i]);\n\t }\n\t }\n\t else {\n\t // validate the new mode\n\t if (!('mode' in mode)) throw new Error('Property \"mode\" missing');\n\t if (!('mixin' in mode)) throw new Error('Property \"mixin\" missing');\n\t if (!('data' in mode)) throw new Error('Property \"data\" missing');\n\t var name = mode.mode;\n\t if (name in JSONEditor.modes) {\n\t throw new Error('Mode \"' + name + '\" already registered');\n\t }\n\t\n\t // validate the mixin\n\t if (typeof mode.mixin.create !== 'function') {\n\t throw new Error('Required function \"create\" missing on mixin');\n\t }\n\t var reserved = ['setMode', 'registerMode', 'modes'];\n\t for (i = 0; i < reserved.length; i++) {\n\t prop = reserved[i];\n\t if (prop in mode.mixin) {\n\t throw new Error('Reserved property \"' + prop + '\" not allowed in mixin');\n\t }\n\t }\n\t\n\t JSONEditor.modes[name] = mode;\n\t }\n\t};\n\t\n\t// register tree and text modes\n\tJSONEditor.registerMode(treemode);\n\tJSONEditor.registerMode(textmode);\n\t\n\tmodule.exports = JSONEditor;\n\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar naturalSort = __webpack_require__(50);\n\tvar ContextMenu = __webpack_require__(4);\n\tvar appendNodeFactory = __webpack_require__(59);\n\tvar util = __webpack_require__(3);\n\t\n\t/**\n\t * @constructor Node\n\t * Create a new Node\n\t * @param {./treemode} editor\n\t * @param {Object} [params] Can contain parameters:\n\t * {string} field\n\t * {boolean} fieldEditable\n\t * {*} value\n\t * {String} type Can have values 'auto', 'array',\n\t * 'object', or 'string'.\n\t */\n\tfunction Node (editor, params) {\n\t /** @type {./treemode} */\n\t this.editor = editor;\n\t this.dom = {};\n\t this.expanded = false;\n\t\n\t if(params && (params instanceof Object)) {\n\t this.setField(params.field, params.fieldEditable);\n\t this.setValue(params.value, params.type);\n\t }\n\t else {\n\t this.setField('');\n\t this.setValue(null);\n\t }\n\t\n\t this._debouncedOnChangeValue = util.debounce(this._onChangeValue.bind(this), Node.prototype.DEBOUNCE_INTERVAL);\n\t this._debouncedOnChangeField = util.debounce(this._onChangeField.bind(this), Node.prototype.DEBOUNCE_INTERVAL);\n\t}\n\t\n\t// debounce interval for keyboard input in milliseconds\n\tNode.prototype.DEBOUNCE_INTERVAL = 150;\n\t\n\t/**\n\t * Determine whether the field and/or value of this node are editable\n\t * @private\n\t */\n\tNode.prototype._updateEditability = function () {\n\t this.editable = {\n\t field: true,\n\t value: true\n\t };\n\t\n\t if (this.editor) {\n\t this.editable.field = this.editor.options.mode === 'tree';\n\t this.editable.value = this.editor.options.mode !== 'view';\n\t\n\t if ((this.editor.options.mode === 'tree' || this.editor.options.mode === 'form') &&\n\t (typeof this.editor.options.onEditable === 'function')) {\n\t var editable = this.editor.options.onEditable({\n\t field: this.field,\n\t value: this.value,\n\t path: this.getPath()\n\t });\n\t\n\t if (typeof editable === 'boolean') {\n\t this.editable.field = editable;\n\t this.editable.value = editable;\n\t }\n\t else {\n\t if (typeof editable.field === 'boolean') this.editable.field = editable.field;\n\t if (typeof editable.value === 'boolean') this.editable.value = editable.value;\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Get the path of this node\n\t * @return {String[]} Array containing the path to this node\n\t */\n\tNode.prototype.getPath = function () {\n\t var node = this;\n\t var path = [];\n\t while (node) {\n\t var field = !node.parent\n\t ? undefined // do not add an (optional) field name of the root node\n\t : (node.parent.type != 'array')\n\t ? node.field\n\t : node.index;\n\t\n\t if (field !== undefined) {\n\t path.unshift(field);\n\t }\n\t node = node.parent;\n\t }\n\t return path;\n\t};\n\t\n\t/**\n\t * Find a Node from a JSON path like '.items[3].name'\n\t * @param {string} jsonPath\n\t * @return {Node | null} Returns the Node when found, returns null if not found\n\t */\n\tNode.prototype.findNode = function (jsonPath) {\n\t var path = util.parsePath(jsonPath);\n\t var node = this;\n\t while (node && path.length > 0) {\n\t var prop = path.shift();\n\t if (typeof prop === 'number') {\n\t if (node.type !== 'array') {\n\t throw new Error('Cannot get child node at index ' + prop + ': node is no array');\n\t }\n\t node = node.childs[prop];\n\t }\n\t else { // string\n\t if (node.type !== 'object') {\n\t throw new Error('Cannot get child node ' + prop + ': node is no object');\n\t }\n\t node = node.childs.filter(function (child) {\n\t return child.field === prop;\n\t })[0];\n\t }\n\t }\n\t\n\t return node;\n\t};\n\t\n\t/**\n\t * Find all parents of this node. The parents are ordered from root node towards\n\t * the original node.\n\t * @return {Array.}\n\t */\n\tNode.prototype.findParents = function () {\n\t var parents = [];\n\t var parent = this.parent;\n\t while (parent) {\n\t parents.unshift(parent);\n\t parent = parent.parent;\n\t }\n\t return parents;\n\t};\n\t\n\t/**\n\t *\n\t * @param {{dataPath: string, keyword: string, message: string, params: Object, schemaPath: string} | null} error\n\t * @param {Node} [child] When this is the error of a parent node, pointing\n\t * to an invalid child node, the child node itself\n\t * can be provided. If provided, clicking the error\n\t * icon will set focus to the invalid child node.\n\t */\n\tNode.prototype.setError = function (error, child) {\n\t // ensure the dom exists\n\t this.getDom();\n\t\n\t this.error = error;\n\t var tdError = this.dom.tdError;\n\t if (error) {\n\t if (!tdError) {\n\t tdError = document.createElement('td');\n\t this.dom.tdError = tdError;\n\t this.dom.tdValue.parentNode.appendChild(tdError);\n\t }\n\t\n\t var popover = document.createElement('div');\n\t popover.className = 'jsoneditor-popover jsoneditor-right';\n\t popover.appendChild(document.createTextNode(error.message));\n\t\n\t var button = document.createElement('button');\n\t button.type = 'button';\n\t button.className = 'jsoneditor-schema-error';\n\t button.appendChild(popover);\n\t\n\t // update the direction of the popover\n\t button.onmouseover = button.onfocus = function updateDirection() {\n\t var directions = ['right', 'above', 'below', 'left'];\n\t for (var i = 0; i < directions.length; i++) {\n\t var direction = directions[i];\n\t popover.className = 'jsoneditor-popover jsoneditor-' + direction;\n\t\n\t var contentRect = this.editor.content.getBoundingClientRect();\n\t var popoverRect = popover.getBoundingClientRect();\n\t var margin = 20; // account for a scroll bar\n\t var fit = util.insideRect(contentRect, popoverRect, margin);\n\t\n\t if (fit) {\n\t break;\n\t }\n\t }\n\t }.bind(this);\n\t\n\t // when clicking the error icon, expand all nodes towards the invalid\n\t // child node, and set focus to the child node\n\t if (child) {\n\t button.onclick = function showInvalidNode() {\n\t child.findParents().forEach(function (parent) {\n\t parent.expand(false);\n\t });\n\t\n\t child.scrollTo(function () {\n\t child.focus();\n\t });\n\t };\n\t }\n\t\n\t // apply the error message to the node\n\t while (tdError.firstChild) {\n\t tdError.removeChild(tdError.firstChild);\n\t }\n\t tdError.appendChild(button);\n\t }\n\t else {\n\t if (tdError) {\n\t this.dom.tdError.parentNode.removeChild(this.dom.tdError);\n\t delete this.dom.tdError;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Get the index of this node: the index in the list of childs where this\n\t * node is part of\n\t * @return {number} Returns the index, or -1 if this is the root node\n\t */\n\tNode.prototype.getIndex = function () {\n\t return this.parent ? this.parent.childs.indexOf(this) : -1;\n\t};\n\t\n\t/**\n\t * Set parent node\n\t * @param {Node} parent\n\t */\n\tNode.prototype.setParent = function(parent) {\n\t this.parent = parent;\n\t};\n\t\n\t/**\n\t * Set field\n\t * @param {String} field\n\t * @param {boolean} [fieldEditable]\n\t */\n\tNode.prototype.setField = function(field, fieldEditable) {\n\t this.field = field;\n\t this.previousField = field;\n\t this.fieldEditable = (fieldEditable === true);\n\t};\n\t\n\t/**\n\t * Get field\n\t * @return {String}\n\t */\n\tNode.prototype.getField = function() {\n\t if (this.field === undefined) {\n\t this._getDomField();\n\t }\n\t\n\t return this.field;\n\t};\n\t\n\t/**\n\t * Set value. Value is a JSON structure or an element String, Boolean, etc.\n\t * @param {*} value\n\t * @param {String} [type] Specify the type of the value. Can be 'auto',\n\t * 'array', 'object', or 'string'\n\t */\n\tNode.prototype.setValue = function(value, type) {\n\t var childValue, child;\n\t\n\t // first clear all current childs (if any)\n\t var childs = this.childs;\n\t if (childs) {\n\t while (childs.length) {\n\t this.removeChild(childs[0]);\n\t }\n\t }\n\t\n\t // TODO: remove the DOM of this Node\n\t\n\t this.type = this._getType(value);\n\t\n\t // check if type corresponds with the provided type\n\t if (type && type != this.type) {\n\t if (type == 'string' && this.type == 'auto') {\n\t this.type = type;\n\t }\n\t else {\n\t throw new Error('Type mismatch: ' +\n\t 'cannot cast value of type \"' + this.type +\n\t ' to the specified type \"' + type + '\"');\n\t }\n\t }\n\t\n\t if (this.type == 'array') {\n\t // array\n\t this.childs = [];\n\t for (var i = 0, iMax = value.length; i < iMax; i++) {\n\t childValue = value[i];\n\t if (childValue !== undefined && !(childValue instanceof Function)) {\n\t // ignore undefined and functions\n\t child = new Node(this.editor, {\n\t value: childValue\n\t });\n\t this.appendChild(child);\n\t }\n\t }\n\t this.value = '';\n\t }\n\t else if (this.type == 'object') {\n\t // object\n\t this.childs = [];\n\t for (var childField in value) {\n\t if (value.hasOwnProperty(childField)) {\n\t childValue = value[childField];\n\t if (childValue !== undefined && !(childValue instanceof Function)) {\n\t // ignore undefined and functions\n\t child = new Node(this.editor, {\n\t field: childField,\n\t value: childValue\n\t });\n\t this.appendChild(child);\n\t }\n\t }\n\t }\n\t this.value = '';\n\t\n\t // sort object keys\n\t if (this.editor.options.sortObjectKeys === true) {\n\t this.sort('asc');\n\t }\n\t }\n\t else {\n\t // value\n\t this.childs = undefined;\n\t this.value = value;\n\t }\n\t\n\t this.previousValue = this.value;\n\t};\n\t\n\t/**\n\t * Get value. Value is a JSON structure\n\t * @return {*} value\n\t */\n\tNode.prototype.getValue = function() {\n\t //var childs, i, iMax;\n\t\n\t if (this.type == 'array') {\n\t var arr = [];\n\t this.childs.forEach (function (child) {\n\t arr.push(child.getValue());\n\t });\n\t return arr;\n\t }\n\t else if (this.type == 'object') {\n\t var obj = {};\n\t this.childs.forEach (function (child) {\n\t obj[child.getField()] = child.getValue();\n\t });\n\t return obj;\n\t }\n\t else {\n\t if (this.value === undefined) {\n\t this._getDomValue();\n\t }\n\t\n\t return this.value;\n\t }\n\t};\n\t\n\t/**\n\t * Get the nesting level of this node\n\t * @return {Number} level\n\t */\n\tNode.prototype.getLevel = function() {\n\t return (this.parent ? this.parent.getLevel() + 1 : 0);\n\t};\n\t\n\t/**\n\t * Get path of the root node till the current node\n\t * @return {Node[]} Returns an array with nodes\n\t */\n\tNode.prototype.getNodePath = function() {\n\t var path = this.parent ? this.parent.getNodePath() : [];\n\t path.push(this);\n\t return path;\n\t};\n\t\n\t/**\n\t * Create a clone of a node\n\t * The complete state of a clone is copied, including whether it is expanded or\n\t * not. The DOM elements are not cloned.\n\t * @return {Node} clone\n\t */\n\tNode.prototype.clone = function() {\n\t var clone = new Node(this.editor);\n\t clone.type = this.type;\n\t clone.field = this.field;\n\t clone.fieldInnerText = this.fieldInnerText;\n\t clone.fieldEditable = this.fieldEditable;\n\t clone.value = this.value;\n\t clone.valueInnerText = this.valueInnerText;\n\t clone.expanded = this.expanded;\n\t\n\t if (this.childs) {\n\t // an object or array\n\t var cloneChilds = [];\n\t this.childs.forEach(function (child) {\n\t var childClone = child.clone();\n\t childClone.setParent(clone);\n\t cloneChilds.push(childClone);\n\t });\n\t clone.childs = cloneChilds;\n\t }\n\t else {\n\t // a value\n\t clone.childs = undefined;\n\t }\n\t\n\t return clone;\n\t};\n\t\n\t/**\n\t * Expand this node and optionally its childs.\n\t * @param {boolean} [recurse] Optional recursion, true by default. When\n\t * true, all childs will be expanded recursively\n\t */\n\tNode.prototype.expand = function(recurse) {\n\t if (!this.childs) {\n\t return;\n\t }\n\t\n\t // set this node expanded\n\t this.expanded = true;\n\t if (this.dom.expand) {\n\t this.dom.expand.className = 'jsoneditor-expanded';\n\t }\n\t\n\t this.showChilds();\n\t\n\t if (recurse !== false) {\n\t this.childs.forEach(function (child) {\n\t child.expand(recurse);\n\t });\n\t }\n\t};\n\t\n\t/**\n\t * Collapse this node and optionally its childs.\n\t * @param {boolean} [recurse] Optional recursion, true by default. When\n\t * true, all childs will be collapsed recursively\n\t */\n\tNode.prototype.collapse = function(recurse) {\n\t if (!this.childs) {\n\t return;\n\t }\n\t\n\t this.hideChilds();\n\t\n\t // collapse childs in case of recurse\n\t if (recurse !== false) {\n\t this.childs.forEach(function (child) {\n\t child.collapse(recurse);\n\t });\n\t\n\t }\n\t\n\t // make this node collapsed\n\t if (this.dom.expand) {\n\t this.dom.expand.className = 'jsoneditor-collapsed';\n\t }\n\t this.expanded = false;\n\t};\n\t\n\t/**\n\t * Recursively show all childs when they are expanded\n\t */\n\tNode.prototype.showChilds = function() {\n\t var childs = this.childs;\n\t if (!childs) {\n\t return;\n\t }\n\t if (!this.expanded) {\n\t return;\n\t }\n\t\n\t var tr = this.dom.tr;\n\t var table = tr ? tr.parentNode : undefined;\n\t if (table) {\n\t // show row with append button\n\t var append = this.getAppend();\n\t var nextTr = tr.nextSibling;\n\t if (nextTr) {\n\t table.insertBefore(append, nextTr);\n\t }\n\t else {\n\t table.appendChild(append);\n\t }\n\t\n\t // show childs\n\t this.childs.forEach(function (child) {\n\t table.insertBefore(child.getDom(), append);\n\t child.showChilds();\n\t });\n\t }\n\t};\n\t\n\t/**\n\t * Hide the node with all its childs\n\t */\n\tNode.prototype.hide = function() {\n\t var tr = this.dom.tr;\n\t var table = tr ? tr.parentNode : undefined;\n\t if (table) {\n\t table.removeChild(tr);\n\t }\n\t this.hideChilds();\n\t};\n\t\n\t\n\t/**\n\t * Recursively hide all childs\n\t */\n\tNode.prototype.hideChilds = function() {\n\t var childs = this.childs;\n\t if (!childs) {\n\t return;\n\t }\n\t if (!this.expanded) {\n\t return;\n\t }\n\t\n\t // hide append row\n\t var append = this.getAppend();\n\t if (append.parentNode) {\n\t append.parentNode.removeChild(append);\n\t }\n\t\n\t // hide childs\n\t this.childs.forEach(function (child) {\n\t child.hide();\n\t });\n\t};\n\t\n\t\n\t/**\n\t * Add a new child to the node.\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t */\n\tNode.prototype.appendChild = function(node) {\n\t if (this._hasChilds()) {\n\t // adjust the link to the parent\n\t node.setParent(this);\n\t node.fieldEditable = (this.type == 'object');\n\t if (this.type == 'array') {\n\t node.index = this.childs.length;\n\t }\n\t this.childs.push(node);\n\t\n\t if (this.expanded) {\n\t // insert into the DOM, before the appendRow\n\t var newTr = node.getDom();\n\t var appendTr = this.getAppend();\n\t var table = appendTr ? appendTr.parentNode : undefined;\n\t if (appendTr && table) {\n\t table.insertBefore(newTr, appendTr);\n\t }\n\t\n\t node.showChilds();\n\t }\n\t\n\t this.updateDom({'updateIndexes': true});\n\t node.updateDom({'recurse': true});\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Move a node from its current parent to this node\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t * @param {Node} beforeNode\n\t */\n\tNode.prototype.moveBefore = function(node, beforeNode) {\n\t if (this._hasChilds()) {\n\t // create a temporary row, to prevent the scroll position from jumping\n\t // when removing the node\n\t var tbody = (this.dom.tr) ? this.dom.tr.parentNode : undefined;\n\t if (tbody) {\n\t var trTemp = document.createElement('tr');\n\t trTemp.style.height = tbody.clientHeight + 'px';\n\t tbody.appendChild(trTemp);\n\t }\n\t\n\t if (node.parent) {\n\t node.parent.removeChild(node);\n\t }\n\t\n\t if (beforeNode instanceof AppendNode) {\n\t this.appendChild(node);\n\t }\n\t else {\n\t this.insertBefore(node, beforeNode);\n\t }\n\t\n\t if (tbody) {\n\t tbody.removeChild(trTemp);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Move a node from its current parent to this node\n\t * Only applicable when Node value is of type array or object.\n\t * If index is out of range, the node will be appended to the end\n\t * @param {Node} node\n\t * @param {Number} index\n\t */\n\tNode.prototype.moveTo = function (node, index) {\n\t if (node.parent == this) {\n\t // same parent\n\t var currentIndex = this.childs.indexOf(node);\n\t if (currentIndex < index) {\n\t // compensate the index for removal of the node itself\n\t index++;\n\t }\n\t }\n\t\n\t var beforeNode = this.childs[index] || this.append;\n\t this.moveBefore(node, beforeNode);\n\t};\n\t\n\t/**\n\t * Insert a new child before a given node\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t * @param {Node} beforeNode\n\t */\n\tNode.prototype.insertBefore = function(node, beforeNode) {\n\t if (this._hasChilds()) {\n\t if (beforeNode == this.append) {\n\t // append to the child nodes\n\t\n\t // adjust the link to the parent\n\t node.setParent(this);\n\t node.fieldEditable = (this.type == 'object');\n\t this.childs.push(node);\n\t }\n\t else {\n\t // insert before a child node\n\t var index = this.childs.indexOf(beforeNode);\n\t if (index == -1) {\n\t throw new Error('Node not found');\n\t }\n\t\n\t // adjust the link to the parent\n\t node.setParent(this);\n\t node.fieldEditable = (this.type == 'object');\n\t this.childs.splice(index, 0, node);\n\t }\n\t\n\t if (this.expanded) {\n\t // insert into the DOM\n\t var newTr = node.getDom();\n\t var nextTr = beforeNode.getDom();\n\t var table = nextTr ? nextTr.parentNode : undefined;\n\t if (nextTr && table) {\n\t table.insertBefore(newTr, nextTr);\n\t }\n\t\n\t node.showChilds();\n\t }\n\t\n\t this.updateDom({'updateIndexes': true});\n\t node.updateDom({'recurse': true});\n\t }\n\t};\n\t\n\t/**\n\t * Insert a new child before a given node\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t * @param {Node} afterNode\n\t */\n\tNode.prototype.insertAfter = function(node, afterNode) {\n\t if (this._hasChilds()) {\n\t var index = this.childs.indexOf(afterNode);\n\t var beforeNode = this.childs[index + 1];\n\t if (beforeNode) {\n\t this.insertBefore(node, beforeNode);\n\t }\n\t else {\n\t this.appendChild(node);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Search in this node\n\t * The node will be expanded when the text is found one of its childs, else\n\t * it will be collapsed. Searches are case insensitive.\n\t * @param {String} text\n\t * @return {Node[]} results Array with nodes containing the search text\n\t */\n\tNode.prototype.search = function(text) {\n\t var results = [];\n\t var index;\n\t var search = text ? text.toLowerCase() : undefined;\n\t\n\t // delete old search data\n\t delete this.searchField;\n\t delete this.searchValue;\n\t\n\t // search in field\n\t if (this.field != undefined) {\n\t var field = String(this.field).toLowerCase();\n\t index = field.indexOf(search);\n\t if (index != -1) {\n\t this.searchField = true;\n\t results.push({\n\t 'node': this,\n\t 'elem': 'field'\n\t });\n\t }\n\t\n\t // update dom\n\t this._updateDomField();\n\t }\n\t\n\t // search in value\n\t if (this._hasChilds()) {\n\t // array, object\n\t\n\t // search the nodes childs\n\t if (this.childs) {\n\t var childResults = [];\n\t this.childs.forEach(function (child) {\n\t childResults = childResults.concat(child.search(text));\n\t });\n\t results = results.concat(childResults);\n\t }\n\t\n\t // update dom\n\t if (search != undefined) {\n\t var recurse = false;\n\t if (childResults.length == 0) {\n\t this.collapse(recurse);\n\t }\n\t else {\n\t this.expand(recurse);\n\t }\n\t }\n\t }\n\t else {\n\t // string, auto\n\t if (this.value != undefined ) {\n\t var value = String(this.value).toLowerCase();\n\t index = value.indexOf(search);\n\t if (index != -1) {\n\t this.searchValue = true;\n\t results.push({\n\t 'node': this,\n\t 'elem': 'value'\n\t });\n\t }\n\t }\n\t\n\t // update dom\n\t this._updateDomValue();\n\t }\n\t\n\t return results;\n\t};\n\t\n\t/**\n\t * Move the scroll position such that this node is in the visible area.\n\t * The node will not get the focus\n\t * @param {function(boolean)} [callback]\n\t */\n\tNode.prototype.scrollTo = function(callback) {\n\t if (!this.dom.tr || !this.dom.tr.parentNode) {\n\t // if the node is not visible, expand its parents\n\t var parent = this.parent;\n\t var recurse = false;\n\t while (parent) {\n\t parent.expand(recurse);\n\t parent = parent.parent;\n\t }\n\t }\n\t\n\t if (this.dom.tr && this.dom.tr.parentNode) {\n\t this.editor.scrollTo(this.dom.tr.offsetTop, callback);\n\t }\n\t};\n\t\n\t\n\t// stores the element name currently having the focus\n\tNode.focusElement = undefined;\n\t\n\t/**\n\t * Set focus to this node\n\t * @param {String} [elementName] The field name of the element to get the\n\t * focus available values: 'drag', 'menu',\n\t * 'expand', 'field', 'value' (default)\n\t */\n\tNode.prototype.focus = function(elementName) {\n\t Node.focusElement = elementName;\n\t\n\t if (this.dom.tr && this.dom.tr.parentNode) {\n\t var dom = this.dom;\n\t\n\t switch (elementName) {\n\t case 'drag':\n\t if (dom.drag) {\n\t dom.drag.focus();\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\t\n\t case 'menu':\n\t dom.menu.focus();\n\t break;\n\t\n\t case 'expand':\n\t if (this._hasChilds()) {\n\t dom.expand.focus();\n\t }\n\t else if (dom.field && this.fieldEditable) {\n\t dom.field.focus();\n\t util.selectContentEditable(dom.field);\n\t }\n\t else if (dom.value && !this._hasChilds()) {\n\t dom.value.focus();\n\t util.selectContentEditable(dom.value);\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\t\n\t case 'field':\n\t if (dom.field && this.fieldEditable) {\n\t dom.field.focus();\n\t util.selectContentEditable(dom.field);\n\t }\n\t else if (dom.value && !this._hasChilds()) {\n\t dom.value.focus();\n\t util.selectContentEditable(dom.value);\n\t }\n\t else if (this._hasChilds()) {\n\t dom.expand.focus();\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\t\n\t case 'value':\n\t default:\n\t if (dom.value && !this._hasChilds()) {\n\t dom.value.focus();\n\t util.selectContentEditable(dom.value);\n\t }\n\t else if (dom.field && this.fieldEditable) {\n\t dom.field.focus();\n\t util.selectContentEditable(dom.field);\n\t }\n\t else if (this._hasChilds()) {\n\t dom.expand.focus();\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Select all text in an editable div after a delay of 0 ms\n\t * @param {Element} editableDiv\n\t */\n\tNode.select = function(editableDiv) {\n\t setTimeout(function () {\n\t util.selectContentEditable(editableDiv);\n\t }, 0);\n\t};\n\t\n\t/**\n\t * Update the values from the DOM field and value of this node\n\t */\n\tNode.prototype.blur = function() {\n\t // retrieve the actual field and value from the DOM.\n\t this._getDomValue(false);\n\t this._getDomField(false);\n\t};\n\t\n\t/**\n\t * Check if given node is a child. The method will check recursively to find\n\t * this node.\n\t * @param {Node} node\n\t * @return {boolean} containsNode\n\t */\n\tNode.prototype.containsNode = function(node) {\n\t if (this == node) {\n\t return true;\n\t }\n\t\n\t var childs = this.childs;\n\t if (childs) {\n\t // TODO: use the js5 Array.some() here?\n\t for (var i = 0, iMax = childs.length; i < iMax; i++) {\n\t if (childs[i].containsNode(node)) {\n\t return true;\n\t }\n\t }\n\t }\n\t\n\t return false;\n\t};\n\t\n\t/**\n\t * Move given node into this node\n\t * @param {Node} node the childNode to be moved\n\t * @param {Node} beforeNode node will be inserted before given\n\t * node. If no beforeNode is given,\n\t * the node is appended at the end\n\t * @private\n\t */\n\tNode.prototype._move = function(node, beforeNode) {\n\t if (node == beforeNode) {\n\t // nothing to do...\n\t return;\n\t }\n\t\n\t // check if this node is not a child of the node to be moved here\n\t if (node.containsNode(this)) {\n\t throw new Error('Cannot move a field into a child of itself');\n\t }\n\t\n\t // remove the original node\n\t if (node.parent) {\n\t node.parent.removeChild(node);\n\t }\n\t\n\t // create a clone of the node\n\t var clone = node.clone();\n\t node.clearDom();\n\t\n\t // insert or append the node\n\t if (beforeNode) {\n\t this.insertBefore(clone, beforeNode);\n\t }\n\t else {\n\t this.appendChild(clone);\n\t }\n\t\n\t /* TODO: adjust the field name (to prevent equal field names)\n\t if (this.type == 'object') {\n\t }\n\t */\n\t};\n\t\n\t/**\n\t * Remove a child from the node.\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node The child node to be removed;\n\t * @return {Node | undefined} node The removed node on success,\n\t * else undefined\n\t */\n\tNode.prototype.removeChild = function(node) {\n\t if (this.childs) {\n\t var index = this.childs.indexOf(node);\n\t\n\t if (index != -1) {\n\t node.hide();\n\t\n\t // delete old search results\n\t delete node.searchField;\n\t delete node.searchValue;\n\t\n\t var removedNode = this.childs.splice(index, 1)[0];\n\t removedNode.parent = null;\n\t\n\t this.updateDom({'updateIndexes': true});\n\t\n\t return removedNode;\n\t }\n\t }\n\t\n\t return undefined;\n\t};\n\t\n\t/**\n\t * Remove a child node node from this node\n\t * This method is equal to Node.removeChild, except that _remove fire an\n\t * onChange event.\n\t * @param {Node} node\n\t * @private\n\t */\n\tNode.prototype._remove = function (node) {\n\t this.removeChild(node);\n\t};\n\t\n\t/**\n\t * Change the type of the value of this Node\n\t * @param {String} newType\n\t */\n\tNode.prototype.changeType = function (newType) {\n\t var oldType = this.type;\n\t\n\t if (oldType == newType) {\n\t // type is not changed\n\t return;\n\t }\n\t\n\t if ((newType == 'string' || newType == 'auto') &&\n\t (oldType == 'string' || oldType == 'auto')) {\n\t // this is an easy change\n\t this.type = newType;\n\t }\n\t else {\n\t // change from array to object, or from string/auto to object/array\n\t var table = this.dom.tr ? this.dom.tr.parentNode : undefined;\n\t var lastTr;\n\t if (this.expanded) {\n\t lastTr = this.getAppend();\n\t }\n\t else {\n\t lastTr = this.getDom();\n\t }\n\t var nextTr = (lastTr && lastTr.parentNode) ? lastTr.nextSibling : undefined;\n\t\n\t // hide current field and all its childs\n\t this.hide();\n\t this.clearDom();\n\t\n\t // adjust the field and the value\n\t this.type = newType;\n\t\n\t // adjust childs\n\t if (newType == 'object') {\n\t if (!this.childs) {\n\t this.childs = [];\n\t }\n\t\n\t this.childs.forEach(function (child, index) {\n\t child.clearDom();\n\t delete child.index;\n\t child.fieldEditable = true;\n\t if (child.field == undefined) {\n\t child.field = '';\n\t }\n\t });\n\t\n\t if (oldType == 'string' || oldType == 'auto') {\n\t this.expanded = true;\n\t }\n\t }\n\t else if (newType == 'array') {\n\t if (!this.childs) {\n\t this.childs = [];\n\t }\n\t\n\t this.childs.forEach(function (child, index) {\n\t child.clearDom();\n\t child.fieldEditable = false;\n\t child.index = index;\n\t });\n\t\n\t if (oldType == 'string' || oldType == 'auto') {\n\t this.expanded = true;\n\t }\n\t }\n\t else {\n\t this.expanded = false;\n\t }\n\t\n\t // create new DOM\n\t if (table) {\n\t if (nextTr) {\n\t table.insertBefore(this.getDom(), nextTr);\n\t }\n\t else {\n\t table.appendChild(this.getDom());\n\t }\n\t }\n\t this.showChilds();\n\t }\n\t\n\t if (newType == 'auto' || newType == 'string') {\n\t // cast value to the correct type\n\t if (newType == 'string') {\n\t this.value = String(this.value);\n\t }\n\t else {\n\t this.value = this._stringCast(String(this.value));\n\t }\n\t\n\t this.focus();\n\t }\n\t\n\t this.updateDom({'updateIndexes': true});\n\t};\n\t\n\t/**\n\t * Retrieve value from DOM\n\t * @param {boolean} [silent] If true (default), no errors will be thrown in\n\t * case of invalid data\n\t * @private\n\t */\n\tNode.prototype._getDomValue = function(silent) {\n\t if (this.dom.value && this.type != 'array' && this.type != 'object') {\n\t this.valueInnerText = util.getInnerText(this.dom.value);\n\t }\n\t\n\t if (this.valueInnerText != undefined) {\n\t try {\n\t // retrieve the value\n\t var value;\n\t if (this.type == 'string') {\n\t value = this._unescapeHTML(this.valueInnerText);\n\t }\n\t else {\n\t var str = this._unescapeHTML(this.valueInnerText);\n\t value = this._stringCast(str);\n\t }\n\t if (value !== this.value) {\n\t this.value = value;\n\t this._debouncedOnChangeValue();\n\t }\n\t }\n\t catch (err) {\n\t this.value = undefined;\n\t // TODO: sent an action with the new, invalid value?\n\t if (silent !== true) {\n\t throw err;\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Handle a changed value\n\t * @private\n\t */\n\tNode.prototype._onChangeValue = function () {\n\t // get current selection, then override the range such that we can select\n\t // the added/removed text on undo/redo\n\t var oldSelection = this.editor.getSelection();\n\t if (oldSelection.range) {\n\t var undoDiff = util.textDiff(String(this.value), String(this.previousValue));\n\t oldSelection.range.startOffset = undoDiff.start;\n\t oldSelection.range.endOffset = undoDiff.end;\n\t }\n\t var newSelection = this.editor.getSelection();\n\t if (newSelection.range) {\n\t var redoDiff = util.textDiff(String(this.previousValue), String(this.value));\n\t newSelection.range.startOffset = redoDiff.start;\n\t newSelection.range.endOffset = redoDiff.end;\n\t }\n\t\n\t this.editor._onAction('editValue', {\n\t node: this,\n\t oldValue: this.previousValue,\n\t newValue: this.value,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t\n\t this.previousValue = this.value;\n\t};\n\t\n\t/**\n\t * Handle a changed field\n\t * @private\n\t */\n\tNode.prototype._onChangeField = function () {\n\t // get current selection, then override the range such that we can select\n\t // the added/removed text on undo/redo\n\t var oldSelection = this.editor.getSelection();\n\t if (oldSelection.range) {\n\t var undoDiff = util.textDiff(this.field, this.previousField);\n\t oldSelection.range.startOffset = undoDiff.start;\n\t oldSelection.range.endOffset = undoDiff.end;\n\t }\n\t var newSelection = this.editor.getSelection();\n\t if (newSelection.range) {\n\t var redoDiff = util.textDiff(this.previousField, this.field);\n\t newSelection.range.startOffset = redoDiff.start;\n\t newSelection.range.endOffset = redoDiff.end;\n\t }\n\t\n\t this.editor._onAction('editField', {\n\t node: this,\n\t oldValue: this.previousField,\n\t newValue: this.field,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t\n\t this.previousField = this.field;\n\t};\n\t\n\t/**\n\t * Update dom value:\n\t * - the text color of the value, depending on the type of the value\n\t * - the height of the field, depending on the width\n\t * - background color in case it is empty\n\t * @private\n\t */\n\tNode.prototype._updateDomValue = function () {\n\t var domValue = this.dom.value;\n\t if (domValue) {\n\t var classNames = ['jsoneditor-value'];\n\t\n\t\n\t // set text color depending on value type\n\t var value = this.value;\n\t var type = (this.type == 'auto') ? util.type(value) : this.type;\n\t var isUrl = type == 'string' && util.isUrl(value);\n\t classNames.push('jsoneditor-' + type);\n\t if (isUrl) {\n\t classNames.push('jsoneditor-url');\n\t }\n\t\n\t // visual styling when empty\n\t var isEmpty = (String(this.value) == '' && this.type != 'array' && this.type != 'object');\n\t if (isEmpty) {\n\t classNames.push('jsoneditor-empty');\n\t }\n\t\n\t // highlight when there is a search result\n\t if (this.searchValueActive) {\n\t classNames.push('jsoneditor-highlight-active');\n\t }\n\t if (this.searchValue) {\n\t classNames.push('jsoneditor-highlight');\n\t }\n\t\n\t domValue.className = classNames.join(' ');\n\t\n\t // update title\n\t if (type == 'array' || type == 'object') {\n\t var count = this.childs ? this.childs.length : 0;\n\t domValue.title = this.type + ' containing ' + count + ' items';\n\t }\n\t else if (isUrl && this.editable.value) {\n\t domValue.title = 'Ctrl+Click or Ctrl+Enter to open url in new window';\n\t }\n\t else {\n\t domValue.title = '';\n\t }\n\t\n\t // show checkbox when the value is a boolean\n\t if (type === 'boolean' && this.editable.value) {\n\t if (!this.dom.checkbox) {\n\t this.dom.checkbox = document.createElement('input');\n\t this.dom.checkbox.type = 'checkbox';\n\t this.dom.tdCheckbox = document.createElement('td');\n\t this.dom.tdCheckbox.className = 'jsoneditor-tree';\n\t this.dom.tdCheckbox.appendChild(this.dom.checkbox);\n\t\n\t this.dom.tdValue.parentNode.insertBefore(this.dom.tdCheckbox, this.dom.tdValue);\n\t }\n\t\n\t this.dom.checkbox.checked = this.value;\n\t }\n\t else {\n\t // cleanup checkbox when displayed\n\t if (this.dom.tdCheckbox) {\n\t this.dom.tdCheckbox.parentNode.removeChild(this.dom.tdCheckbox);\n\t delete this.dom.tdCheckbox;\n\t delete this.dom.checkbox;\n\t }\n\t }\n\t\n\t if (this.enum && this.editable.value) {\n\t // create select box when this node has an enum object\n\t if (!this.dom.select) {\n\t this.dom.select = document.createElement('select');\n\t this.id = this.field + \"_\" + new Date().getUTCMilliseconds();\n\t this.dom.select.id = this.id;\n\t this.dom.select.name = this.dom.select.id;\n\t\n\t //Create the default empty option\n\t this.dom.select.option = document.createElement('option');\n\t this.dom.select.option.value = '';\n\t this.dom.select.option.innerHTML = '--';\n\t this.dom.select.appendChild(this.dom.select.option);\n\t\n\t //Iterate all enum values and add them as options\n\t for(var i = 0; i < this.enum.length; i++) {\n\t this.dom.select.option = document.createElement('option');\n\t this.dom.select.option.value = this.enum[i];\n\t this.dom.select.option.innerHTML = this.enum[i];\n\t if(this.dom.select.option.value == this.value){\n\t this.dom.select.option.selected = true;\n\t }\n\t this.dom.select.appendChild(this.dom.select.option);\n\t }\n\t\n\t this.dom.tdSelect = document.createElement('td');\n\t this.dom.tdSelect.className = 'jsoneditor-tree';\n\t this.dom.tdSelect.appendChild(this.dom.select);\n\t this.dom.tdValue.parentNode.insertBefore(this.dom.tdSelect, this.dom.tdValue);\n\t }\n\t\n\t // If the enum is inside a composite type display\n\t // both the simple input and the dropdown field\n\t if(this.schema && (\n\t !this.schema.hasOwnProperty(\"oneOf\") &&\n\t !this.schema.hasOwnProperty(\"anyOf\") &&\n\t !this.schema.hasOwnProperty(\"allOf\"))\n\t ) {\n\t this.valueFieldHTML = this.dom.tdValue.innerHTML;\n\t this.dom.tdValue.style.visibility = 'hidden';\n\t this.dom.tdValue.innerHTML = '';\n\t } else {\n\t delete this.valueFieldHTML;\n\t }\n\t }\n\t else {\n\t // cleanup select box when displayed\n\t if (this.dom.tdSelect) {\n\t this.dom.tdSelect.parentNode.removeChild(this.dom.tdSelect);\n\t delete this.dom.tdSelect;\n\t delete this.dom.select;\n\t this.dom.tdValue.innerHTML = this.valueFieldHTML;\n\t this.dom.tdValue.style.visibility = '';\n\t delete this.valueFieldHTML;\n\t }\n\t }\n\t\n\t // strip formatting from the contents of the editable div\n\t util.stripFormatting(domValue);\n\t }\n\t};\n\t\n\t/**\n\t * Update dom field:\n\t * - the text color of the field, depending on the text\n\t * - the height of the field, depending on the width\n\t * - background color in case it is empty\n\t * @private\n\t */\n\tNode.prototype._updateDomField = function () {\n\t var domField = this.dom.field;\n\t if (domField) {\n\t // make backgound color lightgray when empty\n\t var isEmpty = (String(this.field) == '' && this.parent.type != 'array');\n\t if (isEmpty) {\n\t util.addClassName(domField, 'jsoneditor-empty');\n\t }\n\t else {\n\t util.removeClassName(domField, 'jsoneditor-empty');\n\t }\n\t\n\t // highlight when there is a search result\n\t if (this.searchFieldActive) {\n\t util.addClassName(domField, 'jsoneditor-highlight-active');\n\t }\n\t else {\n\t util.removeClassName(domField, 'jsoneditor-highlight-active');\n\t }\n\t if (this.searchField) {\n\t util.addClassName(domField, 'jsoneditor-highlight');\n\t }\n\t else {\n\t util.removeClassName(domField, 'jsoneditor-highlight');\n\t }\n\t\n\t // strip formatting from the contents of the editable div\n\t util.stripFormatting(domField);\n\t }\n\t};\n\t\n\t/**\n\t * Retrieve field from DOM\n\t * @param {boolean} [silent] If true (default), no errors will be thrown in\n\t * case of invalid data\n\t * @private\n\t */\n\tNode.prototype._getDomField = function(silent) {\n\t if (this.dom.field && this.fieldEditable) {\n\t this.fieldInnerText = util.getInnerText(this.dom.field);\n\t }\n\t\n\t if (this.fieldInnerText != undefined) {\n\t try {\n\t var field = this._unescapeHTML(this.fieldInnerText);\n\t\n\t if (field !== this.field) {\n\t this.field = field;\n\t this._debouncedOnChangeField();\n\t }\n\t }\n\t catch (err) {\n\t this.field = undefined;\n\t // TODO: sent an action here, with the new, invalid value?\n\t if (silent !== true) {\n\t throw err;\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Validate this node and all it's childs\n\t * @return {Array.<{node: Node, error: {message: string}}>} Returns a list with duplicates\n\t */\n\tNode.prototype.validate = function () {\n\t var errors = [];\n\t\n\t // find duplicate keys\n\t if (this.type === 'object') {\n\t var keys = {};\n\t var duplicateKeys = [];\n\t for (var i = 0; i < this.childs.length; i++) {\n\t var child = this.childs[i];\n\t if (keys.hasOwnProperty(child.field)) {\n\t duplicateKeys.push(child.field);\n\t }\n\t keys[child.field] = true;\n\t }\n\t\n\t if (duplicateKeys.length > 0) {\n\t errors = this.childs\n\t .filter(function (node) {\n\t return duplicateKeys.indexOf(node.field) !== -1;\n\t })\n\t .map(function (node) {\n\t return {\n\t node: node,\n\t error: {\n\t message: 'duplicate key \"' + node.field + '\"'\n\t }\n\t }\n\t });\n\t }\n\t }\n\t\n\t // recurse over the childs\n\t if (this.childs) {\n\t for (var i = 0; i < this.childs.length; i++) {\n\t var e = this.childs[i].validate();\n\t if (e.length > 0) {\n\t errors = errors.concat(e);\n\t }\n\t }\n\t }\n\t\n\t return errors;\n\t};\n\t\n\t/**\n\t * Clear the dom of the node\n\t */\n\tNode.prototype.clearDom = function() {\n\t // TODO: hide the node first?\n\t //this.hide();\n\t // TODO: recursively clear dom?\n\t\n\t this.dom = {};\n\t};\n\t\n\t/**\n\t * Get the HTML DOM TR element of the node.\n\t * The dom will be generated when not yet created\n\t * @return {Element} tr HTML DOM TR Element\n\t */\n\tNode.prototype.getDom = function() {\n\t var dom = this.dom;\n\t if (dom.tr) {\n\t return dom.tr;\n\t }\n\t\n\t this._updateEditability();\n\t\n\t // create row\n\t dom.tr = document.createElement('tr');\n\t dom.tr.node = this;\n\t\n\t if (this.editor.options.mode === 'tree') { // note: we take here the global setting\n\t var tdDrag = document.createElement('td');\n\t if (this.editable.field) {\n\t // create draggable area\n\t if (this.parent) {\n\t var domDrag = document.createElement('button');\n\t domDrag.type = 'button';\n\t dom.drag = domDrag;\n\t domDrag.className = 'jsoneditor-dragarea';\n\t domDrag.title = 'Drag to move this field (Alt+Shift+Arrows)';\n\t tdDrag.appendChild(domDrag);\n\t }\n\t }\n\t dom.tr.appendChild(tdDrag);\n\t\n\t // create context menu\n\t var tdMenu = document.createElement('td');\n\t var menu = document.createElement('button');\n\t menu.type = 'button';\n\t dom.menu = menu;\n\t menu.className = 'jsoneditor-contextmenu';\n\t menu.title = 'Click to open the actions menu (Ctrl+M)';\n\t tdMenu.appendChild(dom.menu);\n\t dom.tr.appendChild(tdMenu);\n\t }\n\t\n\t // create tree and field\n\t var tdField = document.createElement('td');\n\t dom.tr.appendChild(tdField);\n\t dom.tree = this._createDomTree();\n\t tdField.appendChild(dom.tree);\n\t\n\t this.updateDom({'updateIndexes': true});\n\t\n\t return dom.tr;\n\t};\n\t\n\t/**\n\t * DragStart event, fired on mousedown on the dragarea at the left side of a Node\n\t * @param {Node[] | Node} nodes\n\t * @param {Event} event\n\t */\n\tNode.onDragStart = function (nodes, event) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDragStart([nodes], event);\n\t }\n\t if (nodes.length === 0) {\n\t return;\n\t }\n\t\n\t var firstNode = nodes[0];\n\t var lastNode = nodes[nodes.length - 1];\n\t var draggedNode = Node.getNodeFromTarget(event.target);\n\t var beforeNode = lastNode._nextSibling();\n\t var editor = firstNode.editor;\n\t\n\t // in case of multiple selected nodes, offsetY prevents the selection from\n\t // jumping when you start dragging one of the lower down nodes in the selection\n\t var offsetY = util.getAbsoluteTop(draggedNode.dom.tr) - util.getAbsoluteTop(firstNode.dom.tr);\n\t\n\t if (!editor.mousemove) {\n\t editor.mousemove = util.addEventListener(window, 'mousemove', function (event) {\n\t Node.onDrag(nodes, event);\n\t });\n\t }\n\t\n\t if (!editor.mouseup) {\n\t editor.mouseup = util.addEventListener(window, 'mouseup',function (event ) {\n\t Node.onDragEnd(nodes, event);\n\t });\n\t }\n\t\n\t editor.highlighter.lock();\n\t editor.drag = {\n\t oldCursor: document.body.style.cursor,\n\t oldSelection: editor.getSelection(),\n\t oldBeforeNode: beforeNode,\n\t mouseX: event.pageX,\n\t offsetY: offsetY,\n\t level: firstNode.getLevel()\n\t };\n\t document.body.style.cursor = 'move';\n\t\n\t event.preventDefault();\n\t};\n\t\n\t/**\n\t * Drag event, fired when moving the mouse while dragging a Node\n\t * @param {Node[] | Node} nodes\n\t * @param {Event} event\n\t */\n\tNode.onDrag = function (nodes, event) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDrag([nodes], event);\n\t }\n\t if (nodes.length === 0) {\n\t return;\n\t }\n\t\n\t // TODO: this method has grown too large. Split it in a number of methods\n\t var editor = nodes[0].editor;\n\t var mouseY = event.pageY - editor.drag.offsetY;\n\t var mouseX = event.pageX;\n\t var trThis, trPrev, trNext, trFirst, trLast, trRoot;\n\t var nodePrev, nodeNext;\n\t var topThis, topPrev, topFirst, heightThis, bottomNext, heightNext;\n\t var moved = false;\n\t\n\t // TODO: add an ESC option, which resets to the original position\n\t\n\t // move up/down\n\t var firstNode = nodes[0];\n\t trThis = firstNode.dom.tr;\n\t topThis = util.getAbsoluteTop(trThis);\n\t heightThis = trThis.offsetHeight;\n\t if (mouseY < topThis) {\n\t // move up\n\t trPrev = trThis;\n\t do {\n\t trPrev = trPrev.previousSibling;\n\t nodePrev = Node.getNodeFromTarget(trPrev);\n\t topPrev = trPrev ? util.getAbsoluteTop(trPrev) : 0;\n\t }\n\t while (trPrev && mouseY < topPrev);\n\t\n\t if (nodePrev && !nodePrev.parent) {\n\t nodePrev = undefined;\n\t }\n\t\n\t if (!nodePrev) {\n\t // move to the first node\n\t trRoot = trThis.parentNode.firstChild;\n\t trPrev = trRoot ? trRoot.nextSibling : undefined;\n\t nodePrev = Node.getNodeFromTarget(trPrev);\n\t if (nodePrev == firstNode) {\n\t nodePrev = undefined;\n\t }\n\t }\n\t\n\t if (nodePrev) {\n\t // check if mouseY is really inside the found node\n\t trPrev = nodePrev.dom.tr;\n\t topPrev = trPrev ? util.getAbsoluteTop(trPrev) : 0;\n\t if (mouseY > topPrev + heightThis) {\n\t nodePrev = undefined;\n\t }\n\t }\n\t\n\t if (nodePrev) {\n\t nodes.forEach(function (node) {\n\t nodePrev.parent.moveBefore(node, nodePrev);\n\t });\n\t moved = true;\n\t }\n\t }\n\t else {\n\t // move down\n\t var lastNode = nodes[nodes.length - 1];\n\t trLast = (lastNode.expanded && lastNode.append) ? lastNode.append.getDom() : lastNode.dom.tr;\n\t trFirst = trLast ? trLast.nextSibling : undefined;\n\t if (trFirst) {\n\t topFirst = util.getAbsoluteTop(trFirst);\n\t trNext = trFirst;\n\t do {\n\t nodeNext = Node.getNodeFromTarget(trNext);\n\t if (trNext) {\n\t bottomNext = trNext.nextSibling ?\n\t util.getAbsoluteTop(trNext.nextSibling) : 0;\n\t heightNext = trNext ? (bottomNext - topFirst) : 0;\n\t\n\t if (nodeNext.parent.childs.length == nodes.length &&\n\t nodeNext.parent.childs[nodes.length - 1] == lastNode) {\n\t // We are about to remove the last child of this parent,\n\t // which will make the parents appendNode visible.\n\t topThis += 27;\n\t // TODO: dangerous to suppose the height of the appendNode a constant of 27 px.\n\t }\n\t }\n\t\n\t trNext = trNext.nextSibling;\n\t }\n\t while (trNext && mouseY > topThis + heightNext);\n\t\n\t if (nodeNext && nodeNext.parent) {\n\t // calculate the desired level\n\t var diffX = (mouseX - editor.drag.mouseX);\n\t var diffLevel = Math.round(diffX / 24 / 2);\n\t var level = editor.drag.level + diffLevel; // desired level\n\t var levelNext = nodeNext.getLevel(); // level to be\n\t\n\t // find the best fitting level (move upwards over the append nodes)\n\t trPrev = nodeNext.dom.tr.previousSibling;\n\t while (levelNext < level && trPrev) {\n\t nodePrev = Node.getNodeFromTarget(trPrev);\n\t\n\t var isDraggedNode = nodes.some(function (node) {\n\t return node === nodePrev || nodePrev._isChildOf(node);\n\t });\n\t\n\t if (isDraggedNode) {\n\t // neglect the dragged nodes themselves and their childs\n\t }\n\t else if (nodePrev instanceof AppendNode) {\n\t var childs = nodePrev.parent.childs;\n\t if (childs.length != nodes.length || childs[nodes.length - 1] != lastNode) {\n\t // non-visible append node of a list of childs\n\t // consisting of not only this node (else the\n\t // append node will change into a visible \"empty\"\n\t // text when removing this node).\n\t nodeNext = Node.getNodeFromTarget(trPrev);\n\t levelNext = nodeNext.getLevel();\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t else {\n\t break;\n\t }\n\t\n\t trPrev = trPrev.previousSibling;\n\t }\n\t\n\t // move the node when its position is changed\n\t if (trLast.nextSibling != nodeNext.dom.tr) {\n\t nodes.forEach(function (node) {\n\t nodeNext.parent.moveBefore(node, nodeNext);\n\t });\n\t moved = true;\n\t }\n\t }\n\t }\n\t }\n\t\n\t if (moved) {\n\t // update the dragging parameters when moved\n\t editor.drag.mouseX = mouseX;\n\t editor.drag.level = firstNode.getLevel();\n\t }\n\t\n\t // auto scroll when hovering around the top of the editor\n\t editor.startAutoScroll(mouseY);\n\t\n\t event.preventDefault();\n\t};\n\t\n\t/**\n\t * Drag event, fired on mouseup after having dragged a node\n\t * @param {Node[] | Node} nodes\n\t * @param {Event} event\n\t */\n\tNode.onDragEnd = function (nodes, event) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDrag([nodes], event);\n\t }\n\t if (nodes.length === 0) {\n\t return;\n\t }\n\t\n\t var firstNode = nodes[0];\n\t var editor = firstNode.editor;\n\t var parent = firstNode.parent;\n\t var firstIndex = parent.childs.indexOf(firstNode);\n\t var beforeNode = parent.childs[firstIndex + nodes.length] || parent.append;\n\t\n\t // set focus to the context menu button of the first node\n\t if (nodes[0]) {\n\t nodes[0].dom.menu.focus();\n\t }\n\t\n\t var params = {\n\t nodes: nodes,\n\t oldSelection: editor.drag.oldSelection,\n\t newSelection: editor.getSelection(),\n\t oldBeforeNode: editor.drag.oldBeforeNode,\n\t newBeforeNode: beforeNode\n\t };\n\t\n\t if (params.oldBeforeNode != params.newBeforeNode) {\n\t // only register this action if the node is actually moved to another place\n\t editor._onAction('moveNodes', params);\n\t }\n\t\n\t document.body.style.cursor = editor.drag.oldCursor;\n\t editor.highlighter.unlock();\n\t nodes.forEach(function (node) {\n\t if (event.target !== node.dom.drag && event.target !== node.dom.menu) {\n\t editor.highlighter.unhighlight();\n\t }\n\t });\n\t delete editor.drag;\n\t\n\t if (editor.mousemove) {\n\t util.removeEventListener(window, 'mousemove', editor.mousemove);\n\t delete editor.mousemove;\n\t }\n\t if (editor.mouseup) {\n\t util.removeEventListener(window, 'mouseup', editor.mouseup);\n\t delete editor.mouseup;\n\t }\n\t\n\t // Stop any running auto scroll\n\t editor.stopAutoScroll();\n\t\n\t event.preventDefault();\n\t};\n\t\n\t/**\n\t * Test if this node is a child of an other node\n\t * @param {Node} node\n\t * @return {boolean} isChild\n\t * @private\n\t */\n\tNode.prototype._isChildOf = function (node) {\n\t var n = this.parent;\n\t while (n) {\n\t if (n == node) {\n\t return true;\n\t }\n\t n = n.parent;\n\t }\n\t\n\t return false;\n\t};\n\t\n\t/**\n\t * Create an editable field\n\t * @return {Element} domField\n\t * @private\n\t */\n\tNode.prototype._createDomField = function () {\n\t return document.createElement('div');\n\t};\n\t\n\t/**\n\t * Set highlighting for this node and all its childs.\n\t * Only applied to the currently visible (expanded childs)\n\t * @param {boolean} highlight\n\t */\n\tNode.prototype.setHighlight = function (highlight) {\n\t if (this.dom.tr) {\n\t if (highlight) {\n\t util.addClassName(this.dom.tr, 'jsoneditor-highlight');\n\t }\n\t else {\n\t util.removeClassName(this.dom.tr, 'jsoneditor-highlight');\n\t }\n\t\n\t if (this.append) {\n\t this.append.setHighlight(highlight);\n\t }\n\t\n\t if (this.childs) {\n\t this.childs.forEach(function (child) {\n\t child.setHighlight(highlight);\n\t });\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Select or deselect a node\n\t * @param {boolean} selected\n\t * @param {boolean} [isFirst]\n\t */\n\tNode.prototype.setSelected = function (selected, isFirst) {\n\t this.selected = selected;\n\t\n\t if (this.dom.tr) {\n\t if (selected) {\n\t util.addClassName(this.dom.tr, 'jsoneditor-selected');\n\t }\n\t else {\n\t util.removeClassName(this.dom.tr, 'jsoneditor-selected');\n\t }\n\t\n\t if (isFirst) {\n\t util.addClassName(this.dom.tr, 'jsoneditor-first');\n\t }\n\t else {\n\t util.removeClassName(this.dom.tr, 'jsoneditor-first');\n\t }\n\t\n\t if (this.append) {\n\t this.append.setSelected(selected);\n\t }\n\t\n\t if (this.childs) {\n\t this.childs.forEach(function (child) {\n\t child.setSelected(selected);\n\t });\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Update the value of the node. Only primitive types are allowed, no Object\n\t * or Array is allowed.\n\t * @param {String | Number | Boolean | null} value\n\t */\n\tNode.prototype.updateValue = function (value) {\n\t this.value = value;\n\t this.updateDom();\n\t};\n\t\n\t/**\n\t * Update the field of the node.\n\t * @param {String} field\n\t */\n\tNode.prototype.updateField = function (field) {\n\t this.field = field;\n\t this.updateDom();\n\t};\n\t\n\t/**\n\t * Update the HTML DOM, optionally recursing through the childs\n\t * @param {Object} [options] Available parameters:\n\t * {boolean} [recurse] If true, the\n\t * DOM of the childs will be updated recursively.\n\t * False by default.\n\t * {boolean} [updateIndexes] If true, the childs\n\t * indexes of the node will be updated too. False by\n\t * default.\n\t */\n\tNode.prototype.updateDom = function (options) {\n\t // update level indentation\n\t var domTree = this.dom.tree;\n\t if (domTree) {\n\t domTree.style.marginLeft = this.getLevel() * 24 + 'px';\n\t }\n\t\n\t // apply field to DOM\n\t var domField = this.dom.field;\n\t if (domField) {\n\t if (this.fieldEditable) {\n\t // parent is an object\n\t domField.contentEditable = this.editable.field;\n\t domField.spellcheck = false;\n\t domField.className = 'jsoneditor-field';\n\t }\n\t else {\n\t // parent is an array this is the root node\n\t domField.className = 'jsoneditor-readonly';\n\t }\n\t\n\t var fieldText;\n\t if (this.index != undefined) {\n\t fieldText = this.index;\n\t }\n\t else if (this.field != undefined) {\n\t fieldText = this.field;\n\t }\n\t else if (this._hasChilds()) {\n\t fieldText = this.type;\n\t }\n\t else {\n\t fieldText = '';\n\t }\n\t domField.innerHTML = this._escapeHTML(fieldText);\n\t\n\t this._updateSchema();\n\t }\n\t\n\t // apply value to DOM\n\t var domValue = this.dom.value;\n\t if (domValue) {\n\t var count = this.childs ? this.childs.length : 0;\n\t if (this.type == 'array') {\n\t domValue.innerHTML = '[' + count + ']';\n\t util.addClassName(this.dom.tr, 'jsoneditor-expandable');\n\t }\n\t else if (this.type == 'object') {\n\t domValue.innerHTML = '{' + count + '}';\n\t util.addClassName(this.dom.tr, 'jsoneditor-expandable');\n\t }\n\t else {\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t util.removeClassName(this.dom.tr, 'jsoneditor-expandable');\n\t }\n\t }\n\t\n\t // update field and value\n\t this._updateDomField();\n\t this._updateDomValue();\n\t\n\t // update childs indexes\n\t if (options && options.updateIndexes === true) {\n\t // updateIndexes is true or undefined\n\t this._updateDomIndexes();\n\t }\n\t\n\t if (options && options.recurse === true) {\n\t // recurse is true or undefined. update childs recursively\n\t if (this.childs) {\n\t this.childs.forEach(function (child) {\n\t child.updateDom(options);\n\t });\n\t }\n\t }\n\t\n\t // update row with append button\n\t if (this.append) {\n\t this.append.updateDom();\n\t }\n\t};\n\t\n\t/**\n\t * Locate the JSON schema of the node and check for any enum type\n\t * @private\n\t */\n\tNode.prototype._updateSchema = function () {\n\t //Locating the schema of the node and checking for any enum type\n\t if(this.editor && this.editor.options) {\n\t // find the part of the json schema matching this nodes path\n\t this.schema = Node._findSchema(this.editor.options.schema, this.getPath());\n\t if (this.schema) {\n\t this.enum = Node._findEnum(this.schema);\n\t }\n\t else {\n\t delete this.enum;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * find an enum definition in a JSON schema, as property `enum` or inside\n\t * one of the schemas composites (`oneOf`, `anyOf`, `allOf`)\n\t * @param {Object} schema\n\t * @return {Array | null} Returns the enum when found, null otherwise.\n\t * @private\n\t */\n\tNode._findEnum = function (schema) {\n\t if (schema.enum) {\n\t return schema.enum;\n\t }\n\t\n\t var composite = schema.oneOf || schema.anyOf || schema.allOf;\n\t if (composite) {\n\t var match = composite.filter(function (entry) {return entry.enum});\n\t if (match.length > 0) {\n\t return match[0].enum;\n\t }\n\t }\n\t\n\t return null\n\t};\n\t\n\t/**\n\t * Return the part of a JSON schema matching given path.\n\t * @param {Object} schema\n\t * @param {Array.} path\n\t * @return {Object | null}\n\t * @private\n\t */\n\tNode._findSchema = function (schema, path) {\n\t var childSchema = schema;\n\t\n\t for (var i = 0; i < path.length && childSchema; i++) {\n\t var key = path[i];\n\t if (typeof key === 'string' && childSchema.properties) {\n\t childSchema = childSchema.properties[key] || null\n\t }\n\t else if (typeof key === 'number' && childSchema.items) {\n\t childSchema = childSchema.items\n\t }\n\t }\n\t\n\t return childSchema\n\t};\n\t\n\t/**\n\t * Update the DOM of the childs of a node: update indexes and undefined field\n\t * names.\n\t * Only applicable when structure is an array or object\n\t * @private\n\t */\n\tNode.prototype._updateDomIndexes = function () {\n\t var domValue = this.dom.value;\n\t var childs = this.childs;\n\t if (domValue && childs) {\n\t if (this.type == 'array') {\n\t childs.forEach(function (child, index) {\n\t child.index = index;\n\t var childField = child.dom.field;\n\t if (childField) {\n\t childField.innerHTML = index;\n\t }\n\t });\n\t }\n\t else if (this.type == 'object') {\n\t childs.forEach(function (child) {\n\t if (child.index != undefined) {\n\t delete child.index;\n\t\n\t if (child.field == undefined) {\n\t child.field = '';\n\t }\n\t }\n\t });\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Create an editable value\n\t * @private\n\t */\n\tNode.prototype._createDomValue = function () {\n\t var domValue;\n\t\n\t if (this.type == 'array') {\n\t domValue = document.createElement('div');\n\t domValue.innerHTML = '[...]';\n\t }\n\t else if (this.type == 'object') {\n\t domValue = document.createElement('div');\n\t domValue.innerHTML = '{...}';\n\t }\n\t else {\n\t if (!this.editable.value && util.isUrl(this.value)) {\n\t // create a link in case of read-only editor and value containing an url\n\t domValue = document.createElement('a');\n\t domValue.href = this.value;\n\t domValue.target = '_blank';\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t }\n\t else {\n\t // create an editable or read-only div\n\t domValue = document.createElement('div');\n\t domValue.contentEditable = this.editable.value;\n\t domValue.spellcheck = false;\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t }\n\t }\n\t\n\t return domValue;\n\t};\n\t\n\t/**\n\t * Create an expand/collapse button\n\t * @return {Element} expand\n\t * @private\n\t */\n\tNode.prototype._createDomExpandButton = function () {\n\t // create expand button\n\t var expand = document.createElement('button');\n\t expand.type = 'button';\n\t if (this._hasChilds()) {\n\t expand.className = this.expanded ? 'jsoneditor-expanded' : 'jsoneditor-collapsed';\n\t expand.title =\n\t 'Click to expand/collapse this field (Ctrl+E). \\n' +\n\t 'Ctrl+Click to expand/collapse including all childs.';\n\t }\n\t else {\n\t expand.className = 'jsoneditor-invisible';\n\t expand.title = '';\n\t }\n\t\n\t return expand;\n\t};\n\t\n\t\n\t/**\n\t * Create a DOM tree element, containing the expand/collapse button\n\t * @return {Element} domTree\n\t * @private\n\t */\n\tNode.prototype._createDomTree = function () {\n\t var dom = this.dom;\n\t var domTree = document.createElement('table');\n\t var tbody = document.createElement('tbody');\n\t domTree.style.borderCollapse = 'collapse'; // TODO: put in css\n\t domTree.className = 'jsoneditor-values';\n\t domTree.appendChild(tbody);\n\t var tr = document.createElement('tr');\n\t tbody.appendChild(tr);\n\t\n\t // create expand button\n\t var tdExpand = document.createElement('td');\n\t tdExpand.className = 'jsoneditor-tree';\n\t tr.appendChild(tdExpand);\n\t dom.expand = this._createDomExpandButton();\n\t tdExpand.appendChild(dom.expand);\n\t dom.tdExpand = tdExpand;\n\t\n\t // create the field\n\t var tdField = document.createElement('td');\n\t tdField.className = 'jsoneditor-tree';\n\t tr.appendChild(tdField);\n\t dom.field = this._createDomField();\n\t tdField.appendChild(dom.field);\n\t dom.tdField = tdField;\n\t\n\t // create a separator\n\t var tdSeparator = document.createElement('td');\n\t tdSeparator.className = 'jsoneditor-tree';\n\t tr.appendChild(tdSeparator);\n\t if (this.type != 'object' && this.type != 'array') {\n\t tdSeparator.appendChild(document.createTextNode(':'));\n\t tdSeparator.className = 'jsoneditor-separator';\n\t }\n\t dom.tdSeparator = tdSeparator;\n\t\n\t // create the value\n\t var tdValue = document.createElement('td');\n\t tdValue.className = 'jsoneditor-tree';\n\t tr.appendChild(tdValue);\n\t dom.value = this._createDomValue();\n\t tdValue.appendChild(dom.value);\n\t dom.tdValue = tdValue;\n\t\n\t return domTree;\n\t};\n\t\n\t/**\n\t * Handle an event. The event is caught centrally by the editor\n\t * @param {Event} event\n\t */\n\tNode.prototype.onEvent = function (event) {\n\t var type = event.type,\n\t target = event.target || event.srcElement,\n\t dom = this.dom,\n\t node = this,\n\t expandable = this._hasChilds();\n\t\n\t // check if mouse is on menu or on dragarea.\n\t // If so, highlight current row and its childs\n\t if (target == dom.drag || target == dom.menu) {\n\t if (type == 'mouseover') {\n\t this.editor.highlighter.highlight(this);\n\t }\n\t else if (type == 'mouseout') {\n\t this.editor.highlighter.unhighlight();\n\t }\n\t }\n\t\n\t // context menu events\n\t if (type == 'click' && target == dom.menu) {\n\t var highlighter = node.editor.highlighter;\n\t highlighter.highlight(node);\n\t highlighter.lock();\n\t util.addClassName(dom.menu, 'jsoneditor-selected');\n\t this.showContextMenu(dom.menu, function () {\n\t util.removeClassName(dom.menu, 'jsoneditor-selected');\n\t highlighter.unlock();\n\t highlighter.unhighlight();\n\t });\n\t }\n\t\n\t // expand events\n\t if (type == 'click') {\n\t if (target == dom.expand ||\n\t ((node.editor.options.mode === 'view' || node.editor.options.mode === 'form') && target.nodeName === 'DIV')) {\n\t if (expandable) {\n\t var recurse = event.ctrlKey; // with ctrl-key, expand/collapse all\n\t this._onExpand(recurse);\n\t }\n\t }\n\t }\n\t\n\t // swap the value of a boolean when the checkbox displayed left is clicked\n\t if (type == 'change' && target == dom.checkbox) {\n\t this.dom.value.innerHTML = !this.value;\n\t this._getDomValue();\n\t }\n\t\n\t // update the value of the node based on the selected option\n\t if (type == 'change' && target == dom.select) {\n\t this.dom.value.innerHTML = dom.select.value;\n\t this._getDomValue();\n\t this._updateDomValue();\n\t }\n\t\n\t // value events\n\t var domValue = dom.value;\n\t if (target == domValue) {\n\t //noinspection FallthroughInSwitchStatementJS\n\t switch (type) {\n\t case 'blur':\n\t case 'change':\n\t this._getDomValue(true);\n\t this._updateDomValue();\n\t if (this.value) {\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t }\n\t break;\n\t\n\t case 'input':\n\t //this._debouncedGetDomValue(true); // TODO\n\t this._getDomValue(true);\n\t this._updateDomValue();\n\t break;\n\t\n\t case 'keydown':\n\t case 'mousedown':\n\t // TODO: cleanup\n\t this.editor.selection = this.editor.getSelection();\n\t break;\n\t\n\t case 'click':\n\t if (event.ctrlKey || !this.editable.value) {\n\t if (util.isUrl(this.value)) {\n\t window.open(this.value, '_blank');\n\t }\n\t }\n\t break;\n\t\n\t case 'keyup':\n\t //this._debouncedGetDomValue(true); // TODO\n\t this._getDomValue(true);\n\t this._updateDomValue();\n\t break;\n\t\n\t case 'cut':\n\t case 'paste':\n\t setTimeout(function () {\n\t node._getDomValue(true);\n\t node._updateDomValue();\n\t }, 1);\n\t break;\n\t }\n\t }\n\t\n\t // field events\n\t var domField = dom.field;\n\t if (target == domField) {\n\t switch (type) {\n\t case 'blur':\n\t case 'change':\n\t this._getDomField(true);\n\t this._updateDomField();\n\t if (this.field) {\n\t domField.innerHTML = this._escapeHTML(this.field);\n\t }\n\t break;\n\t\n\t case 'input':\n\t this._getDomField(true);\n\t this._updateSchema();\n\t this._updateDomField();\n\t this._updateDomValue();\n\t break;\n\t\n\t case 'keydown':\n\t case 'mousedown':\n\t this.editor.selection = this.editor.getSelection();\n\t break;\n\t\n\t case 'keyup':\n\t this._getDomField(true);\n\t this._updateDomField();\n\t break;\n\t\n\t case 'cut':\n\t case 'paste':\n\t setTimeout(function () {\n\t node._getDomField(true);\n\t node._updateDomField();\n\t }, 1);\n\t break;\n\t }\n\t }\n\t\n\t // focus\n\t // when clicked in whitespace left or right from the field or value, set focus\n\t var domTree = dom.tree;\n\t if (target == domTree.parentNode && type == 'click' && !event.hasMoved) {\n\t var left = (event.offsetX != undefined) ?\n\t (event.offsetX < (this.getLevel() + 1) * 24) :\n\t (event.pageX < util.getAbsoluteLeft(dom.tdSeparator));// for FF\n\t if (left || expandable) {\n\t // node is expandable when it is an object or array\n\t if (domField) {\n\t util.setEndOfContentEditable(domField);\n\t domField.focus();\n\t }\n\t }\n\t else {\n\t if (domValue && !this.enum) {\n\t util.setEndOfContentEditable(domValue);\n\t domValue.focus();\n\t }\n\t }\n\t }\n\t if (((target == dom.tdExpand && !expandable) || target == dom.tdField || target == dom.tdSeparator) &&\n\t (type == 'click' && !event.hasMoved)) {\n\t if (domField) {\n\t util.setEndOfContentEditable(domField);\n\t domField.focus();\n\t }\n\t }\n\t\n\t if (type == 'keydown') {\n\t this.onKeyDown(event);\n\t }\n\t};\n\t\n\t/**\n\t * Key down event handler\n\t * @param {Event} event\n\t */\n\tNode.prototype.onKeyDown = function (event) {\n\t var keynum = event.which || event.keyCode;\n\t var target = event.target || event.srcElement;\n\t var ctrlKey = event.ctrlKey;\n\t var shiftKey = event.shiftKey;\n\t var altKey = event.altKey;\n\t var handled = false;\n\t var prevNode, nextNode, nextDom, nextDom2;\n\t var editable = this.editor.options.mode === 'tree';\n\t var oldSelection;\n\t var oldBeforeNode;\n\t var nodes;\n\t var multiselection;\n\t var selectedNodes = this.editor.multiselection.nodes.length > 0\n\t ? this.editor.multiselection.nodes\n\t : [this];\n\t var firstNode = selectedNodes[0];\n\t var lastNode = selectedNodes[selectedNodes.length - 1];\n\t\n\t // console.log(ctrlKey, keynum, event.charCode); // TODO: cleanup\n\t if (keynum == 13) { // Enter\n\t if (target == this.dom.value) {\n\t if (!this.editable.value || event.ctrlKey) {\n\t if (util.isUrl(this.value)) {\n\t window.open(this.value, '_blank');\n\t handled = true;\n\t }\n\t }\n\t }\n\t else if (target == this.dom.expand) {\n\t var expandable = this._hasChilds();\n\t if (expandable) {\n\t var recurse = event.ctrlKey; // with ctrl-key, expand/collapse all\n\t this._onExpand(recurse);\n\t target.focus();\n\t handled = true;\n\t }\n\t }\n\t }\n\t else if (keynum == 68) { // D\n\t if (ctrlKey && editable) { // Ctrl+D\n\t Node.onDuplicate(selectedNodes);\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 69) { // E\n\t if (ctrlKey) { // Ctrl+E and Ctrl+Shift+E\n\t this._onExpand(shiftKey); // recurse = shiftKey\n\t target.focus(); // TODO: should restore focus in case of recursing expand (which takes DOM offline)\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 77 && editable) { // M\n\t if (ctrlKey) { // Ctrl+M\n\t this.showContextMenu(target);\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 46 && editable) { // Del\n\t if (ctrlKey) { // Ctrl+Del\n\t Node.onRemove(selectedNodes);\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 45 && editable) { // Ins\n\t if (ctrlKey && !shiftKey) { // Ctrl+Ins\n\t this._onInsertBefore();\n\t handled = true;\n\t }\n\t else if (ctrlKey && shiftKey) { // Ctrl+Shift+Ins\n\t this._onInsertAfter();\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 35) { // End\n\t if (altKey) { // Alt+End\n\t // find the last node\n\t var endNode = this._lastNode();\n\t if (endNode) {\n\t endNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 36) { // Home\n\t if (altKey) { // Alt+Home\n\t // find the first node\n\t var homeNode = this._firstNode();\n\t if (homeNode) {\n\t homeNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 37) { // Arrow Left\n\t if (altKey && !shiftKey) { // Alt + Arrow Left\n\t // move to left element\n\t var prevElement = this._previousElement(target);\n\t if (prevElement) {\n\t this.focus(this._getElementName(prevElement));\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow left\n\t if (lastNode.expanded) {\n\t var appendDom = lastNode.getAppend();\n\t nextDom = appendDom ? appendDom.nextSibling : undefined;\n\t }\n\t else {\n\t var dom = lastNode.getDom();\n\t nextDom = dom.nextSibling;\n\t }\n\t if (nextDom) {\n\t nextNode = Node.getNodeFromTarget(nextDom);\n\t nextDom2 = nextDom.nextSibling;\n\t nextNode2 = Node.getNodeFromTarget(nextDom2);\n\t if (nextNode && nextNode instanceof AppendNode &&\n\t !(lastNode.parent.childs.length == 1) &&\n\t nextNode2 && nextNode2.parent) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\t\n\t selectedNodes.forEach(function (node) {\n\t nextNode2.parent.moveBefore(node, nextNode2);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\t\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: nextNode2,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t }\n\t }\n\t }\n\t else if (keynum == 38) { // Arrow Up\n\t if (altKey && !shiftKey) { // Alt + Arrow Up\n\t // find the previous node\n\t prevNode = this._previousNode();\n\t if (prevNode) {\n\t this.editor.deselect(true);\n\t prevNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t else if (!altKey && ctrlKey && shiftKey && editable) { // Ctrl + Shift + Arrow Up\n\t // select multiple nodes\n\t prevNode = this._previousNode();\n\t if (prevNode) {\n\t multiselection = this.editor.multiselection;\n\t multiselection.start = multiselection.start || this;\n\t multiselection.end = prevNode;\n\t nodes = this.editor._findTopLevelNodes(multiselection.start, multiselection.end);\n\t\n\t this.editor.select(nodes);\n\t prevNode.focus('field'); // select field as we know this always exists\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Up\n\t // find the previous node\n\t prevNode = firstNode._previousNode();\n\t if (prevNode && prevNode.parent) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\t\n\t selectedNodes.forEach(function (node) {\n\t prevNode.parent.moveBefore(node, prevNode);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\t\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: prevNode,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 39) { // Arrow Right\n\t if (altKey && !shiftKey) { // Alt + Arrow Right\n\t // move to right element\n\t var nextElement = this._nextElement(target);\n\t if (nextElement) {\n\t this.focus(this._getElementName(nextElement));\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Right\n\t dom = firstNode.getDom();\n\t var prevDom = dom.previousSibling;\n\t if (prevDom) {\n\t prevNode = Node.getNodeFromTarget(prevDom);\n\t if (prevNode && prevNode.parent &&\n\t (prevNode instanceof AppendNode)\n\t && !prevNode.isVisible()) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\t\n\t selectedNodes.forEach(function (node) {\n\t prevNode.parent.moveBefore(node, prevNode);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\t\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: prevNode,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t }\n\t }\n\t }\n\t else if (keynum == 40) { // Arrow Down\n\t if (altKey && !shiftKey) { // Alt + Arrow Down\n\t // find the next node\n\t nextNode = this._nextNode();\n\t if (nextNode) {\n\t this.editor.deselect(true);\n\t nextNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t else if (!altKey && ctrlKey && shiftKey && editable) { // Ctrl + Shift + Arrow Down\n\t // select multiple nodes\n\t nextNode = this._nextNode();\n\t if (nextNode) {\n\t multiselection = this.editor.multiselection;\n\t multiselection.start = multiselection.start || this;\n\t multiselection.end = nextNode;\n\t nodes = this.editor._findTopLevelNodes(multiselection.start, multiselection.end);\n\t\n\t this.editor.select(nodes);\n\t nextNode.focus('field'); // select field as we know this always exists\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Down\n\t // find the 2nd next node and move before that one\n\t if (lastNode.expanded) {\n\t nextNode = lastNode.append ? lastNode.append._nextNode() : undefined;\n\t }\n\t else {\n\t nextNode = lastNode._nextNode();\n\t }\n\t var nextNode2 = nextNode && (nextNode._nextNode() || nextNode.parent.append);\n\t if (nextNode2 && nextNode2.parent) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\t\n\t selectedNodes.forEach(function (node) {\n\t nextNode2.parent.moveBefore(node, nextNode2);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\t\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: nextNode2,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t handled = true;\n\t }\n\t }\n\t\n\t if (handled) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\t\n\t/**\n\t * Handle the expand event, when clicked on the expand button\n\t * @param {boolean} recurse If true, child nodes will be expanded too\n\t * @private\n\t */\n\tNode.prototype._onExpand = function (recurse) {\n\t if (recurse) {\n\t // Take the table offline\n\t var table = this.dom.tr.parentNode; // TODO: not nice to access the main table like this\n\t var frame = table.parentNode;\n\t var scrollTop = frame.scrollTop;\n\t frame.removeChild(table);\n\t }\n\t\n\t if (this.expanded) {\n\t this.collapse(recurse);\n\t }\n\t else {\n\t this.expand(recurse);\n\t }\n\t\n\t if (recurse) {\n\t // Put the table online again\n\t frame.appendChild(table);\n\t frame.scrollTop = scrollTop;\n\t }\n\t};\n\t\n\t/**\n\t * Remove nodes\n\t * @param {Node[] | Node} nodes\n\t */\n\tNode.onRemove = function(nodes) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onRemove([nodes]);\n\t }\n\t\n\t if (nodes && nodes.length > 0) {\n\t var firstNode = nodes[0];\n\t var parent = firstNode.parent;\n\t var editor = firstNode.editor;\n\t var firstIndex = firstNode.getIndex();\n\t editor.highlighter.unhighlight();\n\t\n\t // adjust the focus\n\t var oldSelection = editor.getSelection();\n\t Node.blurNodes(nodes);\n\t var newSelection = editor.getSelection();\n\t\n\t // remove the nodes\n\t nodes.forEach(function (node) {\n\t node.parent._remove(node);\n\t });\n\t\n\t // store history action\n\t editor._onAction('removeNodes', {\n\t nodes: nodes.slice(0), // store a copy of the array!\n\t parent: parent,\n\t index: firstIndex,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Duplicate nodes\n\t * duplicated nodes will be added right after the original nodes\n\t * @param {Node[] | Node} nodes\n\t */\n\tNode.onDuplicate = function(nodes) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDuplicate([nodes]);\n\t }\n\t\n\t if (nodes && nodes.length > 0) {\n\t var lastNode = nodes[nodes.length - 1];\n\t var parent = lastNode.parent;\n\t var editor = lastNode.editor;\n\t\n\t editor.deselect(editor.multiselection.nodes);\n\t\n\t // duplicate the nodes\n\t var oldSelection = editor.getSelection();\n\t var afterNode = lastNode;\n\t var clones = nodes.map(function (node) {\n\t var clone = node.clone();\n\t parent.insertAfter(clone, afterNode);\n\t afterNode = clone;\n\t return clone;\n\t });\n\t\n\t // set selection to the duplicated nodes\n\t if (nodes.length === 1) {\n\t clones[0].focus();\n\t }\n\t else {\n\t editor.select(clones);\n\t }\n\t var newSelection = editor.getSelection();\n\t\n\t editor._onAction('duplicateNodes', {\n\t afterNode: lastNode,\n\t nodes: clones,\n\t parent: parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t }\n\t};\n\t\n\t/**\n\t * Handle insert before event\n\t * @param {String} [field]\n\t * @param {*} [value]\n\t * @param {String} [type] Can be 'auto', 'array', 'object', or 'string'\n\t * @private\n\t */\n\tNode.prototype._onInsertBefore = function (field, value, type) {\n\t var oldSelection = this.editor.getSelection();\n\t\n\t var newNode = new Node(this.editor, {\n\t field: (field != undefined) ? field : '',\n\t value: (value != undefined) ? value : '',\n\t type: type\n\t });\n\t newNode.expand(true);\n\t this.parent.insertBefore(newNode, this);\n\t this.editor.highlighter.unhighlight();\n\t newNode.focus('field');\n\t var newSelection = this.editor.getSelection();\n\t\n\t this.editor._onAction('insertBeforeNodes', {\n\t nodes: [newNode],\n\t beforeNode: this,\n\t parent: this.parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t};\n\t\n\t/**\n\t * Handle insert after event\n\t * @param {String} [field]\n\t * @param {*} [value]\n\t * @param {String} [type] Can be 'auto', 'array', 'object', or 'string'\n\t * @private\n\t */\n\tNode.prototype._onInsertAfter = function (field, value, type) {\n\t var oldSelection = this.editor.getSelection();\n\t\n\t var newNode = new Node(this.editor, {\n\t field: (field != undefined) ? field : '',\n\t value: (value != undefined) ? value : '',\n\t type: type\n\t });\n\t newNode.expand(true);\n\t this.parent.insertAfter(newNode, this);\n\t this.editor.highlighter.unhighlight();\n\t newNode.focus('field');\n\t var newSelection = this.editor.getSelection();\n\t\n\t this.editor._onAction('insertAfterNodes', {\n\t nodes: [newNode],\n\t afterNode: this,\n\t parent: this.parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t};\n\t\n\t/**\n\t * Handle append event\n\t * @param {String} [field]\n\t * @param {*} [value]\n\t * @param {String} [type] Can be 'auto', 'array', 'object', or 'string'\n\t * @private\n\t */\n\tNode.prototype._onAppend = function (field, value, type) {\n\t var oldSelection = this.editor.getSelection();\n\t\n\t var newNode = new Node(this.editor, {\n\t field: (field != undefined) ? field : '',\n\t value: (value != undefined) ? value : '',\n\t type: type\n\t });\n\t newNode.expand(true);\n\t this.parent.appendChild(newNode);\n\t this.editor.highlighter.unhighlight();\n\t newNode.focus('field');\n\t var newSelection = this.editor.getSelection();\n\t\n\t this.editor._onAction('appendNodes', {\n\t nodes: [newNode],\n\t parent: this.parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t};\n\t\n\t/**\n\t * Change the type of the node's value\n\t * @param {String} newType\n\t * @private\n\t */\n\tNode.prototype._onChangeType = function (newType) {\n\t var oldType = this.type;\n\t if (newType != oldType) {\n\t var oldSelection = this.editor.getSelection();\n\t this.changeType(newType);\n\t var newSelection = this.editor.getSelection();\n\t\n\t this.editor._onAction('changeType', {\n\t node: this,\n\t oldType: oldType,\n\t newType: newType,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t }\n\t};\n\t\n\t/**\n\t * Sort the child's of the node. Only applicable when the node has type 'object'\n\t * or 'array'.\n\t * @param {String} direction Sorting direction. Available values: \"asc\", \"desc\"\n\t * @private\n\t */\n\tNode.prototype.sort = function (direction) {\n\t if (!this._hasChilds()) {\n\t return;\n\t }\n\t\n\t var order = (direction == 'desc') ? -1 : 1;\n\t var prop = (this.type == 'array') ? 'value': 'field';\n\t this.hideChilds();\n\t\n\t var oldChilds = this.childs;\n\t var oldSortOrder = this.sortOrder;\n\t\n\t // copy the array (the old one will be kept for an undo action\n\t this.childs = this.childs.concat();\n\t\n\t // sort the arrays\n\t this.childs.sort(function (a, b) {\n\t return order * naturalSort(a[prop], b[prop]);\n\t });\n\t this.sortOrder = (order == 1) ? 'asc' : 'desc';\n\t\n\t this.editor._onAction('sort', {\n\t node: this,\n\t oldChilds: oldChilds,\n\t oldSort: oldSortOrder,\n\t newChilds: this.childs,\n\t newSort: this.sortOrder\n\t });\n\t\n\t this.showChilds();\n\t};\n\t\n\t/**\n\t * Create a table row with an append button.\n\t * @return {HTMLElement | undefined} buttonAppend or undefined when inapplicable\n\t */\n\tNode.prototype.getAppend = function () {\n\t if (!this.append) {\n\t this.append = new AppendNode(this.editor);\n\t this.append.setParent(this);\n\t }\n\t return this.append.getDom();\n\t};\n\t\n\t/**\n\t * Find the node from an event target\n\t * @param {Node} target\n\t * @return {Node | undefined} node or undefined when not found\n\t * @static\n\t */\n\tNode.getNodeFromTarget = function (target) {\n\t while (target) {\n\t if (target.node) {\n\t return target.node;\n\t }\n\t target = target.parentNode;\n\t }\n\t\n\t return undefined;\n\t};\n\t\n\t/**\n\t * Remove the focus of given nodes, and move the focus to the (a) node before,\n\t * (b) the node after, or (c) the parent node.\n\t * @param {Array. | Node} nodes\n\t */\n\tNode.blurNodes = function (nodes) {\n\t if (!Array.isArray(nodes)) {\n\t Node.blurNodes([nodes]);\n\t return;\n\t }\n\t\n\t var firstNode = nodes[0];\n\t var parent = firstNode.parent;\n\t var firstIndex = firstNode.getIndex();\n\t\n\t if (parent.childs[firstIndex + nodes.length]) {\n\t parent.childs[firstIndex + nodes.length].focus();\n\t }\n\t else if (parent.childs[firstIndex - 1]) {\n\t parent.childs[firstIndex - 1].focus();\n\t }\n\t else {\n\t parent.focus();\n\t }\n\t};\n\t\n\t/**\n\t * Get the next sibling of current node\n\t * @return {Node} nextSibling\n\t * @private\n\t */\n\tNode.prototype._nextSibling = function () {\n\t var index = this.parent.childs.indexOf(this);\n\t return this.parent.childs[index + 1] || this.parent.append;\n\t};\n\t\n\t/**\n\t * Get the previously rendered node\n\t * @return {Node | null} previousNode\n\t * @private\n\t */\n\tNode.prototype._previousNode = function () {\n\t var prevNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t // find the previous field\n\t var prevDom = dom;\n\t do {\n\t prevDom = prevDom.previousSibling;\n\t prevNode = Node.getNodeFromTarget(prevDom);\n\t }\n\t while (prevDom && (prevNode instanceof AppendNode && !prevNode.isVisible()));\n\t }\n\t return prevNode;\n\t};\n\t\n\t/**\n\t * Get the next rendered node\n\t * @return {Node | null} nextNode\n\t * @private\n\t */\n\tNode.prototype._nextNode = function () {\n\t var nextNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t // find the previous field\n\t var nextDom = dom;\n\t do {\n\t nextDom = nextDom.nextSibling;\n\t nextNode = Node.getNodeFromTarget(nextDom);\n\t }\n\t while (nextDom && (nextNode instanceof AppendNode && !nextNode.isVisible()));\n\t }\n\t\n\t return nextNode;\n\t};\n\t\n\t/**\n\t * Get the first rendered node\n\t * @return {Node | null} firstNode\n\t * @private\n\t */\n\tNode.prototype._firstNode = function () {\n\t var firstNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t var firstDom = dom.parentNode.firstChild;\n\t firstNode = Node.getNodeFromTarget(firstDom);\n\t }\n\t\n\t return firstNode;\n\t};\n\t\n\t/**\n\t * Get the last rendered node\n\t * @return {Node | null} lastNode\n\t * @private\n\t */\n\tNode.prototype._lastNode = function () {\n\t var lastNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t var lastDom = dom.parentNode.lastChild;\n\t lastNode = Node.getNodeFromTarget(lastDom);\n\t while (lastDom && (lastNode instanceof AppendNode && !lastNode.isVisible())) {\n\t lastDom = lastDom.previousSibling;\n\t lastNode = Node.getNodeFromTarget(lastDom);\n\t }\n\t }\n\t return lastNode;\n\t};\n\t\n\t/**\n\t * Get the next element which can have focus.\n\t * @param {Element} elem\n\t * @return {Element | null} nextElem\n\t * @private\n\t */\n\tNode.prototype._previousElement = function (elem) {\n\t var dom = this.dom;\n\t // noinspection FallthroughInSwitchStatementJS\n\t switch (elem) {\n\t case dom.value:\n\t if (this.fieldEditable) {\n\t return dom.field;\n\t }\n\t // intentional fall through\n\t case dom.field:\n\t if (this._hasChilds()) {\n\t return dom.expand;\n\t }\n\t // intentional fall through\n\t case dom.expand:\n\t return dom.menu;\n\t case dom.menu:\n\t if (dom.drag) {\n\t return dom.drag;\n\t }\n\t // intentional fall through\n\t default:\n\t return null;\n\t }\n\t};\n\t\n\t/**\n\t * Get the next element which can have focus.\n\t * @param {Element} elem\n\t * @return {Element | null} nextElem\n\t * @private\n\t */\n\tNode.prototype._nextElement = function (elem) {\n\t var dom = this.dom;\n\t // noinspection FallthroughInSwitchStatementJS\n\t switch (elem) {\n\t case dom.drag:\n\t return dom.menu;\n\t case dom.menu:\n\t if (this._hasChilds()) {\n\t return dom.expand;\n\t }\n\t // intentional fall through\n\t case dom.expand:\n\t if (this.fieldEditable) {\n\t return dom.field;\n\t }\n\t // intentional fall through\n\t case dom.field:\n\t if (!this._hasChilds()) {\n\t return dom.value;\n\t }\n\t default:\n\t return null;\n\t }\n\t};\n\t\n\t/**\n\t * Get the dom name of given element. returns null if not found.\n\t * For example when element == dom.field, \"field\" is returned.\n\t * @param {Element} element\n\t * @return {String | null} elementName Available elements with name: 'drag',\n\t * 'menu', 'expand', 'field', 'value'\n\t * @private\n\t */\n\tNode.prototype._getElementName = function (element) {\n\t var dom = this.dom;\n\t for (var name in dom) {\n\t if (dom.hasOwnProperty(name)) {\n\t if (dom[name] == element) {\n\t return name;\n\t }\n\t }\n\t }\n\t return null;\n\t};\n\t\n\t/**\n\t * Test if this node has childs. This is the case when the node is an object\n\t * or array.\n\t * @return {boolean} hasChilds\n\t * @private\n\t */\n\tNode.prototype._hasChilds = function () {\n\t return this.type == 'array' || this.type == 'object';\n\t};\n\t\n\t// titles with explanation for the different types\n\tNode.TYPE_TITLES = {\n\t 'auto': 'Field type \"auto\". ' +\n\t 'The field type is automatically determined from the value ' +\n\t 'and can be a string, number, boolean, or null.',\n\t 'object': 'Field type \"object\". ' +\n\t 'An object contains an unordered set of key/value pairs.',\n\t 'array': 'Field type \"array\". ' +\n\t 'An array contains an ordered collection of values.',\n\t 'string': 'Field type \"string\". ' +\n\t 'Field type is not determined from the value, ' +\n\t 'but always returned as string.'\n\t};\n\t\n\t/**\n\t * Show a contextmenu for this node\n\t * @param {HTMLElement} anchor Anchor element to attach the context menu to\n\t * as sibling.\n\t * @param {function} [onClose] Callback method called when the context menu\n\t * is being closed.\n\t */\n\tNode.prototype.showContextMenu = function (anchor, onClose) {\n\t var node = this;\n\t var titles = Node.TYPE_TITLES;\n\t var items = [];\n\t\n\t if (this.editable.value) {\n\t items.push({\n\t text: 'Type',\n\t title: 'Change the type of this field',\n\t className: 'jsoneditor-type-' + this.type,\n\t submenu: [\n\t {\n\t text: 'Auto',\n\t className: 'jsoneditor-type-auto' +\n\t (this.type == 'auto' ? ' jsoneditor-selected' : ''),\n\t title: titles.auto,\n\t click: function () {\n\t node._onChangeType('auto');\n\t }\n\t },\n\t {\n\t text: 'Array',\n\t className: 'jsoneditor-type-array' +\n\t (this.type == 'array' ? ' jsoneditor-selected' : ''),\n\t title: titles.array,\n\t click: function () {\n\t node._onChangeType('array');\n\t }\n\t },\n\t {\n\t text: 'Object',\n\t className: 'jsoneditor-type-object' +\n\t (this.type == 'object' ? ' jsoneditor-selected' : ''),\n\t title: titles.object,\n\t click: function () {\n\t node._onChangeType('object');\n\t }\n\t },\n\t {\n\t text: 'String',\n\t className: 'jsoneditor-type-string' +\n\t (this.type == 'string' ? ' jsoneditor-selected' : ''),\n\t title: titles.string,\n\t click: function () {\n\t node._onChangeType('string');\n\t }\n\t }\n\t ]\n\t });\n\t }\n\t\n\t if (this._hasChilds()) {\n\t var direction = ((this.sortOrder == 'asc') ? 'desc': 'asc');\n\t items.push({\n\t text: 'Sort',\n\t title: 'Sort the childs of this ' + this.type,\n\t className: 'jsoneditor-sort-' + direction,\n\t click: function () {\n\t node.sort(direction);\n\t },\n\t submenu: [\n\t {\n\t text: 'Ascending',\n\t className: 'jsoneditor-sort-asc',\n\t title: 'Sort the childs of this ' + this.type + ' in ascending order',\n\t click: function () {\n\t node.sort('asc');\n\t }\n\t },\n\t {\n\t text: 'Descending',\n\t className: 'jsoneditor-sort-desc',\n\t title: 'Sort the childs of this ' + this.type +' in descending order',\n\t click: function () {\n\t node.sort('desc');\n\t }\n\t }\n\t ]\n\t });\n\t }\n\t\n\t if (this.parent && this.parent._hasChilds()) {\n\t if (items.length) {\n\t // create a separator\n\t items.push({\n\t 'type': 'separator'\n\t });\n\t }\n\t\n\t // create append button (for last child node only)\n\t var childs = node.parent.childs;\n\t if (node == childs[childs.length - 1]) {\n\t items.push({\n\t text: 'Append',\n\t title: 'Append a new field with type \\'auto\\' after this field (Ctrl+Shift+Ins)',\n\t submenuTitle: 'Select the type of the field to be appended',\n\t className: 'jsoneditor-append',\n\t click: function () {\n\t node._onAppend('', '', 'auto');\n\t },\n\t submenu: [\n\t {\n\t text: 'Auto',\n\t className: 'jsoneditor-type-auto',\n\t title: titles.auto,\n\t click: function () {\n\t node._onAppend('', '', 'auto');\n\t }\n\t },\n\t {\n\t text: 'Array',\n\t className: 'jsoneditor-type-array',\n\t title: titles.array,\n\t click: function () {\n\t node._onAppend('', []);\n\t }\n\t },\n\t {\n\t text: 'Object',\n\t className: 'jsoneditor-type-object',\n\t title: titles.object,\n\t click: function () {\n\t node._onAppend('', {});\n\t }\n\t },\n\t {\n\t text: 'String',\n\t className: 'jsoneditor-type-string',\n\t title: titles.string,\n\t click: function () {\n\t node._onAppend('', '', 'string');\n\t }\n\t }\n\t ]\n\t });\n\t }\n\t\n\t // create insert button\n\t items.push({\n\t text: 'Insert',\n\t title: 'Insert a new field with type \\'auto\\' before this field (Ctrl+Ins)',\n\t submenuTitle: 'Select the type of the field to be inserted',\n\t className: 'jsoneditor-insert',\n\t click: function () {\n\t node._onInsertBefore('', '', 'auto');\n\t },\n\t submenu: [\n\t {\n\t text: 'Auto',\n\t className: 'jsoneditor-type-auto',\n\t title: titles.auto,\n\t click: function () {\n\t node._onInsertBefore('', '', 'auto');\n\t }\n\t },\n\t {\n\t text: 'Array',\n\t className: 'jsoneditor-type-array',\n\t title: titles.array,\n\t click: function () {\n\t node._onInsertBefore('', []);\n\t }\n\t },\n\t {\n\t text: 'Object',\n\t className: 'jsoneditor-type-object',\n\t title: titles.object,\n\t click: function () {\n\t node._onInsertBefore('', {});\n\t }\n\t },\n\t {\n\t text: 'String',\n\t className: 'jsoneditor-type-string',\n\t title: titles.string,\n\t click: function () {\n\t node._onInsertBefore('', '', 'string');\n\t }\n\t }\n\t ]\n\t });\n\t\n\t if (this.editable.field) {\n\t // create duplicate button\n\t items.push({\n\t text: 'Duplicate',\n\t title: 'Duplicate this field (Ctrl+D)',\n\t className: 'jsoneditor-duplicate',\n\t click: function () {\n\t Node.onDuplicate(node);\n\t }\n\t });\n\t\n\t // create remove button\n\t items.push({\n\t text: 'Remove',\n\t title: 'Remove this field (Ctrl+Del)',\n\t className: 'jsoneditor-remove',\n\t click: function () {\n\t Node.onRemove(node);\n\t }\n\t });\n\t }\n\t }\n\t\n\t var menu = new ContextMenu(items, {close: onClose});\n\t menu.show(anchor, this.editor.content);\n\t};\n\t\n\t/**\n\t * get the type of a value\n\t * @param {*} value\n\t * @return {String} type Can be 'object', 'array', 'string', 'auto'\n\t * @private\n\t */\n\tNode.prototype._getType = function(value) {\n\t if (value instanceof Array) {\n\t return 'array';\n\t }\n\t if (value instanceof Object) {\n\t return 'object';\n\t }\n\t if (typeof(value) == 'string' && typeof(this._stringCast(value)) != 'string') {\n\t return 'string';\n\t }\n\t\n\t return 'auto';\n\t};\n\t\n\t/**\n\t * cast contents of a string to the correct type. This can be a string,\n\t * a number, a boolean, etc\n\t * @param {String} str\n\t * @return {*} castedStr\n\t * @private\n\t */\n\tNode.prototype._stringCast = function(str) {\n\t var lower = str.toLowerCase(),\n\t num = Number(str), // will nicely fail with '123ab'\n\t numFloat = parseFloat(str); // will nicely fail with ' '\n\t\n\t if (str == '') {\n\t return '';\n\t }\n\t else if (lower == 'null') {\n\t return null;\n\t }\n\t else if (lower == 'true') {\n\t return true;\n\t }\n\t else if (lower == 'false') {\n\t return false;\n\t }\n\t else if (!isNaN(num) && !isNaN(numFloat)) {\n\t return num;\n\t }\n\t else {\n\t return str;\n\t }\n\t};\n\t\n\t/**\n\t * escape a text, such that it can be displayed safely in an HTML element\n\t * @param {String} text\n\t * @return {String} escapedText\n\t * @private\n\t */\n\tNode.prototype._escapeHTML = function (text) {\n\t if (typeof text !== 'string') {\n\t return String(text);\n\t }\n\t else {\n\t var htmlEscaped = String(text)\n\t .replace(/&/g, '&') // must be replaced first!\n\t .replace(//g, '>')\n\t .replace(/ /g, '  ') // replace double space with an nbsp and space\n\t .replace(/^ /, ' ') // space at start\n\t .replace(/ $/, ' '); // space at end\n\t\n\t var json = JSON.stringify(htmlEscaped);\n\t var html = json.substring(1, json.length - 1);\n\t if (this.editor.options.escapeUnicode === true) {\n\t html = util.escapeUnicodeChars(html);\n\t }\n\t return html;\n\t }\n\t};\n\t\n\t/**\n\t * unescape a string.\n\t * @param {String} escapedText\n\t * @return {String} text\n\t * @private\n\t */\n\tNode.prototype._unescapeHTML = function (escapedText) {\n\t var json = '\"' + this._escapeJSON(escapedText) + '\"';\n\t var htmlEscaped = util.parse(json);\n\t\n\t return htmlEscaped\n\t .replace(/</g, '<')\n\t .replace(/>/g, '>')\n\t .replace(/ |\\u00A0/g, ' ')\n\t .replace(/&/g, '&'); // must be replaced last\n\t};\n\t\n\t/**\n\t * escape a text to make it a valid JSON string. The method will:\n\t * - replace unescaped double quotes with '\\\"'\n\t * - replace unescaped backslash with '\\\\'\n\t * - replace returns with '\\n'\n\t * @param {String} text\n\t * @return {String} escapedText\n\t * @private\n\t */\n\tNode.prototype._escapeJSON = function (text) {\n\t // TODO: replace with some smart regex (only when a new solution is faster!)\n\t var escaped = '';\n\t var i = 0;\n\t while (i < text.length) {\n\t var c = text.charAt(i);\n\t if (c == '\\n') {\n\t escaped += '\\\\n';\n\t }\n\t else if (c == '\\\\') {\n\t escaped += c;\n\t i++;\n\t\n\t c = text.charAt(i);\n\t if (c === '' || '\"\\\\/bfnrtu'.indexOf(c) == -1) {\n\t escaped += '\\\\'; // no valid escape character\n\t }\n\t escaped += c;\n\t }\n\t else if (c == '\"') {\n\t escaped += '\\\\\"';\n\t }\n\t else {\n\t escaped += c;\n\t }\n\t i++;\n\t }\n\t\n\t return escaped;\n\t};\n\t\n\t// TODO: find a nicer solution to resolve this circular dependency between Node and AppendNode\n\tvar AppendNode = appendNodeFactory(Node);\n\t\n\tmodule.exports = Node;\n\n\n/***/ },\n/* 56 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * @constructor SearchBox\n\t * Create a search box in given HTML container\n\t * @param {JSONEditor} editor The JSON Editor to attach to\n\t * @param {Element} container HTML container element of where to\n\t * create the search box\n\t */\n\tfunction SearchBox (editor, container) {\n\t var searchBox = this;\n\t\n\t this.editor = editor;\n\t this.timeout = undefined;\n\t this.delay = 200; // ms\n\t this.lastText = undefined;\n\t\n\t this.dom = {};\n\t this.dom.container = container;\n\t\n\t var table = document.createElement('table');\n\t this.dom.table = table;\n\t table.className = 'jsoneditor-search';\n\t container.appendChild(table);\n\t var tbody = document.createElement('tbody');\n\t this.dom.tbody = tbody;\n\t table.appendChild(tbody);\n\t var tr = document.createElement('tr');\n\t tbody.appendChild(tr);\n\t\n\t var td = document.createElement('td');\n\t tr.appendChild(td);\n\t var results = document.createElement('div');\n\t this.dom.results = results;\n\t results.className = 'jsoneditor-results';\n\t td.appendChild(results);\n\t\n\t td = document.createElement('td');\n\t tr.appendChild(td);\n\t var divInput = document.createElement('div');\n\t this.dom.input = divInput;\n\t divInput.className = 'jsoneditor-frame';\n\t divInput.title = 'Search fields and values';\n\t td.appendChild(divInput);\n\t\n\t // table to contain the text input and search button\n\t var tableInput = document.createElement('table');\n\t divInput.appendChild(tableInput);\n\t var tbodySearch = document.createElement('tbody');\n\t tableInput.appendChild(tbodySearch);\n\t tr = document.createElement('tr');\n\t tbodySearch.appendChild(tr);\n\t\n\t var refreshSearch = document.createElement('button');\n\t refreshSearch.type = 'button';\n\t refreshSearch.className = 'jsoneditor-refresh';\n\t td = document.createElement('td');\n\t td.appendChild(refreshSearch);\n\t tr.appendChild(td);\n\t\n\t var search = document.createElement('input');\n\t // search.type = 'button';\n\t this.dom.search = search;\n\t search.oninput = function (event) {\n\t searchBox._onDelayedSearch(event);\n\t };\n\t search.onchange = function (event) { // For IE 9\n\t searchBox._onSearch();\n\t };\n\t search.onkeydown = function (event) {\n\t searchBox._onKeyDown(event);\n\t };\n\t search.onkeyup = function (event) {\n\t searchBox._onKeyUp(event);\n\t };\n\t refreshSearch.onclick = function (event) {\n\t search.select();\n\t };\n\t\n\t // TODO: ESC in FF restores the last input, is a FF bug, https://bugzilla.mozilla.org/show_bug.cgi?id=598819\n\t td = document.createElement('td');\n\t td.appendChild(search);\n\t tr.appendChild(td);\n\t\n\t var searchNext = document.createElement('button');\n\t searchNext.type = 'button';\n\t searchNext.title = 'Next result (Enter)';\n\t searchNext.className = 'jsoneditor-next';\n\t searchNext.onclick = function () {\n\t searchBox.next();\n\t };\n\t td = document.createElement('td');\n\t td.appendChild(searchNext);\n\t tr.appendChild(td);\n\t\n\t var searchPrevious = document.createElement('button');\n\t searchPrevious.type = 'button';\n\t searchPrevious.title = 'Previous result (Shift+Enter)';\n\t searchPrevious.className = 'jsoneditor-previous';\n\t searchPrevious.onclick = function () {\n\t searchBox.previous();\n\t };\n\t td = document.createElement('td');\n\t td.appendChild(searchPrevious);\n\t tr.appendChild(td);\n\t}\n\t\n\t/**\n\t * Go to the next search result\n\t * @param {boolean} [focus] If true, focus will be set to the next result\n\t * focus is false by default.\n\t */\n\tSearchBox.prototype.next = function(focus) {\n\t if (this.results != undefined) {\n\t var index = (this.resultIndex != undefined) ? this.resultIndex + 1 : 0;\n\t if (index > this.results.length - 1) {\n\t index = 0;\n\t }\n\t this._setActiveResult(index, focus);\n\t }\n\t};\n\t\n\t/**\n\t * Go to the prevous search result\n\t * @param {boolean} [focus] If true, focus will be set to the next result\n\t * focus is false by default.\n\t */\n\tSearchBox.prototype.previous = function(focus) {\n\t if (this.results != undefined) {\n\t var max = this.results.length - 1;\n\t var index = (this.resultIndex != undefined) ? this.resultIndex - 1 : max;\n\t if (index < 0) {\n\t index = max;\n\t }\n\t this._setActiveResult(index, focus);\n\t }\n\t};\n\t\n\t/**\n\t * Set new value for the current active result\n\t * @param {Number} index\n\t * @param {boolean} [focus] If true, focus will be set to the next result.\n\t * focus is false by default.\n\t * @private\n\t */\n\tSearchBox.prototype._setActiveResult = function(index, focus) {\n\t // de-activate current active result\n\t if (this.activeResult) {\n\t var prevNode = this.activeResult.node;\n\t var prevElem = this.activeResult.elem;\n\t if (prevElem == 'field') {\n\t delete prevNode.searchFieldActive;\n\t }\n\t else {\n\t delete prevNode.searchValueActive;\n\t }\n\t prevNode.updateDom();\n\t }\n\t\n\t if (!this.results || !this.results[index]) {\n\t // out of range, set to undefined\n\t this.resultIndex = undefined;\n\t this.activeResult = undefined;\n\t return;\n\t }\n\t\n\t this.resultIndex = index;\n\t\n\t // set new node active\n\t var node = this.results[this.resultIndex].node;\n\t var elem = this.results[this.resultIndex].elem;\n\t if (elem == 'field') {\n\t node.searchFieldActive = true;\n\t }\n\t else {\n\t node.searchValueActive = true;\n\t }\n\t this.activeResult = this.results[this.resultIndex];\n\t node.updateDom();\n\t\n\t // TODO: not so nice that the focus is only set after the animation is finished\n\t node.scrollTo(function () {\n\t if (focus) {\n\t node.focus(elem);\n\t }\n\t });\n\t};\n\t\n\t/**\n\t * Cancel any running onDelayedSearch.\n\t * @private\n\t */\n\tSearchBox.prototype._clearDelay = function() {\n\t if (this.timeout != undefined) {\n\t clearTimeout(this.timeout);\n\t delete this.timeout;\n\t }\n\t};\n\t\n\t/**\n\t * Start a timer to execute a search after a short delay.\n\t * Used for reducing the number of searches while typing.\n\t * @param {Event} event\n\t * @private\n\t */\n\tSearchBox.prototype._onDelayedSearch = function (event) {\n\t // execute the search after a short delay (reduces the number of\n\t // search actions while typing in the search text box)\n\t this._clearDelay();\n\t var searchBox = this;\n\t this.timeout = setTimeout(function (event) {\n\t searchBox._onSearch();\n\t },\n\t this.delay);\n\t};\n\t\n\t/**\n\t * Handle onSearch event\n\t * @param {boolean} [forceSearch] If true, search will be executed again even\n\t * when the search text is not changed.\n\t * Default is false.\n\t * @private\n\t */\n\tSearchBox.prototype._onSearch = function (forceSearch) {\n\t this._clearDelay();\n\t\n\t var value = this.dom.search.value;\n\t var text = (value.length > 0) ? value : undefined;\n\t if (text != this.lastText || forceSearch) {\n\t // only search again when changed\n\t this.lastText = text;\n\t this.results = this.editor.search(text);\n\t this._setActiveResult(undefined);\n\t\n\t // display search results\n\t if (text != undefined) {\n\t var resultCount = this.results.length;\n\t switch (resultCount) {\n\t case 0: this.dom.results.innerHTML = 'no results'; break;\n\t case 1: this.dom.results.innerHTML = '1 result'; break;\n\t default: this.dom.results.innerHTML = resultCount + ' results'; break;\n\t }\n\t }\n\t else {\n\t this.dom.results.innerHTML = '';\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Handle onKeyDown event in the input box\n\t * @param {Event} event\n\t * @private\n\t */\n\tSearchBox.prototype._onKeyDown = function (event) {\n\t var keynum = event.which;\n\t if (keynum == 27) { // ESC\n\t this.dom.search.value = ''; // clear search\n\t this._onSearch();\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t else if (keynum == 13) { // Enter\n\t if (event.ctrlKey) {\n\t // force to search again\n\t this._onSearch(true);\n\t }\n\t else if (event.shiftKey) {\n\t // move to the previous search result\n\t this.previous();\n\t }\n\t else {\n\t // move to the next search result\n\t this.next();\n\t }\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\t\n\t/**\n\t * Handle onKeyUp event in the input box\n\t * @param {Event} event\n\t * @private\n\t */\n\tSearchBox.prototype._onKeyUp = function (event) {\n\t var keynum = event.keyCode;\n\t if (keynum != 27 && keynum != 13) { // !show and !Enter\n\t this._onDelayedSearch(event); // For IE 9\n\t }\n\t};\n\t\n\t/**\n\t * Clear the search results\n\t */\n\tSearchBox.prototype.clear = function () {\n\t this.dom.search.value = '';\n\t this._onSearch();\n\t};\n\t\n\t/**\n\t * Destroy the search box\n\t */\n\tSearchBox.prototype.destroy = function () {\n\t this.editor = null;\n\t this.dom.container.removeChild(this.dom.table);\n\t this.dom = null;\n\t\n\t this.results = null;\n\t this.activeResult = null;\n\t\n\t this._clearDelay();\n\t\n\t};\n\t\n\tmodule.exports = SearchBox;\n\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// load brace\n\tvar ace = __webpack_require__(45);\n\t\n\t// load required ace modules\n\t__webpack_require__(46);\n\t__webpack_require__(44);\n\t\n\tmodule.exports = ace;\n\n\n/***/ },\n/* 58 */\n/***/ function(module, exports) {\n\n\t/* ***** BEGIN LICENSE BLOCK *****\n\t * Distributed under the BSD license:\n\t *\n\t * Copyright (c) 2010, Ajax.org B.V.\n\t * All rights reserved.\n\t * \n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are met:\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above copyright\n\t * notice, this list of conditions and the following disclaimer in the\n\t * documentation and/or other materials provided with the distribution.\n\t * * Neither the name of Ajax.org B.V. nor the\n\t * names of its contributors may be used to endorse or promote products\n\t * derived from this software without specific prior written permission.\n\t * \n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n\t * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\t * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\t * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n\t * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n\t * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n\t * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t *\n\t * ***** END LICENSE BLOCK ***** */\n\t\n\tace.define('ace/theme/jsoneditor', ['require', 'exports', 'module', 'ace/lib/dom'], function(acequire, exports, module) {\n\t\n\texports.isDark = false;\n\texports.cssClass = \"ace-jsoneditor\";\n\texports.cssText = \".ace-jsoneditor .ace_gutter {\\\n\tbackground: #ebebeb;\\\n\tcolor: #333\\\n\t}\\\n\t\\\n\t.ace-jsoneditor.ace_editor {\\\n\tfont-family: droid sans mono, consolas, monospace, courier new, courier, sans-serif;\\\n\tline-height: 1.3;\\\n\t}\\\n\t.ace-jsoneditor .ace_print-margin {\\\n\twidth: 1px;\\\n\tbackground: #e8e8e8\\\n\t}\\\n\t.ace-jsoneditor .ace_scroller {\\\n\tbackground-color: #FFFFFF\\\n\t}\\\n\t.ace-jsoneditor .ace_text-layer {\\\n\tcolor: gray\\\n\t}\\\n\t.ace-jsoneditor .ace_variable {\\\n\tcolor: #1a1a1a\\\n\t}\\\n\t.ace-jsoneditor .ace_cursor {\\\n\tborder-left: 2px solid #000000\\\n\t}\\\n\t.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\\\n\tborder-left: 0px;\\\n\tborder-bottom: 1px solid #000000\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_selection {\\\n\tbackground: lightgray\\\n\t}\\\n\t.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\\\n\tbox-shadow: 0 0 3px 0px #FFFFFF;\\\n\tborder-radius: 2px\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_step {\\\n\tbackground: rgb(255, 255, 0)\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_bracket {\\\n\tmargin: -1px 0 0 -1px;\\\n\tborder: 1px solid #BFBFBF\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_active-line {\\\n\tbackground: #FFFBD1\\\n\t}\\\n\t.ace-jsoneditor .ace_gutter-active-line {\\\n\tbackground-color : #dcdcdc\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_selected-word {\\\n\tborder: 1px solid lightgray\\\n\t}\\\n\t.ace-jsoneditor .ace_invisible {\\\n\tcolor: #BFBFBF\\\n\t}\\\n\t.ace-jsoneditor .ace_keyword,\\\n\t.ace-jsoneditor .ace_meta,\\\n\t.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\\\n\tcolor: #AF956F\\\n\t}\\\n\t.ace-jsoneditor .ace_keyword.ace_operator {\\\n\tcolor: #484848\\\n\t}\\\n\t.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\\\n\tcolor: #96DC5F\\\n\t}\\\n\t.ace-jsoneditor .ace_constant.ace_language {\\\n\tcolor: darkorange\\\n\t}\\\n\t.ace-jsoneditor .ace_constant.ace_numeric {\\\n\tcolor: red\\\n\t}\\\n\t.ace-jsoneditor .ace_constant.ace_character.ace_entity {\\\n\tcolor: #BF78CC\\\n\t}\\\n\t.ace-jsoneditor .ace_invalid {\\\n\tcolor: #FFFFFF;\\\n\tbackground-color: #FF002A;\\\n\t}\\\n\t.ace-jsoneditor .ace_fold {\\\n\tbackground-color: #AF956F;\\\n\tborder-color: #000000\\\n\t}\\\n\t.ace-jsoneditor .ace_storage,\\\n\t.ace-jsoneditor .ace_support.ace_class,\\\n\t.ace-jsoneditor .ace_support.ace_function,\\\n\t.ace-jsoneditor .ace_support.ace_other,\\\n\t.ace-jsoneditor .ace_support.ace_type {\\\n\tcolor: #C52727\\\n\t}\\\n\t.ace-jsoneditor .ace_string {\\\n\tcolor: green\\\n\t}\\\n\t.ace-jsoneditor .ace_comment {\\\n\tcolor: #BCC8BA\\\n\t}\\\n\t.ace-jsoneditor .ace_entity.ace_name.ace_tag,\\\n\t.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\\\n\tcolor: #606060\\\n\t}\\\n\t.ace-jsoneditor .ace_markup.ace_underline {\\\n\ttext-decoration: underline\\\n\t}\\\n\t.ace-jsoneditor .ace_indent-guide {\\\n\tbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y\\\n\t}\";\n\t\n\tvar dom = acequire(\"../lib/dom\");\n\tdom.importCssString(exports.cssText, exports.cssClass);\n\t});\n\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar util = __webpack_require__(3);\n\tvar ContextMenu = __webpack_require__(4);\n\t\n\t/**\n\t * A factory function to create an AppendNode, which depends on a Node\n\t * @param {Node} Node\n\t */\n\tfunction appendNodeFactory(Node) {\n\t /**\n\t * @constructor AppendNode\n\t * @extends Node\n\t * @param {TreeEditor} editor\n\t * Create a new AppendNode. This is a special node which is created at the\n\t * end of the list with childs for an object or array\n\t */\n\t function AppendNode (editor) {\n\t /** @type {TreeEditor} */\n\t this.editor = editor;\n\t this.dom = {};\n\t }\n\t\n\t AppendNode.prototype = new Node();\n\t\n\t /**\n\t * Return a table row with an append button.\n\t * @return {Element} dom TR element\n\t */\n\t AppendNode.prototype.getDom = function () {\n\t // TODO: implement a new solution for the append node\n\t var dom = this.dom;\n\t\n\t if (dom.tr) {\n\t return dom.tr;\n\t }\n\t\n\t this._updateEditability();\n\t\n\t // a row for the append button\n\t var trAppend = document.createElement('tr');\n\t trAppend.node = this;\n\t dom.tr = trAppend;\n\t\n\t // TODO: consistent naming\n\t\n\t if (this.editor.options.mode === 'tree') {\n\t // a cell for the dragarea column\n\t dom.tdDrag = document.createElement('td');\n\t\n\t // create context menu\n\t var tdMenu = document.createElement('td');\n\t dom.tdMenu = tdMenu;\n\t var menu = document.createElement('button');\n\t menu.type = 'button';\n\t menu.className = 'jsoneditor-contextmenu';\n\t menu.title = 'Click to open the actions menu (Ctrl+M)';\n\t dom.menu = menu;\n\t tdMenu.appendChild(dom.menu);\n\t }\n\t\n\t // a cell for the contents (showing text 'empty')\n\t var tdAppend = document.createElement('td');\n\t var domText = document.createElement('div');\n\t domText.innerHTML = '(empty)';\n\t domText.className = 'jsoneditor-readonly';\n\t tdAppend.appendChild(domText);\n\t dom.td = tdAppend;\n\t dom.text = domText;\n\t\n\t this.updateDom();\n\t\n\t return trAppend;\n\t };\n\t\n\t /**\n\t * Update the HTML dom of the Node\n\t */\n\t AppendNode.prototype.updateDom = function () {\n\t var dom = this.dom;\n\t var tdAppend = dom.td;\n\t if (tdAppend) {\n\t tdAppend.style.paddingLeft = (this.getLevel() * 24 + 26) + 'px';\n\t // TODO: not so nice hard coded offset\n\t }\n\t\n\t var domText = dom.text;\n\t if (domText) {\n\t domText.innerHTML = '(empty ' + this.parent.type + ')';\n\t }\n\t\n\t // attach or detach the contents of the append node:\n\t // hide when the parent has childs, show when the parent has no childs\n\t var trAppend = dom.tr;\n\t if (!this.isVisible()) {\n\t if (dom.tr.firstChild) {\n\t if (dom.tdDrag) {\n\t trAppend.removeChild(dom.tdDrag);\n\t }\n\t if (dom.tdMenu) {\n\t trAppend.removeChild(dom.tdMenu);\n\t }\n\t trAppend.removeChild(tdAppend);\n\t }\n\t }\n\t else {\n\t if (!dom.tr.firstChild) {\n\t if (dom.tdDrag) {\n\t trAppend.appendChild(dom.tdDrag);\n\t }\n\t if (dom.tdMenu) {\n\t trAppend.appendChild(dom.tdMenu);\n\t }\n\t trAppend.appendChild(tdAppend);\n\t }\n\t }\n\t };\n\t\n\t /**\n\t * Check whether the AppendNode is currently visible.\n\t * the AppendNode is visible when its parent has no childs (i.e. is empty).\n\t * @return {boolean} isVisible\n\t */\n\t AppendNode.prototype.isVisible = function () {\n\t return (this.parent.childs.length == 0);\n\t };\n\t\n\t /**\n\t * Show a contextmenu for this node\n\t * @param {HTMLElement} anchor The element to attach the menu to.\n\t * @param {function} [onClose] Callback method called when the context menu\n\t * is being closed.\n\t */\n\t AppendNode.prototype.showContextMenu = function (anchor, onClose) {\n\t var node = this;\n\t var titles = Node.TYPE_TITLES;\n\t var items = [\n\t // create append button\n\t {\n\t 'text': 'Append',\n\t 'title': 'Append a new field with type \\'auto\\' (Ctrl+Shift+Ins)',\n\t 'submenuTitle': 'Select the type of the field to be appended',\n\t 'className': 'jsoneditor-insert',\n\t 'click': function () {\n\t node._onAppend('', '', 'auto');\n\t },\n\t 'submenu': [\n\t {\n\t 'text': 'Auto',\n\t 'className': 'jsoneditor-type-auto',\n\t 'title': titles.auto,\n\t 'click': function () {\n\t node._onAppend('', '', 'auto');\n\t }\n\t },\n\t {\n\t 'text': 'Array',\n\t 'className': 'jsoneditor-type-array',\n\t 'title': titles.array,\n\t 'click': function () {\n\t node._onAppend('', []);\n\t }\n\t },\n\t {\n\t 'text': 'Object',\n\t 'className': 'jsoneditor-type-object',\n\t 'title': titles.object,\n\t 'click': function () {\n\t node._onAppend('', {});\n\t }\n\t },\n\t {\n\t 'text': 'String',\n\t 'className': 'jsoneditor-type-string',\n\t 'title': titles.string,\n\t 'click': function () {\n\t node._onAppend('', '', 'string');\n\t }\n\t }\n\t ]\n\t }\n\t ];\n\t\n\t var menu = new ContextMenu(items, {close: onClose});\n\t menu.show(anchor, this.editor.content);\n\t };\n\t\n\t /**\n\t * Handle an event. The event is catched centrally by the editor\n\t * @param {Event} event\n\t */\n\t AppendNode.prototype.onEvent = function (event) {\n\t var type = event.type;\n\t var target = event.target || event.srcElement;\n\t var dom = this.dom;\n\t\n\t // highlight the append nodes parent\n\t var menu = dom.menu;\n\t if (target == menu) {\n\t if (type == 'mouseover') {\n\t this.editor.highlighter.highlight(this.parent);\n\t }\n\t else if (type == 'mouseout') {\n\t this.editor.highlighter.unhighlight();\n\t }\n\t }\n\t\n\t // context menu events\n\t if (type == 'click' && target == dom.menu) {\n\t var highlighter = this.editor.highlighter;\n\t highlighter.highlight(this.parent);\n\t highlighter.lock();\n\t util.addClassName(dom.menu, 'jsoneditor-selected');\n\t this.showContextMenu(dom.menu, function () {\n\t util.removeClassName(dom.menu, 'jsoneditor-selected');\n\t highlighter.unlock();\n\t highlighter.unhighlight();\n\t });\n\t }\n\t\n\t if (type == 'keydown') {\n\t this.onKeyDown(event);\n\t }\n\t };\n\t\n\t return AppendNode;\n\t}\n\t\n\tmodule.exports = appendNodeFactory;\n\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* Jison generated parser */\n\tvar jsonlint = (function(){\n\tvar parser = {trace: function trace() { },\n\tyy: {},\n\tsymbols_: {\"error\":2,\"JSONString\":3,\"STRING\":4,\"JSONNumber\":5,\"NUMBER\":6,\"JSONNullLiteral\":7,\"NULL\":8,\"JSONBooleanLiteral\":9,\"TRUE\":10,\"FALSE\":11,\"JSONText\":12,\"JSONValue\":13,\"EOF\":14,\"JSONObject\":15,\"JSONArray\":16,\"{\":17,\"}\":18,\"JSONMemberList\":19,\"JSONMember\":20,\":\":21,\",\":22,\"[\":23,\"]\":24,\"JSONElementList\":25,\"$accept\":0,\"$end\":1},\n\tterminals_: {2:\"error\",4:\"STRING\",6:\"NUMBER\",8:\"NULL\",10:\"TRUE\",11:\"FALSE\",14:\"EOF\",17:\"{\",18:\"}\",21:\":\",22:\",\",23:\"[\",24:\"]\"},\n\tproductions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],\n\tperformAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {\n\t\n\tvar $0 = $$.length - 1;\n\tswitch (yystate) {\n\tcase 1: // replace escaped characters with actual character\n\t this.$ = yytext.replace(/\\\\(\\\\|\")/g, \"$\"+\"1\")\n\t .replace(/\\\\n/g,'\\n')\n\t .replace(/\\\\r/g,'\\r')\n\t .replace(/\\\\t/g,'\\t')\n\t .replace(/\\\\v/g,'\\v')\n\t .replace(/\\\\f/g,'\\f')\n\t .replace(/\\\\b/g,'\\b');\n\t \n\tbreak;\n\tcase 2:this.$ = Number(yytext);\n\tbreak;\n\tcase 3:this.$ = null;\n\tbreak;\n\tcase 4:this.$ = true;\n\tbreak;\n\tcase 5:this.$ = false;\n\tbreak;\n\tcase 6:return this.$ = $$[$0-1];\n\tbreak;\n\tcase 13:this.$ = {};\n\tbreak;\n\tcase 14:this.$ = $$[$0-1];\n\tbreak;\n\tcase 15:this.$ = [$$[$0-2], $$[$0]];\n\tbreak;\n\tcase 16:this.$ = {}; this.$[$$[$0][0]] = $$[$0][1];\n\tbreak;\n\tcase 17:this.$ = $$[$0-2]; $$[$0-2][$$[$0][0]] = $$[$0][1];\n\tbreak;\n\tcase 18:this.$ = [];\n\tbreak;\n\tcase 19:this.$ = $$[$0-1];\n\tbreak;\n\tcase 20:this.$ = [$$[$0]];\n\tbreak;\n\tcase 21:this.$ = $$[$0-2]; $$[$0-2].push($$[$0]);\n\tbreak;\n\t}\n\t},\n\ttable: [{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],\n\tdefaultActions: {16:[2,6]},\n\tparseError: function parseError(str, hash) {\n\t throw new Error(str);\n\t},\n\tparse: function parse(input) {\n\t var self = this,\n\t stack = [0],\n\t vstack = [null], // semantic value stack\n\t lstack = [], // location stack\n\t table = this.table,\n\t yytext = '',\n\t yylineno = 0,\n\t yyleng = 0,\n\t recovering = 0,\n\t TERROR = 2,\n\t EOF = 1;\n\t\n\t //this.reductionCount = this.shiftCount = 0;\n\t\n\t this.lexer.setInput(input);\n\t this.lexer.yy = this.yy;\n\t this.yy.lexer = this.lexer;\n\t if (typeof this.lexer.yylloc == 'undefined')\n\t this.lexer.yylloc = {};\n\t var yyloc = this.lexer.yylloc;\n\t lstack.push(yyloc);\n\t\n\t if (typeof this.yy.parseError === 'function')\n\t this.parseError = this.yy.parseError;\n\t\n\t function popStack (n) {\n\t stack.length = stack.length - 2*n;\n\t vstack.length = vstack.length - n;\n\t lstack.length = lstack.length - n;\n\t }\n\t\n\t function lex() {\n\t var token;\n\t token = self.lexer.lex() || 1; // $end = 1\n\t // if token isn't its numeric value, convert\n\t if (typeof token !== 'number') {\n\t token = self.symbols_[token] || token;\n\t }\n\t return token;\n\t }\n\t\n\t var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;\n\t while (true) {\n\t // retreive state number from top of stack\n\t state = stack[stack.length-1];\n\t\n\t // use default actions if available\n\t if (this.defaultActions[state]) {\n\t action = this.defaultActions[state];\n\t } else {\n\t if (symbol == null)\n\t symbol = lex();\n\t // read action for current state and first input\n\t action = table[state] && table[state][symbol];\n\t }\n\t\n\t // handle parse error\n\t _handle_error:\n\t if (typeof action === 'undefined' || !action.length || !action[0]) {\n\t\n\t if (!recovering) {\n\t // Report error\n\t expected = [];\n\t for (p in table[state]) if (this.terminals_[p] && p > 2) {\n\t expected.push(\"'\"+this.terminals_[p]+\"'\");\n\t }\n\t var errStr = '';\n\t if (this.lexer.showPosition) {\n\t errStr = 'Parse error on line '+(yylineno+1)+\":\\n\"+this.lexer.showPosition()+\"\\nExpecting \"+expected.join(', ') + \", got '\" + this.terminals_[symbol]+ \"'\";\n\t } else {\n\t errStr = 'Parse error on line '+(yylineno+1)+\": Unexpected \" +\n\t (symbol == 1 /*EOF*/ ? \"end of input\" :\n\t (\"'\"+(this.terminals_[symbol] || symbol)+\"'\"));\n\t }\n\t this.parseError(errStr,\n\t {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});\n\t }\n\t\n\t // just recovered from another error\n\t if (recovering == 3) {\n\t if (symbol == EOF) {\n\t throw new Error(errStr || 'Parsing halted.');\n\t }\n\t\n\t // discard current lookahead and grab another\n\t yyleng = this.lexer.yyleng;\n\t yytext = this.lexer.yytext;\n\t yylineno = this.lexer.yylineno;\n\t yyloc = this.lexer.yylloc;\n\t symbol = lex();\n\t }\n\t\n\t // try to recover from error\n\t while (1) {\n\t // check for error recovery rule in this state\n\t if ((TERROR.toString()) in table[state]) {\n\t break;\n\t }\n\t if (state == 0) {\n\t throw new Error(errStr || 'Parsing halted.');\n\t }\n\t popStack(1);\n\t state = stack[stack.length-1];\n\t }\n\t\n\t preErrorSymbol = symbol; // save the lookahead token\n\t symbol = TERROR; // insert generic error symbol as new lookahead\n\t state = stack[stack.length-1];\n\t action = table[state] && table[state][TERROR];\n\t recovering = 3; // allow 3 real symbols to be shifted before reporting a new error\n\t }\n\t\n\t // this shouldn't happen, unless resolve defaults are off\n\t if (action[0] instanceof Array && action.length > 1) {\n\t throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);\n\t }\n\t\n\t switch (action[0]) {\n\t\n\t case 1: // shift\n\t //this.shiftCount++;\n\t\n\t stack.push(symbol);\n\t vstack.push(this.lexer.yytext);\n\t lstack.push(this.lexer.yylloc);\n\t stack.push(action[1]); // push state\n\t symbol = null;\n\t if (!preErrorSymbol) { // normal execution/no error\n\t yyleng = this.lexer.yyleng;\n\t yytext = this.lexer.yytext;\n\t yylineno = this.lexer.yylineno;\n\t yyloc = this.lexer.yylloc;\n\t if (recovering > 0)\n\t recovering--;\n\t } else { // error just occurred, resume old lookahead f/ before error\n\t symbol = preErrorSymbol;\n\t preErrorSymbol = null;\n\t }\n\t break;\n\t\n\t case 2: // reduce\n\t //this.reductionCount++;\n\t\n\t len = this.productions_[action[1]][1];\n\t\n\t // perform semantic action\n\t yyval.$ = vstack[vstack.length-len]; // default to $$ = $1\n\t // default location, uses first token for firsts, last for lasts\n\t yyval._$ = {\n\t first_line: lstack[lstack.length-(len||1)].first_line,\n\t last_line: lstack[lstack.length-1].last_line,\n\t first_column: lstack[lstack.length-(len||1)].first_column,\n\t last_column: lstack[lstack.length-1].last_column\n\t };\n\t r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n\t\n\t if (typeof r !== 'undefined') {\n\t return r;\n\t }\n\t\n\t // pop off stack\n\t if (len) {\n\t stack = stack.slice(0,-1*len*2);\n\t vstack = vstack.slice(0, -1*len);\n\t lstack = lstack.slice(0, -1*len);\n\t }\n\t\n\t stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)\n\t vstack.push(yyval.$);\n\t lstack.push(yyval._$);\n\t // goto new state = table[STATE][NONTERMINAL]\n\t newState = table[stack[stack.length-2]][stack[stack.length-1]];\n\t stack.push(newState);\n\t break;\n\t\n\t case 3: // accept\n\t return true;\n\t }\n\t\n\t }\n\t\n\t return true;\n\t}};\n\t/* Jison generated lexer */\n\tvar lexer = (function(){\n\tvar lexer = ({EOF:1,\n\tparseError:function parseError(str, hash) {\n\t if (this.yy.parseError) {\n\t this.yy.parseError(str, hash);\n\t } else {\n\t throw new Error(str);\n\t }\n\t },\n\tsetInput:function (input) {\n\t this._input = input;\n\t this._more = this._less = this.done = false;\n\t this.yylineno = this.yyleng = 0;\n\t this.yytext = this.matched = this.match = '';\n\t this.conditionStack = ['INITIAL'];\n\t this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};\n\t return this;\n\t },\n\tinput:function () {\n\t var ch = this._input[0];\n\t this.yytext+=ch;\n\t this.yyleng++;\n\t this.match+=ch;\n\t this.matched+=ch;\n\t var lines = ch.match(/\\n/);\n\t if (lines) this.yylineno++;\n\t this._input = this._input.slice(1);\n\t return ch;\n\t },\n\tunput:function (ch) {\n\t this._input = ch + this._input;\n\t return this;\n\t },\n\tmore:function () {\n\t this._more = true;\n\t return this;\n\t },\n\tless:function (n) {\n\t this._input = this.match.slice(n) + this._input;\n\t },\n\tpastInput:function () {\n\t var past = this.matched.substr(0, this.matched.length - this.match.length);\n\t return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n\t },\n\tupcomingInput:function () {\n\t var next = this.match;\n\t if (next.length < 20) {\n\t next += this._input.substr(0, 20-next.length);\n\t }\n\t return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\\n/g, \"\");\n\t },\n\tshowPosition:function () {\n\t var pre = this.pastInput();\n\t var c = new Array(pre.length + 1).join(\"-\");\n\t return pre + this.upcomingInput() + \"\\n\" + c+\"^\";\n\t },\n\tnext:function () {\n\t if (this.done) {\n\t return this.EOF;\n\t }\n\t if (!this._input) this.done = true;\n\t\n\t var token,\n\t match,\n\t tempMatch,\n\t index,\n\t col,\n\t lines;\n\t if (!this._more) {\n\t this.yytext = '';\n\t this.match = '';\n\t }\n\t var rules = this._currentRules();\n\t for (var i=0;i < rules.length; i++) {\n\t tempMatch = this._input.match(this.rules[rules[i]]);\n\t if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n\t match = tempMatch;\n\t index = i;\n\t if (!this.options.flex) break;\n\t }\n\t }\n\t if (match) {\n\t lines = match[0].match(/\\n.*/g);\n\t if (lines) this.yylineno += lines.length;\n\t this.yylloc = {first_line: this.yylloc.last_line,\n\t last_line: this.yylineno+1,\n\t first_column: this.yylloc.last_column,\n\t last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}\n\t this.yytext += match[0];\n\t this.match += match[0];\n\t this.yyleng = this.yytext.length;\n\t this._more = false;\n\t this._input = this._input.slice(match[0].length);\n\t this.matched += match[0];\n\t token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);\n\t if (this.done && this._input) this.done = false;\n\t if (token) return token;\n\t else return;\n\t }\n\t if (this._input === \"\") {\n\t return this.EOF;\n\t } else {\n\t this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\\n'+this.showPosition(), \n\t {text: \"\", token: null, line: this.yylineno});\n\t }\n\t },\n\tlex:function lex() {\n\t var r = this.next();\n\t if (typeof r !== 'undefined') {\n\t return r;\n\t } else {\n\t return this.lex();\n\t }\n\t },\n\tbegin:function begin(condition) {\n\t this.conditionStack.push(condition);\n\t },\n\tpopState:function popState() {\n\t return this.conditionStack.pop();\n\t },\n\t_currentRules:function _currentRules() {\n\t return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;\n\t },\n\ttopState:function () {\n\t return this.conditionStack[this.conditionStack.length-2];\n\t },\n\tpushState:function begin(condition) {\n\t this.begin(condition);\n\t }});\n\tlexer.options = {};\n\tlexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\n\t\n\tvar YYSTATE=YY_START\n\tswitch($avoiding_name_collisions) {\n\tcase 0:/* skip whitespace */\n\tbreak;\n\tcase 1:return 6\n\tbreak;\n\tcase 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4\n\tbreak;\n\tcase 3:return 17\n\tbreak;\n\tcase 4:return 18\n\tbreak;\n\tcase 5:return 23\n\tbreak;\n\tcase 6:return 24\n\tbreak;\n\tcase 7:return 22\n\tbreak;\n\tcase 8:return 21\n\tbreak;\n\tcase 9:return 10\n\tbreak;\n\tcase 10:return 11\n\tbreak;\n\tcase 11:return 8\n\tbreak;\n\tcase 12:return 14\n\tbreak;\n\tcase 13:return 'INVALID'\n\tbreak;\n\t}\n\t};\n\tlexer.rules = [/^(?:\\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\\.[0-9]+)?([eE][-+]?[0-9]+)?\\b)/,/^(?:\"(?:\\\\[\\\\\"bfnrt/]|\\\\u[a-fA-F0-9]{4}|[^\\\\\\0-\\x09\\x0a-\\x1f\"])*\")/,/^(?:\\{)/,/^(?:\\})/,/^(?:\\[)/,/^(?:\\])/,/^(?:,)/,/^(?::)/,/^(?:true\\b)/,/^(?:false\\b)/,/^(?:null\\b)/,/^(?:$)/,/^(?:.)/];\n\tlexer.conditions = {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"inclusive\":true}};\n\t\n\t\n\t;\n\treturn lexer;})()\n\tparser.lexer = lexer;\n\treturn parser;\n\t})();\n\tif (true) {\n\t exports.parser = jsonlint;\n\t exports.parse = jsonlint.parse.bind(jsonlint);\n\t}\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar ace;\n\ttry {\n\t ace = __webpack_require__(57);\n\t}\n\tcatch (err) {\n\t // failed to load ace, no problem, we will fall back to plain text\n\t}\n\t\n\tvar ModeSwitcher = __webpack_require__(17);\n\tvar util = __webpack_require__(3);\n\t\n\t// create a mixin with the functions for text mode\n\tvar textmode = {};\n\t\n\tvar MAX_ERRORS = 3; // maximum number of displayed errors at the bottom\n\t\n\tvar DEFAULT_THEME = 'ace/theme/jsoneditor';\n\t\n\t/**\n\t * Create a text editor\n\t * @param {Element} container\n\t * @param {Object} [options] Object with options. available options:\n\t * {String} mode Available values:\n\t * \"text\" (default)\n\t * or \"code\".\n\t * {Number} indentation Number of indentation\n\t * spaces. 2 by default.\n\t * {function} onChange Callback method\n\t * triggered on change\n\t * {function} onModeChange Callback method\n\t * triggered after setMode\n\t * {Object} ace A custom instance of\n\t * Ace editor.\n\t * {boolean} escapeUnicode If true, unicode\n\t * characters are escaped.\n\t * false by default.\n\t * @private\n\t */\n\ttextmode.create = function (container, options) {\n\t // read options\n\t options = options || {};\n\t this.options = options;\n\t\n\t // indentation\n\t if (options.indentation) {\n\t this.indentation = Number(options.indentation);\n\t }\n\t else {\n\t this.indentation = 2; // number of spaces\n\t }\n\t\n\t // grab ace from options if provided\n\t var _ace = options.ace ? options.ace : ace;\n\t\n\t // determine mode\n\t this.mode = (options.mode == 'code') ? 'code' : 'text';\n\t if (this.mode == 'code') {\n\t // verify whether Ace editor is available and supported\n\t if (typeof _ace === 'undefined') {\n\t this.mode = 'text';\n\t console.warn('Failed to load Ace editor, falling back to plain text mode. Please use a JSONEditor bundle including Ace, or pass Ace as via the configuration option `ace`.');\n\t }\n\t }\n\t\n\t // determine theme\n\t this.theme = options.theme || DEFAULT_THEME;\n\t if (this.theme === DEFAULT_THEME && window.ace) {\n\t __webpack_require__(58);\n\t }\n\t\n\t var me = this;\n\t this.container = container;\n\t this.dom = {};\n\t this.aceEditor = undefined; // ace code editor\n\t this.textarea = undefined; // plain text editor (fallback when Ace is not available)\n\t this.validateSchema = null;\n\t\n\t // create a debounced validate function\n\t this._debouncedValidate = util.debounce(this.validate.bind(this), this.DEBOUNCE_INTERVAL);\n\t\n\t this.width = container.clientWidth;\n\t this.height = container.clientHeight;\n\t\n\t this.frame = document.createElement('div');\n\t this.frame.className = 'jsoneditor jsoneditor-mode-' + this.options.mode;\n\t this.frame.onclick = function (event) {\n\t // prevent default submit action when the editor is located inside a form\n\t event.preventDefault();\n\t };\n\t this.frame.onkeydown = function (event) {\n\t me._onKeyDown(event);\n\t };\n\t\n\t // create menu\n\t this.menu = document.createElement('div');\n\t this.menu.className = 'jsoneditor-menu';\n\t this.frame.appendChild(this.menu);\n\t\n\t // create format button\n\t var buttonFormat = document.createElement('button');\n\t buttonFormat.type = 'button';\n\t buttonFormat.className = 'jsoneditor-format';\n\t buttonFormat.title = 'Format JSON data, with proper indentation and line feeds (Ctrl+\\\\)';\n\t this.menu.appendChild(buttonFormat);\n\t buttonFormat.onclick = function () {\n\t try {\n\t me.format();\n\t me._onChange();\n\t }\n\t catch (err) {\n\t me._onError(err);\n\t }\n\t };\n\t\n\t // create compact button\n\t var buttonCompact = document.createElement('button');\n\t buttonCompact.type = 'button';\n\t buttonCompact.className = 'jsoneditor-compact';\n\t buttonCompact.title = 'Compact JSON data, remove all whitespaces (Ctrl+Shift+\\\\)';\n\t this.menu.appendChild(buttonCompact);\n\t buttonCompact.onclick = function () {\n\t try {\n\t me.compact();\n\t me._onChange();\n\t }\n\t catch (err) {\n\t me._onError(err);\n\t }\n\t };\n\t\n\t // create mode box\n\t if (this.options && this.options.modes && this.options.modes.length) {\n\t this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {\n\t // switch mode and restore focus\n\t me.setMode(mode);\n\t me.modeSwitcher.focus();\n\t });\n\t }\n\t\n\t this.content = document.createElement('div');\n\t this.content.className = 'jsoneditor-outer';\n\t this.frame.appendChild(this.content);\n\t\n\t this.container.appendChild(this.frame);\n\t\n\t if (this.mode == 'code') {\n\t this.editorDom = document.createElement('div');\n\t this.editorDom.style.height = '100%'; // TODO: move to css\n\t this.editorDom.style.width = '100%'; // TODO: move to css\n\t this.content.appendChild(this.editorDom);\n\t\n\t var aceEditor = _ace.edit(this.editorDom);\n\t aceEditor.$blockScrolling = Infinity;\n\t aceEditor.setTheme(this.theme);\n\t aceEditor.setShowPrintMargin(false);\n\t aceEditor.setFontSize(13);\n\t aceEditor.getSession().setMode('ace/mode/json');\n\t aceEditor.getSession().setTabSize(this.indentation);\n\t aceEditor.getSession().setUseSoftTabs(true);\n\t aceEditor.getSession().setUseWrapMode(true);\n\t aceEditor.commands.bindKey('Ctrl-L', null); // disable Ctrl+L (is used by the browser to select the address bar)\n\t aceEditor.commands.bindKey('Command-L', null); // disable Ctrl+L (is used by the browser to select the address bar)\n\t this.aceEditor = aceEditor;\n\t\n\t // TODO: deprecated since v5.0.0. Cleanup backward compatibility some day\n\t if (!this.hasOwnProperty('editor')) {\n\t Object.defineProperty(this, 'editor', {\n\t get: function () {\n\t console.warn('Property \"editor\" has been renamed to \"aceEditor\".');\n\t return me.aceEditor;\n\t },\n\t set: function (aceEditor) {\n\t console.warn('Property \"editor\" has been renamed to \"aceEditor\".');\n\t me.aceEditor = aceEditor;\n\t }\n\t });\n\t }\n\t\n\t var poweredBy = document.createElement('a');\n\t poweredBy.appendChild(document.createTextNode('powered by ace'));\n\t poweredBy.href = 'http://ace.ajax.org';\n\t poweredBy.target = '_blank';\n\t poweredBy.className = 'jsoneditor-poweredBy';\n\t poweredBy.onclick = function () {\n\t // TODO: this anchor falls below the margin of the content,\n\t // therefore the normal a.href does not work. We use a click event\n\t // for now, but this should be fixed.\n\t window.open(poweredBy.href, poweredBy.target);\n\t };\n\t this.menu.appendChild(poweredBy);\n\t\n\t // register onchange event\n\t aceEditor.on('change', this._onChange.bind(this));\n\t }\n\t else {\n\t // load a plain text textarea\n\t var textarea = document.createElement('textarea');\n\t textarea.className = 'jsoneditor-text';\n\t textarea.spellcheck = false;\n\t this.content.appendChild(textarea);\n\t this.textarea = textarea;\n\t\n\t // register onchange event\n\t if (this.textarea.oninput === null) {\n\t this.textarea.oninput = this._onChange.bind(this);\n\t }\n\t else {\n\t // oninput is undefined. For IE8-\n\t this.textarea.onchange = this._onChange.bind(this);\n\t }\n\t }\n\t\n\t this.setSchema(this.options.schema);\n\t};\n\t\n\t/**\n\t * Handle a change:\n\t * - Validate JSON schema\n\t * - Send a callback to the onChange listener if provided\n\t * @private\n\t */\n\ttextmode._onChange = function () {\n\t // validate JSON schema (if configured)\n\t this._debouncedValidate();\n\t\n\t // trigger the onChange callback\n\t if (this.options.onChange) {\n\t try {\n\t this.options.onChange();\n\t }\n\t catch (err) {\n\t console.error('Error in onChange callback: ', err);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Event handler for keydown. Handles shortcut keys\n\t * @param {Event} event\n\t * @private\n\t */\n\ttextmode._onKeyDown = function (event) {\n\t var keynum = event.which || event.keyCode;\n\t var handled = false;\n\t\n\t if (keynum == 220 && event.ctrlKey) {\n\t if (event.shiftKey) { // Ctrl+Shift+\\\n\t this.compact();\n\t this._onChange();\n\t }\n\t else { // Ctrl+\\\n\t this.format();\n\t this._onChange();\n\t }\n\t handled = true;\n\t }\n\t\n\t if (handled) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\t\n\t/**\n\t * Destroy the editor. Clean up DOM, event listeners, and web workers.\n\t */\n\ttextmode.destroy = function () {\n\t // remove old ace editor\n\t if (this.aceEditor) {\n\t this.aceEditor.destroy();\n\t this.aceEditor = null;\n\t }\n\t\n\t if (this.frame && this.container && this.frame.parentNode == this.container) {\n\t this.container.removeChild(this.frame);\n\t }\n\t\n\t if (this.modeSwitcher) {\n\t this.modeSwitcher.destroy();\n\t this.modeSwitcher = null;\n\t }\n\t\n\t this.textarea = null;\n\t \n\t this._debouncedValidate = null;\n\t};\n\t\n\t/**\n\t * Compact the code in the formatter\n\t */\n\ttextmode.compact = function () {\n\t var json = this.get();\n\t var text = JSON.stringify(json);\n\t this.setText(text);\n\t};\n\t\n\t/**\n\t * Format the code in the formatter\n\t */\n\ttextmode.format = function () {\n\t var json = this.get();\n\t var text = JSON.stringify(json, null, this.indentation);\n\t this.setText(text);\n\t};\n\t\n\t/**\n\t * Set focus to the formatter\n\t */\n\ttextmode.focus = function () {\n\t if (this.textarea) {\n\t this.textarea.focus();\n\t }\n\t if (this.aceEditor) {\n\t this.aceEditor.focus();\n\t }\n\t};\n\t\n\t/**\n\t * Resize the formatter\n\t */\n\ttextmode.resize = function () {\n\t if (this.aceEditor) {\n\t var force = false;\n\t this.aceEditor.resize(force);\n\t }\n\t};\n\t\n\t/**\n\t * Set json data in the formatter\n\t * @param {Object} json\n\t */\n\ttextmode.set = function(json) {\n\t this.setText(JSON.stringify(json, null, this.indentation));\n\t};\n\t\n\t/**\n\t * Get json data from the formatter\n\t * @return {Object} json\n\t */\n\ttextmode.get = function() {\n\t var text = this.getText();\n\t var json;\n\t\n\t try {\n\t json = util.parse(text); // this can throw an error\n\t }\n\t catch (err) {\n\t // try to sanitize json, replace JavaScript notation with JSON notation\n\t text = util.sanitize(text);\n\t\n\t // try to parse again\n\t json = util.parse(text); // this can throw an error\n\t }\n\t\n\t return json;\n\t};\n\t\n\t/**\n\t * Get the text contents of the editor\n\t * @return {String} jsonText\n\t */\n\ttextmode.getText = function() {\n\t if (this.textarea) {\n\t return this.textarea.value;\n\t }\n\t if (this.aceEditor) {\n\t return this.aceEditor.getValue();\n\t }\n\t return '';\n\t};\n\t\n\t/**\n\t * Set the text contents of the editor\n\t * @param {String} jsonText\n\t */\n\ttextmode.setText = function(jsonText) {\n\t var text;\n\t\n\t if (this.options.escapeUnicode === true) {\n\t text = util.escapeUnicodeChars(jsonText);\n\t }\n\t else {\n\t text = jsonText;\n\t }\n\t\n\t if (this.textarea) {\n\t this.textarea.value = text;\n\t }\n\t if (this.aceEditor) {\n\t // prevent emitting onChange events while setting new text\n\t var originalOnChange = this.options.onChange;\n\t this.options.onChange = null;\n\t\n\t this.aceEditor.setValue(text, -1);\n\t\n\t this.options.onChange = originalOnChange;\n\t }\n\t\n\t // validate JSON schema\n\t this.validate();\n\t};\n\t\n\t/**\n\t * Validate current JSON object against the configured JSON schema\n\t * Throws an exception when no JSON schema is configured\n\t */\n\ttextmode.validate = function () {\n\t // clear all current errors\n\t if (this.dom.validationErrors) {\n\t this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors);\n\t this.dom.validationErrors = null;\n\t\n\t this.content.style.marginBottom = '';\n\t this.content.style.paddingBottom = '';\n\t }\n\t\n\t var doValidate = false;\n\t var errors = [];\n\t var json;\n\t try {\n\t json = this.get(); // this can fail when there is no valid json\n\t doValidate = true;\n\t }\n\t catch (err) {\n\t // no valid JSON, don't validate\n\t }\n\t\n\t // only validate the JSON when parsing the JSON succeeded\n\t if (doValidate && this.validateSchema) {\n\t var valid = this.validateSchema(json);\n\t if (!valid) {\n\t errors = this.validateSchema.errors.map(function (error) {\n\t return util.improveSchemaError(error);\n\t });\n\t }\n\t }\n\t\n\t if (errors.length > 0) {\n\t // limit the number of displayed errors\n\t var limit = errors.length > MAX_ERRORS;\n\t if (limit) {\n\t errors = errors.slice(0, MAX_ERRORS);\n\t var hidden = this.validateSchema.errors.length - MAX_ERRORS;\n\t errors.push('(' + hidden + ' more errors...)')\n\t }\n\t\n\t var validationErrors = document.createElement('div');\n\t validationErrors.innerHTML = '' +\n\t '' +\n\t errors.map(function (error) {\n\t var message;\n\t if (typeof error === 'string') {\n\t message = '';\n\t }\n\t else {\n\t message = '' +\n\t '';\n\t }\n\t\n\t return '' + message + ''\n\t }).join('') +\n\t '' +\n\t '
' + error + '
' + error.dataPath + '' + error.message + '
';\n\t\n\t this.dom.validationErrors = validationErrors;\n\t this.frame.appendChild(validationErrors);\n\t\n\t var height = validationErrors.clientHeight;\n\t this.content.style.marginBottom = (-height) + 'px';\n\t this.content.style.paddingBottom = height + 'px';\n\t }\n\t\n\t // update the height of the ace editor\n\t if (this.aceEditor) {\n\t var force = false;\n\t this.aceEditor.resize(force);\n\t }\n\t};\n\t\n\t// define modes\n\tmodule.exports = [\n\t {\n\t mode: 'text',\n\t mixin: textmode,\n\t data: 'text',\n\t load: textmode.format\n\t },\n\t {\n\t mode: 'code',\n\t mixin: textmode,\n\t data: 'text',\n\t load: textmode.format\n\t }\n\t];\n\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t\n\tvar Highlighter = __webpack_require__(52);\n\tvar History = __webpack_require__(53);\n\tvar SearchBox = __webpack_require__(56);\n\tvar ContextMenu = __webpack_require__(4);\n\tvar Node = __webpack_require__(55);\n\tvar ModeSwitcher = __webpack_require__(17);\n\tvar util = __webpack_require__(3);\n\t\n\t// create a mixin with the functions for tree mode\n\tvar treemode = {};\n\t\n\t/**\n\t * Create a tree editor\n\t * @param {Element} container Container element\n\t * @param {Object} [options] Object with options. available options:\n\t * {String} mode Editor mode. Available values:\n\t * 'tree' (default), 'view',\n\t * and 'form'.\n\t * {Boolean} search Enable search box.\n\t * True by default\n\t * {Boolean} history Enable history (undo/redo).\n\t * True by default\n\t * {function} onChange Callback method, triggered\n\t * on change of contents\n\t * {String} name Field name for the root node.\n\t * {boolean} escapeUnicode If true, unicode\n\t * characters are escaped.\n\t * false by default.\n\t * {Object} schema A JSON Schema for validation\n\t * @private\n\t */\n\ttreemode.create = function (container, options) {\n\t if (!container) {\n\t throw new Error('No container element provided.');\n\t }\n\t this.container = container;\n\t this.dom = {};\n\t this.highlighter = new Highlighter();\n\t this.selection = undefined; // will hold the last input selection\n\t this.multiselection = {\n\t nodes: []\n\t };\n\t this.validateSchema = null; // will be set in .setSchema(schema)\n\t this.errorNodes = [];\n\t\n\t this.node = null;\n\t this.focusTarget = null;\n\t\n\t this._setOptions(options);\n\t\n\t if (this.options.history && this.options.mode !== 'view') {\n\t this.history = new History(this);\n\t }\n\t\n\t this._createFrame();\n\t this._createTable();\n\t};\n\t\n\t/**\n\t * Destroy the editor. Clean up DOM, event listeners, and web workers.\n\t */\n\ttreemode.destroy = function () {\n\t if (this.frame && this.container && this.frame.parentNode == this.container) {\n\t this.container.removeChild(this.frame);\n\t this.frame = null;\n\t }\n\t this.container = null;\n\t\n\t this.dom = null;\n\t\n\t this.clear();\n\t this.node = null;\n\t this.focusTarget = null;\n\t this.selection = null;\n\t this.multiselection = null;\n\t this.errorNodes = null;\n\t this.validateSchema = null;\n\t this._debouncedValidate = null;\n\t\n\t if (this.history) {\n\t this.history.destroy();\n\t this.history = null;\n\t }\n\t\n\t if (this.searchBox) {\n\t this.searchBox.destroy();\n\t this.searchBox = null;\n\t }\n\t\n\t if (this.modeSwitcher) {\n\t this.modeSwitcher.destroy();\n\t this.modeSwitcher = null;\n\t }\n\t};\n\t\n\t/**\n\t * Initialize and set default options\n\t * @param {Object} [options] See description in constructor\n\t * @private\n\t */\n\ttreemode._setOptions = function (options) {\n\t this.options = {\n\t search: true,\n\t history: true,\n\t mode: 'tree',\n\t name: undefined, // field name of root node\n\t schema: null\n\t };\n\t\n\t // copy all options\n\t if (options) {\n\t for (var prop in options) {\n\t if (options.hasOwnProperty(prop)) {\n\t this.options[prop] = options[prop];\n\t }\n\t }\n\t }\n\t\n\t // compile a JSON schema validator if a JSON schema is provided\n\t this.setSchema(this.options.schema);\n\t\n\t // create a debounced validate function\n\t this._debouncedValidate = util.debounce(this.validate.bind(this), this.DEBOUNCE_INTERVAL);\n\t};\n\t\n\t/**\n\t * Set JSON object in editor\n\t * @param {Object | undefined} json JSON data\n\t * @param {String} [name] Optional field name for the root node.\n\t * Can also be set using setName(name).\n\t */\n\ttreemode.set = function (json, name) {\n\t // adjust field name for root node\n\t if (name) {\n\t // TODO: deprecated since version 2.2.0. Cleanup some day.\n\t console.warn('Second parameter \"name\" is deprecated. Use setName(name) instead.');\n\t this.options.name = name;\n\t }\n\t\n\t // verify if json is valid JSON, ignore when a function\n\t if (json instanceof Function || (json === undefined)) {\n\t this.clear();\n\t }\n\t else {\n\t this.content.removeChild(this.table); // Take the table offline\n\t\n\t // replace the root node\n\t var params = {\n\t field: this.options.name,\n\t value: json\n\t };\n\t var node = new Node(this, params);\n\t this._setRoot(node);\n\t\n\t // validate JSON schema (if configured)\n\t this.validate();\n\t\n\t // expand\n\t var recurse = false;\n\t this.node.expand(recurse);\n\t\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t\n\t // TODO: maintain history, store last state and previous document\n\t if (this.history) {\n\t this.history.clear();\n\t }\n\t\n\t // clear search\n\t if (this.searchBox) {\n\t this.searchBox.clear();\n\t }\n\t};\n\t\n\t/**\n\t * Get JSON object from editor\n\t * @return {Object | undefined} json\n\t */\n\ttreemode.get = function () {\n\t // remove focus from currently edited node\n\t if (this.focusTarget) {\n\t var node = Node.getNodeFromTarget(this.focusTarget);\n\t if (node) {\n\t node.blur();\n\t }\n\t }\n\t\n\t if (this.node) {\n\t return this.node.getValue();\n\t }\n\t else {\n\t return undefined;\n\t }\n\t};\n\t\n\t/**\n\t * Get the text contents of the editor\n\t * @return {String} jsonText\n\t */\n\ttreemode.getText = function() {\n\t return JSON.stringify(this.get());\n\t};\n\t\n\t/**\n\t * Set the text contents of the editor\n\t * @param {String} jsonText\n\t */\n\ttreemode.setText = function(jsonText) {\n\t this.set(util.parse(jsonText));\n\t};\n\t\n\t/**\n\t * Set a field name for the root node.\n\t * @param {String | undefined} name\n\t */\n\ttreemode.setName = function (name) {\n\t this.options.name = name;\n\t if (this.node) {\n\t this.node.updateField(this.options.name);\n\t }\n\t};\n\t\n\t/**\n\t * Get the field name for the root node.\n\t * @return {String | undefined} name\n\t */\n\ttreemode.getName = function () {\n\t return this.options.name;\n\t};\n\t\n\t/**\n\t * Set focus to the editor. Focus will be set to:\n\t * - the first editable field or value, or else\n\t * - to the expand button of the root node, or else\n\t * - to the context menu button of the root node, or else\n\t * - to the first button in the top menu\n\t */\n\ttreemode.focus = function () {\n\t var input = this.content.querySelector('[contenteditable=true]');\n\t if (input) {\n\t input.focus();\n\t }\n\t else if (this.node.dom.expand) {\n\t this.node.dom.expand.focus();\n\t }\n\t else if (this.node.dom.menu) {\n\t this.node.dom.menu.focus();\n\t }\n\t else {\n\t // focus to the first button in the menu\n\t input = this.frame.querySelector('button');\n\t if (input) {\n\t input.focus();\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Remove the root node from the editor\n\t */\n\ttreemode.clear = function () {\n\t if (this.node) {\n\t this.node.collapse();\n\t this.tbody.removeChild(this.node.getDom());\n\t delete this.node;\n\t }\n\t};\n\t\n\t/**\n\t * Set the root node for the json editor\n\t * @param {Node} node\n\t * @private\n\t */\n\ttreemode._setRoot = function (node) {\n\t this.clear();\n\t\n\t this.node = node;\n\t\n\t // append to the dom\n\t this.tbody.appendChild(node.getDom());\n\t};\n\t\n\t/**\n\t * Search text in all nodes\n\t * The nodes will be expanded when the text is found one of its childs,\n\t * else it will be collapsed. Searches are case insensitive.\n\t * @param {String} text\n\t * @return {Object[]} results Array with nodes containing the search results\n\t * The result objects contains fields:\n\t * - {Node} node,\n\t * - {String} elem the dom element name where\n\t * the result is found ('field' or\n\t * 'value')\n\t */\n\ttreemode.search = function (text) {\n\t var results;\n\t if (this.node) {\n\t this.content.removeChild(this.table); // Take the table offline\n\t results = this.node.search(text);\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t else {\n\t results = [];\n\t }\n\t\n\t return results;\n\t};\n\t\n\t/**\n\t * Expand all nodes\n\t */\n\ttreemode.expandAll = function () {\n\t if (this.node) {\n\t this.content.removeChild(this.table); // Take the table offline\n\t this.node.expand();\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t};\n\t\n\t/**\n\t * Collapse all nodes\n\t */\n\ttreemode.collapseAll = function () {\n\t if (this.node) {\n\t this.content.removeChild(this.table); // Take the table offline\n\t this.node.collapse();\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t};\n\t\n\t/**\n\t * The method onChange is called whenever a field or value is changed, created,\n\t * deleted, duplicated, etc.\n\t * @param {String} action Change action. Available values: \"editField\",\n\t * \"editValue\", \"changeType\", \"appendNode\",\n\t * \"removeNode\", \"duplicateNode\", \"moveNode\", \"expand\",\n\t * \"collapse\".\n\t * @param {Object} params Object containing parameters describing the change.\n\t * The parameters in params depend on the action (for\n\t * example for \"editValue\" the Node, old value, and new\n\t * value are provided). params contains all information\n\t * needed to undo or redo the action.\n\t * @private\n\t */\n\ttreemode._onAction = function (action, params) {\n\t // add an action to the history\n\t if (this.history) {\n\t this.history.add(action, params);\n\t }\n\t\n\t this._onChange();\n\t};\n\t\n\t/**\n\t * Handle a change:\n\t * - Validate JSON schema\n\t * - Send a callback to the onChange listener if provided\n\t * @private\n\t */\n\ttreemode._onChange = function () {\n\t // validate JSON schema (if configured)\n\t this._debouncedValidate();\n\t\n\t // trigger the onChange callback\n\t if (this.options.onChange) {\n\t try {\n\t this.options.onChange();\n\t }\n\t catch (err) {\n\t console.error('Error in onChange callback: ', err);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Validate current JSON object against the configured JSON schema\n\t * Throws an exception when no JSON schema is configured\n\t */\n\ttreemode.validate = function () {\n\t // clear all current errors\n\t if (this.errorNodes) {\n\t this.errorNodes.forEach(function (node) {\n\t node.setError(null);\n\t });\n\t }\n\t\n\t var root = this.node;\n\t if (!root) { // TODO: this should be redundant but is needed on mode switch\n\t return;\n\t }\n\t\n\t // check for duplicate keys\n\t var duplicateErrors = root.validate();\n\t\n\t // validate the JSON\n\t var schemaErrors = [];\n\t if (this.validateSchema) {\n\t var valid = this.validateSchema(root.getValue());\n\t if (!valid) {\n\t // apply all new errors\n\t schemaErrors = this.validateSchema.errors\n\t .map(function (error) {\n\t return util.improveSchemaError(error);\n\t })\n\t .map(function findNode (error) {\n\t return {\n\t node: root.findNode(error.dataPath),\n\t error: error\n\t }\n\t })\n\t .filter(function hasNode (entry) {\n\t return entry.node != null\n\t });\n\t }\n\t }\n\t\n\t // display the error in the nodes with a problem\n\t this.errorNodes = duplicateErrors\n\t .concat(schemaErrors)\n\t .reduce(function expandParents (all, entry) {\n\t // expand parents, then merge such that parents come first and\n\t // original entries last\n\t return entry.node\n\t .findParents()\n\t .map(function (parent) {\n\t return {\n\t node: parent,\n\t child: entry.node,\n\t error: {\n\t message: parent.type === 'object'\n\t ? 'Contains invalid properties' // object\n\t : 'Contains invalid items' // array\n\t }\n\t };\n\t })\n\t .concat(all, [entry]);\n\t }, [])\n\t // TODO: dedupe the parent nodes\n\t .map(function setError (entry) {\n\t entry.node.setError(entry.error, entry.child);\n\t return entry.node;\n\t });\n\t};\n\t\n\t/**\n\t * Refresh the rendered contents\n\t */\n\ttreemode.refresh = function () {\n\t if (this.node) {\n\t this.node.updateDom({recurse: true});\n\t }\n\t};\n\t\n\t/**\n\t * Start autoscrolling when given mouse position is above the top of the\n\t * editor contents, or below the bottom.\n\t * @param {Number} mouseY Absolute mouse position in pixels\n\t */\n\ttreemode.startAutoScroll = function (mouseY) {\n\t var me = this;\n\t var content = this.content;\n\t var top = util.getAbsoluteTop(content);\n\t var height = content.clientHeight;\n\t var bottom = top + height;\n\t var margin = 24;\n\t var interval = 50; // ms\n\t\n\t if ((mouseY < top + margin) && content.scrollTop > 0) {\n\t this.autoScrollStep = ((top + margin) - mouseY) / 3;\n\t }\n\t else if (mouseY > bottom - margin &&\n\t height + content.scrollTop < content.scrollHeight) {\n\t this.autoScrollStep = ((bottom - margin) - mouseY) / 3;\n\t }\n\t else {\n\t this.autoScrollStep = undefined;\n\t }\n\t\n\t if (this.autoScrollStep) {\n\t if (!this.autoScrollTimer) {\n\t this.autoScrollTimer = setInterval(function () {\n\t if (me.autoScrollStep) {\n\t content.scrollTop -= me.autoScrollStep;\n\t }\n\t else {\n\t me.stopAutoScroll();\n\t }\n\t }, interval);\n\t }\n\t }\n\t else {\n\t this.stopAutoScroll();\n\t }\n\t};\n\t\n\t/**\n\t * Stop auto scrolling. Only applicable when scrolling\n\t */\n\ttreemode.stopAutoScroll = function () {\n\t if (this.autoScrollTimer) {\n\t clearTimeout(this.autoScrollTimer);\n\t delete this.autoScrollTimer;\n\t }\n\t if (this.autoScrollStep) {\n\t delete this.autoScrollStep;\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Set the focus to an element in the editor, set text selection, and\n\t * set scroll position.\n\t * @param {Object} selection An object containing fields:\n\t * {Element | undefined} dom The dom element\n\t * which has focus\n\t * {Range | TextRange} range A text selection\n\t * {Node[]} nodes Nodes in case of multi selection\n\t * {Number} scrollTop Scroll position\n\t */\n\ttreemode.setSelection = function (selection) {\n\t if (!selection) {\n\t return;\n\t }\n\t\n\t if ('scrollTop' in selection && this.content) {\n\t // TODO: animated scroll\n\t this.content.scrollTop = selection.scrollTop;\n\t }\n\t if (selection.nodes) {\n\t // multi-select\n\t this.select(selection.nodes);\n\t }\n\t if (selection.range) {\n\t util.setSelectionOffset(selection.range);\n\t }\n\t if (selection.dom) {\n\t selection.dom.focus();\n\t }\n\t};\n\t\n\t/**\n\t * Get the current focus\n\t * @return {Object} selection An object containing fields:\n\t * {Element | undefined} dom The dom element\n\t * which has focus\n\t * {Range | TextRange} range A text selection\n\t * {Node[]} nodes Nodes in case of multi selection\n\t * {Number} scrollTop Scroll position\n\t */\n\ttreemode.getSelection = function () {\n\t var range = util.getSelectionOffset();\n\t if (range && range.container.nodeName !== 'DIV') { // filter on (editable) divs)\n\t range = null;\n\t }\n\t\n\t return {\n\t dom: this.focusTarget,\n\t range: range,\n\t nodes: this.multiselection.nodes.slice(0),\n\t scrollTop: this.content ? this.content.scrollTop : 0\n\t };\n\t};\n\t\n\t/**\n\t * Adjust the scroll position such that given top position is shown at 1/4\n\t * of the window height.\n\t * @param {Number} top\n\t * @param {function(boolean)} [callback] Callback, executed when animation is\n\t * finished. The callback returns true\n\t * when animation is finished, or false\n\t * when not.\n\t */\n\ttreemode.scrollTo = function (top, callback) {\n\t var content = this.content;\n\t if (content) {\n\t var editor = this;\n\t // cancel any running animation\n\t if (editor.animateTimeout) {\n\t clearTimeout(editor.animateTimeout);\n\t delete editor.animateTimeout;\n\t }\n\t if (editor.animateCallback) {\n\t editor.animateCallback(false);\n\t delete editor.animateCallback;\n\t }\n\t\n\t // calculate final scroll position\n\t var height = content.clientHeight;\n\t var bottom = content.scrollHeight - height;\n\t var finalScrollTop = Math.min(Math.max(top - height / 4, 0), bottom);\n\t\n\t // animate towards the new scroll position\n\t var animate = function () {\n\t var scrollTop = content.scrollTop;\n\t var diff = (finalScrollTop - scrollTop);\n\t if (Math.abs(diff) > 3) {\n\t content.scrollTop += diff / 3;\n\t editor.animateCallback = callback;\n\t editor.animateTimeout = setTimeout(animate, 50);\n\t }\n\t else {\n\t // finished\n\t if (callback) {\n\t callback(true);\n\t }\n\t content.scrollTop = finalScrollTop;\n\t delete editor.animateTimeout;\n\t delete editor.animateCallback;\n\t }\n\t };\n\t animate();\n\t }\n\t else {\n\t if (callback) {\n\t callback(false);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Create main frame\n\t * @private\n\t */\n\ttreemode._createFrame = function () {\n\t // create the frame\n\t this.frame = document.createElement('div');\n\t this.frame.className = 'jsoneditor jsoneditor-mode-' + this.options.mode;\n\t this.container.appendChild(this.frame);\n\t\n\t // create one global event listener to handle all events from all nodes\n\t var editor = this;\n\t function onEvent(event) {\n\t // when switching to mode \"code\" or \"text\" via the menu, some events\n\t // are still fired whilst the _onEvent methods is already removed.\n\t if (editor._onEvent) {\n\t editor._onEvent(event);\n\t }\n\t }\n\t this.frame.onclick = function (event) {\n\t var target = event.target;// || event.srcElement;\n\t\n\t onEvent(event);\n\t\n\t // prevent default submit action of buttons when editor is located\n\t // inside a form\n\t if (target.nodeName == 'BUTTON') {\n\t event.preventDefault();\n\t }\n\t };\n\t this.frame.oninput = onEvent;\n\t this.frame.onchange = onEvent;\n\t this.frame.onkeydown = onEvent;\n\t this.frame.onkeyup = onEvent;\n\t this.frame.oncut = onEvent;\n\t this.frame.onpaste = onEvent;\n\t this.frame.onmousedown = onEvent;\n\t this.frame.onmouseup = onEvent;\n\t this.frame.onmouseover = onEvent;\n\t this.frame.onmouseout = onEvent;\n\t // Note: focus and blur events do not propagate, therefore they defined\n\t // using an eventListener with useCapture=true\n\t // see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html\n\t util.addEventListener(this.frame, 'focus', onEvent, true);\n\t util.addEventListener(this.frame, 'blur', onEvent, true);\n\t this.frame.onfocusin = onEvent; // for IE\n\t this.frame.onfocusout = onEvent; // for IE\n\t\n\t // create menu\n\t this.menu = document.createElement('div');\n\t this.menu.className = 'jsoneditor-menu';\n\t this.frame.appendChild(this.menu);\n\t\n\t // create expand all button\n\t var expandAll = document.createElement('button');\n\t expandAll.type = 'button';\n\t expandAll.className = 'jsoneditor-expand-all';\n\t expandAll.title = 'Expand all fields';\n\t expandAll.onclick = function () {\n\t editor.expandAll();\n\t };\n\t this.menu.appendChild(expandAll);\n\t\n\t // create expand all button\n\t var collapseAll = document.createElement('button');\n\t collapseAll.type = 'button';\n\t collapseAll.title = 'Collapse all fields';\n\t collapseAll.className = 'jsoneditor-collapse-all';\n\t collapseAll.onclick = function () {\n\t editor.collapseAll();\n\t };\n\t this.menu.appendChild(collapseAll);\n\t\n\t // create undo/redo buttons\n\t if (this.history) {\n\t // create undo button\n\t var undo = document.createElement('button');\n\t undo.type = 'button';\n\t undo.className = 'jsoneditor-undo jsoneditor-separator';\n\t undo.title = 'Undo last action (Ctrl+Z)';\n\t undo.onclick = function () {\n\t editor._onUndo();\n\t };\n\t this.menu.appendChild(undo);\n\t this.dom.undo = undo;\n\t\n\t // create redo button\n\t var redo = document.createElement('button');\n\t redo.type = 'button';\n\t redo.className = 'jsoneditor-redo';\n\t redo.title = 'Redo (Ctrl+Shift+Z)';\n\t redo.onclick = function () {\n\t editor._onRedo();\n\t };\n\t this.menu.appendChild(redo);\n\t this.dom.redo = redo;\n\t\n\t // register handler for onchange of history\n\t this.history.onChange = function () {\n\t undo.disabled = !editor.history.canUndo();\n\t redo.disabled = !editor.history.canRedo();\n\t };\n\t this.history.onChange();\n\t }\n\t\n\t // create mode box\n\t if (this.options && this.options.modes && this.options.modes.length) {\n\t var me = this;\n\t this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {\n\t me.modeSwitcher.destroy();\n\t\n\t // switch mode and restore focus\n\t me.setMode(mode);\n\t me.modeSwitcher.focus();\n\t });\n\t }\n\t\n\t // create search box\n\t if (this.options.search) {\n\t this.searchBox = new SearchBox(this, this.menu);\n\t }\n\t};\n\t\n\t/**\n\t * Perform an undo action\n\t * @private\n\t */\n\ttreemode._onUndo = function () {\n\t if (this.history) {\n\t // undo last action\n\t this.history.undo();\n\t\n\t // fire change event\n\t this._onChange();\n\t }\n\t};\n\t\n\t/**\n\t * Perform a redo action\n\t * @private\n\t */\n\ttreemode._onRedo = function () {\n\t if (this.history) {\n\t // redo last action\n\t this.history.redo();\n\t\n\t // fire change event\n\t this._onChange();\n\t }\n\t};\n\t\n\t/**\n\t * Event handler\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onEvent = function (event) {\n\t if (event.type == 'keydown') {\n\t this._onKeyDown(event);\n\t }\n\t\n\t if (event.type == 'focus') {\n\t this.focusTarget = event.target;\n\t }\n\t\n\t if (event.type == 'mousedown') {\n\t this._startDragDistance(event);\n\t }\n\t if (event.type == 'mousemove' || event.type == 'mouseup' || event.type == 'click') {\n\t this._updateDragDistance(event);\n\t }\n\t\n\t var node = Node.getNodeFromTarget(event.target);\n\t\n\t if (node && node.selected) {\n\t if (event.type == 'click') {\n\t if (event.target == node.dom.menu) {\n\t this.showContextMenu(event.target);\n\t\n\t // stop propagation (else we will open the context menu of a single node)\n\t return;\n\t }\n\t\n\t // deselect a multi selection\n\t if (!event.hasMoved) {\n\t this.deselect();\n\t }\n\t }\n\t\n\t if (event.type == 'mousedown') {\n\t // drag multiple nodes\n\t Node.onDragStart(this.multiselection.nodes, event);\n\t }\n\t }\n\t else {\n\t if (event.type == 'mousedown') {\n\t this.deselect();\n\t\n\t if (node && event.target == node.dom.drag) {\n\t // drag a singe node\n\t Node.onDragStart(node, event);\n\t }\n\t else if (!node || (event.target != node.dom.field && event.target != node.dom.value && event.target != node.dom.select)) {\n\t // select multiple nodes\n\t this._onMultiSelectStart(event);\n\t }\n\t }\n\t }\n\t\n\t if (node) {\n\t node.onEvent(event);\n\t }\n\t};\n\t\n\ttreemode._startDragDistance = function (event) {\n\t this.dragDistanceEvent = {\n\t initialTarget: event.target,\n\t initialPageX: event.pageX,\n\t initialPageY: event.pageY,\n\t dragDistance: 0,\n\t hasMoved: false\n\t };\n\t};\n\t\n\ttreemode._updateDragDistance = function (event) {\n\t if (!this.dragDistanceEvent) {\n\t this._startDragDistance(event);\n\t }\n\t\n\t var diffX = event.pageX - this.dragDistanceEvent.initialPageX;\n\t var diffY = event.pageY - this.dragDistanceEvent.initialPageY;\n\t\n\t this.dragDistanceEvent.dragDistance = Math.sqrt(diffX * diffX + diffY * diffY);\n\t this.dragDistanceEvent.hasMoved =\n\t this.dragDistanceEvent.hasMoved || this.dragDistanceEvent.dragDistance > 10;\n\t\n\t event.dragDistance = this.dragDistanceEvent.dragDistance;\n\t event.hasMoved = this.dragDistanceEvent.hasMoved;\n\t\n\t return event.dragDistance;\n\t};\n\t\n\t/**\n\t * Start multi selection of nodes by dragging the mouse\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onMultiSelectStart = function (event) {\n\t var node = Node.getNodeFromTarget(event.target);\n\t\n\t if (this.options.mode !== 'tree' || this.options.onEditable !== undefined) {\n\t // dragging not allowed in modes 'view' and 'form'\n\t // TODO: allow multiselection of items when option onEditable is specified\n\t return;\n\t }\n\t\n\t this.multiselection = {\n\t start: node || null,\n\t end: null,\n\t nodes: []\n\t };\n\t\n\t this._startDragDistance(event);\n\t\n\t var editor = this;\n\t if (!this.mousemove) {\n\t this.mousemove = util.addEventListener(window, 'mousemove', function (event) {\n\t editor._onMultiSelect(event);\n\t });\n\t }\n\t if (!this.mouseup) {\n\t this.mouseup = util.addEventListener(window, 'mouseup', function (event ) {\n\t editor._onMultiSelectEnd(event);\n\t });\n\t }\n\t\n\t};\n\t\n\t/**\n\t * Multiselect nodes by dragging\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onMultiSelect = function (event) {\n\t event.preventDefault();\n\t\n\t this._updateDragDistance(event);\n\t if (!event.hasMoved) {\n\t return;\n\t }\n\t\n\t var node = Node.getNodeFromTarget(event.target);\n\t\n\t if (node) {\n\t if (this.multiselection.start == null) {\n\t this.multiselection.start = node;\n\t }\n\t this.multiselection.end = node;\n\t }\n\t\n\t // deselect previous selection\n\t this.deselect();\n\t\n\t // find the selected nodes in the range from first to last\n\t var start = this.multiselection.start;\n\t var end = this.multiselection.end || this.multiselection.start;\n\t if (start && end) {\n\t // find the top level childs, all having the same parent\n\t this.multiselection.nodes = this._findTopLevelNodes(start, end);\n\t this.select(this.multiselection.nodes);\n\t }\n\t};\n\t\n\t/**\n\t * End of multiselect nodes by dragging\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onMultiSelectEnd = function (event) {\n\t // set focus to the context menu button of the first node\n\t if (this.multiselection.nodes[0]) {\n\t this.multiselection.nodes[0].dom.menu.focus();\n\t }\n\t\n\t this.multiselection.start = null;\n\t this.multiselection.end = null;\n\t\n\t // cleanup global event listeners\n\t if (this.mousemove) {\n\t util.removeEventListener(window, 'mousemove', this.mousemove);\n\t delete this.mousemove;\n\t }\n\t if (this.mouseup) {\n\t util.removeEventListener(window, 'mouseup', this.mouseup);\n\t delete this.mouseup;\n\t }\n\t};\n\t\n\t/**\n\t * deselect currently selected nodes\n\t * @param {boolean} [clearStartAndEnd=false] If true, the `start` and `end`\n\t * state is cleared too.\n\t */\n\ttreemode.deselect = function (clearStartAndEnd) {\n\t this.multiselection.nodes.forEach(function (node) {\n\t node.setSelected(false);\n\t });\n\t this.multiselection.nodes = [];\n\t\n\t if (clearStartAndEnd) {\n\t this.multiselection.start = null;\n\t this.multiselection.end = null;\n\t }\n\t};\n\t\n\t/**\n\t * select nodes\n\t * @param {Node[] | Node} nodes\n\t */\n\ttreemode.select = function (nodes) {\n\t if (!Array.isArray(nodes)) {\n\t return this.select([nodes]);\n\t }\n\t\n\t if (nodes) {\n\t this.deselect();\n\t\n\t this.multiselection.nodes = nodes.slice(0);\n\t\n\t var first = nodes[0];\n\t nodes.forEach(function (node) {\n\t node.setSelected(true, node === first);\n\t });\n\t }\n\t};\n\t\n\t/**\n\t * From two arbitrary selected nodes, find their shared parent node.\n\t * From that parent node, select the two child nodes in the brances going to\n\t * nodes `start` and `end`, and select all childs in between.\n\t * @param {Node} start\n\t * @param {Node} end\n\t * @return {Array.} Returns an ordered list with child nodes\n\t * @private\n\t */\n\ttreemode._findTopLevelNodes = function (start, end) {\n\t var startPath = start.getNodePath();\n\t var endPath = end.getNodePath();\n\t var i = 0;\n\t while (i < startPath.length && startPath[i] === endPath[i]) {\n\t i++;\n\t }\n\t var root = startPath[i - 1];\n\t var startChild = startPath[i];\n\t var endChild = endPath[i];\n\t\n\t if (!startChild || !endChild) {\n\t if (root.parent) {\n\t // startChild is a parent of endChild or vice versa\n\t startChild = root;\n\t endChild = root;\n\t root = root.parent\n\t }\n\t else {\n\t // we have selected the root node (which doesn't have a parent)\n\t startChild = root.childs[0];\n\t endChild = root.childs[root.childs.length - 1];\n\t }\n\t }\n\t\n\t if (root && startChild && endChild) {\n\t var startIndex = root.childs.indexOf(startChild);\n\t var endIndex = root.childs.indexOf(endChild);\n\t var firstIndex = Math.min(startIndex, endIndex);\n\t var lastIndex = Math.max(startIndex, endIndex);\n\t\n\t return root.childs.slice(firstIndex, lastIndex + 1);\n\t }\n\t else {\n\t return [];\n\t }\n\t};\n\t\n\t/**\n\t * Event handler for keydown. Handles shortcut keys\n\t * @param {Event} event\n\t * @private\n\t */\n\ttreemode._onKeyDown = function (event) {\n\t var keynum = event.which || event.keyCode;\n\t var ctrlKey = event.ctrlKey;\n\t var shiftKey = event.shiftKey;\n\t var handled = false;\n\t\n\t if (keynum == 9) { // Tab or Shift+Tab\n\t var me = this;\n\t setTimeout(function () {\n\t // select all text when moving focus to an editable div\n\t util.selectContentEditable(me.focusTarget);\n\t }, 0);\n\t }\n\t\n\t if (this.searchBox) {\n\t if (ctrlKey && keynum == 70) { // Ctrl+F\n\t this.searchBox.dom.search.focus();\n\t this.searchBox.dom.search.select();\n\t handled = true;\n\t }\n\t else if (keynum == 114 || (ctrlKey && keynum == 71)) { // F3 or Ctrl+G\n\t var focus = true;\n\t if (!shiftKey) {\n\t // select next search result (F3 or Ctrl+G)\n\t this.searchBox.next(focus);\n\t }\n\t else {\n\t // select previous search result (Shift+F3 or Ctrl+Shift+G)\n\t this.searchBox.previous(focus);\n\t }\n\t\n\t handled = true;\n\t }\n\t }\n\t\n\t if (this.history) {\n\t if (ctrlKey && !shiftKey && keynum == 90) { // Ctrl+Z\n\t // undo\n\t this._onUndo();\n\t handled = true;\n\t }\n\t else if (ctrlKey && shiftKey && keynum == 90) { // Ctrl+Shift+Z\n\t // redo\n\t this._onRedo();\n\t handled = true;\n\t }\n\t }\n\t\n\t if (handled) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\t\n\t/**\n\t * Create main table\n\t * @private\n\t */\n\ttreemode._createTable = function () {\n\t var contentOuter = document.createElement('div');\n\t contentOuter.className = 'jsoneditor-outer';\n\t this.contentOuter = contentOuter;\n\t\n\t this.content = document.createElement('div');\n\t this.content.className = 'jsoneditor-tree';\n\t contentOuter.appendChild(this.content);\n\t\n\t this.table = document.createElement('table');\n\t this.table.className = 'jsoneditor-tree';\n\t this.content.appendChild(this.table);\n\t\n\t // create colgroup where the first two columns don't have a fixed\n\t // width, and the edit columns do have a fixed width\n\t var col;\n\t this.colgroupContent = document.createElement('colgroup');\n\t if (this.options.mode === 'tree') {\n\t col = document.createElement('col');\n\t col.width = \"24px\";\n\t this.colgroupContent.appendChild(col);\n\t }\n\t col = document.createElement('col');\n\t col.width = \"24px\";\n\t this.colgroupContent.appendChild(col);\n\t col = document.createElement('col');\n\t this.colgroupContent.appendChild(col);\n\t this.table.appendChild(this.colgroupContent);\n\t\n\t this.tbody = document.createElement('tbody');\n\t this.table.appendChild(this.tbody);\n\t\n\t this.frame.appendChild(contentOuter);\n\t};\n\t\n\t/**\n\t * Show a contextmenu for this node.\n\t * Used for multiselection\n\t * @param {HTMLElement} anchor Anchor element to attache the context menu to.\n\t * @param {function} [onClose] Callback method called when the context menu\n\t * is being closed.\n\t */\n\ttreemode.showContextMenu = function (anchor, onClose) {\n\t var items = [];\n\t var editor = this;\n\t\n\t // create duplicate button\n\t items.push({\n\t text: 'Duplicate',\n\t title: 'Duplicate selected fields (Ctrl+D)',\n\t className: 'jsoneditor-duplicate',\n\t click: function () {\n\t Node.onDuplicate(editor.multiselection.nodes);\n\t }\n\t });\n\t\n\t // create remove button\n\t items.push({\n\t text: 'Remove',\n\t title: 'Remove selected fields (Ctrl+Del)',\n\t className: 'jsoneditor-remove',\n\t click: function () {\n\t Node.onRemove(editor.multiselection.nodes);\n\t }\n\t });\n\t\n\t var menu = new ContextMenu(items, {close: onClose});\n\t menu.show(anchor, this.content);\n\t};\n\t\n\t\n\t// define modes\n\tmodule.exports = [\n\t {\n\t mode: 'tree',\n\t mixin: treemode,\n\t data: 'json'\n\t },\n\t {\n\t mode: 'view',\n\t mixin: treemode,\n\t data: 'json'\n\t },\n\t {\n\t mode: 'form',\n\t mixin: treemode,\n\t data: 'json'\n\t }\n\t];\n\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\texports.parse = __webpack_require__(64);\n\texports.stringify = __webpack_require__(65);\n\n\n/***/ },\n/* 64 */\n/***/ function(module, exports) {\n\n\tvar at, // The index of the current character\n\t ch, // The current character\n\t escapee = {\n\t '\"': '\"',\n\t '\\\\': '\\\\',\n\t '/': '/',\n\t b: '\\b',\n\t f: '\\f',\n\t n: '\\n',\n\t r: '\\r',\n\t t: '\\t'\n\t },\n\t text,\n\t\n\t error = function (m) {\n\t // Call error when something is wrong.\n\t throw {\n\t name: 'SyntaxError',\n\t message: m,\n\t at: at,\n\t text: text\n\t };\n\t },\n\t \n\t next = function (c) {\n\t // If a c parameter is provided, verify that it matches the current character.\n\t if (c && c !== ch) {\n\t error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n\t }\n\t \n\t // Get the next character. When there are no more characters,\n\t // return the empty string.\n\t \n\t ch = text.charAt(at);\n\t at += 1;\n\t return ch;\n\t },\n\t \n\t number = function () {\n\t // Parse a number value.\n\t var number,\n\t string = '';\n\t \n\t if (ch === '-') {\n\t string = '-';\n\t next('-');\n\t }\n\t while (ch >= '0' && ch <= '9') {\n\t string += ch;\n\t next();\n\t }\n\t if (ch === '.') {\n\t string += '.';\n\t while (next() && ch >= '0' && ch <= '9') {\n\t string += ch;\n\t }\n\t }\n\t if (ch === 'e' || ch === 'E') {\n\t string += ch;\n\t next();\n\t if (ch === '-' || ch === '+') {\n\t string += ch;\n\t next();\n\t }\n\t while (ch >= '0' && ch <= '9') {\n\t string += ch;\n\t next();\n\t }\n\t }\n\t number = +string;\n\t if (!isFinite(number)) {\n\t error(\"Bad number\");\n\t } else {\n\t return number;\n\t }\n\t },\n\t \n\t string = function () {\n\t // Parse a string value.\n\t var hex,\n\t i,\n\t string = '',\n\t uffff;\n\t \n\t // When parsing for string values, we must look for \" and \\ characters.\n\t if (ch === '\"') {\n\t while (next()) {\n\t if (ch === '\"') {\n\t next();\n\t return string;\n\t } else if (ch === '\\\\') {\n\t next();\n\t if (ch === 'u') {\n\t uffff = 0;\n\t for (i = 0; i < 4; i += 1) {\n\t hex = parseInt(next(), 16);\n\t if (!isFinite(hex)) {\n\t break;\n\t }\n\t uffff = uffff * 16 + hex;\n\t }\n\t string += String.fromCharCode(uffff);\n\t } else if (typeof escapee[ch] === 'string') {\n\t string += escapee[ch];\n\t } else {\n\t break;\n\t }\n\t } else {\n\t string += ch;\n\t }\n\t }\n\t }\n\t error(\"Bad string\");\n\t },\n\t\n\t white = function () {\n\t\n\t// Skip whitespace.\n\t\n\t while (ch && ch <= ' ') {\n\t next();\n\t }\n\t },\n\t\n\t word = function () {\n\t\n\t// true, false, or null.\n\t\n\t switch (ch) {\n\t case 't':\n\t next('t');\n\t next('r');\n\t next('u');\n\t next('e');\n\t return true;\n\t case 'f':\n\t next('f');\n\t next('a');\n\t next('l');\n\t next('s');\n\t next('e');\n\t return false;\n\t case 'n':\n\t next('n');\n\t next('u');\n\t next('l');\n\t next('l');\n\t return null;\n\t }\n\t error(\"Unexpected '\" + ch + \"'\");\n\t },\n\t\n\t value, // Place holder for the value function.\n\t\n\t array = function () {\n\t\n\t// Parse an array value.\n\t\n\t var array = [];\n\t\n\t if (ch === '[') {\n\t next('[');\n\t white();\n\t if (ch === ']') {\n\t next(']');\n\t return array; // empty array\n\t }\n\t while (ch) {\n\t array.push(value());\n\t white();\n\t if (ch === ']') {\n\t next(']');\n\t return array;\n\t }\n\t next(',');\n\t white();\n\t }\n\t }\n\t error(\"Bad array\");\n\t },\n\t\n\t object = function () {\n\t\n\t// Parse an object value.\n\t\n\t var key,\n\t object = {};\n\t\n\t if (ch === '{') {\n\t next('{');\n\t white();\n\t if (ch === '}') {\n\t next('}');\n\t return object; // empty object\n\t }\n\t while (ch) {\n\t key = string();\n\t white();\n\t next(':');\n\t if (Object.hasOwnProperty.call(object, key)) {\n\t error('Duplicate key \"' + key + '\"');\n\t }\n\t object[key] = value();\n\t white();\n\t if (ch === '}') {\n\t next('}');\n\t return object;\n\t }\n\t next(',');\n\t white();\n\t }\n\t }\n\t error(\"Bad object\");\n\t };\n\t\n\tvalue = function () {\n\t\n\t// Parse a JSON value. It could be an object, an array, a string, a number,\n\t// or a word.\n\t\n\t white();\n\t switch (ch) {\n\t case '{':\n\t return object();\n\t case '[':\n\t return array();\n\t case '\"':\n\t return string();\n\t case '-':\n\t return number();\n\t default:\n\t return ch >= '0' && ch <= '9' ? number() : word();\n\t }\n\t};\n\t\n\t// Return the json_parse function. It will have access to all of the above\n\t// functions and variables.\n\t\n\tmodule.exports = function (source, reviver) {\n\t var result;\n\t \n\t text = source;\n\t at = 0;\n\t ch = ' ';\n\t result = value();\n\t white();\n\t if (ch) {\n\t error(\"Syntax error\");\n\t }\n\t\n\t // If there is a reviver function, we recursively walk the new structure,\n\t // passing each name/value pair to the reviver function for possible\n\t // transformation, starting with a temporary root object that holds the result\n\t // in an empty key. If there is not a reviver function, we simply return the\n\t // result.\n\t\n\t return typeof reviver === 'function' ? (function walk(holder, key) {\n\t var k, v, value = holder[key];\n\t if (value && typeof value === 'object') {\n\t for (k in value) {\n\t if (Object.prototype.hasOwnProperty.call(value, k)) {\n\t v = walk(value, k);\n\t if (v !== undefined) {\n\t value[k] = v;\n\t } else {\n\t delete value[k];\n\t }\n\t }\n\t }\n\t }\n\t return reviver.call(holder, key, value);\n\t }({'': result}, '')) : result;\n\t};\n\n\n/***/ },\n/* 65 */\n/***/ function(module, exports) {\n\n\tvar cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n\t escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n\t gap,\n\t indent,\n\t meta = { // table of character substitutions\n\t '\\b': '\\\\b',\n\t '\\t': '\\\\t',\n\t '\\n': '\\\\n',\n\t '\\f': '\\\\f',\n\t '\\r': '\\\\r',\n\t '\"' : '\\\\\"',\n\t '\\\\': '\\\\\\\\'\n\t },\n\t rep;\n\t\n\tfunction quote(string) {\n\t // If the string contains no control characters, no quote characters, and no\n\t // backslash characters, then we can safely slap some quotes around it.\n\t // Otherwise we must also replace the offending characters with safe escape\n\t // sequences.\n\t \n\t escapable.lastIndex = 0;\n\t return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n\t var c = meta[a];\n\t return typeof c === 'string' ? c :\n\t '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n\t }) + '\"' : '\"' + string + '\"';\n\t}\n\t\n\tfunction str(key, holder) {\n\t // Produce a string from holder[key].\n\t var i, // The loop counter.\n\t k, // The member key.\n\t v, // The member value.\n\t length,\n\t mind = gap,\n\t partial,\n\t value = holder[key];\n\t \n\t // If the value has a toJSON method, call it to obtain a replacement value.\n\t if (value && typeof value === 'object' &&\n\t typeof value.toJSON === 'function') {\n\t value = value.toJSON(key);\n\t }\n\t \n\t // If we were called with a replacer function, then call the replacer to\n\t // obtain a replacement value.\n\t if (typeof rep === 'function') {\n\t value = rep.call(holder, key, value);\n\t }\n\t \n\t // What happens next depends on the value's type.\n\t switch (typeof value) {\n\t case 'string':\n\t return quote(value);\n\t \n\t case 'number':\n\t // JSON numbers must be finite. Encode non-finite numbers as null.\n\t return isFinite(value) ? String(value) : 'null';\n\t \n\t case 'boolean':\n\t case 'null':\n\t // If the value is a boolean or null, convert it to a string. Note:\n\t // typeof null does not produce 'null'. The case is included here in\n\t // the remote chance that this gets fixed someday.\n\t return String(value);\n\t \n\t case 'object':\n\t if (!value) return 'null';\n\t gap += indent;\n\t partial = [];\n\t \n\t // Array.isArray\n\t if (Object.prototype.toString.apply(value) === '[object Array]') {\n\t length = value.length;\n\t for (i = 0; i < length; i += 1) {\n\t partial[i] = str(i, value) || 'null';\n\t }\n\t \n\t // Join all of the elements together, separated with commas, and\n\t // wrap them in brackets.\n\t v = partial.length === 0 ? '[]' : gap ?\n\t '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n\t '[' + partial.join(',') + ']';\n\t gap = mind;\n\t return v;\n\t }\n\t \n\t // If the replacer is an array, use it to select the members to be\n\t // stringified.\n\t if (rep && typeof rep === 'object') {\n\t length = rep.length;\n\t for (i = 0; i < length; i += 1) {\n\t k = rep[i];\n\t if (typeof k === 'string') {\n\t v = str(k, value);\n\t if (v) {\n\t partial.push(quote(k) + (gap ? ': ' : ':') + v);\n\t }\n\t }\n\t }\n\t }\n\t else {\n\t // Otherwise, iterate through all of the keys in the object.\n\t for (k in value) {\n\t if (Object.prototype.hasOwnProperty.call(value, k)) {\n\t v = str(k, value);\n\t if (v) {\n\t partial.push(quote(k) + (gap ? ': ' : ':') + v);\n\t }\n\t }\n\t }\n\t }\n\t \n\t // Join all of the member texts together, separated with commas,\n\t // and wrap them in braces.\n\t\n\t v = partial.length === 0 ? '{}' : gap ?\n\t '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n\t '{' + partial.join(',') + '}';\n\t gap = mind;\n\t return v;\n\t }\n\t}\n\t\n\tmodule.exports = function (value, replacer, space) {\n\t var i;\n\t gap = '';\n\t indent = '';\n\t \n\t // If the space parameter is a number, make an indent string containing that\n\t // many spaces.\n\t if (typeof space === 'number') {\n\t for (i = 0; i < space; i += 1) {\n\t indent += ' ';\n\t }\n\t }\n\t // If the space parameter is a string, it will be used as the indent string.\n\t else if (typeof space === 'string') {\n\t indent = space;\n\t }\n\t\n\t // If there is a replacer, it must be a function or an array.\n\t // Otherwise, throw an error.\n\t rep = replacer;\n\t if (replacer && typeof replacer !== 'function'\n\t && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {\n\t throw new Error('JSON.stringify');\n\t }\n\t \n\t // Make a fake root object containing our value under the key of ''.\n\t // Return the result of stringifying the value.\n\t return str('', {'': value});\n\t};\n\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _jsoneditor = __webpack_require__(51);\n\t\n\tvar _jsoneditor2 = _interopRequireDefault(_jsoneditor);\n\t\n\t__webpack_require__(73);\n\t\n\t__webpack_require__(1);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = function () {\n\t 'ngInject';\n\t\n\t return {\n\t restrict: 'E',\n\t require: 'ngModel',\n\t scope: { 'options': '=' },\n\t link: function link($scope, element, attrs, ngModel) {\n\t var editor = void 0;\n\t var createEditor = function createEditor(options) {\n\t var settings = angular.extend({}, {}, options);\n\t settings.onChange = function () {\n\t ngModel.$setViewValue(editor.get());\n\t };\n\t element.html('');\n\t return new _jsoneditor2.default(element[0], settings);\n\t };\n\t\n\t editor = createEditor($scope.options);\n\t\n\t $scope.$watch('options', function (newValue, oldValue) {\n\t for (var k in newValue) {\n\t if (newValue.hasOwnProperty(k)) {\n\t var v = newValue[k];\n\t if (newValue[k] !== oldValue[k]) {\n\t if (k === 'mode') {\n\t editor.setMode(v);\n\t } else if (k === 'name') {\n\t editor.setName(v);\n\t } else {\n\t // other settings cannot be changed without re-creating the JsonEditor\n\t editor = createEditor(newValue);\n\t $scope.updateJsonEditor();\n\t return;\n\t }\n\t }\n\t }\n\t }\n\t }, true);\n\t\n\t $scope.$on('$destroy', function () {\n\t editor = null;\n\t });\n\t\n\t $scope.updateJsonEditor = function () {\n\t editor.set(ngModel.$viewValue || {});\n\t };\n\t\n\t ngModel.$render = $scope.updateJsonEditor;\n\t\n\t $scope.$watch(function () {\n\t return ngModel.$modelValue;\n\t }, function (newValue) {\n\t // Do not update 2 times\n\t if (!angular.equals(newValue, editor.get())) {\n\t $scope.updateJsonEditor();\n\t }\n\t }, true);\n\t }\n\t };\n\t};\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 67 */\n/***/ function(module, exports) {\n\n\t// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\t'use strict';\n\t\n\t// If obj.hasOwnProperty has been overridden, then calling\n\t// obj.hasOwnProperty(prop) will break.\n\t// See: https://github.com/joyent/node/issues/1707\n\tfunction hasOwnProperty(obj, prop) {\n\t return Object.prototype.hasOwnProperty.call(obj, prop);\n\t}\n\t\n\tmodule.exports = function(qs, sep, eq, options) {\n\t sep = sep || '&';\n\t eq = eq || '=';\n\t var obj = {};\n\t\n\t if (typeof qs !== 'string' || qs.length === 0) {\n\t return obj;\n\t }\n\t\n\t var regexp = /\\+/g;\n\t qs = qs.split(sep);\n\t\n\t var maxKeys = 1000;\n\t if (options && typeof options.maxKeys === 'number') {\n\t maxKeys = options.maxKeys;\n\t }\n\t\n\t var len = qs.length;\n\t // maxKeys <= 0 means that we should not limit keys count\n\t if (maxKeys > 0 && len > maxKeys) {\n\t len = maxKeys;\n\t }\n\t\n\t for (var i = 0; i < len; ++i) {\n\t var x = qs[i].replace(regexp, '%20'),\n\t idx = x.indexOf(eq),\n\t kstr, vstr, k, v;\n\t\n\t if (idx >= 0) {\n\t kstr = x.substr(0, idx);\n\t vstr = x.substr(idx + 1);\n\t } else {\n\t kstr = x;\n\t vstr = '';\n\t }\n\t\n\t k = decodeURIComponent(kstr);\n\t v = decodeURIComponent(vstr);\n\t\n\t if (!hasOwnProperty(obj, k)) {\n\t obj[k] = v;\n\t } else if (Array.isArray(obj[k])) {\n\t obj[k].push(v);\n\t } else {\n\t obj[k] = [obj[k], v];\n\t }\n\t }\n\t\n\t return obj;\n\t};\n\n\n/***/ },\n/* 68 */\n/***/ function(module, exports) {\n\n\t// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\t'use strict';\n\t\n\tvar stringifyPrimitive = function(v) {\n\t switch (typeof v) {\n\t case 'string':\n\t return v;\n\t\n\t case 'boolean':\n\t return v ? 'true' : 'false';\n\t\n\t case 'number':\n\t return isFinite(v) ? v : '';\n\t\n\t default:\n\t return '';\n\t }\n\t};\n\t\n\tmodule.exports = function(obj, sep, eq, name) {\n\t sep = sep || '&';\n\t eq = eq || '=';\n\t if (obj === null) {\n\t obj = undefined;\n\t }\n\t\n\t if (typeof obj === 'object') {\n\t return Object.keys(obj).map(function(k) {\n\t var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n\t if (Array.isArray(obj[k])) {\n\t return obj[k].map(function(v) {\n\t return ks + encodeURIComponent(stringifyPrimitive(v));\n\t }).join(sep);\n\t } else {\n\t return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n\t }\n\t }).join(sep);\n\t\n\t }\n\t\n\t if (!name) return '';\n\t return encodeURIComponent(stringifyPrimitive(name)) + eq +\n\t encodeURIComponent(stringifyPrimitive(obj));\n\t};\n\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.decode = exports.parse = __webpack_require__(67);\n\texports.encode = exports.stringify = __webpack_require__(68);\n\n\n/***/ },\n/* 70 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"{\\n \\\"id\\\": \\\"http://json-schema.org/draft-04/schema#\\\",\\n \\\"$schema\\\": \\\"http://json-schema.org/draft-04/schema#\\\",\\n \\\"description\\\": \\\"Core schema meta-schema\\\",\\n \\\"definitions\\\": {\\n \\\"schemaArray\\\": {\\n \\\"type\\\": \\\"array\\\",\\n \\\"minItems\\\": 1,\\n \\\"items\\\": { \\\"$ref\\\": \\\"#\\\" }\\n },\\n \\\"positiveInteger\\\": {\\n \\\"type\\\": \\\"integer\\\",\\n \\\"minimum\\\": 0\\n },\\n \\\"positiveIntegerDefault0\\\": {\\n \\\"allOf\\\": [ { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" }, { \\\"default\\\": 0 } ]\\n },\\n \\\"simpleTypes\\\": {\\n \\\"enum\\\": [ \\\"array\\\", \\\"boolean\\\", \\\"integer\\\", \\\"null\\\", \\\"number\\\", \\\"object\\\", \\\"string\\\" ]\\n },\\n \\\"stringArray\\\": {\\n \\\"type\\\": \\\"array\\\",\\n \\\"items\\\": { \\\"type\\\": \\\"string\\\" },\\n \\\"minItems\\\": 1,\\n \\\"uniqueItems\\\": true\\n }\\n },\\n \\\"type\\\": \\\"object\\\",\\n \\\"properties\\\": {\\n \\\"id\\\": {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"uri\\\"\\n },\\n \\\"$schema\\\": {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"uri\\\"\\n },\\n \\\"title\\\": {\\n \\\"type\\\": \\\"string\\\"\\n },\\n \\\"description\\\": {\\n \\\"type\\\": \\\"string\\\"\\n },\\n \\\"default\\\": {},\\n \\\"multipleOf\\\": {\\n \\\"type\\\": \\\"number\\\",\\n \\\"minimum\\\": 0,\\n \\\"exclusiveMinimum\\\": true\\n },\\n \\\"maximum\\\": {\\n \\\"type\\\": \\\"number\\\"\\n },\\n \\\"exclusiveMaximum\\\": {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n \\\"minimum\\\": {\\n \\\"type\\\": \\\"number\\\"\\n },\\n \\\"exclusiveMinimum\\\": {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n \\\"maxLength\\\": { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n \\\"minLength\\\": { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n \\\"pattern\\\": {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"regex\\\"\\n },\\n \\\"additionalItems\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"boolean\\\" },\\n { \\\"$ref\\\": \\\"#\\\" }\\n ],\\n \\\"default\\\": {}\\n },\\n \\\"items\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" }\\n ],\\n \\\"default\\\": {}\\n },\\n \\\"maxItems\\\": { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n \\\"minItems\\\": { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n \\\"uniqueItems\\\": {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n \\\"maxProperties\\\": { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n \\\"minProperties\\\": { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n \\\"required\\\": { \\\"$ref\\\": \\\"#/definitions/stringArray\\\" },\\n \\\"additionalProperties\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"boolean\\\" },\\n { \\\"$ref\\\": \\\"#\\\" }\\n ],\\n \\\"default\\\": {}\\n },\\n \\\"definitions\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"default\\\": {}\\n },\\n \\\"properties\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"default\\\": {}\\n },\\n \\\"patternProperties\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"default\\\": {}\\n },\\n \\\"dependencies\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/stringArray\\\" }\\n ]\\n }\\n },\\n \\\"enum\\\": {\\n \\\"type\\\": \\\"array\\\",\\n \\\"minItems\\\": 1,\\n \\\"uniqueItems\\\": true\\n },\\n \\\"type\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/simpleTypes\\\" },\\n {\\n \\\"type\\\": \\\"array\\\",\\n \\\"items\\\": { \\\"$ref\\\": \\\"#/definitions/simpleTypes\\\" },\\n \\\"minItems\\\": 1,\\n \\\"uniqueItems\\\": true\\n }\\n ]\\n },\\n \\\"allOf\\\": { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" },\\n \\\"anyOf\\\": { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" },\\n \\\"oneOf\\\": { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" },\\n \\\"not\\\": { \\\"$ref\\\": \\\"#\\\" }\\n },\\n \\\"dependencies\\\": {\\n \\\"exclusiveMaximum\\\": [ \\\"maximum\\\" ],\\n \\\"exclusiveMinimum\\\": [ \\\"minimum\\\" ]\\n },\\n \\\"default\\\": {}\\n}\\n\"\n\n/***/ },\n/* 71 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \"{\\n \\\"id\\\": \\\"https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#\\\",\\n \\\"$schema\\\": \\\"http://json-schema.org/draft-04/schema#\\\",\\n \\\"description\\\": \\\"Core schema meta-schema (v5 proposals)\\\",\\n \\\"definitions\\\": {\\n \\\"schemaArray\\\": {\\n \\\"type\\\": \\\"array\\\",\\n \\\"minItems\\\": 1,\\n \\\"items\\\": { \\\"$ref\\\": \\\"#\\\" }\\n },\\n \\\"positiveInteger\\\": {\\n \\\"type\\\": \\\"integer\\\",\\n \\\"minimum\\\": 0\\n },\\n \\\"positiveIntegerDefault0\\\": {\\n \\\"allOf\\\": [ { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" }, { \\\"default\\\": 0 } ]\\n },\\n \\\"simpleTypes\\\": {\\n \\\"enum\\\": [ \\\"array\\\", \\\"boolean\\\", \\\"integer\\\", \\\"null\\\", \\\"number\\\", \\\"object\\\", \\\"string\\\" ]\\n },\\n \\\"stringArray\\\": {\\n \\\"type\\\": \\\"array\\\",\\n \\\"items\\\": { \\\"type\\\": \\\"string\\\" },\\n \\\"minItems\\\": 1,\\n \\\"uniqueItems\\\": true\\n },\\n \\\"$data\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"required\\\": [ \\\"$data\\\" ],\\n \\\"properties\\\": {\\n \\\"$data\\\": {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"relative-json-pointer\\\"\\n }\\n },\\n \\\"additionalProperties\\\": false\\n }\\n },\\n \\\"type\\\": \\\"object\\\",\\n \\\"properties\\\": {\\n \\\"id\\\": {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"uri\\\"\\n },\\n \\\"$schema\\\": {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"uri\\\"\\n },\\n \\\"title\\\": {\\n \\\"type\\\": \\\"string\\\"\\n },\\n \\\"description\\\": {\\n \\\"type\\\": \\\"string\\\"\\n },\\n \\\"default\\\": {},\\n \\\"multipleOf\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"number\\\",\\n \\\"minimum\\\": 0,\\n \\\"exclusiveMinimum\\\": true\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"maximum\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"number\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"exclusiveMaximum\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"minimum\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"number\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"exclusiveMinimum\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"maxLength\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"minLength\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"pattern\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"string\\\",\\n \\\"format\\\": \\\"regex\\\"\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"additionalItems\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"boolean\\\" },\\n { \\\"$ref\\\": \\\"#\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ],\\n \\\"default\\\": {}\\n },\\n \\\"items\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" }\\n ],\\n \\\"default\\\": {}\\n },\\n \\\"maxItems\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"minItems\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"uniqueItems\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"maxProperties\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"minProperties\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"required\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/stringArray\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"additionalProperties\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"boolean\\\" },\\n { \\\"$ref\\\": \\\"#\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ],\\n \\\"default\\\": {}\\n },\\n \\\"definitions\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"default\\\": {}\\n },\\n \\\"properties\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"default\\\": {}\\n },\\n \\\"patternProperties\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"default\\\": {}\\n },\\n \\\"dependencies\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/stringArray\\\" }\\n ]\\n }\\n },\\n \\\"enum\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"array\\\",\\n \\\"minItems\\\": 1,\\n \\\"uniqueItems\\\": true\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"type\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/simpleTypes\\\" },\\n {\\n \\\"type\\\": \\\"array\\\",\\n \\\"items\\\": { \\\"$ref\\\": \\\"#/definitions/simpleTypes\\\" },\\n \\\"minItems\\\": 1,\\n \\\"uniqueItems\\\": true\\n }\\n ]\\n },\\n \\\"allOf\\\": { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" },\\n \\\"anyOf\\\": { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" },\\n \\\"oneOf\\\": { \\\"$ref\\\": \\\"#/definitions/schemaArray\\\" },\\n \\\"not\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"format\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"string\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"formatMaximum\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"string\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"formatMinimum\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"string\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"exclusiveFormatMaximum\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"exclusiveFormatMinimum\\\": {\\n \\\"anyOf\\\": [\\n {\\n \\\"type\\\": \\\"boolean\\\",\\n \\\"default\\\": false\\n },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"constant\\\": {\\n \\\"anyOf\\\": [\\n {},\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"contains\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"patternGroups\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"additionalProperties\\\": {\\n \\\"type\\\": \\\"object\\\",\\n \\\"required\\\": [ \\\"schema\\\" ],\\n \\\"properties\\\": {\\n \\\"maximum\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveInteger\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"minimum\\\": {\\n \\\"anyOf\\\": [\\n { \\\"$ref\\\": \\\"#/definitions/positiveIntegerDefault0\\\" },\\n { \\\"$ref\\\": \\\"#/definitions/$data\\\" }\\n ]\\n },\\n \\\"schema\\\": { \\\"$ref\\\": \\\"#\\\" }\\n },\\n \\\"additionalProperties\\\": false\\n },\\n \\\"default\\\": {}\\n },\\n \\\"switch\\\": {\\n \\\"type\\\": \\\"array\\\",\\n \\\"items\\\": {\\n \\\"required\\\": [ \\\"then\\\" ],\\n \\\"properties\\\": {\\n \\\"if\\\": { \\\"$ref\\\": \\\"#\\\" },\\n \\\"then\\\": {\\n \\\"anyOf\\\": [\\n { \\\"type\\\": \\\"boolean\\\" },\\n { \\\"$ref\\\": \\\"#\\\" }\\n ]\\n },\\n \\\"continue\\\": { \\\"type\\\": \\\"boolean\\\" }\\n },\\n \\\"additionalProperties\\\": false,\\n \\\"dependencies\\\": {\\n \\\"continue\\\": [ \\\"if\\\" ]\\n }\\n }\\n }\\n },\\n \\\"dependencies\\\": {\\n \\\"exclusiveMaximum\\\": [ \\\"maximum\\\" ],\\n \\\"exclusiveMinimum\\\": [ \\\"minimum\\\" ],\\n \\\"formatMaximum\\\": [ \\\"format\\\" ],\\n \\\"formatMinimum\\\": [ \\\"format\\\" ],\\n \\\"exclusiveFormatMaximum\\\": [ \\\"formatMaximum\\\" ],\\n \\\"exclusiveFormatMinimum\\\": [ \\\"formatMinimum\\\" ]\\n },\\n \\\"default\\\": {}\\n}\\n\"\n\n/***/ },\n/* 72 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\r\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\t\tAuthor Tobias Koppers @sokra\r\n\t*/\r\n\tvar stylesInDom = {},\r\n\t\tmemoize = function(fn) {\r\n\t\t\tvar memo;\r\n\t\t\treturn function () {\r\n\t\t\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\r\n\t\t\t\treturn memo;\r\n\t\t\t};\r\n\t\t},\r\n\t\tisOldIE = memoize(function() {\r\n\t\t\treturn /msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase());\r\n\t\t}),\r\n\t\tgetHeadElement = memoize(function () {\r\n\t\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\r\n\t\t}),\r\n\t\tsingletonElement = null,\r\n\t\tsingletonCounter = 0,\r\n\t\tstyleElementsInsertedAtTop = [];\r\n\t\r\n\tmodule.exports = function(list, options) {\r\n\t\tif(false) {\r\n\t\t\tif(typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\r\n\t\t}\r\n\t\r\n\t\toptions = options || {};\r\n\t\t// Force single-tag solution on IE6-9, which has a hard limit on the # of