aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/infrastructure/ace/www
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/infrastructure/ace/www')
-rw-r--r--trunk/infrastructure/ace/www/ace2_common.js115
-rw-r--r--trunk/infrastructure/ace/www/ace2_common_dev.js296
-rw-r--r--trunk/infrastructure/ace/www/ace2_inner.js4817
-rw-r--r--trunk/infrastructure/ace/www/ace2_outer.js214
-rw-r--r--trunk/infrastructure/ace/www/ace2_wrapper.js226
-rw-r--r--trunk/infrastructure/ace/www/bbtree.js372
-rw-r--r--trunk/infrastructure/ace/www/changesettracker.js170
-rw-r--r--trunk/infrastructure/ace/www/colorutils.js91
-rw-r--r--trunk/infrastructure/ace/www/contentcollector.js527
-rw-r--r--trunk/infrastructure/ace/www/cssmanager.js88
-rw-r--r--trunk/infrastructure/ace/www/dev.html39
-rw-r--r--trunk/infrastructure/ace/www/domline.js210
-rw-r--r--trunk/infrastructure/ace/www/easy_sync.js923
-rw-r--r--trunk/infrastructure/ace/www/easysync2.js1968
-rw-r--r--trunk/infrastructure/ace/www/easysync2_tests.js877
-rw-r--r--trunk/infrastructure/ace/www/editor.css114
-rw-r--r--trunk/infrastructure/ace/www/firebug/errorIcon.pngbin0 -> 457 bytes
-rw-r--r--trunk/infrastructure/ace/www/firebug/firebug.css209
-rw-r--r--trunk/infrastructure/ace/www/firebug/firebug.html23
-rw-r--r--trunk/infrastructure/ace/www/firebug/firebug.js688
-rw-r--r--trunk/infrastructure/ace/www/firebug/firebugx.js26
-rw-r--r--trunk/infrastructure/ace/www/firebug/infoIcon.pngbin0 -> 524 bytes
-rw-r--r--trunk/infrastructure/ace/www/firebug/warningIcon.pngbin0 -> 516 bytes
-rw-r--r--trunk/infrastructure/ace/www/index.html50
-rw-r--r--trunk/infrastructure/ace/www/inner.css48
-rw-r--r--trunk/infrastructure/ace/www/jquery-1.2.1.js2992
-rw-r--r--trunk/infrastructure/ace/www/lang_html.js1685
-rw-r--r--trunk/infrastructure/ace/www/lang_js.js102
-rw-r--r--trunk/infrastructure/ace/www/lexer_support.js1068
-rw-r--r--trunk/infrastructure/ace/www/linestylefilter.js253
-rw-r--r--trunk/infrastructure/ace/www/magicdom.js293
-rw-r--r--trunk/infrastructure/ace/www/multilang_lexer.js349
-rw-r--r--trunk/infrastructure/ace/www/processing.js1714
-rw-r--r--trunk/infrastructure/ace/www/profiler.js117
-rw-r--r--trunk/infrastructure/ace/www/skiplist.js347
-rw-r--r--trunk/infrastructure/ace/www/spanlist.js279
-rw-r--r--trunk/infrastructure/ace/www/syntax-new.css35
-rw-r--r--trunk/infrastructure/ace/www/syntax.css32
-rw-r--r--trunk/infrastructure/ace/www/test.html11
-rw-r--r--trunk/infrastructure/ace/www/testcode.js36
-rw-r--r--trunk/infrastructure/ace/www/toSource.js274
-rw-r--r--trunk/infrastructure/ace/www/undomodule.js258
-rw-r--r--trunk/infrastructure/ace/www/virtual_lines.js287
43 files changed, 22223 insertions, 0 deletions
diff --git a/trunk/infrastructure/ace/www/ace2_common.js b/trunk/infrastructure/ace/www/ace2_common.js
new file mode 100644
index 0000000..4a08de6
--- /dev/null
+++ b/trunk/infrastructure/ace/www/ace2_common.js
@@ -0,0 +1,115 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+function isNodeText(node) {
+ return (node.nodeType == 3);
+}
+
+function object(o) {
+ var f = function() {};
+ f.prototype = o;
+ return new f();
+}
+
+function extend(obj, props) {
+ for(var p in props) {
+ obj[p] = props[p];
+ }
+ return obj;
+}
+
+function forEach(array, func) {
+ for(var i=0;i<array.length;i++) {
+ var result = func(array[i], i);
+ if (result) break;
+ }
+}
+
+function map(array, func) {
+ var result = [];
+ // must remain compatible with "arguments" pseudo-array
+ for(var i=0;i<array.length;i++) {
+ if (func) result.push(func(array[i], i));
+ else result.push(array[i]);
+ }
+ return result;
+}
+
+function filter(array, func) {
+ var result = [];
+ // must remain compatible with "arguments" pseudo-array
+ for(var i=0;i<array.length;i++) {
+ if (func(array[i], i)) result.push(array[i]);
+ }
+ return result;
+}
+
+function isArray(testObject) {
+ return testObject && typeof testObject === 'object' &&
+ !(testObject.propertyIsEnumerable('length')) &&
+ typeof testObject.length === 'number';
+}
+
+// Figure out what browser is being used (stolen from jquery 1.2.1)
+var userAgent = navigator.userAgent.toLowerCase();
+var browser = {
+ version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
+ safari: /webkit/.test(userAgent),
+ opera: /opera/.test(userAgent),
+ msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
+ mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent),
+ windows: /windows/.test(userAgent) // dgreensp
+};
+
+function getAssoc(obj, name) {
+ return obj["_magicdom_"+name];
+}
+
+function setAssoc(obj, name, value) {
+ // note that in IE designMode, properties of a node can get
+ // copied to new nodes that are spawned during editing; also,
+ // properties representable in HTML text can survive copy-and-paste
+ obj["_magicdom_"+name] = value;
+}
+
+// "func" is a function over 0..(numItems-1) that is monotonically
+// "increasing" with index (false, then true). Finds the boundary
+// between false and true, a number between 0 and numItems inclusive.
+function binarySearch(numItems, func) {
+ if (numItems < 1) return 0;
+ if (func(0)) return 0;
+ if (! func(numItems-1)) return numItems;
+ var low = 0; // func(low) is always false
+ var high = numItems-1; // func(high) is always true
+ while ((high - low) > 1) {
+ var x = Math.floor((low+high)/2); // x != low, x != high
+ if (func(x)) high = x;
+ else low = x;
+ }
+ return high;
+}
+
+function binarySearchInfinite(expectedLength, func) {
+ var i = 0;
+ while (!func(i)) i += expectedLength;
+ return binarySearch(i, func);
+}
+
+function htmlPrettyEscape(str) {
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
+ .replace(/\r?\n/g, '\\n');
+}
diff --git a/trunk/infrastructure/ace/www/ace2_common_dev.js b/trunk/infrastructure/ace/www/ace2_common_dev.js
new file mode 100644
index 0000000..8fb88b0
--- /dev/null
+++ b/trunk/infrastructure/ace/www/ace2_common_dev.js
@@ -0,0 +1,296 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Remove non-cross-browser stuff I'm tempted to use */
+if (Array.prototype.filter) delete Array.prototype.filter;
+if (Array.prototype.forEach) delete Array.prototype.forEach;
+if (Array.prototype.map) delete Array.prototype.map;
+/* */
+
+function busyWait(ms) {
+ var start = (new Date()).getTime();
+ while ((new Date()).getTime() < start+ms) {}
+}
+
+/*
+ based on: http://www.JSON.org/json2.js
+ 2008-07-15
+*/
+toSource = function () {
+
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ Date.prototype.toJSON = function (key) {
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+ String.prototype.toJSON =
+ Number.prototype.toJSON =
+ Boolean.prototype.toJSON = function (key) {
+ return this.valueOf();
+ };
+
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ escapeable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ gap,
+ indent,
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ rep;
+
+
+ function quote(string) {
+
+ // If the string contains no control characters, no quote characters, and no
+ // backslash characters, then we can safely slap some quotes around it.
+ // Otherwise we must also replace the offending characters with safe escape
+ // sequences.
+
+ escapeable.lastIndex = 0;
+ return escapeable.test(string) ?
+ '"' + string.replace(escapeable, function (a) {
+ var c = meta[a];
+ if (typeof c === 'string') {
+ return c;
+ }
+ return '\\u' + ('0000' +
+ (+(a.charCodeAt(0))).toString(16)).slice(-4);
+ }) + '"' :
+ '"' + string + '"';
+ }
+
+
+ function str(key, holder) {
+
+ // Produce a string from holder[key].
+
+ var i, // The loop counter.
+ k, // The member key.
+ v, // The member value.
+ length,
+ mind = gap,
+ partial,
+ value = holder[key];
+
+ // If the value has a toJSON method, call it to obtain a replacement value.
+
+ if (value && typeof value === 'object' &&
+ typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+ // If we were called with a replacer function, then call the replacer to
+ // obtain a replacement value.
+
+ if (typeof rep === 'function') {
+ value = rep.call(holder, key, value);
+ }
+
+ // What happens next depends on the value's type.
+
+ switch (typeof value) {
+ case 'string':
+ return quote(value);
+
+ case 'number':
+
+ // JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value) ? String(value) : 'null';
+
+ case 'boolean':
+ case 'null':
+
+ // If the value is a boolean or null, convert it to a string. Note:
+ // typeof null does not produce 'null'. The case is included here in
+ // the remote chance that this gets fixed someday.
+
+ return String(value);
+
+ // If the type is 'object', we might be dealing with an object or an array or
+ // null.
+
+ case 'object':
+
+ // Due to a specification blunder in ECMAScript, typeof null is 'object',
+ // so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+ // Make an array to hold the partial results of stringifying this object value.
+
+ gap += indent;
+ partial = [];
+
+ // If the object has a dontEnum length property, we'll treat it as an array.
+
+ if (typeof value.length === 'number' &&
+ !(value.propertyIsEnumerable('length'))) {
+
+ // The object is an array. Stringify every element. Use null as a placeholder
+ // for non-JSON values.
+
+ length = value.length;
+ for (i = 0; i < length; i += 1) {
+ partial[i] = str(i, value) || 'null';
+ }
+
+ // Join all of the elements together, separated with commas, and wrap them in
+ // brackets.
+
+ v = partial.length === 0 ? '[]' :
+ gap ? '[\n' + gap +
+ partial.join(',\n' + gap) + '\n' +
+ mind + ']' :
+ '[' + partial.join(',') + ']';
+ gap = mind;
+ return v;
+ }
+
+ // If the replacer is an array, use it to select the members to be stringified.
+
+ if (rep && typeof rep === 'object') {
+ length = rep.length;
+ for (i = 0; i < length; i += 1) {
+ k = rep[i];
+ if (typeof k === 'string') {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ } else {
+
+ // Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (Object.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ }
+
+ // Join all of the member texts together, separated with commas,
+ // and wrap them in braces.
+
+ v = partial.length === 0 ? '{}' :
+ gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
+ mind + '}' : '{' + partial.join(',') + '}';
+ gap = mind;
+ return v;
+ }
+ }
+
+ return function (value, replacer, space) {
+
+ // The stringify method takes a value and an optional replacer, and an optional
+ // space parameter, and returns a JSON text. The replacer can be a function
+ // that can replace values, or an array of strings that will select the keys.
+ // A default replacer method can be provided. Use of the space parameter can
+ // produce text that is more easily readable.
+
+ var i;
+ gap = '';
+ indent = '';
+
+ // If the space parameter is a number, make an indent string containing that
+ // many spaces.
+
+ if (typeof space === 'number') {
+ for (i = 0; i < space; i += 1) {
+ indent += ' ';
+ }
+
+ // If the space parameter is a string, it will be used as the indent string.
+
+ } else if (typeof space === 'string') {
+ indent = space;
+ }
+
+ // If there is a replacer, it must be a function or an array.
+ // Otherwise, throw an error.
+
+ rep = replacer;
+ if (replacer && typeof replacer !== 'function' &&
+ (typeof replacer !== 'object' ||
+ typeof replacer.length !== 'number')) {
+ throw new Error('JSON.stringify');
+ }
+
+ // Make a fake root object containing our value under the key of ''.
+ // Return the result of stringifying the value.
+
+ return str('', {'': value});
+ }
+}();
+
+function debugFrame(optName, func) {
+ var name = "something";
+ if ((typeof optName) == "string") {
+ name = optName;
+ }
+ else func = optName;
+
+ return function() {
+ try {
+ return func.apply(this, arguments);
+ }
+ catch (e) {
+ console.warn(name+" didn't complete");
+ throw e;
+ }
+ }
+}
+
+function makeRecentSet(size) {
+ var ringBuffer = {};
+ var nextIndex = 0;
+ return {
+ contains: function (elem) {
+ for(var i=0;i<size;i++) {
+ if (ringBuffer[i] === elem) return true;
+ }
+ return false;
+ },
+ addNew: function (elem) {
+ // precond: not already in set
+ ringBuffer[nextIndex] = elem;
+ nextIndex = ((nextIndex+1) % size);
+ }
+ };
+}
diff --git a/trunk/infrastructure/ace/www/ace2_inner.js b/trunk/infrastructure/ace/www/ace2_inner.js
new file mode 100644
index 0000000..8bd1096
--- /dev/null
+++ b/trunk/infrastructure/ace/www/ace2_inner.js
@@ -0,0 +1,4817 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function OUTER(gscope) {
+
+ var DEBUG=true;//$$ build script replaces the string "var DEBUG=true;//$$" with "var DEBUG=false;"
+
+ var isSetUp = false;
+
+ var THE_TAB = ' ';//4
+ var MAX_LIST_LEVEL = 8;
+
+ var LINE_NUMBER_PADDING_RIGHT = 4;
+ var LINE_NUMBER_PADDING_LEFT = 4;
+ var MIN_LINEDIV_WIDTH = 20;
+ var EDIT_BODY_PADDING_TOP = 8;
+ var EDIT_BODY_PADDING_LEFT = 8;
+
+ var caughtErrors = [];
+
+ var thisAuthor = '';
+
+ var disposed = false;
+
+ var editorInfo = parent.editorInfo;
+
+ var iframe = window.frameElement;
+ var outerWin = iframe.ace_outerWin;
+ iframe.ace_outerWin = null; // prevent IE 6 memory leak
+ var sideDiv = iframe.nextSibling;
+ var lineMetricsDiv = sideDiv.nextSibling;
+ var overlaysdiv = lineMetricsDiv.nextSibling;
+ initLineNumbers();
+
+ var outsideKeyDown = function(evt) {};
+ var outsideKeyPress = function(evt) { return true; };
+ var outsideNotifyDirty = function() {};
+
+ // selFocusAtStart -- determines whether the selection extends "backwards", so that the focus
+ // point (controlled with the arrow keys) is at the beginning; not supported in IE, though
+ // native IE selections have that behavior (which we try not to interfere with).
+ // Must be false if selection is collapsed!
+ var rep = { lines: newSkipList(), selStart: null, selEnd: null, selFocusAtStart: false,
+ alltext: "", alines: [],
+ apool: new AttribPool() };
+ // lines, alltext, alines, and DOM are set up in setup()
+ if (undoModule.enabled) {
+ undoModule.apool = rep.apool;
+ }
+
+ var root, doc; // set in setup()
+
+ var isEditable = true;
+ var doesWrap = true;
+ var hasLineNumbers = true;
+ var isStyled = true;
+
+ // space around the innermost iframe element
+ var iframePadLeft = MIN_LINEDIV_WIDTH + LINE_NUMBER_PADDING_RIGHT + EDIT_BODY_PADDING_LEFT;
+ var iframePadTop = EDIT_BODY_PADDING_TOP;
+ var iframePadBottom = 0, iframePadRight = 0;
+
+ var console = (DEBUG && top.console);
+ if (! console) {
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+ "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+ console = {};
+ for (var i = 0; i < names.length; ++i)
+ console[names[i]] = function() {};
+ //console.error = function(str) { alert(str); };
+ }
+ var PROFILER = window.PROFILER;
+ if (!PROFILER) {
+ PROFILER = function() { return {start:noop, mark:noop, literal:noop, end:noop, cancel:noop}; };
+ }
+ function noop() {}
+ function identity(x) { return x; }
+
+ // "dmesg" is for displaying messages in the in-page output pane
+ // visible when "?djs=1" is appended to the pad URL. It generally
+ // remains a no-op unless djs is enabled, but we make a habit of
+ // only calling it in error cases or while debugging.
+ var dmesg = noop;
+ window.dmesg = noop;
+
+ var scheduler = parent;
+
+ var textFace = 'monospace';
+ var textSize = 12;
+ function textLineHeight() { return Math.round(textSize * 4/3); }
+
+ var dynamicCSS = null;
+ function initDynamicCSS() {
+ dynamicCSS = makeCSSManager("dynamicsyntax");
+ }
+
+ var changesetTracker = makeChangesetTracker(scheduler, rep.apool, {
+ withCallbacks: function(operationName, f) {
+ inCallStackIfNecessary(operationName, function() {
+ fastIncorp(1);
+ f({
+ setDocumentAttributedText: function(atext) {
+ setDocAText(atext);
+ },
+ applyChangesetToDocument: function(changeset, preferInsertionAfterCaret) {
+ var oldEventType = currentCallStack.editEvent.eventType;
+ currentCallStack.startNewEvent("nonundoable");
+
+ performDocumentApplyChangeset(changeset, preferInsertionAfterCaret);
+
+ currentCallStack.startNewEvent(oldEventType);
+ }
+ });
+ });
+ }
+ });
+
+ var authorInfos = {}; // presence of key determines if author is present in doc
+
+ function setAuthorInfo(author, info) {
+ if ((typeof author) != "string") {
+ throw new Error("setAuthorInfo: author ("+author+") is not a string");
+ }
+ if (! info) {
+ delete authorInfos[author];
+ if (dynamicCSS) {
+ dynamicCSS.removeSelectorStyle(getAuthorColorClassSelector(getAuthorClassName(author)));
+ }
+ }
+ else {
+ authorInfos[author] = info;
+ if (info.bgcolor) {
+ if (dynamicCSS) {
+ var bgcolor = info.bgcolor;
+ if ((typeof info.fade) == "number") {
+ bgcolor = fadeColor(bgcolor, info.fade);
+ }
+
+ dynamicCSS.selectorStyle(getAuthorColorClassSelector(
+ getAuthorClassName(author))).backgroundColor = bgcolor;
+ }
+ }
+ }
+ }
+
+ function getAuthorClassName(author) {
+ return "author-"+author.replace(/[^a-y0-9]/g, function(c) {
+ if (c == ".") return "-";
+ return 'z'+c.charCodeAt(0)+'z';
+ });
+ }
+ function className2Author(className) {
+ if (className.substring(0,7) == "author-") {
+ return className.substring(7).replace(/[a-y0-9]+|-|z.+?z/g, function(cc) {
+ if (cc == '-') return '.';
+ else if (cc.charAt(0) == 'z') {
+ return String.fromCharCode(Number(cc.slice(1,-1)));
+ }
+ else {
+ return cc;
+ }
+ });
+ }
+ return null;
+ }
+ function getAuthorColorClassSelector(oneClassName) {
+ return ".authorColors ."+oneClassName;
+ }
+ function setUpTrackingCSS() {
+ if (dynamicCSS) {
+ var backgroundHeight = lineMetricsDiv.offsetHeight;
+ var lineHeight = textLineHeight();
+ var extraBodding = 0;
+ var extraTodding = 0;
+ if (backgroundHeight < lineHeight) {
+ extraBodding = Math.ceil((lineHeight - backgroundHeight)/2);
+ extraTodding = lineHeight - backgroundHeight - extraBodding;
+ }
+ var spanStyle = dynamicCSS.selectorStyle("#innerdocbody span");
+ spanStyle.paddingTop = extraTodding+"px";
+ spanStyle.paddingBottom = extraBodding+"px";
+ }
+ }
+ function boldColorFromColor(lightColorCSS) {
+ var color = colorutils.css2triple(lightColorCSS);
+
+ // amp up the saturation to full
+ color = colorutils.saturate(color);
+
+ // normalize brightness based on luminosity
+ color = colorutils.scaleColor(color, 0, 0.5 / colorutils.luminosity(color));
+
+ return colorutils.triple2css(color);
+ }
+ function fadeColor(colorCSS, fadeFrac) {
+ var color = colorutils.css2triple(colorCSS);
+ color = colorutils.blend(color, [1,1,1], fadeFrac);
+ return colorutils.triple2css(color);
+ }
+
+ function doAlert(str) {
+ scheduler.setTimeout(function() { alert(str); }, 0);
+ }
+
+ var currentCallStack = null;
+ function inCallStack(type, action) {
+ if (disposed) return;
+
+ if (currentCallStack) {
+ console.error("Can't enter callstack "+type+", already in "+
+ currentCallStack.type);
+ }
+
+ var profiling = false;
+ function profileRest() {
+ profiling = true;
+ console.profile();
+ }
+
+ function newEditEvent(eventType) {
+ return {eventType:eventType, backset: null};
+ }
+
+ function submitOldEvent(evt) {
+ if (rep.selStart && rep.selEnd) {
+ var selStartChar =
+ rep.lines.offsetOfIndex(rep.selStart[0]) + rep.selStart[1];
+ var selEndChar =
+ rep.lines.offsetOfIndex(rep.selEnd[0]) + rep.selEnd[1];
+ evt.selStart = selStartChar;
+ evt.selEnd = selEndChar;
+ evt.selFocusAtStart = rep.selFocusAtStart;
+ }
+ if (undoModule.enabled) {
+ var undoWorked = false;
+ try {
+ if (evt.eventType == "setup" || evt.eventType == "importText" ||
+ evt.eventType == "setBaseText") {
+ undoModule.clearHistory();
+ }
+ else if (evt.eventType == "nonundoable") {
+ if (evt.changeset) {
+ undoModule.reportExternalChange(evt.changeset);
+ }
+ }
+ else {
+ undoModule.reportEvent(evt);
+ }
+ undoWorked = true;
+ }
+ finally {
+ if (! undoWorked) {
+ undoModule.enabled = false; // for safety
+ }
+ }
+ }
+ }
+
+ function startNewEvent(eventType, dontSubmitOld) {
+ var oldEvent = currentCallStack.editEvent;
+ if (! dontSubmitOld) {
+ submitOldEvent(oldEvent);
+ }
+ currentCallStack.editEvent = newEditEvent(eventType);
+ return oldEvent;
+ }
+
+ currentCallStack = {type: type, docTextChanged: false, selectionAffected: false,
+ userChangedSelection: false,
+ domClean: false, profileRest:profileRest,
+ isUserChange: false, // is this a "user change" type of call-stack
+ repChanged: false, editEvent: newEditEvent(type),
+ startNewEvent:startNewEvent};
+ var cleanExit = false;
+ var result;
+ try {
+ result = action();
+ //console.log("Just did action for: "+type);
+ cleanExit = true;
+ }
+ catch (e) {
+ caughtErrors.push({error: e, time: +new Date()});
+ dmesg(e.toString());
+ throw e;
+ }
+ finally {
+ var cs = currentCallStack;
+ //console.log("Finished action for: "+type);
+ if (cleanExit) {
+ submitOldEvent(cs.editEvent);
+ if (cs.domClean && cs.type != "setup") {
+ if (cs.isUserChange) {
+ if (cs.repChanged) parenModule.notifyChange();
+ else parenModule.notifyTick();
+ }
+ recolorModule.recolorLines();
+ if (cs.selectionAffected) {
+ updateBrowserSelectionFromRep();
+ }
+ if ((cs.docTextChanged || cs.userChangedSelection) && cs.type != "applyChangesToBase") {
+ scrollSelectionIntoView();
+ }
+ if (cs.docTextChanged && cs.type.indexOf("importText") < 0) {
+ outsideNotifyDirty();
+ }
+ }
+ }
+ else {
+ // non-clean exit
+ if (currentCallStack.type == "idleWorkTimer") {
+ idleWorkTimer.atLeast(1000);
+ }
+ }
+ currentCallStack = null;
+ if (profiling) console.profileEnd();
+ }
+ return result;
+ }
+
+ function inCallStackIfNecessary(type, action) {
+ if (! currentCallStack) {
+ inCallStack(type, action);
+ }
+ else {
+ action();
+ }
+ }
+
+ function recolorLineByKey(key) {
+ if (rep.lines.containsKey(key)) {
+ var offset = rep.lines.offsetOfKey(key);
+ var width = rep.lines.atKey(key).width;
+ recolorLinesInRange(offset, offset + width);
+ }
+ }
+
+ function getLineKeyForOffset(charOffset) {
+ return rep.lines.atOffset(charOffset).key;
+ }
+
+ var recolorModule = (function() {
+ var dirtyLineKeys = {};
+
+ var module = {};
+ module.setCharNeedsRecoloring = function(offset) {
+ if (offset >= rep.alltext.length) {
+ offset = rep.alltext.length-1;
+ }
+ dirtyLineKeys[getLineKeyForOffset(offset)] = true;
+ }
+
+ module.setCharRangeNeedsRecoloring = function(offset1, offset2) {
+ if (offset1 >= rep.alltext.length) {
+ offset1 = rep.alltext.length-1;
+ }
+ if (offset2 >= rep.alltext.length) {
+ offset2 = rep.alltext.length-1;
+ }
+ var firstEntry = rep.lines.atOffset(offset1);
+ var lastKey = rep.lines.atOffset(offset2).key;
+ dirtyLineKeys[lastKey] = true;
+ var entry = firstEntry;
+ while (entry && entry.key != lastKey) {
+ dirtyLineKeys[entry.key] = true;
+ entry = rep.lines.next(entry);
+ }
+ }
+
+ module.recolorLines = function() {
+ for(var k in dirtyLineKeys) {
+ recolorLineByKey(k);
+ }
+ dirtyLineKeys = {};
+ }
+
+ return module;
+ })();
+
+ var parenModule = (function() {
+ var module = {};
+ module.notifyTick = function() { handleFlashing(false); };
+ module.notifyChange = function() { handleFlashing(true); };
+ module.shouldNormalizeOnChar = function (c) {
+ if (parenFlashRep.active) {
+ // avoid highlight style from carrying on to typed text
+ return true;
+ }
+ c = String.fromCharCode(c);
+ return !! (bracketMap[c]);
+ }
+
+ var parenFlashRep = { active: false, whichChars: null, whichLineKeys: null, expireTime: null };
+ var bracketMap = {'(': 1, ')':-1, '[':2, ']':-2, '{':3, '}':-3};
+ var bracketRegex = /[{}\[\]()]/g;
+ function handleFlashing(docChanged) {
+ function getSearchRange(aroundLoc) {
+ var rng = getVisibleCharRange();
+ var d = 100; // minimum radius
+ var e = 3000; // maximum radius;
+ if (rng[0] > aroundLoc-d) rng[0] = aroundLoc-d;
+ if (rng[0] < aroundLoc-e) rng[0] = aroundLoc-e;
+ if (rng[0] < 0) rng[0] = 0;
+ if (rng[1] < aroundLoc+d) rng[1] = aroundLoc+d;
+ if (rng[1] > aroundLoc+e) rng[1] = aroundLoc+e;
+ if (rng[1] > rep.lines.totalWidth()) rng[1] = rep.lines.totalWidth();
+ return rng;
+ }
+ function findMatchingVisibleBracket(startLoc, forwards) {
+ var rng = getSearchRange(startLoc);
+ var str = rep.alltext.substring(rng[0], rng[1]);
+ var bstr = str.replace(bracketRegex, '('); // handy for searching
+ var loc = startLoc - rng[0];
+ var bracketState = [];
+ var foundParen = false;
+ var goodParen = false;
+ function nextLoc() {
+ if (loc < 0) return;
+ if (forwards) loc++; else loc--;
+ if (loc < 0 || loc >= str.length) loc = -1;
+ if (loc >= 0) {
+ if (forwards) loc = bstr.indexOf('(', loc);
+ else loc = bstr.lastIndexOf('(', loc);
+ }
+ }
+ while ((! foundParen) && (loc >= 0)) {
+ if (getCharType(loc + rng[0]) == "p") {
+ var b = bracketMap[str.charAt(loc)]; // -1, 1, -2, 2, -3, 3
+ var into = forwards;
+ var typ = b;
+ if (typ < 0) { into = ! into; typ = -typ; }
+ if (into) bracketState.push(typ);
+ else {
+ var recent = bracketState.pop();
+ if (recent != typ) {
+ foundParen = true; goodParen = false;
+ }
+ else if (bracketState.length == 0) {
+ foundParen = true; goodParen = true;
+ }
+ }
+ }
+ //console.log(bracketState.toSource());
+ if ((! foundParen) && (loc >= 0)) nextLoc();
+ }
+ if (! foundParen) return null;
+ return {chr: (loc + rng[0]), good: goodParen};
+ }
+
+ var r = parenFlashRep;
+ var charsToHighlight = null;
+ var linesToUnhighlight = null;
+ if (r.active && (docChanged || (now() > r.expireTime))) {
+ linesToUnhighlight = r.whichLineKeys;
+ r.active = false;
+ }
+ if ((! r.active) && docChanged && isCaret() && caretColumn() > 0) {
+ var caret = caretDocChar();
+ if (caret > 0 && getCharType(caret-1) == "p") {
+ var charBefore = rep.alltext.charAt(caret-1);
+ if (bracketMap[charBefore]) {
+ var lookForwards = (bracketMap[charBefore] > 0);
+ var findResult = findMatchingVisibleBracket(caret-1, lookForwards);
+ if (findResult) {
+ var mateLoc = findResult.chr;
+ var mateGood = findResult.good;
+ r.active = true;
+ charsToHighlight = {};
+ charsToHighlight[caret-1] = 'flash';
+ charsToHighlight[mateLoc] = (mateGood ? 'flash' : 'flashbad');
+ r.whichLineKeys = [];
+ r.whichLineKeys.push(getLineKeyForOffset(caret-1));
+ r.whichLineKeys.push(getLineKeyForOffset(mateLoc));
+ r.expireTime = now() + 4000;
+ newlyActive = true;
+ }
+ }
+ }
+
+ }
+ if (linesToUnhighlight) {
+ recolorLineByKey(linesToUnhighlight[0]);
+ recolorLineByKey(linesToUnhighlight[1]);
+ }
+ if (r.active && charsToHighlight) {
+ function f(txt, cls, next, ofst) {
+ var flashClass = charsToHighlight[ofst];
+ if (cls) {
+ next(txt, cls+" "+flashClass);
+ }
+ else next(txt, cls);
+ }
+ for(var c in charsToHighlight) {
+ recolorLinesInRange((+c), (+c)+1, null, f);
+ }
+ }
+ }
+
+ return module;
+ })();
+
+ function dispose() {
+ disposed = true;
+ if (idleWorkTimer) idleWorkTimer.never();
+ teardown();
+ }
+
+ function checkALines() {
+ return; // disable for speed
+ function error() { throw new Error("checkALines"); }
+ if (rep.alines.length != rep.lines.length()) {
+ error();
+ }
+ for(var i=0;i<rep.alines.length;i++) {
+ var aline = rep.alines[i];
+ var lineText = rep.lines.atIndex(i).text+"\n";
+ var lineTextLength = lineText.length;
+ var opIter = Changeset.opIterator(aline);
+ var alineLength = 0;
+ while (opIter.hasNext()) {
+ var o = opIter.next();
+ alineLength += o.chars;
+ if (opIter.hasNext()) {
+ if (o.lines != 0) error();
+ }
+ else {
+ if (o.lines != 1) error();
+ }
+ }
+ if (alineLength != lineTextLength) {
+ error();
+ }
+ }
+ }
+
+ function setWraps(newVal) {
+ doesWrap = newVal;
+ var dwClass = "doesWrap";
+ setClassPresence(root, "doesWrap", doesWrap);
+ scheduler.setTimeout(function() {
+ inCallStackIfNecessary("setWraps", function() {
+ fastIncorp(7);
+ recreateDOM();
+ fixView();
+ });
+ }, 0);
+ }
+
+ function setStyled(newVal) {
+ var oldVal = isStyled;
+ isStyled = !!newVal;
+
+ if (newVal != oldVal) {
+ if (! newVal) {
+ // clear styles
+ inCallStackIfNecessary("setStyled", function() {
+ fastIncorp(12);
+ var clearStyles = [];
+ for(var k in STYLE_ATTRIBS) {
+ clearStyles.push([k,'']);
+ }
+ performDocumentApplyAttributesToCharRange(0, rep.alltext.length, clearStyles);
+ });
+ }
+ }
+ }
+
+ function setTextFace(face) {
+ textFace = face;
+ root.style.fontFamily = textFace;
+ lineMetricsDiv.style.fontFamily = textFace;
+ scheduler.setTimeout(function() {
+ setUpTrackingCSS();
+ }, 0);
+ }
+
+ function setTextSize(size) {
+ textSize = size;
+ root.style.fontSize = textSize+"px";
+ root.style.lineHeight = textLineHeight()+"px";
+ sideDiv.style.lineHeight = textLineHeight()+"px";
+ lineMetricsDiv.style.fontSize = textSize+"px";
+ scheduler.setTimeout(function() {
+ setUpTrackingCSS();
+ }, 0);
+ }
+
+ function recreateDOM() {
+ // precond: normalized
+ recolorLinesInRange(0, rep.alltext.length);
+ }
+
+ function setEditable(newVal) {
+ isEditable = newVal;
+
+ // the following may fail, e.g. if iframe is hidden
+ if (! isEditable) {
+ setDesignMode(false);
+ }
+ else {
+ setDesignMode(true);
+ }
+ setClassPresence(root, "static", ! isEditable);
+ }
+
+ function enforceEditability() {
+ setEditable(isEditable);
+ }
+
+ function importText(text, undoable, dontProcess) {
+ var lines;
+ if (dontProcess) {
+ if (text.charAt(text.length-1) != "\n") {
+ throw new Error("new raw text must end with newline");
+ }
+ if (/[\r\t\xa0]/.exec(text)) {
+ throw new Error("new raw text must not contain CR, tab, or nbsp");
+ }
+ lines = text.substring(0, text.length-1).split('\n');
+ }
+ else {
+ lines = map(text.split('\n'), textify);
+ }
+ var newText = "\n";
+ if (lines.length > 0) {
+ newText = lines.join('\n')+'\n';
+ }
+
+ inCallStackIfNecessary("importText"+(undoable?"Undoable":""), function() {
+ setDocText(newText);
+ });
+
+ if (dontProcess && rep.alltext != text) {
+ throw new Error("mismatch error setting raw text in importText");
+ }
+ }
+
+ function importAText(atext, apoolJsonObj, undoable) {
+ atext = Changeset.cloneAText(atext);
+ if (apoolJsonObj) {
+ var wireApool = (new AttribPool()).fromJsonable(apoolJsonObj);
+ atext.attribs = Changeset.moveOpsToNewPool(atext.attribs, wireApool, rep.apool);
+ }
+ inCallStackIfNecessary("importText"+(undoable?"Undoable":""), function() {
+ setDocAText(atext);
+ });
+ }
+
+ function setDocAText(atext) {
+ fastIncorp(8);
+
+ var oldLen = rep.lines.totalWidth();
+ var numLines = rep.lines.length();
+ var upToLastLine = rep.lines.offsetOfIndex(numLines-1);
+ var lastLineLength = rep.lines.atIndex(numLines-1).text.length;
+ var assem = Changeset.smartOpAssembler();
+ var o = Changeset.newOp('-');
+ o.chars = upToLastLine;
+ o.lines = numLines-1;
+ assem.append(o);
+ o.chars = lastLineLength;
+ o.lines = 0;
+ assem.append(o);
+ Changeset.appendATextToAssembler(atext, assem);
+ var newLen = oldLen + assem.getLengthChange();
+ var changeset = Changeset.checkRep(
+ Changeset.pack(oldLen, newLen, assem.toString(),
+ atext.text.slice(0, -1)));
+ performDocumentApplyChangeset(changeset);
+
+ performSelectionChange([0,rep.lines.atIndex(0).lineMarker],
+ [0,rep.lines.atIndex(0).lineMarker]);
+
+ idleWorkTimer.atMost(100);
+
+ if (rep.alltext != atext.text) {
+ dmesg(htmlPrettyEscape(rep.alltext));
+ dmesg(htmlPrettyEscape(atext.text));
+ throw new Error("mismatch error setting raw text in setDocAText");
+ }
+ }
+
+ function setDocText(text) {
+ setDocAText(Changeset.makeAText(text));
+ }
+
+ function getDocText() {
+ var alltext = rep.alltext;
+ var len = alltext.length;
+ if (len > 0) len--; // final extra newline
+ return alltext.substring(0, len);
+ }
+
+ function exportText() {
+ if (currentCallStack && ! currentCallStack.domClean) {
+ inCallStackIfNecessary("exportText", function() { fastIncorp(2); });
+ }
+ return getDocText();
+ }
+
+ function editorChangedSize() {
+ fixView();
+ }
+
+ function setOnKeyPress(handler) {
+ outsideKeyPress = handler;
+ }
+
+ function setOnKeyDown(handler) {
+ outsideKeyDown = handler;
+ }
+
+ function setNotifyDirty(handler) {
+ outsideNotifyDirty = handler;
+ }
+
+ function getFormattedCode() {
+ if (currentCallStack && ! currentCallStack.domClean) {
+ inCallStackIfNecessary("getFormattedCode", incorporateUserChanges);
+ }
+ var buf = [];
+ if (rep.lines.length() > 0) {
+ // should be the case, even for empty file
+ var entry = rep.lines.atIndex(0);
+ while (entry) {
+ var domInfo = entry.domInfo;
+ buf.push((domInfo && domInfo.getInnerHTML()) ||
+ domline.processSpaces(domline.escapeHTML(entry.text),
+ doesWrap) ||
+ '&nbsp;' /*empty line*/);
+ entry = rep.lines.next(entry);
+ }
+ }
+ return '<div class="syntax"><div>'+buf.join('</div>\n<div>')+
+ '</div></div>';
+ }
+
+ var CMDS = {
+ bold: function() { toggleAttributeOnSelection('bold'); },
+ italic: function() { toggleAttributeOnSelection('italic'); },
+ underline: function() { toggleAttributeOnSelection('underline'); },
+ strikethrough: function() { toggleAttributeOnSelection('strikethrough'); },
+ h1: function() { toggleAttributeOnSelection('h1'); },
+ h2: function() { toggleAttributeOnSelection('h2'); },
+ h3: function() { toggleAttributeOnSelection('h3'); },
+ h4: function() { toggleAttributeOnSelection('h4'); },
+ h5: function() { toggleAttributeOnSelection('h5'); },
+ h6: function() { toggleAttributeOnSelection('h6'); },
+ undo: function() { doUndoRedo('undo'); },
+ redo: function() { doUndoRedo('redo'); },
+ clearauthorship: function(prompt) {
+ if ((!(rep.selStart && rep.selEnd)) || isCaret()) {
+ if (prompt) {
+ prompt();
+ }
+ else {
+ performDocumentApplyAttributesToCharRange(0, rep.alltext.length,
+ [['author', '']]);
+ }
+ }
+ else {
+ setAttributeOnSelection('author', '');
+ }
+ },
+ insertunorderedlist: doInsertUnorderedList,
+ indent: function() {
+ if (! doIndentOutdent(false)) {
+ doInsertUnorderedList();
+ }
+ },
+ outdent: function() { doIndentOutdent(true); }
+ };
+
+ function execCommand(cmd) {
+ cmd = cmd.toLowerCase();
+ var cmdArgs = Array.prototype.slice.call(arguments, 1);
+ if (CMDS[cmd]) {
+ inCallStack(cmd, function() {
+ fastIncorp(9);
+ CMDS[cmd].apply(CMDS, cmdArgs);
+ });
+ }
+ }
+
+ editorInfo.ace_focus = focus;
+ editorInfo.ace_importText = importText;
+ editorInfo.ace_importAText = importAText;
+ editorInfo.ace_exportText = exportText;
+ editorInfo.ace_editorChangedSize = editorChangedSize;
+ editorInfo.ace_setOnKeyPress = setOnKeyPress;
+ editorInfo.ace_setOnKeyDown = setOnKeyDown;
+ editorInfo.ace_setNotifyDirty = setNotifyDirty;
+ editorInfo.ace_dispose = dispose;
+ editorInfo.ace_getFormattedCode = getFormattedCode;
+ editorInfo.ace_setEditable = setEditable;
+ editorInfo.ace_execCommand = execCommand;
+
+ editorInfo.ace_setProperty = function(key, value) {
+ var k = key.toLowerCase();
+ if (k == "wraps") {
+ setWraps(value);
+ }
+ else if (k == "showsauthorcolors") {
+ setClassPresence(root, "authorColors", !!value);
+ }
+ else if (k == "showsuserselections") {
+ setClassPresence(root, "userSelections", !!value);
+ }
+ else if (k == "showslinenumbers") {
+ hasLineNumbers = !!value;
+ setClassPresence(sideDiv, "sidedivhidden", ! hasLineNumbers);
+ fixView();
+ }
+ else if (k == "grayedout") {
+ setClassPresence(outerWin.document.body, "grayedout", !!value);
+ }
+ else if (k == "dmesg") {
+ dmesg = value;
+ window.dmesg = value;
+ }
+ else if (k == 'userauthor') {
+ thisAuthor = String(value);
+ }
+ else if (k == 'styled') {
+ setStyled(value);
+ }
+ else if (k == 'textface') {
+ setTextFace(value);
+ }
+ else if (k == 'textsize') {
+ setTextSize(value);
+ }
+ }
+
+ editorInfo.ace_setBaseText = function(txt) {
+ changesetTracker.setBaseText(txt);
+ };
+ editorInfo.ace_setBaseAttributedText = function(atxt, apoolJsonObj) {
+ setUpTrackingCSS();
+ changesetTracker.setBaseAttributedText(atxt, apoolJsonObj);
+ };
+ editorInfo.ace_applyChangesToBase = function(c, optAuthor, apoolJsonObj) {
+ changesetTracker.applyChangesToBase(c, optAuthor, apoolJsonObj);
+ };
+ editorInfo.ace_prepareUserChangeset = function() {
+ return changesetTracker.prepareUserChangeset();
+ };
+ editorInfo.ace_applyPreparedChangesetToBase = function() {
+ changesetTracker.applyPreparedChangesetToBase();
+ };
+ editorInfo.ace_setUserChangeNotificationCallback = function(f) {
+ changesetTracker.setUserChangeNotificationCallback(f);
+ };
+ editorInfo.ace_setAuthorInfo = function(author, info) {
+ setAuthorInfo(author, info);
+ };
+ editorInfo.ace_setAuthorSelectionRange = function(author, start, end) {
+ changesetTracker.setAuthorSelectionRange(author, start, end);
+ };
+
+ editorInfo.ace_getUnhandledErrors = function() {
+ return caughtErrors.slice();
+ };
+
+ editorInfo.ace_getDebugProperty = function(prop) {
+ if (prop == "debugger") {
+ // obfuscate "eval" so as not to scare yuicompressor
+ window['ev'+'al']("debugger");
+ }
+ else if (prop == "rep") {
+ return rep;
+ }
+ else if (prop == "window") {
+ return window;
+ }
+ else if (prop == "document") {
+ return document;
+ }
+ return undefined;
+ };
+
+ function now() { return (new Date()).getTime(); }
+
+ function newTimeLimit(ms) {
+ //console.debug("new time limit");
+ var startTime = now();
+ var lastElapsed = 0;
+ var exceededAlready = false;
+ var printedTrace = false;
+ var isTimeUp = function () {
+ if (exceededAlready) {
+ if ((! printedTrace)) {// && now() - startTime - ms > 300) {
+ //console.trace();
+ printedTrace = true;
+ }
+ return true;
+ }
+ var elapsed = now() - startTime;
+ if (elapsed > ms) {
+ exceededAlready = true;
+ //console.debug("time limit hit, before was %d/%d", lastElapsed, ms);
+ //console.trace();
+ return true;
+ }
+ else {
+ lastElapsed = elapsed;
+ return false;
+ }
+ }
+ isTimeUp.elapsed = function() { return now() - startTime; }
+ return isTimeUp;
+ }
+
+
+ function makeIdleAction(func) {
+ var scheduledTimeout = null;
+ var scheduledTime = 0;
+ function unschedule() {
+ if (scheduledTimeout) {
+ scheduler.clearTimeout(scheduledTimeout);
+ scheduledTimeout = null;
+ }
+ }
+ function reschedule(time) {
+ unschedule();
+ scheduledTime = time;
+ var delay = time - now();
+ if (delay < 0) delay = 0;
+ scheduledTimeout = scheduler.setTimeout(callback, delay);
+ }
+ function callback() {
+ scheduledTimeout = null;
+ // func may reschedule the action
+ func();
+ }
+ return {
+ atMost: function (ms) {
+ var latestTime = now() + ms;
+ if ((! scheduledTimeout) || scheduledTime > latestTime) {
+ reschedule(latestTime);
+ }
+ },
+ // atLeast(ms) will schedule the action if not scheduled yet.
+ // In other words, "infinity" is replaced by ms, even though
+ // it is technically larger.
+ atLeast: function (ms) {
+ var earliestTime = now()+ms;
+ if ((! scheduledTimeout) || scheduledTime < earliestTime) {
+ reschedule(earliestTime);
+ }
+ },
+ never: function() {
+ unschedule();
+ }
+ }
+ }
+
+ function fastIncorp(n) {
+ // normalize but don't do any lexing or anything
+ incorporateUserChanges(newTimeLimit(0));
+ }
+
+ function incorpIfQuick() {
+ var me = incorpIfQuick;
+ var failures = (me.failures || 0);
+ if (failures < 5) {
+ var isTimeUp = newTimeLimit(40);
+ var madeChanges = incorporateUserChanges(isTimeUp);
+ if (isTimeUp()) {
+ me.failures = failures+1;
+ }
+ return true;
+ }
+ else {
+ var skipCount = (me.skipCount || 0);
+ skipCount++;
+ if (skipCount == 20) {
+ skipCount = 0;
+ me.failures = 0;
+ }
+ me.skipCount = skipCount;
+ }
+ return false;
+ }
+
+ var idleWorkTimer = makeIdleAction(function() {
+
+ //if (! top.BEFORE) top.BEFORE = [];
+ //top.BEFORE.push(magicdom.root.dom.innerHTML);
+
+ if (! isEditable) return; // and don't reschedule
+
+ if (inInternationalComposition) {
+ // don't do idle input incorporation during international input composition
+ idleWorkTimer.atLeast(500);
+ return;
+ }
+
+ inCallStack("idleWorkTimer", function() {
+
+ var isTimeUp = newTimeLimit(250);
+
+ //console.time("idlework");
+
+ var finishedImportantWork = false;
+ var finishedWork = false;
+
+ try {
+
+ // isTimeUp() is a soft constraint for incorporateUserChanges,
+ // which always renormalizes the DOM, no matter how long it takes,
+ // but doesn't necessarily lex and highlight it
+ incorporateUserChanges(isTimeUp);
+
+ if (isTimeUp()) return;
+
+ updateLineNumbers(); // update line numbers if any time left
+
+ if (isTimeUp()) return;
+
+ var visibleRange = getVisibleCharRange();
+ var docRange = [0, rep.lines.totalWidth()];
+ //console.log("%o %o", docRange, visibleRange);
+
+ finishedImportantWork = true;
+ finishedWork = true;
+ }
+ finally {
+ //console.timeEnd("idlework");
+ if (finishedWork) {
+ idleWorkTimer.atMost(1000);
+ }
+ else if (finishedImportantWork) {
+ // if we've finished highlighting the view area,
+ // more highlighting could be counter-productive,
+ // e.g. if the user just opened a triple-quote and will soon close it.
+ idleWorkTimer.atMost(500);
+ }
+ else {
+ var timeToWait = Math.round(isTimeUp.elapsed() / 2);
+ if (timeToWait < 100) timeToWait = 100;
+ idleWorkTimer.atMost(timeToWait);
+ }
+ }
+ });
+
+ //if (! top.AFTER) top.AFTER = [];
+ //top.AFTER.push(magicdom.root.dom.innerHTML);
+
+ });
+
+ var _nextId = 1;
+ function uniqueId(n) {
+ // not actually guaranteed to be unique, e.g. if user copy-pastes
+ // nodes with ids
+ var nid = n.id;
+ if (nid) return nid;
+ return (n.id = "magicdomid"+(_nextId++));
+ }
+
+
+ function recolorLinesInRange(startChar, endChar, isTimeUp, optModFunc) {
+ if (endChar <= startChar) return;
+ if (startChar < 0 || startChar >= rep.lines.totalWidth()) return;
+ var lineEntry = rep.lines.atOffset(startChar); // rounds down to line boundary
+ var lineStart = rep.lines.offsetOfEntry(lineEntry);
+ var lineIndex = rep.lines.indexOfEntry(lineEntry);
+ var selectionNeedsResetting = false;
+ var firstLine = null;
+ var lastLine = null;
+ isTimeUp = (isTimeUp || noop);
+
+ // tokenFunc function; accesses current value of lineEntry and curDocChar,
+ // also mutates curDocChar
+ var curDocChar;
+ var tokenFunc = function(tokenText, tokenClass) {
+ lineEntry.domInfo.appendSpan(tokenText, tokenClass);
+ };
+ if (optModFunc) {
+ var f = tokenFunc;
+ tokenFunc = function(tokenText, tokenClass) {
+ optModFunc(tokenText, tokenClass, f, curDocChar);
+ curDocChar += tokenText.length;
+ };
+ }
+
+ while (lineEntry && lineStart < endChar && ! isTimeUp()) {
+ //var timer = newTimeLimit(200);
+ var lineEnd = lineStart + lineEntry.width;
+
+ curDocChar = lineStart;
+ lineEntry.domInfo.clearSpans();
+ getSpansForLine(lineEntry, tokenFunc, lineStart);
+ lineEntry.domInfo.finishUpdate();
+
+ markNodeClean(lineEntry.lineNode);
+
+ if (rep.selStart && rep.selStart[0] == lineIndex ||
+ rep.selEnd && rep.selEnd[0] == lineIndex) {
+ selectionNeedsResetting = true;
+ }
+
+ //if (timer()) console.dirxml(lineEntry.lineNode.dom);
+
+ if (firstLine === null) firstLine = lineIndex;
+ lastLine = lineIndex;
+ lineStart = lineEnd;
+ lineEntry = rep.lines.next(lineEntry);
+ lineIndex++;
+ }
+ if (selectionNeedsResetting) {
+ currentCallStack.selectionAffected = true;
+ }
+ //console.debug("Recolored line range %d-%d", firstLine, lastLine);
+ }
+
+ // like getSpansForRange, but for a line, and the func takes (text,class)
+ // instead of (width,class); excludes the trailing '\n' from
+ // consideration by func
+ function getSpansForLine(lineEntry, textAndClassFunc, lineEntryOffsetHint) {
+ var lineEntryOffset = lineEntryOffsetHint;
+ if ((typeof lineEntryOffset) != "number") {
+ lineEntryOffset = rep.lines.offsetOfEntry(lineEntry);
+ }
+ var text = lineEntry.text;
+ var width = lineEntry.width; // text.length+1
+
+ if (text.length == 0) {
+ // allow getLineStyleFilter to set line-div styles
+ var func = linestylefilter.getLineStyleFilter(
+ 0, '', textAndClassFunc, rep.apool);
+ func('', '');
+ }
+ else {
+ var offsetIntoLine = 0;
+ var filteredFunc = textAndClassFunc;
+ filteredFunc = linestylefilter.getURLFilter(text, filteredFunc);
+ if (browser.msie) {
+ // IE7+ will take an e-mail address like <foo@bar.com> and linkify it to foo@bar.com.
+ // We then normalize it back to text with no angle brackets. It's weird. So always
+ // break spans at an "at" sign.
+ filteredFunc = linestylefilter.getAtSignSplitterFilter(
+ text, filteredFunc);
+ }
+ var lineNum = rep.lines.indexOfEntry(lineEntry);
+ var aline = rep.alines[lineNum];
+ filteredFunc = linestylefilter.getLineStyleFilter(
+ text.length, aline, filteredFunc, rep.apool);
+ filteredFunc(text, '');
+ }
+ }
+
+
+ function getCharType(charIndex) {
+ return '';
+ }
+
+ var observedChanges;
+ function clearObservedChanges() {
+ observedChanges = { cleanNodesNearChanges: {} };
+ }
+ clearObservedChanges();
+
+ function getCleanNodeByKey(key) {
+ var p = PROFILER("getCleanNodeByKey", false);
+ p.extra = 0;
+ var n = doc.getElementById(key);
+ // copying and pasting can lead to duplicate ids
+ while (n && isNodeDirty(n)) {
+ p.extra++;
+ n.id = "";
+ n = doc.getElementById(key);
+ }
+ p.literal(p.extra, "extra");
+ p.end();
+ return n;
+ }
+
+ function observeChangesAroundNode(node) {
+ // Around this top-level DOM node, look for changes to the document
+ // (from how it looks in our representation) and record them in a way
+ // that can be used to "normalize" the document (apply the changes to our
+ // representation, and put the DOM in a canonical form).
+
+ //top.console.log("observeChangesAroundNode(%o)", node);
+
+ var cleanNode;
+ var hasAdjacentDirtyness;
+ if (! isNodeDirty(node)) {
+ cleanNode = node;
+ var prevSib = cleanNode.previousSibling;
+ var nextSib = cleanNode.nextSibling;
+ hasAdjacentDirtyness = ((prevSib && isNodeDirty(prevSib))
+ || (nextSib && isNodeDirty(nextSib)));
+ }
+ else {
+ // node is dirty, look for clean node above
+ var upNode = node.previousSibling;
+ while (upNode && isNodeDirty(upNode)) {
+ upNode = upNode.previousSibling;
+ }
+ if (upNode) {
+ cleanNode = upNode;
+ }
+ else {
+ var downNode = node.nextSibling;
+ while (downNode && isNodeDirty(downNode)) {
+ downNode = downNode.nextSibling;
+ }
+ if (downNode) {
+ cleanNode = downNode;
+ }
+ }
+ if (! cleanNode) {
+ // Couldn't find any adjacent clean nodes!
+ // Since top and bottom of doc is dirty, the dirty area will be detected.
+ return;
+ }
+ hasAdjacentDirtyness = true;
+ }
+
+ if (hasAdjacentDirtyness) {
+ // previous or next line is dirty
+ observedChanges.cleanNodesNearChanges['$'+uniqueId(cleanNode)] = true;
+ }
+ else {
+ // next and prev lines are clean (if they exist)
+ var lineKey = uniqueId(cleanNode);
+ var prevSib = cleanNode.previousSibling;
+ var nextSib = cleanNode.nextSibling;
+ var actualPrevKey = ((prevSib && uniqueId(prevSib)) || null);
+ var actualNextKey = ((nextSib && uniqueId(nextSib)) || null);
+ var repPrevEntry = rep.lines.prev(rep.lines.atKey(lineKey));
+ var repNextEntry = rep.lines.next(rep.lines.atKey(lineKey));
+ var repPrevKey = ((repPrevEntry && repPrevEntry.key) || null);
+ var repNextKey = ((repNextEntry && repNextEntry.key) || null);
+ if (actualPrevKey != repPrevKey || actualNextKey != repNextKey) {
+ observedChanges.cleanNodesNearChanges['$'+uniqueId(cleanNode)] = true;
+ }
+ }
+ }
+
+ function observeChangesAroundSelection() {
+ if (currentCallStack.observedSelection) return;
+ currentCallStack.observedSelection = true;
+
+ var p = PROFILER("getSelection", false);
+ var selection = getSelection();
+ p.end();
+ if (selection) {
+ function topLevel(n) {
+ if ((!n) || n == root) return null;
+ while (n.parentNode != root) {
+ n = n.parentNode;
+ }
+ return n;
+ }
+ var node1 = topLevel(selection.startPoint.node);
+ var node2 = topLevel(selection.endPoint.node);
+ if (node1) observeChangesAroundNode(node1);
+ if (node2 && node1 != node2) {
+ observeChangesAroundNode(node2);
+ }
+ }
+ }
+
+ function observeSuspiciousNodes() {
+ // inspired by Firefox bug #473255, where pasting formatted text
+ // causes the cursor to jump away, making the new HTML never found.
+ if (root.getElementsByTagName) {
+ var nds = root.getElementsByTagName("style");
+ for(var i=0;i<nds.length;i++) {
+ var n = nds[i];
+ while (n.parentNode && n.parentNode != root) {
+ n = n.parentNode;
+ }
+ if (n.parentNode == root) {
+ observeChangesAroundNode(n);
+ }
+ }
+ }
+ }
+
+ function incorporateUserChanges(isTimeUp) {
+
+ if (currentCallStack.domClean) return false;
+
+ inInternationalComposition = false; // if we need the document normalized, so be it
+
+ currentCallStack.isUserChange = true;
+
+ isTimeUp = (isTimeUp || function() { return false; });
+
+ if (DEBUG && top.DONT_INCORP || window.DEBUG_DONT_INCORP) return false;
+
+ var p = PROFILER("incorp", false);
+
+ //if (doc.body.innerHTML.indexOf("AppJet") >= 0)
+ //dmesg(htmlPrettyEscape(doc.body.innerHTML));
+ //if (top.RECORD) top.RECORD.push(doc.body.innerHTML);
+
+ // returns true if dom changes were made
+
+ if (! root.firstChild) {
+ root.innerHTML = "<div><!-- --></div>";
+ }
+
+ p.mark("obs");
+ observeChangesAroundSelection();
+ observeSuspiciousNodes();
+ p.mark("dirty");
+ var dirtyRanges = getDirtyRanges();
+ //console.log("dirtyRanges: "+toSource(dirtyRanges));
+
+ var dirtyRangesCheckOut = true;
+ var j = 0;
+ var a,b;
+ while (j < dirtyRanges.length) {
+ a = dirtyRanges[j][0];
+ b = dirtyRanges[j][1];
+ if (! ((a == 0 || getCleanNodeByKey(rep.lines.atIndex(a-1).key)) &&
+ (b == rep.lines.length() || getCleanNodeByKey(rep.lines.atIndex(b).key)))) {
+ dirtyRangesCheckOut = false;
+ break;
+ }
+ j++;
+ }
+ if (! dirtyRangesCheckOut) {
+ var numBodyNodes = root.childNodes.length;
+ for(var k=0;k<numBodyNodes;k++) {
+ var bodyNode = root.childNodes.item(k);
+ if ((bodyNode.tagName) && ((! bodyNode.id) || (! rep.lines.containsKey(bodyNode.id)))) {
+ observeChangesAroundNode(bodyNode);
+ }
+ }
+ dirtyRanges = getDirtyRanges();
+ }
+
+ clearObservedChanges();
+
+ p.mark("getsel");
+ var selection = getSelection();
+
+ //console.log(magicdom.root.dom.innerHTML);
+ //console.log("got selection: %o", selection);
+ var selStart, selEnd; // each one, if truthy, has [line,char] needed to set selection
+
+ var i = 0;
+ var splicesToDo = [];
+ var netNumLinesChangeSoFar = 0;
+ var toDeleteAtEnd = [];
+ p.mark("ranges");
+ p.literal(dirtyRanges.length, "numdirt");
+ var domInsertsNeeded = []; // each entry is [nodeToInsertAfter, [info1, info2, ...]]
+ while (i < dirtyRanges.length) {
+ var range = dirtyRanges[i];
+ a = range[0];
+ b = range[1];
+ var firstDirtyNode = (((a == 0) && root.firstChild) ||
+ getCleanNodeByKey(rep.lines.atIndex(a-1).key).nextSibling);
+ firstDirtyNode = (firstDirtyNode && isNodeDirty(firstDirtyNode) && firstDirtyNode);
+ var lastDirtyNode = (((b == rep.lines.length()) && root.lastChild) ||
+ getCleanNodeByKey(rep.lines.atIndex(b).key).previousSibling);
+ lastDirtyNode = (lastDirtyNode && isNodeDirty(lastDirtyNode) && lastDirtyNode);
+ if (firstDirtyNode && lastDirtyNode) {
+ var cc = makeContentCollector(isStyled, browser, rep.apool, null,
+ className2Author);
+ cc.notifySelection(selection);
+ var dirtyNodes = [];
+ for(var n = firstDirtyNode; n && ! (n.previousSibling &&
+ n.previousSibling == lastDirtyNode);
+ n = n.nextSibling) {
+ if (browser.msie) {
+ // try to undo IE's pesky and overzealous linkification
+ try { n.createTextRange().execCommand("unlink", false, null); }
+ catch (e) {}
+ }
+ cc.collectContent(n);
+ dirtyNodes.push(n);
+ }
+ cc.notifyNextNode(lastDirtyNode.nextSibling);
+ var lines = cc.getLines();
+ if ((lines.length <= 1 || lines[lines.length-1] !== "")
+ && lastDirtyNode.nextSibling) {
+ // dirty region doesn't currently end a line, even taking the following node
+ // (or lack of node) into account, so include the following clean node.
+ // It could be SPAN or a DIV; basically this is any case where the contentCollector
+ // decides it isn't done.
+ // Note that this clean node might need to be there for the next dirty range.
+ //console.log("inclusive of "+lastDirtyNode.next().dom.tagName);
+ b++;
+ var cleanLine = lastDirtyNode.nextSibling;
+ cc.collectContent(cleanLine);
+ toDeleteAtEnd.push(cleanLine);
+ cc.notifyNextNode(cleanLine.nextSibling);
+ }
+
+ var ccData = cc.finish();
+ var ss = ccData.selStart;
+ var se = ccData.selEnd;
+ lines = ccData.lines;
+ var lineAttribs = ccData.lineAttribs;
+ var linesWrapped = ccData.linesWrapped;
+
+ if (linesWrapped > 0) {
+ doAlert("Editor warning: "+linesWrapped+" long line"+
+ (linesWrapped == 1 ? " was" : "s were")+" hard-wrapped into "+
+ ccData.numLinesAfter
+ +" lines.");
+ }
+
+ if (ss[0] >= 0) selStart = [ss[0]+a+netNumLinesChangeSoFar, ss[1]];
+ if (se[0] >= 0) selEnd = [se[0]+a+netNumLinesChangeSoFar, se[1]];
+
+ /*var oldLines = rep.alltext.substring(rep.lines.offsetOfIndex(a),
+ rep.lines.offsetOfIndex(b));
+ var newLines = lines.join('\n')+'\n';
+ dmesg("OLD: "+htmlPrettyEscape(oldLines));
+ dmesg("NEW: "+htmlPrettyEscape(newLines));*/
+
+ var entries = [];
+ var nodeToAddAfter = lastDirtyNode;
+ var lineNodeInfos = new Array(lines.length);
+ for(var k=0;k<lines.length;k++) {
+ var lineString = lines[k];
+ var newEntry = createDomLineEntry(lineString);
+ entries.push(newEntry);
+ lineNodeInfos[k] = newEntry.domInfo;
+ }
+ //var fragment = magicdom.wrapDom(document.createDocumentFragment());
+ domInsertsNeeded.push([nodeToAddAfter, lineNodeInfos]);
+ forEach(dirtyNodes, function (n) { toDeleteAtEnd.push(n); });
+ var spliceHints = {};
+ if (selStart) spliceHints.selStart = selStart;
+ if (selEnd) spliceHints.selEnd = selEnd;
+ splicesToDo.push([a+netNumLinesChangeSoFar, b-a, entries, lineAttribs, spliceHints]);
+ netNumLinesChangeSoFar += (lines.length - (b-a));
+ }
+ else if (b > a) {
+ splicesToDo.push([a+netNumLinesChangeSoFar, b-a, [], []]);
+ }
+ i++;
+ }
+
+ var domChanges = (splicesToDo.length > 0);
+
+ // update the representation
+ p.mark("splice");
+ forEach(splicesToDo, function (splice) {
+ doIncorpLineSplice(splice[0], splice[1], splice[2], splice[3], splice[4]);
+ });
+
+ //p.mark("relex");
+ //rep.lexer.lexCharRange(getVisibleCharRange(), function() { return false; });
+ //var isTimeUp = newTimeLimit(100);
+
+ // do DOM inserts
+ p.mark("insert");
+ forEach(domInsertsNeeded, function (ins) {
+ insertDomLines(ins[0], ins[1], isTimeUp);
+ });
+
+ p.mark("del");
+ // delete old dom nodes
+ forEach(toDeleteAtEnd, function (n) {
+ //var id = n.uniqueId();
+
+ // parent of n may not be "root" in IE due to non-tree-shaped DOM (wtf)
+ n.parentNode.removeChild(n);
+
+ //dmesg(htmlPrettyEscape(htmlForRemovedChild(n)));
+ //console.log("removed: "+id);
+ });
+
+ p.mark("findsel");
+ // if the nodes that define the selection weren't encountered during
+ // content collection, figure out where those nodes are now.
+ if (selection && !selStart) {
+ //if (domChanges) dmesg("selection not collected");
+ selStart = getLineAndCharForPoint(selection.startPoint);
+ }
+ if (selection && !selEnd) {
+ selEnd = getLineAndCharForPoint(selection.endPoint);
+ }
+
+ // selection from content collection can, in various ways, extend past final
+ // BR in firefox DOM, so cap the line
+ var numLines = rep.lines.length();
+ if (selStart && selStart[0] >= numLines) {
+ selStart[0] = numLines-1;
+ selStart[1] = rep.lines.atIndex(selStart[0]).text.length;
+ }
+ if (selEnd && selEnd[0] >= numLines) {
+ selEnd[0] = numLines-1;
+ selEnd[1] = rep.lines.atIndex(selEnd[0]).text.length;
+ }
+
+ p.mark("repsel");
+ // update rep
+ repSelectionChange(selStart, selEnd, selection && selection.focusAtStart);
+ // update browser selection
+ p.mark("browsel");
+ if (selection && (domChanges || isCaret())) {
+ // if no DOM changes (not this case), want to treat range selection delicately,
+ // e.g. in IE not lose which end of the selection is the focus/anchor;
+ // on the other hand, we may have just noticed a press of PageUp/PageDown
+ currentCallStack.selectionAffected = true;
+ }
+
+ currentCallStack.domClean = true;
+
+ p.mark("fixview");
+
+ fixView();
+
+ p.end("END");
+
+ return domChanges;
+ }
+
+ function htmlForRemovedChild(n) {
+ var div = doc.createElement("DIV");
+ div.appendChild(n);
+ return div.innerHTML;
+ }
+
+ var STYLE_ATTRIBS = {bold: true, italic: true, underline: true,
+ strikethrough: true, h1: true, h2: true,
+ h3: true, h4: true, h5: true, h6: true,
+ list: true};
+ var OTHER_INCORPED_ATTRIBS = {insertorder: true, author: true};
+
+ function isStyleAttribute(aname) {
+ return !! STYLE_ATTRIBS[aname];
+ }
+ function isIncorpedAttribute(aname) {
+ return (!! STYLE_ATTRIBS[aname]) || (!! OTHER_INCORPED_ATTRIBS[aname]);
+ }
+
+ function insertDomLines(nodeToAddAfter, infoStructs, isTimeUp) {
+ isTimeUp = (isTimeUp || function() { return false; });
+
+ var lastEntry;
+ var lineStartOffset;
+ if (infoStructs.length < 1) return;
+ var startEntry = rep.lines.atKey(uniqueId(infoStructs[0].node));
+ var endEntry = rep.lines.atKey(uniqueId(infoStructs[infoStructs.length-1].node));
+ var charStart = rep.lines.offsetOfEntry(startEntry);
+ var charEnd = rep.lines.offsetOfEntry(endEntry) + endEntry.width;
+
+ //rep.lexer.lexCharRange([charStart, charEnd], isTimeUp);
+
+ forEach(infoStructs, function (info) {
+ var p2 = PROFILER("insertLine", false);
+ var node = info.node;
+ var key = uniqueId(node);
+ var entry;
+ p2.mark("findEntry");
+ if (lastEntry) {
+ // optimization to avoid recalculation
+ var next = rep.lines.next(lastEntry);
+ if (next && next.key == key) {
+ entry = next;
+ lineStartOffset += lastEntry.width;
+ }
+ }
+ if (! entry) {
+ p2.literal(1, "nonopt");
+ entry = rep.lines.atKey(key);
+ lineStartOffset = rep.lines.offsetOfKey(key);
+ }
+ else p2.literal(0, "nonopt");
+ lastEntry = entry;
+ p2.mark("spans");
+ getSpansForLine(entry, function (tokenText, tokenClass) {
+ info.appendSpan(tokenText, tokenClass);
+ }, lineStartOffset, isTimeUp());
+ //else if (entry.text.length > 0) {
+ //info.appendSpan(entry.text, 'dirty');
+ //}
+ p2.mark("addLine");
+ info.prepareForAdd();
+ entry.lineMarker = info.lineMarker;
+ if (! nodeToAddAfter) {
+ root.insertBefore(node, root.firstChild);
+ }
+ else {
+ root.insertBefore(node, nodeToAddAfter.nextSibling);
+ }
+ nodeToAddAfter = node;
+ info.notifyAdded();
+ p2.mark("markClean");
+ markNodeClean(node);
+ p2.end();
+ });
+ }
+
+ function isCaret() {
+ return (rep.selStart && rep.selEnd && rep.selStart[0] == rep.selEnd[0] &&
+ rep.selStart[1] == rep.selEnd[1]);
+ }
+
+ // prereq: isCaret()
+ function caretLine() { return rep.selStart[0]; }
+ function caretColumn() { return rep.selStart[1]; }
+ function caretDocChar() {
+ return rep.lines.offsetOfIndex(caretLine()) + caretColumn();
+ }
+
+ function handleReturnIndentation() {
+ // on return, indent to level of previous line
+ if (isCaret() && caretColumn() == 0 && caretLine() > 0) {
+ var lineNum = caretLine();
+ var thisLine = rep.lines.atIndex(lineNum);
+ var prevLine = rep.lines.prev(thisLine);
+ var prevLineText = prevLine.text;
+ var theIndent = /^ *(?:)/.exec(prevLineText)[0];
+ if (/[\[\(\{]\s*$/.exec(prevLineText)) theIndent += THE_TAB;
+ var cs = Changeset.builder(rep.lines.totalWidth()).keep(
+ rep.lines.offsetOfIndex(lineNum), lineNum).insert(
+ theIndent, [['author',thisAuthor]], rep.apool).toString();
+ performDocumentApplyChangeset(cs);
+ performSelectionChange([lineNum, theIndent.length], [lineNum, theIndent.length]);
+ }
+ }
+
+
+ function setupMozillaCaretHack(lineNum) {
+ // This is really ugly, but by god, it works!
+ // Fixes annoying Firefox caret artifact (observed in 2.0.0.12
+ // and unfixed in Firefox 2 as of now) where mutating the DOM
+ // and then moving the caret to the beginning of a line causes
+ // an image of the caret to be XORed at the top of the iframe.
+ // The previous solution involved remembering to set the selection
+ // later, in response to the next event in the queue, which was hugely
+ // annoying.
+ // This solution: add a space character (0x20) to the beginning of the line.
+ // After setting the selection, remove the space.
+ var lineNode = rep.lines.atIndex(lineNum).lineNode;
+
+ var fc = lineNode.firstChild;
+ while (isBlockElement(fc) && fc.firstChild) {
+ fc = fc.firstChild;
+ }
+ var textNode;
+ if (isNodeText(fc)) {
+ fc.nodeValue = " "+fc.nodeValue;
+ textNode = fc;
+ }
+ else {
+ textNode = doc.createTextNode(" ");
+ fc.parentNode.insertBefore(textNode, fc);
+ }
+ markNodeClean(lineNode);
+ return { unhack: function() {
+ if (textNode.nodeValue == " ") {
+ textNode.parentNode.removeChild(textNode);
+ }
+ else {
+ textNode.nodeValue = textNode.nodeValue.substring(1);
+ }
+ markNodeClean(lineNode);
+ } };
+ }
+
+
+ function getPointForLineAndChar(lineAndChar) {
+ var line = lineAndChar[0];
+ var charsLeft = lineAndChar[1];
+ //console.log("line: %d, key: %s, node: %o", line, rep.lines.atIndex(line).key,
+ //getCleanNodeByKey(rep.lines.atIndex(line).key));
+ var lineEntry = rep.lines.atIndex(line);
+ charsLeft -= lineEntry.lineMarker;
+ if (charsLeft < 0) {
+ charsLeft = 0;
+ }
+ var lineNode = lineEntry.lineNode;
+ var n = lineNode;
+ var after = false;
+ if (charsLeft == 0) {
+ var index = 0;
+ if (browser.msie && line == (rep.lines.length()-1) && lineNode.childNodes.length == 0) {
+ // best to stay at end of last empty div in IE
+ index = 1;
+ }
+ return {node: lineNode, index:index, maxIndex:1};
+ }
+ while (!(n == lineNode && after)) {
+ if (after) {
+ if (n.nextSibling) {
+ n = n.nextSibling;
+ after = false;
+ }
+ else n = n.parentNode;
+ }
+ else {
+ if (isNodeText(n)) {
+ var len = n.nodeValue.length;
+ if (charsLeft <= len) {
+ return {node: n, index:charsLeft, maxIndex:len};
+ }
+ charsLeft -= len;
+ after = true;
+ }
+ else {
+ if (n.firstChild) n = n.firstChild;
+ else after = true;
+ }
+ }
+ }
+ return {node: lineNode, index:1, maxIndex:1};
+ }
+
+ function nodeText(n) {
+ return n.innerText || n.textContent || n.nodeValue || '';
+ }
+
+ function getLineAndCharForPoint(point) {
+ // Turn DOM node selection into [line,char] selection.
+ // This method has to work when the DOM is not pristine,
+ // assuming the point is not in a dirty node.
+ if (point.node == root) {
+ if (point.index == 0) {
+ return [0, 0];
+ }
+ else {
+ var N = rep.lines.length();
+ var ln = rep.lines.atIndex(N-1);
+ return [N-1, ln.text.length];
+ }
+ }
+ else {
+ var n = point.node;
+ var col = 0;
+ // if this part fails, it probably means the selection node
+ // was dirty, and we didn't see it when collecting dirty nodes.
+ if (isNodeText(n)) {
+ col = point.index;
+ }
+ else if (point.index > 0) {
+ col = nodeText(n).length;
+ }
+ var parNode, prevSib;
+ while ((parNode = n.parentNode) != root) {
+ if ((prevSib = n.previousSibling)) {
+ n = prevSib;
+ col += nodeText(n).length;
+ }
+ else {
+ n = parNode;
+ }
+ }
+ if (n.id == "") console.debug("BAD");
+ if (n.firstChild && isBlockElement(n.firstChild)) {
+ col += 1; // lineMarker
+ }
+ var lineEntry = rep.lines.atKey(n.id);
+ var lineNum = rep.lines.indexOfEntry(lineEntry);
+ return [lineNum, col];
+ }
+ }
+
+ function createDomLineEntry(lineString) {
+ var info = doCreateDomLine(lineString.length > 0);
+ var newNode = info.node;
+ return {key: uniqueId(newNode), text: lineString, lineNode: newNode,
+ domInfo: info, lineMarker: 0};
+ }
+
+ function canApplyChangesetToDocument(changes) {
+ return Changeset.oldLen(changes) == rep.alltext.length;
+ }
+
+ function performDocumentApplyChangeset(changes, insertsAfterSelection) {
+ doRepApplyChangeset(changes, insertsAfterSelection);
+
+ var requiredSelectionSetting = null;
+ if (rep.selStart && rep.selEnd) {
+ var selStartChar = rep.lines.offsetOfIndex(rep.selStart[0]) + rep.selStart[1];
+ var selEndChar = rep.lines.offsetOfIndex(rep.selEnd[0]) + rep.selEnd[1];
+ var result = Changeset.characterRangeFollow(changes, selStartChar, selEndChar,
+ insertsAfterSelection);
+ requiredSelectionSetting = [result[0], result[1], rep.selFocusAtStart];
+ }
+
+ var linesMutatee = {
+ splice: function(start, numRemoved, newLinesVA) {
+ domAndRepSplice(start, numRemoved,
+ map(Array.prototype.slice.call(arguments, 2),
+ function(s) { return s.slice(0,-1); }),
+ null);
+ },
+ get: function(i) { return rep.lines.atIndex(i).text+'\n'; },
+ length: function() { return rep.lines.length(); },
+ slice_notused: function(start, end) {
+ return map(rep.lines.slice(start, end), function(e) { return e.text+'\n'; });
+ }
+ };
+
+ Changeset.mutateTextLines(changes, linesMutatee);
+
+ checkALines();
+
+ if (requiredSelectionSetting) {
+ performSelectionChange(lineAndColumnFromChar(requiredSelectionSetting[0]),
+ lineAndColumnFromChar(requiredSelectionSetting[1]),
+ requiredSelectionSetting[2]);
+ }
+
+ function domAndRepSplice(startLine, deleteCount, newLineStrings, isTimeUp) {
+ // dgreensp 3/2009: the spliced lines may be in the middle of a dirty region,
+ // so if no explicit time limit, don't spend a lot of time highlighting
+ isTimeUp = (isTimeUp || newTimeLimit(50));
+
+ var keysToDelete = [];
+ if (deleteCount > 0) {
+ var entryToDelete = rep.lines.atIndex(startLine);
+ for(var i=0;i<deleteCount;i++) {
+ keysToDelete.push(entryToDelete.key);
+ entryToDelete = rep.lines.next(entryToDelete);
+ }
+ }
+
+ var lineEntries = map(newLineStrings, createDomLineEntry);
+
+ doRepLineSplice(startLine, deleteCount, lineEntries);
+
+ var nodeToAddAfter;
+ if (startLine > 0) {
+ nodeToAddAfter = getCleanNodeByKey(rep.lines.atIndex(startLine-1).key);
+ }
+ else nodeToAddAfter = null;
+
+ insertDomLines(nodeToAddAfter, map(lineEntries, function (entry) { return entry.domInfo; }),
+ isTimeUp);
+
+ forEach(keysToDelete, function (k) {
+ var n = doc.getElementById(k);
+ n.parentNode.removeChild(n);
+ });
+
+ if ((rep.selStart && rep.selStart[0] >= startLine && rep.selStart[0] <= startLine+deleteCount) ||
+ (rep.selEnd && rep.selEnd[0] >= startLine && rep.selEnd[0] <= startLine+deleteCount)) {
+ currentCallStack.selectionAffected = true;
+ }
+ }
+ }
+
+ function checkChangesetLineInformationAgainstRep(changes) {
+ return true; // disable for speed
+ var opIter = Changeset.opIterator(Changeset.unpack(changes).ops);
+ var curOffset = 0;
+ var curLine = 0;
+ var curCol = 0;
+ while (opIter.hasNext()) {
+ var o = opIter.next();
+ if (o.opcode == '-' || o.opcode == '=') {
+ curOffset += o.chars;
+ if (o.lines) {
+ curLine += o.lines;
+ curCol = 0;
+ }
+ else {
+ curCol += o.chars;
+ }
+ }
+ var calcLine = rep.lines.indexOfOffset(curOffset);
+ var calcLineStart = rep.lines.offsetOfIndex(calcLine);
+ var calcCol = curOffset - calcLineStart;
+ if (calcCol != curCol || calcLine != curLine) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function doRepApplyChangeset(changes, insertsAfterSelection) {
+ Changeset.checkRep(changes);
+
+ if (Changeset.oldLen(changes) != rep.alltext.length)
+ throw new Error("doRepApplyChangeset length mismatch: "+
+ Changeset.oldLen(changes)+"/"+rep.alltext.length);
+
+ if (! checkChangesetLineInformationAgainstRep(changes)) {
+ throw new Error("doRepApplyChangeset line break mismatch");
+ }
+
+ (function doRecordUndoInformation(changes) {
+ var editEvent = currentCallStack.editEvent;
+ if (editEvent.eventType == "nonundoable") {
+ if (! editEvent.changeset) {
+ editEvent.changeset = changes;
+ }
+ else {
+ editEvent.changeset = Changeset.compose(editEvent.changeset, changes,
+ rep.apool);
+ }
+ }
+ else {
+ var inverseChangeset = Changeset.inverse(changes, {get: function(i) {
+ return rep.lines.atIndex(i).text+'\n';
+ }, length: function() { return rep.lines.length(); }},
+ rep.alines, rep.apool);
+
+ if (! editEvent.backset) {
+ editEvent.backset = inverseChangeset;
+ }
+ else {
+ editEvent.backset = Changeset.compose(inverseChangeset,
+ editEvent.backset, rep.apool);
+ }
+ }
+ })(changes);
+
+ //rep.alltext = Changeset.applyToText(changes, rep.alltext);
+ Changeset.mutateAttributionLines(changes, rep.alines, rep.apool);
+
+ if (changesetTracker.isTracking()) {
+ changesetTracker.composeUserChangeset(changes);
+ }
+
+ }
+
+ function lineAndColumnFromChar(x) {
+ var lineEntry = rep.lines.atOffset(x);
+ var lineStart = rep.lines.offsetOfEntry(lineEntry);
+ var lineNum = rep.lines.indexOfEntry(lineEntry);
+ return [lineNum, x - lineStart];
+ }
+
+ function performDocumentReplaceCharRange(startChar, endChar, newText) {
+ if (startChar == endChar && newText.length == 0) {
+ return;
+ }
+ // Requires that the replacement preserve the property that the
+ // internal document text ends in a newline. Given this, we
+ // rewrite the splice so that it doesn't touch the very last
+ // char of the document.
+ if (endChar == rep.alltext.length) {
+ if (startChar == endChar) {
+ // an insert at end
+ startChar--;
+ endChar--;
+ newText = '\n'+newText.substring(0, newText.length-1);
+ }
+ else if (newText.length == 0) {
+ // a delete at end
+ startChar--;
+ endChar--;
+ }
+ else {
+ // a replace at end
+ endChar--;
+ newText = newText.substring(0, newText.length-1);
+ }
+ }
+ performDocumentReplaceRange(lineAndColumnFromChar(startChar),
+ lineAndColumnFromChar(endChar),
+ newText);
+ }
+
+ function performDocumentReplaceRange(start, end, newText) {
+ //dmesg(String([start.toSource(),end.toSource(),newText.toSource()]));
+
+ // start[0]: <--- start[1] --->CCCCCCCCCCC\n
+ // CCCCCCCCCCCCCCCCCCCC\n
+ // CCCC\n
+ // end[0]: <CCC end[1] CCC>-------\n
+
+ var builder = Changeset.builder(rep.lines.totalWidth());
+ buildKeepToStartOfRange(builder, start);
+ buildRemoveRange(builder, start, end);
+ builder.insert(newText, [['author',thisAuthor]], rep.apool);
+ var cs = builder.toString();
+
+ performDocumentApplyChangeset(cs);
+ }
+
+ function performDocumentApplyAttributesToCharRange(start, end, attribs) {
+ if (end >= rep.alltext.length) {
+ end = rep.alltext.length-1;
+ }
+ performDocumentApplyAttributesToRange(lineAndColumnFromChar(start),
+ lineAndColumnFromChar(end), attribs);
+ }
+
+ function performDocumentApplyAttributesToRange(start, end, attribs) {
+ var builder = Changeset.builder(rep.lines.totalWidth());
+ buildKeepToStartOfRange(builder, start);
+ buildKeepRange(builder, start, end, attribs, rep.apool);
+ var cs = builder.toString();
+ performDocumentApplyChangeset(cs);
+ }
+
+ function buildKeepToStartOfRange(builder, start) {
+ var startLineOffset = rep.lines.offsetOfIndex(start[0]);
+
+ builder.keep(startLineOffset, start[0]);
+ builder.keep(start[1]);
+ }
+ function buildRemoveRange(builder, start, end) {
+ var startLineOffset = rep.lines.offsetOfIndex(start[0]);
+ var endLineOffset = rep.lines.offsetOfIndex(end[0]);
+
+ if (end[0] > start[0]) {
+ builder.remove(endLineOffset - startLineOffset - start[1], end[0] - start[0]);
+ builder.remove(end[1]);
+ }
+ else {
+ builder.remove(end[1] - start[1]);
+ }
+ }
+ function buildKeepRange(builder, start, end, attribs, pool) {
+ var startLineOffset = rep.lines.offsetOfIndex(start[0]);
+ var endLineOffset = rep.lines.offsetOfIndex(end[0]);
+
+ if (end[0] > start[0]) {
+ builder.keep(endLineOffset - startLineOffset - start[1], end[0] - start[0], attribs, pool);
+ builder.keep(end[1], 0, attribs, pool);
+ }
+ else {
+ builder.keep(end[1] - start[1], 0, attribs, pool);
+ }
+ }
+
+ function setAttributeOnSelection(attributeName, attributeValue) {
+ if (!(rep.selStart && rep.selEnd)) return;
+
+ performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd,
+ [[attributeName, attributeValue]]);
+ }
+
+ function toggleAttributeOnSelection(attributeName) {
+ if (!(rep.selStart && rep.selEnd)) return;
+
+ var selectionAllHasIt = true;
+ var withIt = Changeset.makeAttribsString('+', [[attributeName, 'true']], rep.apool);
+ var withItRegex = new RegExp(withIt.replace(/\*/g,'\\*')+"(\\*|$)");
+ function hasIt(attribs) { return withItRegex.test(attribs); }
+
+ var selStartLine = rep.selStart[0];
+ var selEndLine = rep.selEnd[0];
+ for(var n=selStartLine; n<=selEndLine; n++) {
+ var opIter = Changeset.opIterator(rep.alines[n]);
+ var indexIntoLine = 0;
+ var selectionStartInLine = 0;
+ var selectionEndInLine = rep.lines.atIndex(n).text.length; // exclude newline
+ if (n == selStartLine) {
+ selectionStartInLine = rep.selStart[1];
+ }
+ if (n == selEndLine) {
+ selectionEndInLine = rep.selEnd[1];
+ }
+ while (opIter.hasNext()) {
+ var op = opIter.next();
+ var opStartInLine = indexIntoLine;
+ var opEndInLine = opStartInLine + op.chars;
+ if (! hasIt(op.attribs)) {
+ // does op overlap selection?
+ if (! (opEndInLine <= selectionStartInLine || opStartInLine >= selectionEndInLine)) {
+ selectionAllHasIt = false;
+ break;
+ }
+ }
+ indexIntoLine = opEndInLine;
+ }
+ if (! selectionAllHasIt) {
+ break;
+ }
+ }
+
+ if (selectionAllHasIt) {
+ performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd,
+ [[attributeName,'']]);
+ }
+ else {
+ var settings = [[attributeName, 'true']];
+
+ if (attributeName == 'h1' || attributeName == 'h2' || attributeName == 'h3' ||
+ attributeName == 'h4' || attributeName == 'h5' || attributeName == 'h6') {
+
+ settings = [['h1',''], ['h2',''], ['h3',''],
+ ['h4',''], ['h5',''], ['h6','']];
+ if (attributeName == 'h1') {
+ settings[0] = [attributeName, 'true'];
+ }
+ else if (attributeName == 'h2') {
+ settings[1] = [attributeName, 'true'];
+ }
+ else if (attributeName == 'h3') {
+ settings[2] = [attributeName, 'true'];
+ }
+ else if (attributeName == 'h4') {
+ settings[3] = [attributeName, 'true'];
+ }
+ else if (attributeName == 'h5') {
+ settings[4] = [attributeName, 'true'];
+ }
+ else if (attributeName == 'h6') {
+ settings[5] = [attributeName, 'true'];
+ }
+ }
+
+ performDocumentApplyAttributesToRange(rep.selStart, rep.selEnd, settings);
+ }
+ }
+
+ function performDocumentReplaceSelection(newText) {
+ if (!(rep.selStart && rep.selEnd)) return;
+ performDocumentReplaceRange(rep.selStart, rep.selEnd, newText);
+ }
+
+ // Change the abstract representation of the document to have a different set of lines.
+ // Must be called after rep.alltext is set.
+ function doRepLineSplice(startLine, deleteCount, newLineEntries) {
+
+ forEach(newLineEntries, function (entry) { entry.width = entry.text.length+1; });
+
+ var startOldChar = rep.lines.offsetOfIndex(startLine);
+ var endOldChar = rep.lines.offsetOfIndex(startLine+deleteCount);
+
+ var oldRegionStart = rep.lines.offsetOfIndex(startLine);
+ var oldRegionEnd = rep.lines.offsetOfIndex(startLine+deleteCount);
+ rep.lines.splice(startLine, deleteCount, newLineEntries);
+ currentCallStack.docTextChanged = true;
+ currentCallStack.repChanged = true;
+ var newRegionEnd = rep.lines.offsetOfIndex(startLine + newLineEntries.length);
+
+ var newText = map(newLineEntries, function (e) { return e.text+'\n'; }).join('');
+
+ rep.alltext = rep.alltext.substring(0, startOldChar) + newText +
+ rep.alltext.substring(endOldChar, rep.alltext.length);
+
+ //var newTotalLength = rep.alltext.length;
+
+ //rep.lexer.updateBuffer(rep.alltext, oldRegionStart, oldRegionEnd - oldRegionStart,
+ //newRegionEnd - oldRegionStart);
+ }
+
+ function doIncorpLineSplice(startLine, deleteCount, newLineEntries, lineAttribs, hints) {
+
+ var startOldChar = rep.lines.offsetOfIndex(startLine);
+ var endOldChar = rep.lines.offsetOfIndex(startLine+deleteCount);
+
+ var oldRegionStart = rep.lines.offsetOfIndex(startLine);
+
+ var selStartHintChar, selEndHintChar;
+ if (hints && hints.selStart) {
+ selStartHintChar = rep.lines.offsetOfIndex(hints.selStart[0]) + hints.selStart[1] -
+ oldRegionStart;
+ }
+ if (hints && hints.selEnd) {
+ selEndHintChar = rep.lines.offsetOfIndex(hints.selEnd[0]) + hints.selEnd[1] -
+ oldRegionStart;
+ }
+
+ var newText = map(newLineEntries, function (e) { return e.text+'\n'; }).join('');
+ var oldText = rep.alltext.substring(startOldChar, endOldChar);
+ var oldAttribs = rep.alines.slice(startLine, startLine+deleteCount).join('');
+ var newAttribs = lineAttribs.join('|1+1')+'|1+1'; // not valid in a changeset
+ var analysis = analyzeChange(oldText, newText, oldAttribs, newAttribs,
+ selStartHintChar, selEndHintChar);
+ var commonStart = analysis[0];
+ var commonEnd = analysis[1];
+ var shortOldText = oldText.substring(commonStart, oldText.length - commonEnd);
+ var shortNewText = newText.substring(commonStart, newText.length - commonEnd);
+ var spliceStart = startOldChar+commonStart;
+ var spliceEnd = endOldChar-commonEnd;
+ var shiftFinalNewlineToBeforeNewText = false;
+
+ // adjust the splice to not involve the final newline of the document;
+ // be very defensive
+ if (shortOldText.charAt(shortOldText.length-1) == '\n' &&
+ shortNewText.charAt(shortNewText.length-1) == '\n') {
+ // replacing text that ends in newline with text that also ends in newline
+ // (still, after analysis, somehow)
+ shortOldText = shortOldText.slice(0,-1);
+ shortNewText = shortNewText.slice(0,-1);
+ spliceEnd--;
+ commonEnd++;
+ }
+ if (shortOldText.length == 0 && spliceStart == rep.alltext.length
+ && shortNewText.length > 0) {
+ // inserting after final newline, bad
+ spliceStart--;
+ spliceEnd--;
+ shortNewText = '\n'+shortNewText.slice(0,-1);
+ shiftFinalNewlineToBeforeNewText = true;
+ }
+ if (spliceEnd == rep.alltext.length && shortOldText.length > 0 &&
+ shortNewText.length == 0) {
+ // deletion at end of rep.alltext
+ if (rep.alltext.charAt(spliceStart-1) == '\n') {
+ // (if not then what the heck? it will definitely lead
+ // to a rep.alltext without a final newline)
+ spliceStart--;
+ spliceEnd--;
+ }
+ }
+
+ if (! (shortOldText.length == 0 && shortNewText.length == 0)) {
+ var oldDocText = rep.alltext;
+ var oldLen = oldDocText.length;
+
+ var spliceStartLine = rep.lines.indexOfOffset(spliceStart);
+ var spliceStartLineStart = rep.lines.offsetOfIndex(spliceStartLine);
+ function startBuilder() {
+ var builder = Changeset.builder(oldLen);
+ builder.keep(spliceStartLineStart, spliceStartLine);
+ builder.keep(spliceStart - spliceStartLineStart);
+ return builder;
+ }
+
+ function eachAttribRun(attribs, func/*(startInNewText, endInNewText, attribs)*/) {
+ var attribsIter = Changeset.opIterator(attribs);
+ var textIndex = 0;
+ var newTextStart = commonStart;
+ var newTextEnd = newText.length - commonEnd - (shiftFinalNewlineToBeforeNewText ? 1 : 0);
+ while (attribsIter.hasNext()) {
+ var op = attribsIter.next();
+ var nextIndex = textIndex + op.chars;
+ if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) {
+ func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs);
+ }
+ textIndex = nextIndex;
+ }
+ }
+
+ var justApplyStyles = (shortNewText == shortOldText);
+ var theChangeset;
+
+ if (justApplyStyles) {
+ // create changeset that clears the incorporated styles on
+ // the existing text. we compose this with the
+ // changeset the applies the styles found in the DOM.
+ // This allows us to incorporate, e.g., Safari's native "unbold".
+
+ var incorpedAttribClearer = cachedStrFunc(function (oldAtts) {
+ return Changeset.mapAttribNumbers(oldAtts, function(n) {
+ var k = rep.apool.getAttribKey(n);
+ if (isStyleAttribute(k)) {
+ return rep.apool.putAttrib([k,'']);
+ }
+ return false;
+ });
+ });
+
+ var builder1 = startBuilder();
+ if (shiftFinalNewlineToBeforeNewText) {
+ builder1.keep(1, 1);
+ }
+ eachAttribRun(oldAttribs, function(start, end, attribs) {
+ builder1.keepText(newText.substring(start, end), incorpedAttribClearer(attribs));
+ });
+ var clearer = builder1.toString();
+
+ var builder2 = startBuilder();
+ if (shiftFinalNewlineToBeforeNewText) {
+ builder2.keep(1, 1);
+ }
+ eachAttribRun(newAttribs, function(start, end, attribs) {
+ builder2.keepText(newText.substring(start, end), attribs);
+ });
+ var styler = builder2.toString();
+
+ theChangeset = Changeset.compose(clearer, styler, rep.apool);
+ }
+ else {
+ var builder = startBuilder();
+
+ var spliceEndLine = rep.lines.indexOfOffset(spliceEnd);
+ var spliceEndLineStart = rep.lines.offsetOfIndex(spliceEndLine);
+ if (spliceEndLineStart > spliceStart) {
+ builder.remove(spliceEndLineStart - spliceStart, spliceEndLine - spliceStartLine);
+ builder.remove(spliceEnd - spliceEndLineStart);
+ }
+ else {
+ builder.remove(spliceEnd - spliceStart);
+ }
+
+ var isNewTextMultiauthor = false;
+ var authorAtt = Changeset.makeAttribsString(
+ '+', (thisAuthor ? [['author', thisAuthor]] : []), rep.apool);
+ var authorizer = cachedStrFunc(function(oldAtts) {
+ if (isNewTextMultiauthor) {
+ // prefer colors from DOM
+ return Changeset.composeAttributes(authorAtt, oldAtts, true, rep.apool);
+ }
+ else {
+ // use this author's color
+ return Changeset.composeAttributes(oldAtts, authorAtt, true, rep.apool);
+ }
+ });
+
+ var foundDomAuthor = '';
+ eachAttribRun(newAttribs, function(start, end, attribs) {
+ var a = Changeset.attribsAttributeValue(attribs, 'author', rep.apool);
+ if (a && a != foundDomAuthor) {
+ if (! foundDomAuthor) {
+ foundDomAuthor = a;
+ }
+ else {
+ isNewTextMultiauthor = true; // multiple authors in DOM!
+ }
+ }
+ });
+
+ if (shiftFinalNewlineToBeforeNewText) {
+ builder.insert('\n', authorizer(''));
+ }
+
+ eachAttribRun(newAttribs, function(start, end, attribs) {
+ builder.insert(newText.substring(start, end), authorizer(attribs));
+ });
+ theChangeset = builder.toString();
+ }
+
+ //dmesg(htmlPrettyEscape(theChangeset));
+
+ doRepApplyChangeset(theChangeset);
+ }
+
+ // do this no matter what, because we need to get the right
+ // line keys into the rep.
+ doRepLineSplice(startLine, deleteCount, newLineEntries);
+
+ checkALines();
+ }
+
+ function cachedStrFunc(func) {
+ var cache = {};
+ return function(s) {
+ if (! cache[s]) {
+ cache[s] = func(s);
+ }
+ return cache[s];
+ };
+ }
+
+ function analyzeChange(oldText, newText, oldAttribs, newAttribs, optSelStartHint, optSelEndHint) {
+ function incorpedAttribFilter(anum) {
+ return isStyleAttribute(rep.apool.getAttribKey(anum));
+ }
+ function attribRuns(attribs) {
+ var lengs = [];
+ var atts = [];
+ var iter = Changeset.opIterator(attribs);
+ while (iter.hasNext()) {
+ var op = iter.next();
+ lengs.push(op.chars);
+ atts.push(op.attribs);
+ }
+ return [lengs,atts];
+ }
+ function attribIterator(runs, backward) {
+ var lengs = runs[0];
+ var atts = runs[1];
+ var i = (backward ? lengs.length-1 : 0);
+ var j = 0;
+ return function next() {
+ while (j >= lengs[i]) {
+ if (backward) i--; else i++;
+ j = 0;
+ }
+ var a = atts[i];
+ j++;
+ return a;
+ };
+ }
+
+ var oldLen = oldText.length;
+ var newLen = newText.length;
+ var minLen = Math.min(oldLen, newLen);
+
+ var oldARuns = attribRuns(Changeset.filterAttribNumbers(oldAttribs, incorpedAttribFilter));
+ var newARuns = attribRuns(Changeset.filterAttribNumbers(newAttribs, incorpedAttribFilter));
+
+ var commonStart = 0;
+ var oldStartIter = attribIterator(oldARuns, false);
+ var newStartIter = attribIterator(newARuns, false);
+ while (commonStart < minLen) {
+ if (oldText.charAt(commonStart) == newText.charAt(commonStart) &&
+ oldStartIter() == newStartIter()) {
+ commonStart++;
+ }
+ else break;
+ }
+
+ var commonEnd = 0;
+ var oldEndIter = attribIterator(oldARuns, true);
+ var newEndIter = attribIterator(newARuns, true);
+ while (commonEnd < minLen) {
+ if (commonEnd == 0) {
+ // assume newline in common
+ oldEndIter(); newEndIter();
+ commonEnd++;
+ }
+ else if (oldText.charAt(oldLen-1-commonEnd) == newText.charAt(newLen-1-commonEnd) &&
+ oldEndIter() == newEndIter()) {
+ commonEnd++;
+ }
+ else break;
+ }
+
+ var hintedCommonEnd = -1;
+ if ((typeof optSelEndHint) == "number") {
+ hintedCommonEnd = newLen - optSelEndHint;
+ }
+
+
+ if (commonStart + commonEnd > oldLen) {
+ // ambiguous insertion
+ var minCommonEnd = oldLen - commonStart;
+ var maxCommonEnd = commonEnd;
+ if (hintedCommonEnd >= minCommonEnd && hintedCommonEnd <= maxCommonEnd) {
+ commonEnd = hintedCommonEnd;
+ }
+ else {
+ commonEnd = minCommonEnd;
+ }
+ commonStart = oldLen - commonEnd;
+ }
+ if (commonStart + commonEnd > newLen) {
+ // ambiguous deletion
+ var minCommonEnd = newLen - commonStart;
+ var maxCommonEnd = commonEnd;
+ if (hintedCommonEnd >= minCommonEnd && hintedCommonEnd <= maxCommonEnd) {
+ commonEnd = hintedCommonEnd;
+ }
+ else {
+ commonEnd = minCommonEnd;
+ }
+ commonStart = newLen - commonEnd;
+ }
+
+ return [commonStart, commonEnd];
+ }
+
+ function equalLineAndChars(a, b) {
+ if (!a) return !b;
+ if (!b) return !a;
+ return (a[0] == b[0] && a[1] == b[1]);
+ }
+
+ function performSelectionChange(selectStart, selectEnd, focusAtStart) {
+ if (repSelectionChange(selectStart, selectEnd, focusAtStart)) {
+ currentCallStack.selectionAffected = true;
+ }
+ }
+
+ // Change the abstract representation of the document to have a different selection.
+ // Should not rely on the line representation. Should not affect the DOM.
+ function repSelectionChange(selectStart, selectEnd, focusAtStart) {
+ focusAtStart = !! focusAtStart;
+
+ var newSelFocusAtStart = (focusAtStart &&
+ ((! selectStart) || (! selectEnd) ||
+ (selectStart[0] != selectEnd[0]) ||
+ (selectStart[1] != selectEnd[1])));
+
+ if ((! equalLineAndChars(rep.selStart, selectStart)) ||
+ (! equalLineAndChars(rep.selEnd, selectEnd)) ||
+ (rep.selFocusAtStart != newSelFocusAtStart)) {
+ rep.selStart = selectStart;
+ rep.selEnd = selectEnd;
+ rep.selFocusAtStart = newSelFocusAtStart;
+ if (mozillaFakeArrows) mozillaFakeArrows.notifySelectionChanged();
+ currentCallStack.repChanged = true;
+
+ return true;
+ //console.log("selStart: %o, selEnd: %o, focusAtStart: %s", rep.selStart, rep.selEnd,
+ //String(!!rep.selFocusAtStart));
+ }
+ return false;
+ //console.log("%o %o %s", rep.selStart, rep.selEnd, rep.selFocusAtStart);
+ }
+
+ /*function escapeHTML(s) {
+ var re = /[&<>'"]/g; /']/; // stupid indentation thing
+ if (! re.MAP) {
+ // persisted across function calls!
+ re.MAP = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&#34;',
+ "'": '&#39;'
+ };
+ }
+ return s.replace(re, function(c) { return re.MAP[c]; });
+ }*/
+
+ function doCreateDomLine(nonEmpty) {
+ if (browser.msie && (! nonEmpty)) {
+ var result = { node: null,
+ appendSpan: noop,
+ prepareForAdd: noop,
+ notifyAdded: noop,
+ clearSpans: noop,
+ finishUpdate: noop,
+ lineMarker: 0 };
+
+ var lineElem = doc.createElement("div");
+ result.node = lineElem;
+
+ result.notifyAdded = function() {
+ // magic -- settng an empty div's innerHTML to the empty string
+ // keeps it from collapsing. Apparently innerHTML must be set *after*
+ // adding the node to the DOM.
+ // Such a div is what IE 6 creates naturally when you make a blank line
+ // in a document of divs. However, when copy-and-pasted the div will
+ // contain a space, so we note its emptiness with a property.
+ lineElem.innerHTML = "";
+ // a primitive-valued property survives copy-and-paste
+ setAssoc(lineElem, "shouldBeEmpty", true);
+ // an object property doesn't
+ setAssoc(lineElem, "unpasted", {});
+ };
+ var lineClass = 'ace-line';
+ result.appendSpan = function(txt, cls) {
+ if ((! txt) && cls) {
+ // gain a whole-line style (currently to show insertion point in CSS)
+ lineClass = domline.addToLineClass(lineClass, cls);
+ }
+ // otherwise, ignore appendSpan, this is an empty line
+ };
+ result.clearSpans = function() {
+ lineClass = ''; // non-null to cause update
+ };
+ function writeClass() {
+ if (lineClass !== null) lineElem.className = lineClass;
+ }
+ result.prepareForAdd = writeClass;
+ result.finishUpdate = writeClass;
+ result.getInnerHTML = function() { return ""; };
+
+ return result;
+ }
+ else {
+ return domline.createDomLine(nonEmpty, doesWrap, browser, doc);
+ }
+ }
+
+ function textify(str) {
+ return str.replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' ');
+ }
+
+ var _blockElems = { "div":1, "p":1, "pre":1, "li":1, "ol":1, "ul":1 };
+ function isBlockElement(n) {
+ return !!_blockElems[(n.tagName || "").toLowerCase()];
+ }
+
+ function getDirtyRanges() {
+ // based on observedChanges, return a list of ranges of original lines
+ // that need to be removed or replaced with new user content to incorporate
+ // the user's changes into the line representation. ranges may be zero-length,
+ // indicating inserted content. for example, [0,0] means content was inserted
+ // at the top of the document, while [3,4] means line 3 was deleted, modified,
+ // or replaced with one or more new lines of content. ranges do not touch.
+
+ var p = PROFILER("getDirtyRanges", false);
+ p.forIndices = 0;
+ p.consecutives = 0;
+ p.corrections = 0;
+
+ var cleanNodeForIndexCache = {};
+ var N = rep.lines.length(); // old number of lines
+ function cleanNodeForIndex(i) {
+ // if line (i) in the un-updated line representation maps to a clean node
+ // in the document, return that node.
+ // if (i) is out of bounds, return true. else return false.
+ if (cleanNodeForIndexCache[i] === undefined) {
+ p.forIndices++;
+ var result;
+ if (i < 0 || i >= N) {
+ result = true; // truthy, but no actual node
+ }
+ else {
+ var key = rep.lines.atIndex(i).key;
+ result = (getCleanNodeByKey(key) || false);
+ }
+ cleanNodeForIndexCache[i] = result;
+ }
+ return cleanNodeForIndexCache[i];
+ }
+ var isConsecutiveCache = {};
+ function isConsecutive(i) {
+ if (isConsecutiveCache[i] === undefined) {
+ p.consecutives++;
+ isConsecutiveCache[i] = (function() {
+ // returns whether line (i) and line (i-1), assumed to be map to clean DOM nodes,
+ // or document boundaries, are consecutive in the changed DOM
+ var a = cleanNodeForIndex(i-1);
+ var b = cleanNodeForIndex(i);
+ if ((!a) || (!b)) return false; // violates precondition
+ if ((a === true) && (b === true)) return ! root.firstChild;
+ if ((a === true) && b.previousSibling) return false;
+ if ((b === true) && a.nextSibling) return false;
+ if ((a === true) || (b === true)) return true;
+ return a.nextSibling == b;
+ })();
+ }
+ return isConsecutiveCache[i];
+ }
+ function isClean(i) {
+ // returns whether line (i) in the un-updated representation maps to a clean node,
+ // or is outside the bounds of the document
+ return !! cleanNodeForIndex(i);
+ }
+ // list of pairs, each representing a range of lines that is clean and consecutive
+ // in the changed DOM. lines (-1) and (N) are always clean, but may or may not
+ // be consecutive with lines in the document. pairs are in sorted order.
+ var cleanRanges = [[-1,N+1]];
+ function rangeForLine(i) {
+ // returns index of cleanRange containing i, or -1 if none
+ var answer = -1;
+ forEach(cleanRanges, function (r, idx) {
+ if (i >= r[1]) return false; // keep looking
+ if (i < r[0]) return true; // not found, stop looking
+ answer = idx;
+ return true; // found, stop looking
+ });
+ return answer;
+ }
+ function removeLineFromRange(rng, line) {
+ // rng is index into cleanRanges, line is line number
+ // precond: line is in rng
+ var a = cleanRanges[rng][0];
+ var b = cleanRanges[rng][1];
+ if ((a+1) == b) cleanRanges.splice(rng, 1);
+ else if (line == a) cleanRanges[rng][0]++;
+ else if (line == (b-1)) cleanRanges[rng][1]--;
+ else cleanRanges.splice(rng, 1, [a,line], [line+1,b]);
+ }
+ function splitRange(rng, pt) {
+ // precond: pt splits cleanRanges[rng] into two non-empty ranges
+ var a = cleanRanges[rng][0];
+ var b = cleanRanges[rng][1];
+ cleanRanges.splice(rng, 1, [a,pt], [pt,b]);
+ }
+ var correctedLines = {};
+ function correctlyAssignLine(line) {
+ if (correctedLines[line]) return true;
+ p.corrections++;
+ correctedLines[line] = true;
+ // "line" is an index of a line in the un-updated rep.
+ // returns whether line was already correctly assigned (i.e. correctly
+ // clean or dirty, according to cleanRanges, and if clean, correctly
+ // attached or not attached (i.e. in the same range as) the prev and next lines).
+ //console.log("correctly assigning: %d", line);
+ var rng = rangeForLine(line);
+ var lineClean = isClean(line);
+ if (rng < 0) {
+ if (lineClean) {
+ console.debug("somehow lost clean line");
+ }
+ return true;
+ }
+ if (! lineClean) {
+ // a clean-range includes this dirty line, fix it
+ removeLineFromRange(rng, line);
+ return false;
+ }
+ else {
+ // line is clean, but could be wrongly connected to a clean line
+ // above or below
+ var a = cleanRanges[rng][0];
+ var b = cleanRanges[rng][1];
+ var didSomething = false;
+ // we'll leave non-clean adjacent nodes in the clean range for the caller to
+ // detect and deal with. we deal with whether the range should be split
+ // just above or just below this line.
+ if (a < line && isClean(line-1) && ! isConsecutive(line)) {
+ splitRange(rng, line);
+ didSomething = true;
+ }
+ if (b > (line+1) && isClean(line+1) && ! isConsecutive(line+1)) {
+ splitRange(rng, line+1);
+ didSomething = true;
+ }
+ return ! didSomething;
+ }
+ }
+ function detectChangesAroundLine(line, reqInARow) {
+ // make sure cleanRanges is correct about line number "line" and the surrounding
+ // lines; only stops checking at end of document or after no changes need
+ // making for several consecutive lines. note that iteration is over old lines,
+ // so this operation takes time proportional to the number of old lines
+ // that are changed or missing, not the number of new lines inserted.
+ var correctInARow = 0;
+ var currentIndex = line;
+ while (correctInARow < reqInARow && currentIndex >= 0) {
+ if (correctlyAssignLine(currentIndex)) {
+ correctInARow++;
+ }
+ else correctInARow = 0;
+ currentIndex--;
+ }
+ correctInARow = 0;
+ currentIndex = line;
+ while (correctInARow < reqInARow && currentIndex < N) {
+ if (correctlyAssignLine(currentIndex)) {
+ correctInARow++;
+ }
+ else correctInARow = 0;
+ currentIndex++;
+ }
+ }
+
+ if (N == 0) {
+ p.cancel();
+ if (! isConsecutive(0)) {
+ splitRange(0, 0);
+ }
+ }
+ else {
+ p.mark("topbot");
+ detectChangesAroundLine(0,1);
+ detectChangesAroundLine(N-1,1);
+
+ p.mark("obs");
+ //console.log("observedChanges: "+toSource(observedChanges));
+ for (var k in observedChanges.cleanNodesNearChanges) {
+ var key = k.substring(1);
+ if (rep.lines.containsKey(key)) {
+ var line = rep.lines.indexOfKey(key);
+ detectChangesAroundLine(line,2);
+ }
+ }
+ p.mark("stats&calc");
+ p.literal(p.forIndices, "byidx");
+ p.literal(p.consecutives, "cons");
+ p.literal(p.corrections, "corr");
+ }
+
+ var dirtyRanges = [];
+ for(var r=0;r<cleanRanges.length-1;r++) {
+ dirtyRanges.push([cleanRanges[r][1], cleanRanges[r+1][0]]);
+ }
+
+ p.end();
+
+ return dirtyRanges;
+ }
+
+ function markNodeClean(n) {
+ // clean nodes have knownHTML that matches their innerHTML
+ var dirtiness = {};
+ dirtiness.nodeId = uniqueId(n);
+ dirtiness.knownHTML = n.innerHTML;
+ if (browser.msie) {
+ // adding a space to an "empty" div in IE designMode doesn't
+ // change the innerHTML of the div's parent; also, other
+ // browsers don't support innerText
+ dirtiness.knownText = n.innerText;
+ }
+ setAssoc(n, "dirtiness", dirtiness);
+ }
+
+ function isNodeDirty(n) {
+ var p = PROFILER("cleanCheck", false);
+ if (n.parentNode != root) return true;
+ var data = getAssoc(n, "dirtiness");
+ if (!data) return true;
+ if (n.id !== data.nodeId) return true;
+ if (browser.msie) {
+ if (n.innerText !== data.knownText) return true;
+ }
+ if (n.innerHTML !== data.knownHTML) return true;
+ p.end();
+ return false;
+ }
+
+ function getLineEntryTopBottom(entry, destObj) {
+ var dom = entry.lineNode;
+ var top = dom.offsetTop;
+ var height = dom.offsetHeight;
+ var obj = (destObj || {});
+ obj.top = top;
+ obj.bottom = (top+height);
+ return obj;
+ }
+
+ function getViewPortTopBottom() {
+ var theTop = getScrollY();
+ var doc = outerWin.document;
+ var height = doc.documentElement.clientHeight;
+ return {top:theTop, bottom:(theTop+height)};
+ }
+
+ function getVisibleLineRange() {
+ var viewport = getViewPortTopBottom();
+ //console.log("viewport top/bottom: %o", viewport);
+ var obj = {};
+ var start = rep.lines.search(function (e) {
+ return getLineEntryTopBottom(e, obj).bottom > viewport.top;
+ });
+ var end = rep.lines.search(function(e) {
+ return getLineEntryTopBottom(e, obj).top >= viewport.bottom;
+ });
+ if (end < start) end = start; // unlikely
+ //console.log(start+","+end);
+ return [start,end];
+ }
+
+ function getVisibleCharRange() {
+ var lineRange = getVisibleLineRange();
+ return [rep.lines.offsetOfIndex(lineRange[0]),
+ rep.lines.offsetOfIndex(lineRange[1])];
+ }
+
+ function handleClick(evt) {
+ inCallStack("handleClick", function() {
+ idleWorkTimer.atMost(200);
+ });
+
+ // only want to catch left-click
+ if ((! evt.ctrlKey) && (evt.button != 2) && (evt.button != 3)) {
+ // find A tag with HREF
+ function isLink(n) { return (n.tagName||'').toLowerCase() == "a" && n.href; }
+ var n = evt.target;
+ while (n && n.parentNode && ! isLink(n)) { n = n.parentNode; }
+ if (n && isLink(n)) {
+ try {
+ var newWindow = window.open(n.href, '_blank');
+ newWindow.focus();
+ }
+ catch (e) {
+ // absorb "user canceled" error in IE for certain prompts
+ }
+ evt.preventDefault();
+ }
+ }
+ }
+
+ function doReturnKey() {
+ if (! (rep.selStart && rep.selEnd)) {
+ return;
+ }
+ var lineNum = rep.selStart[0];
+ var listType = getLineListType(lineNum);
+
+ performDocumentReplaceSelection('\n');
+ if (listType) {
+ if (lineNum+1 < rep.lines.length()) {
+ setLineListType(lineNum+1, listType);
+ }
+ }
+ else {
+ handleReturnIndentation();
+ }
+ }
+
+ function doIndentOutdent(isOut) {
+ if (! (rep.selStart && rep.selEnd)) {
+ return false;
+ }
+
+ var firstLine, lastLine;
+ firstLine = rep.selStart[0];
+ lastLine = Math.max(firstLine,
+ rep.selEnd[0] - ((rep.selEnd[1] == 0) ? 1 : 0));
+
+ var mods = [];
+ var foundLists = false;
+ for(var n=firstLine;n<=lastLine;n++) {
+ var listType = getLineListType(n);
+ if (listType) {
+ listType = /([a-z]+)([12345678])/.exec(listType);
+ if (listType) {
+ foundLists = true;
+ var t = listType[1];
+ var level = Number(listType[2]);
+ var newLevel =
+ Math.max(1, Math.min(MAX_LIST_LEVEL,
+ level + (isOut ? -1 : 1)));
+ if (level != newLevel) {
+ mods.push([n, t+newLevel]);
+ }
+ }
+ }
+ }
+
+ if (mods.length > 0) {
+ setLineListTypes(mods);
+ }
+
+ return foundLists;
+ }
+
+ function doTabKey(shiftDown) {
+ if (! doIndentOutdent(shiftDown)) {
+ performDocumentReplaceSelection(THE_TAB);
+ }
+ }
+
+ function doDeleteKey(optEvt) {
+ var evt = optEvt || {};
+ var handled = false;
+ if (rep.selStart) {
+ if (isCaret()) {
+ var lineNum = caretLine();
+ var col = caretColumn();
+ var lineEntry = rep.lines.atIndex(lineNum);
+ var lineText = lineEntry.text;
+ var lineMarker = lineEntry.lineMarker;
+ if (/^ +$/.exec(lineText.substring(lineMarker, col))) {
+ var col2 = col - lineMarker;
+ var tabSize = THE_TAB.length;
+ var toDelete = ((col2 - 1) % tabSize)+1;
+ performDocumentReplaceRange([lineNum,col-toDelete],
+ [lineNum,col], '');
+ //scrollSelectionIntoView();
+ handled = true;
+ }
+ }
+ if (! handled) {
+ if (isCaret()) {
+ var theLine = caretLine();
+ var lineEntry = rep.lines.atIndex(theLine);
+ if (caretColumn() <= lineEntry.lineMarker) {
+ // delete at beginning of line
+ var action = 'delete_newline';
+ var prevLineListType =
+ (theLine > 0 ? getLineListType(theLine-1) : '');
+ var thisLineListType = getLineListType(theLine);
+ var prevLineEntry = (theLine > 0 &&
+ rep.lines.atIndex(theLine-1));
+ var prevLineBlank = (prevLineEntry &&
+ prevLineEntry.text.length ==
+ prevLineEntry.lineMarker);
+ if (thisLineListType) {
+ // this line is a list
+ /*if (prevLineListType) {
+ // prev line is a list too, remove this bullet
+ performDocumentReplaceRange([theLine-1, prevLineEntry.text.length],
+ [theLine, lineEntry.lineMarker], '');
+ }
+ else*/ if (prevLineBlank && ! prevLineListType) {
+ // previous line is blank, remove it
+ performDocumentReplaceRange([theLine-1, prevLineEntry.text.length],
+ [theLine, 0], '');
+ }
+ else {
+ // delistify
+ performDocumentReplaceRange([theLine, 0],
+ [theLine, lineEntry.lineMarker], '');
+ }
+ }
+ else if (theLine > 0) {
+ // remove newline
+ performDocumentReplaceRange([theLine-1, prevLineEntry.text.length],
+ [theLine, 0], '');
+ }
+ }
+ else {
+ var docChar = caretDocChar();
+ if (docChar > 0) {
+ if (evt.metaKey || evt.ctrlKey || evt.altKey) {
+ // delete as many unicode "letters or digits" in a row as possible;
+ // always delete one char, delete further even if that first char
+ // isn't actually a word char.
+ var deleteBackTo = docChar-1;
+ while (deleteBackTo > lineEntry.lineMarker &&
+ isWordChar(rep.alltext.charAt(deleteBackTo-1))) {
+ deleteBackTo--;
+ }
+ performDocumentReplaceCharRange(deleteBackTo, docChar, '');
+ }
+ else {
+ // normal delete
+ performDocumentReplaceCharRange(docChar-1, docChar, '');
+ }
+ }
+ }
+ }
+ else {
+ performDocumentReplaceSelection('');
+ }
+ }
+ }
+ }
+
+ // set of "letter or digit" chars is based on section 20.5.16 of the original Java Language Spec
+ var REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/;
+ var REGEX_SPACE = /\s/;
+
+ function isWordChar(c) {
+ return !! REGEX_WORDCHAR.exec(c);
+ }
+ function isSpaceChar(c) {
+ return !! REGEX_SPACE.exec(c);
+ }
+
+ function moveByWordInLine(lineText, initialIndex, forwardNotBack) {
+ var i = initialIndex;
+ function nextChar() {
+ if (forwardNotBack) return lineText.charAt(i);
+ else return lineText.charAt(i-1);
+ }
+ function advance() { if (forwardNotBack) i++; else i--; }
+ function isDone() {
+ if (forwardNotBack) return i >= lineText.length;
+ else return i <= 0;
+ }
+
+ // On Mac and Linux, move right moves to end of word and move left moves to start;
+ // on Windows, always move to start of word.
+ // On Windows, Firefox and IE disagree on whether to stop for punctuation (FF says no).
+ if (browser.windows && forwardNotBack) {
+ while ((! isDone()) && isWordChar(nextChar())) { advance(); }
+ while ((! isDone()) && ! isWordChar(nextChar())) { advance(); }
+ }
+ else {
+ while ((! isDone()) && ! isWordChar(nextChar())) { advance(); }
+ while ((! isDone()) && isWordChar(nextChar())) { advance(); }
+ }
+
+ return i;
+ }
+
+ function handleKeyEvent(evt) {
+ if (DEBUG && top.DONT_INCORP) return;
+
+ /*if (evt.which == 48) {
+ //setEditable(! isEditable);
+ //doAlert(getInnerWidth());
+ //doAlert(doc.documentElement.innerWidth)
+ alert(eval(prompt()));
+ evt.preventDefault();
+ return;
+ }*/
+ /*if (evt.which == 48) {
+ alert(doc.body.innerHTML);
+ }*/
+ /*if (evt.which == 48 && evt.type == "keydown") {
+ var lineHeights = [];
+ function eachChild(node, func) {
+ if (node.firstChild) {
+ var n = node.firstChild;
+ while (n) {
+ func(n);
+ n = n.nextSibling;
+ }
+ }
+ }
+ eachChild(doc.body, function (n) {
+ if (n.clientHeight) {
+ lineHeights.push(n.clientHeight);
+ }
+ });
+ alert(lineHeights.join(','));
+ }*/
+ /*if (evt.which == 48) {
+ top.DONT_INCORP = true;
+ var cmdTarget = doc;
+ if (browser.msie) {
+ if (doc.selection) {
+ cmdTarget = doc.selection.createRange();
+ }
+ else cmdTarget = null;
+ }
+ if (cmdTarget) {
+ cmdTarget.execCommand("Bold", false, null);
+ }
+ alert(doc.body.innerHTML);
+ evt.preventDefault();
+ return;
+ }*/
+ /*if (evt.which == 48) {
+ if (evt.type == "keypress") {
+ top.console.log(window.getSelection().getRangeAt(0));
+ evt.preventDefault();
+ }
+ return;
+ }*/
+ /*if (evt.which == 48) {
+ if (evt.type == "keypress") {
+ inCallStack("bold", function() {
+ fastIncorp(9);
+ toggleAttributeOnSelection('bold');
+ });
+ evt.preventDefault();
+ }
+ return;
+ }*/
+ /*if (evt.which == 48) {
+ if (evt.type == "keypress") {
+ inCallStack("insertunorderedlist", function() {
+ fastIncorp(9);
+ doInsertUnorderedList();
+ });
+ evt.preventDefault();
+ }
+ return;
+ }*/
+
+ if (! isEditable) return;
+
+ var type = evt.type;
+ var charCode = evt.charCode;
+ var keyCode = evt.keyCode;
+ var mods = "";
+ if (evt.altKey) mods = mods+"A";
+ if (evt.ctrlKey) mods = mods+"C";
+ if (evt.shiftKey) mods = mods+"S";
+ if (evt.metaKey) mods = mods+"M";
+ var modsPrfx = "";
+ if (mods) modsPrfx = mods+"-";
+ var which = evt.which;
+
+ //dmesg("keyevent type: "+type+", which: "+which);
+
+ // Don't take action based on modifier keys going up and down.
+ // Modifier keys do not generate "keypress" events.
+ // 224 is the command-key under Mac Firefox.
+ // 91 is the Windows key in IE; it is ASCII for open-bracket but isn't the keycode for that key
+ // 20 is capslock in IE.
+ var isModKey = ((!charCode) &&
+ ((type == "keyup") || (type == "keydown")) &&
+ (keyCode == 16 || keyCode == 17 || keyCode == 18 || keyCode == 20 || keyCode == 224
+ || keyCode == 91));
+ if (isModKey) return;
+
+ var specialHandled = false;
+ var isTypeForSpecialKey = ((browser.msie || browser.safari) ?
+ (type == "keydown") : (type == "keypress"));
+ var isTypeForCmdKey = ((browser.msie || browser.safari) ? (type == "keydown") : (type == "keypress"));
+
+ var stopped = false;
+
+ inCallStack("handleKeyEvent", function() {
+
+ if (type == "keypress" ||
+ (isTypeForSpecialKey && keyCode == 13/*return*/)) {
+ // in IE, special keys don't send keypress, the keydown does the action
+ if (! outsideKeyPress(evt)) {
+ evt.preventDefault();
+ stopped = true;
+ }
+ }
+ else if (type == "keydown") {
+ outsideKeyDown(evt);
+ }
+
+ if (! stopped) {
+ if (isTypeForSpecialKey && keyCode == 8) {
+ // "delete" key; in mozilla, if we're at the beginning of a line, normalize now,
+ // or else deleting a blank line can take two delete presses.
+ // --
+ // we do deletes completely customly now:
+ // - allows consistent (and better) meta-delete behavior
+ // - normalizing and then allowing default behavior confused IE
+ // - probably eliminates a few minor quirks
+ fastIncorp(3);
+ evt.preventDefault();
+ doDeleteKey(evt);
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForSpecialKey && keyCode == 13) {
+ // return key, handle specially;
+ // note that in mozilla we need to do an incorporation for proper return behavior anyway.
+ fastIncorp(4);
+ evt.preventDefault();
+ doReturnKey();
+ //scrollSelectionIntoView();
+ scheduler.setTimeout(function() {outerWin.scrollBy(-100,0);}, 0);
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForSpecialKey && keyCode == 9 &&
+ ! (evt.metaKey || evt.ctrlKey)) {
+ // tab
+ fastIncorp(5);
+ evt.preventDefault();
+ doTabKey(evt.shiftKey);
+ //scrollSelectionIntoView();
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "z" &&
+ (evt.metaKey || evt.ctrlKey)) {
+ // cmd-Z (undo)
+ fastIncorp(6);
+ evt.preventDefault();
+ if (evt.shiftKey) {
+ doUndoRedo("redo");
+ }
+ else {
+ doUndoRedo("undo");
+ }
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "y" &&
+ (evt.metaKey || evt.ctrlKey)) {
+ // cmd-Y (redo)
+ fastIncorp(10);
+ evt.preventDefault();
+ doUndoRedo("redo");
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "b" &&
+ (evt.metaKey || evt.ctrlKey)) {
+ // cmd-B (bold)
+ fastIncorp(13);
+ evt.preventDefault();
+ toggleAttributeOnSelection('bold');
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "i" &&
+ (evt.metaKey || evt.ctrlKey)) {
+ // cmd-I (italic)
+ fastIncorp(14);
+ evt.preventDefault();
+ toggleAttributeOnSelection('italic');
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "u" &&
+ (evt.metaKey || evt.ctrlKey)) {
+ // cmd-U (underline)
+ fastIncorp(15);
+ evt.preventDefault();
+ toggleAttributeOnSelection('underline');
+ specialHandled = true;
+ }
+ if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "h" &&
+ (evt.ctrlKey)) {
+ // cmd-H (backspace)
+ fastIncorp(20);
+ evt.preventDefault();
+ doDeleteKey();
+ specialHandled = true;
+ }
+ /*if ((!specialHandled) && isTypeForCmdKey &&
+ String.fromCharCode(which).toLowerCase() == "u" &&
+ (evt.metaKey || evt.ctrlKey)) {
+ // cmd-U
+ doc.body.innerHTML = '';
+ evt.preventDefault();
+ specialHandled = true;
+ }*/
+
+ if (mozillaFakeArrows && mozillaFakeArrows.handleKeyEvent(evt)) {
+ evt.preventDefault();
+ specialHandled = true;
+ }
+ }
+
+ if (type == "keydown") {
+ idleWorkTimer.atLeast(500);
+ }
+ else if (type == "keypress") {
+ if ((! specialHandled) && parenModule.shouldNormalizeOnChar(charCode)) {
+ idleWorkTimer.atMost(0);
+ }
+ else {
+ idleWorkTimer.atLeast(500);
+ }
+ }
+ else if (type == "keyup") {
+ var wait = 200;
+ idleWorkTimer.atLeast(wait);
+ idleWorkTimer.atMost(wait);
+ }
+
+ // Is part of multi-keystroke international character on Firefox Mac
+ var isFirefoxHalfCharacter =
+ (browser.mozilla && evt.altKey && charCode == 0 && keyCode == 0);
+
+ // Is part of multi-keystroke international character on Safari Mac
+ var isSafariHalfCharacter =
+ (browser.safari && evt.altKey && keyCode == 229);
+
+ if (thisKeyDoesntTriggerNormalize || isFirefoxHalfCharacter || isSafariHalfCharacter) {
+ idleWorkTimer.atLeast(3000); // give user time to type
+ // if this is a keydown, e.g., the keyup shouldn't trigger a normalize
+ thisKeyDoesntTriggerNormalize = true;
+ }
+
+ if ((! specialHandled) && (! thisKeyDoesntTriggerNormalize) &&
+ (! inInternationalComposition)) {
+ if (type != "keyup" || ! incorpIfQuick()) {
+ observeChangesAroundSelection();
+ }
+ }
+
+ if (type == "keyup") {
+ thisKeyDoesntTriggerNormalize = false;
+ }
+ });
+ }
+
+ var thisKeyDoesntTriggerNormalize = false;
+
+ function doUndoRedo(which) {
+ // precond: normalized DOM
+ if (undoModule.enabled) {
+ var whichMethod;
+ if (which == "undo") whichMethod = 'performUndo';
+ if (which == "redo") whichMethod = 'performRedo';
+ if (whichMethod) {
+ var oldEventType = currentCallStack.editEvent.eventType;
+ currentCallStack.startNewEvent(which);
+ undoModule[whichMethod](function(backset, selectionInfo) {
+ if (backset) {
+ performDocumentApplyChangeset(backset);
+ }
+ if (selectionInfo) {
+ performSelectionChange(lineAndColumnFromChar(selectionInfo.selStart),
+ lineAndColumnFromChar(selectionInfo.selEnd),
+ selectionInfo.selFocusAtStart);
+ }
+ var oldEvent = currentCallStack.startNewEvent(oldEventType, true);
+ return oldEvent;
+ });
+ }
+ }
+ }
+
+ /*function enforceNewTextTypedStyle() {
+ var sel = getSelection();
+ var n = (sel && sel.startPoint && sel.startPoint.node);
+ if (!n) return;
+ var isInOurNode = false;
+ while (n) {
+ if (n.tagName) {
+ var tag = n.tagName.toLowerCase();
+ if (tag == "b" || tag == "strong") {
+ isInOurNode = true;
+ break;
+ }
+ if (((typeof n.className) == "string") &&
+ n.className.toLowerCase().indexOf("Apple-style-span") >= 0) {
+ isInOurNode = true;
+ break;
+ }
+ }
+ n = n.parentNode;
+ }
+
+ if (! isInOurNode) {
+ doc.execCommand("Bold", false, null);
+ }
+
+ if (! browser.msie) {
+ var browserSelection = window.getSelection();
+ if (browserSelection && browserSelection.type != "None" &&
+ browserSelection.rangeCount !== 0) {
+ var range = browserSelection.getRangeAt(0);
+ var surrounder = doc.createElement("B");
+ range.surroundContents(surrounder);
+ range.selectNodeContents(surrounder);
+ browserSelection.removeAllRanges();
+ browserSelection.addRange(range);
+ }
+ }
+ }*/
+
+ function updateBrowserSelectionFromRep() {
+ // requires normalized DOM!
+ var selStart = rep.selStart, selEnd = rep.selEnd;
+
+ if (!(selStart && selEnd)) {
+ setSelection(null);
+ return;
+ }
+
+ var mozillaCaretHack = (false && browser.mozilla && selStart && selEnd &&
+ selStart[0] == selEnd[0]
+ && selStart[1] == rep.lines.atIndex(selStart[0]).lineMarker
+ && selEnd[1] == rep.lines.atIndex(selEnd[0]).lineMarker &&
+ setupMozillaCaretHack(selStart[0]));
+
+ var selection = {};
+
+ var ss = [selStart[0], selStart[1]];
+ if (mozillaCaretHack) ss[1] += 1;
+ selection.startPoint = getPointForLineAndChar(ss);
+
+ var se = [selEnd[0], selEnd[1]];
+ if (mozillaCaretHack) se[1] += 1;
+ selection.endPoint = getPointForLineAndChar(se);
+
+ selection.focusAtStart = !!rep.selFocusAtStart;
+
+ setSelection(selection);
+
+ if (mozillaCaretHack) {
+ mozillaCaretHack.unhack();
+ }
+ }
+
+ function getRepHTML() {
+ /*function lineWithSelection(text, lineNum) {
+ var haveSelStart = (rep.selStart && rep.selStart[0] == lineNum);
+ var haveSelEnd = (rep.selEnd && rep.selEnd[0] == lineNum);
+ var startCol = (haveSelStart && rep.selStart[1]);
+ var endCol = (haveSelEnd && rep.selEnd[1]);
+ var len = text.length;
+ if (haveSelStart && haveSelEnd && startCol == endCol) {
+ var color = "#000";
+ if (endCol == len) {
+ return '<span style="border-right: 1px solid '+color+'">'+
+ htmlEscape(text)+'</span>';
+ }
+ else {
+ return htmlEscape
+ }
+ }
+ }*/
+
+ return map(rep.lines.slice(), function (entry) {
+ var text = entry.text;
+ var content;
+ if (text.length == 0) {
+ content = '<span style="color: #aaa">--</span>';
+ }
+ else {
+ content = htmlPrettyEscape(text);
+ }
+ return '<div><code>'+content+'</div></code>';
+ }).join('');
+ }
+
+ function nodeMaxIndex(nd) {
+ if (isNodeText(nd)) return nd.nodeValue.length;
+ else return 1;
+ }
+
+ function hasIESelection() {
+ var browserSelection;
+ try { browserSelection = doc.selection; } catch (e) {}
+ if (! browserSelection) return false;
+ var origSelectionRange;
+ try { origSelectionRange = browserSelection.createRange(); } catch (e) {}
+ if (! origSelectionRange) return false;
+ var selectionParent = origSelectionRange.parentElement();
+ if (selectionParent.ownerDocument != doc) return false;
+ return true;
+ }
+
+ function getSelection() {
+ // returns null, or a structure containing startPoint and endPoint,
+ // each of which has node (a magicdom node), index, and maxIndex. If the node
+ // is a text node, maxIndex is the length of the text; else maxIndex is 1.
+ // index is between 0 and maxIndex, inclusive.
+ if (browser.msie) {
+ var browserSelection;
+ try { browserSelection = doc.selection; } catch (e) {}
+ if (! browserSelection) return null;
+ var origSelectionRange;
+ try { origSelectionRange = browserSelection.createRange(); } catch (e) {}
+ if (! origSelectionRange) return null;
+ var selectionParent = origSelectionRange.parentElement();
+ if (selectionParent.ownerDocument != doc) return null;
+ function newRange() {
+ return doc.body.createTextRange();
+ }
+ function rangeForElementNode(nd) {
+ var rng = newRange();
+ // doesn't work on text nodes
+ rng.moveToElementText(nd);
+ return rng;
+ }
+ function pointFromCollapsedRange(rng) {
+ var parNode = rng.parentElement();
+ var elemBelow = -1;
+ var elemAbove = parNode.childNodes.length;
+ var rangeWithin = rangeForElementNode(parNode);
+
+ if (rng.compareEndPoints("StartToStart", rangeWithin) == 0) {
+ return {node:parNode, index:0, maxIndex:1};
+ }
+ else if (rng.compareEndPoints("EndToEnd", rangeWithin) == 0) {
+ if (isBlockElement(parNode) && parNode.nextSibling) {
+ // caret after block is not consistent across browsers
+ // (same line vs next) so put caret before next node
+ return {node:parNode.nextSibling, index:0, maxIndex:1};
+ }
+ return {node:parNode, index:1, maxIndex:1};
+ }
+ else if (parNode.childNodes.length == 0) {
+ return {node:parNode, index:0, maxIndex:1};
+ }
+
+ for(var i=0;i<parNode.childNodes.length;i++) {
+ var n = parNode.childNodes.item(i);
+ if (! isNodeText(n)) {
+ var nodeRange = rangeForElementNode(n);
+ var startComp = rng.compareEndPoints("StartToStart", nodeRange);
+ var endComp = rng.compareEndPoints("EndToEnd", nodeRange);
+ if (startComp >= 0 && endComp <= 0) {
+ var index = 0;
+ if (startComp > 0) {
+ index = 1;
+ }
+ return {node:n, index:index, maxIndex:1};
+ }
+ else if (endComp > 0) {
+ if (i > elemBelow) {
+ elemBelow = i;
+ rangeWithin.setEndPoint("StartToEnd", nodeRange);
+ }
+ }
+ else if (startComp < 0) {
+ if (i < elemAbove) {
+ elemAbove = i;
+ rangeWithin.setEndPoint("EndToStart", nodeRange);
+ }
+ }
+ }
+ }
+ if ((elemAbove - elemBelow) == 1) {
+ if (elemBelow >= 0) {
+ return {node:parNode.childNodes.item(elemBelow), index:1, maxIndex:1};
+ }
+ else {
+ return {node:parNode.childNodes.item(elemAbove), index:0, maxIndex:1};
+ }
+ }
+ var idx = 0;
+ var r = rng.duplicate();
+ // infinite stateful binary search! call function for values 0 to inf,
+ // expecting the answer to be about 40. return index of smallest
+ // true value.
+ var indexIntoRange = binarySearchInfinite(40, function (i) {
+ // the search algorithm whips the caret back and forth,
+ // though it has to be moved relatively and may hit
+ // the end of the buffer
+ var delta = i-idx;
+ var moved = Math.abs(r.move("character", -delta));
+ // next line is work-around for fact that when moving left, the beginning
+ // of a text node is considered to be after the start of the parent element:
+ if (r.move("character", -1)) r.move("character", 1);
+ if (delta < 0) idx -= moved;
+ else idx += moved;
+ return (r.compareEndPoints("StartToStart", rangeWithin) <= 0);
+ });
+ // iterate over consecutive text nodes, point is in one of them
+ var textNode = elemBelow+1;
+ var indexLeft = indexIntoRange;
+ while (textNode < elemAbove) {
+ var tn = parNode.childNodes.item(textNode);
+ if (indexLeft <= tn.nodeValue.length) {
+ return {node:tn, index:indexLeft, maxIndex:tn.nodeValue.length};
+ }
+ indexLeft -= tn.nodeValue.length;
+ textNode++;
+ }
+ var tn = parNode.childNodes.item(textNode-1);
+ return {node:tn, index:tn.nodeValue.length, maxIndex:tn.nodeValue.length};
+ }
+ var selection = {};
+ if (origSelectionRange.compareEndPoints("StartToEnd", origSelectionRange) == 0) {
+ // collapsed
+ var pnt = pointFromCollapsedRange(origSelectionRange);
+ selection.startPoint = pnt;
+ selection.endPoint = {node:pnt.node, index:pnt.index, maxIndex:pnt.maxIndex};
+ }
+ else {
+ var start = origSelectionRange.duplicate();
+ start.collapse(true);
+ var end = origSelectionRange.duplicate();
+ end.collapse(false);
+ selection.startPoint = pointFromCollapsedRange(start);
+ selection.endPoint = pointFromCollapsedRange(end);
+ /*if ((!selection.startPoint.node.isText) && (!selection.endPoint.node.isText)) {
+ console.log(selection.startPoint.node.uniqueId()+","+
+ selection.startPoint.index+" / "+
+ selection.endPoint.node.uniqueId()+","+
+ selection.endPoint.index);
+ }*/
+ }
+ return selection;
+ }
+ else {
+ // non-IE browser
+ var browserSelection = window.getSelection();
+ if (browserSelection && browserSelection.type != "None" &&
+ browserSelection.rangeCount !== 0) {
+ var range = browserSelection.getRangeAt(0);
+ function isInBody(n) {
+ while (n && ! (n.tagName && n.tagName.toLowerCase() == "body")) {
+ n = n.parentNode;
+ }
+ return !!n;
+ }
+ function pointFromRangeBound(container, offset) {
+ if (! isInBody(container)) {
+ // command-click in Firefox selects whole document, HEAD and BODY!
+ return {node:root, index:0, maxIndex:1};
+ }
+ var n = container;
+ var childCount = n.childNodes.length;
+ if (isNodeText(n)) {
+ return {node:n, index:offset, maxIndex:n.nodeValue.length};
+ }
+ else if (childCount == 0) {
+ return {node:n, index:0, maxIndex:1};
+ }
+ // treat point between two nodes as BEFORE the second (rather than after the first)
+ // if possible; this way point at end of a line block-element is treated as
+ // at beginning of next line
+ else if (offset == childCount) {
+ var nd = n.childNodes.item(childCount-1);
+ var max = nodeMaxIndex(nd);
+ return {node:nd, index:max, maxIndex:max};
+ }
+ else {
+ var nd = n.childNodes.item(offset);
+ var max = nodeMaxIndex(nd);
+ return {node:nd, index:0, maxIndex:max};
+ }
+ }
+ var selection = {};
+ selection.startPoint = pointFromRangeBound(range.startContainer, range.startOffset);
+ selection.endPoint = pointFromRangeBound(range.endContainer, range.endOffset);
+ selection.focusAtStart = (((range.startContainer != range.endContainer) ||
+ (range.startOffset != range.endOffset)) &&
+ browserSelection.anchorNode &&
+ (browserSelection.anchorNode == range.endContainer) &&
+ (browserSelection.anchorOffset == range.endOffset));
+ return selection;
+ }
+ else return null;
+ }
+ }
+
+ function setSelection(selection) {
+ function copyPoint(pt) {
+ return {node:pt.node, index:pt.index, maxIndex:pt.maxIndex};
+ }
+ if (browser.msie) {
+ // Oddly enough, accessing scrollHeight fixes return key handling on IE 8,
+ // presumably by forcing some kind of internal DOM update.
+ doc.body.scrollHeight;
+
+ function moveToElementText(s, n) {
+ while (n.firstChild && ! isNodeText(n.firstChild)) {
+ n = n.firstChild;
+ }
+ s.moveToElementText(n);
+ }
+ function newRange() {
+ return doc.body.createTextRange();
+ }
+ function setCollapsedBefore(s, n) {
+ // s is an IE TextRange, n is a dom node
+ if (isNodeText(n)) {
+ // previous node should not also be text, but prevent inf recurs
+ if (n.previousSibling && ! isNodeText(n.previousSibling)) {
+ setCollapsedAfter(s, n.previousSibling);
+ }
+ else {
+ setCollapsedBefore(s, n.parentNode);
+ }
+ }
+ else {
+ moveToElementText(s, n);
+ // work around for issue that caret at beginning of line
+ // somehow ends up at end of previous line
+ if (s.move('character', 1)) {
+ s.move('character', -1);
+ }
+ s.collapse(true); // to start
+ }
+ }
+ function setCollapsedAfter(s, n) {
+ // s is an IE TextRange, n is a magicdom node
+ if (isNodeText(n)) {
+ // can't use end of container when no nextSibling (could be on next line),
+ // so use previousSibling or start of container and move forward.
+ setCollapsedBefore(s, n);
+ s.move("character", n.nodeValue.length);
+ }
+ else {
+ moveToElementText(s, n);
+ s.collapse(false); // to end
+ }
+ }
+ function getPointRange(point) {
+ var s = newRange();
+ var n = point.node;
+ if (isNodeText(n)) {
+ setCollapsedBefore(s, n);
+ s.move("character", point.index);
+ }
+ else if (point.index == 0) {
+ setCollapsedBefore(s, n);
+ }
+ else {
+ setCollapsedAfter(s, n);
+ }
+ return s;
+ }
+
+ if (selection) {
+ if (! hasIESelection()) {
+ return; // don't steal focus
+ }
+
+ var startPoint = copyPoint(selection.startPoint);
+ var endPoint = copyPoint(selection.endPoint);
+
+ // fix issue where selection can't be extended past end of line
+ // with shift-rightarrow or shift-downarrow
+ if (endPoint.index == endPoint.maxIndex && endPoint.node.nextSibling) {
+ endPoint.node = endPoint.node.nextSibling;
+ endPoint.index = 0;
+ endPoint.maxIndex = nodeMaxIndex(endPoint.node);
+ }
+ var range = getPointRange(startPoint);
+ range.setEndPoint("EndToEnd", getPointRange(endPoint));
+
+ // setting the selection in IE causes everything to scroll
+ // so that the selection is visible. if setting the selection
+ // definitely accomplishes nothing, don't do it.
+ function isEqualToDocumentSelection(rng) {
+ var browserSelection;
+ try { browserSelection = doc.selection; } catch (e) {}
+ if (! browserSelection) return false;
+ var rng2 = browserSelection.createRange();
+ if (rng2.parentElement().ownerDocument != doc) return false;
+ if (rng.compareEndPoints("StartToStart", rng2) !== 0) return false;
+ if (rng.compareEndPoints("EndToEnd", rng2) !== 0) return false;
+ return true;
+ }
+ if (! isEqualToDocumentSelection(range)) {
+ //dmesg(toSource(selection));
+ //dmesg(escapeHTML(doc.body.innerHTML));
+ range.select();
+ }
+ }
+ else {
+ try { doc.selection.empty(); } catch (e) {}
+ }
+ }
+ else {
+ // non-IE browser
+ var isCollapsed;
+ function pointToRangeBound(pt) {
+ var p = copyPoint(pt);
+ // Make sure Firefox cursor is deep enough; fixes cursor jumping when at top level,
+ // and also problem where cut/copy of a whole line selected with fake arrow-keys
+ // copies the next line too.
+ if (isCollapsed) {
+ function diveDeep() {
+ while (p.node.childNodes.length > 0) {
+ //&& (p.node == root || p.node.parentNode == root)) {
+ if (p.index == 0) {
+ p.node = p.node.firstChild;
+ p.maxIndex = nodeMaxIndex(p.node);
+ }
+ else if (p.index == p.maxIndex) {
+ p.node = p.node.lastChild;
+ p.maxIndex = nodeMaxIndex(p.node);
+ p.index = p.maxIndex;
+ }
+ else break;
+ }
+ }
+ // now fix problem where cursor at end of text node at end of span-like element
+ // with background doesn't seem to show up...
+ if (isNodeText(p.node) && p.index == p.maxIndex) {
+ var n = p.node;
+ while ((! n.nextSibling) && (n != root) && (n.parentNode != root)) {
+ n = n.parentNode;
+ }
+ if (n.nextSibling &&
+ (! ((typeof n.nextSibling.tagName) == "string" &&
+ n.nextSibling.tagName.toLowerCase() == "br")) &&
+ (n != p.node) && (n != root) && (n.parentNode != root)) {
+ // found a parent, go to next node and dive in
+ p.node = n.nextSibling;
+ p.maxIndex = nodeMaxIndex(p.node);
+ p.index = 0;
+ diveDeep();
+ }
+ }
+ // try to make sure insertion point is styled;
+ // also fixes other FF problems
+ if (! isNodeText(p.node)) {
+ diveDeep();
+ }
+ }
+ /*// make sure Firefox cursor is shallow enough;
+ // to fix problem where "return" between two spans doesn't move the caret to
+ // the next line
+ // (decided against)
+ while (!(p.node.isRoot || p.node.parent().isRoot || p.node.parent().parent().isRoot)) {
+ if (p.index == 0 && ! p.node.prev()) {
+ p.node = p.node.parent();
+ p.maxIndex = 1;
+ }
+ else if (p.index == p.maxIndex && ! p.node.next()) {
+ p.node = p.node.parent();
+ p.maxIndex = 1;
+ p.index = 1;
+ }
+ else break;
+ }
+ if ((! p.node.isRoot) && (!p.node.parent().isRoot) &&
+ (p.index == p.maxIndex) && p.node.next()) {
+ p.node = p.node.next();
+ p.maxIndex = nodeMaxIndex(p.node);
+ p.index = 0;
+ }*/
+ if (isNodeText(p.node)) {
+ return { container: p.node, offset: p.index };
+ }
+ else {
+ // p.index in {0,1}
+ return { container: p.node.parentNode, offset: childIndex(p.node) + p.index };
+ }
+ }
+ var browserSelection = window.getSelection();
+ if (browserSelection) {
+ browserSelection.removeAllRanges();
+ if (selection) {
+ isCollapsed = (selection.startPoint.node === selection.endPoint.node &&
+ selection.startPoint.index === selection.endPoint.index);
+ var start = pointToRangeBound(selection.startPoint);
+ var end = pointToRangeBound(selection.endPoint);
+
+ if ((!isCollapsed) && selection.focusAtStart && browserSelection.collapse && browserSelection.extend) {
+ // can handle "backwards"-oriented selection, shift-arrow-keys move start
+ // of selection
+ browserSelection.collapse(end.container, end.offset);
+ //console.trace();
+ //console.log(htmlPrettyEscape(rep.alltext));
+ //console.log("%o %o", rep.selStart, rep.selEnd);
+ //console.log("%o %d", start.container, start.offset);
+ browserSelection.extend(start.container, start.offset);
+ }
+ else {
+ var range = doc.createRange();
+ range.setStart(start.container, start.offset);
+ range.setEnd(end.container, end.offset);
+ browserSelection.removeAllRanges();
+ browserSelection.addRange(range);
+ }
+ }
+ }
+ }
+ }
+
+ function childIndex(n) {
+ var idx = 0;
+ while (n.previousSibling) {
+ idx++;
+ n = n.previousSibling;
+ }
+ return idx;
+ }
+
+ function fixView() {
+ // calling this method repeatedly should be fast
+
+ if (getInnerWidth() == 0 || getInnerHeight() == 0) {
+ return;
+ }
+
+ function setIfNecessary(obj, prop, value) {
+ if (obj[prop] != value) {
+ obj[prop] = value;
+ }
+ }
+
+ var lineNumberWidth = sideDiv.firstChild.offsetWidth;
+ var newSideDivWidth = lineNumberWidth + LINE_NUMBER_PADDING_LEFT;
+ if (newSideDivWidth < MIN_LINEDIV_WIDTH) newSideDivWidth = MIN_LINEDIV_WIDTH;
+ iframePadLeft = EDIT_BODY_PADDING_LEFT;
+ if (hasLineNumbers) iframePadLeft += newSideDivWidth + LINE_NUMBER_PADDING_RIGHT;
+ setIfNecessary(iframe.style, "left", iframePadLeft+"px");
+ setIfNecessary(sideDiv.style, "width", newSideDivWidth+"px");
+
+ for(var i=0;i<2;i++) {
+ var newHeight = root.clientHeight;
+ var newWidth = (browser.msie ? root.createTextRange().boundingWidth : root.clientWidth);
+ var viewHeight = getInnerHeight() - iframePadBottom - iframePadTop;
+ var viewWidth = getInnerWidth() - iframePadLeft - iframePadRight;
+ if (newHeight < viewHeight) {
+ newHeight = viewHeight;
+ if (browser.msie) setIfNecessary(outerWin.document.documentElement.style, 'overflowY', 'auto');
+ }
+ else {
+ if (browser.msie) setIfNecessary(outerWin.document.documentElement.style, 'overflowY', 'scroll');
+ }
+ if (doesWrap) {
+ newWidth = viewWidth;
+ }
+ else {
+ if (newWidth < viewWidth) newWidth = viewWidth;
+ }
+ if (newHeight > 32000) newHeight = 32000;
+ if (newWidth > 32000) newWidth = 32000;
+ setIfNecessary(iframe.style, "height", newHeight+"px");
+ setIfNecessary(iframe.style, "width", newWidth+"px");
+ setIfNecessary(sideDiv.style, "height", newHeight+"px");
+ }
+ if (browser.mozilla) {
+ if (! doesWrap) {
+ // the body:display:table-cell hack makes mozilla do scrolling
+ // correctly by shrinking the <body> to fit around its content,
+ // but mozilla won't act on clicks below the body. We keep the
+ // style.height property set to the viewport height (editor height
+ // not including scrollbar), so it will never shrink so that part of
+ // the editor isn't clickable.
+ var body = root;
+ var styleHeight = viewHeight+"px";
+ setIfNecessary(body.style, "height", styleHeight);
+ }
+ else {
+ setIfNecessary(root.style, "height", "");
+ }
+ }
+ // if near edge, scroll to edge
+ var scrollX = getScrollX();
+ var scrollY = getScrollY();
+ var win = outerWin;
+ var r = 20;
+ /*if (scrollX <= iframePadLeft+r) win.scrollBy(-iframePadLeft-r, 0);
+ else if (getPageWidth() - scrollX - getInnerWidth() <= iframePadRight+r)
+ scrollBy(iframePadRight+r, 0);*/
+ /*if (scrollY <= iframePadTop+r) win.scrollBy(0, -iframePadTop-r);
+ else if (getPageHeight() - scrollY - getInnerHeight() <= iframePadBottom+r)
+ scrollBy(0, iframePadBottom+r);*/
+
+ enforceEditability();
+
+ addClass(sideDiv, 'sidedivdelayed');
+ }
+
+ function getScrollXY() {
+ var win = outerWin;
+ var odoc = outerWin.document;
+ if (typeof(win.pageYOffset) == "number") {
+ return {x: win.pageXOffset, y: win.pageYOffset};
+ }
+ var docel = odoc.documentElement;
+ if (docel && typeof(docel.scrollTop) == "number") {
+ return {x:docel.scrollLeft, y:docel.scrollTop};
+ }
+ }
+
+ function getScrollX() {
+ return getScrollXY().x;
+ }
+
+ function getScrollY() {
+ return getScrollXY().y;
+ }
+
+ function setScrollX(x) {
+ outerWin.scrollTo(x, getScrollY());
+ }
+
+ function setScrollY(y) {
+ outerWin.scrollTo(getScrollX(), y);
+ }
+
+ function setScrollXY(x, y) {
+ outerWin.scrollTo(x, y);
+ }
+
+ var _teardownActions = [];
+ function teardown() {
+ forEach(_teardownActions, function (a) { a(); });
+ }
+
+ bindEventHandler(window, "load", setup);
+
+ function setDesignMode(newVal) {
+ try {
+ function setIfNecessary(target, prop, val) {
+ if (String(target[prop]).toLowerCase() != val) {
+ target[prop] = val;
+ return true;
+ }
+ return false;
+ }
+ if (browser.msie || browser.safari) {
+ setIfNecessary(root, 'contentEditable', (newVal ? 'true' : 'false'));
+ }
+ else {
+ var wasSet = setIfNecessary(doc, 'designMode', (newVal ? 'on' : 'off'));
+ if (wasSet && newVal && browser.opera) {
+ // turning on designMode clears event handlers
+ bindTheEventHandlers();
+ }
+ }
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
+ }
+
+ var iePastedLines = null;
+ function handleIEPaste(evt) {
+ // Pasting in IE loses blank lines in a way that loses information;
+ // "one\n\ntwo\nthree" becomes "<p>one</p><p>two</p><p>three</p>",
+ // which becomes "one\ntwo\nthree". We can get the correct text
+ // from the clipboard directly, but we still have to let the paste
+ // happen to get the style information.
+
+ var clipText = window.clipboardData && window.clipboardData.getData("Text");
+ if (clipText && doc.selection) {
+ // this "paste" event seems to mess with the selection whether we try to
+ // stop it or not, so can't really do document-level manipulation now
+ // or in an idle call-stack. instead, use IE native manipulation
+ //function escapeLine(txt) {
+ //return processSpaces(escapeHTML(textify(txt)));
+ //}
+ //var newHTML = map(clipText.replace(/\r/g,'').split('\n'), escapeLine).join('<br>');
+ //doc.selection.createRange().pasteHTML(newHTML);
+ //evt.preventDefault();
+
+ //iePastedLines = map(clipText.replace(/\r/g,'').split('\n'), textify);
+ }
+ }
+
+ var inInternationalComposition = false;
+
+ function handleCompositionEvent(evt) {
+ // international input events, fired in FF3, at least; allow e.g. Japanese input
+ if (evt.type == "compositionstart") {
+ inInternationalComposition = true;
+ }
+ else if (evt.type == "compositionend") {
+ inInternationalComposition = false;
+ }
+ }
+
+ /*function handleTextEvent(evt) {
+ top.console.log("TEXT EVENT");
+ inCallStackIfNecessary("handleTextEvent", function() {
+ observeChangesAroundSelection();
+ });
+ }*/
+
+ function bindTheEventHandlers() {
+ bindEventHandler(window, "unload", teardown);
+ bindEventHandler(document, "keydown", handleKeyEvent);
+ bindEventHandler(document, "keypress", handleKeyEvent);
+ bindEventHandler(document, "keyup", handleKeyEvent);
+ bindEventHandler(document, "click", handleClick);
+ bindEventHandler(root, "blur", handleBlur);
+ if (browser.msie) {
+ bindEventHandler(document, "click", handleIEOuterClick);
+ }
+ if (browser.msie) bindEventHandler(root, "paste", handleIEPaste);
+ if ((! browser.msie) && document.documentElement) {
+ bindEventHandler(document.documentElement, "compositionstart", handleCompositionEvent);
+ bindEventHandler(document.documentElement, "compositionend", handleCompositionEvent);
+ }
+
+ /*bindEventHandler(window, "mousemove", function(e) {
+ if (e.pageX < 10) {
+ window.DEBUG_DONT_INCORP = (e.pageX < 2);
+ }
+ });*/
+ }
+
+ function handleIEOuterClick(evt) {
+ if ((evt.target.tagName||'').toLowerCase() != "html") {
+ return;
+ }
+ if (!(evt.pageY > root.clientHeight)) {
+ return;
+ }
+
+ // click below the body
+ inCallStack("handleOuterClick", function() {
+ // put caret at bottom of doc
+ fastIncorp(11);
+ if (isCaret()) { // don't interfere with drag
+ var lastLine = rep.lines.length()-1;
+ var lastCol = rep.lines.atIndex(lastLine).text.length;
+ performSelectionChange([lastLine,lastCol],[lastLine,lastCol]);
+ }
+ });
+ }
+
+ function getClassArray(elem, optFilter) {
+ var bodyClasses = [];
+ (elem.className || '').replace(/\S+/g, function (c) {
+ if ((! optFilter) || (optFilter(c))) {
+ bodyClasses.push(c);
+ }
+ });
+ return bodyClasses;
+ }
+ function setClassArray(elem, array) {
+ elem.className = array.join(' ');
+ }
+ function addClass(elem, className) {
+ var seen = false;
+ var cc = getClassArray(elem, function(c) { if (c == className) seen = true; return true; });
+ if (! seen) {
+ cc.push(className);
+ setClassArray(elem, cc);
+ }
+ }
+ function removeClass(elem, className) {
+ var seen = false;
+ var cc = getClassArray(elem, function(c) {
+ if (c == className) { seen = true; return false; } return true; });
+ if (seen) {
+ setClassArray(elem, cc);
+ }
+ }
+ function setClassPresence(elem, className, present) {
+ if (present) addClass(elem, className);
+ else removeClass(elem, className);
+ }
+
+ function setup() {
+ doc = document; // defined as a var in scope outside
+ inCallStack("setup", function() {
+ var body = doc.getElementById("innerdocbody");
+ root = body; // defined as a var in scope outside
+
+ if (browser.mozilla) addClass(root, "mozilla");
+ if (browser.safari) addClass(root, "safari");
+ if (browser.msie) addClass(root, "msie");
+ if (browser.msie) {
+ // cache CSS background images
+ try {
+ doc.execCommand("BackgroundImageCache", false, true);
+ }
+ catch (e) {
+ /* throws an error in some IE 6 but not others! */
+ }
+ }
+ setClassPresence(root, "authorColors", true);
+ setClassPresence(root, "doesWrap", doesWrap);
+
+ initDynamicCSS();
+
+ enforceEditability();
+
+ // set up dom and rep
+ while (root.firstChild) root.removeChild(root.firstChild);
+ var oneEntry = createDomLineEntry("");
+ doRepLineSplice(0, rep.lines.length(), [oneEntry]);
+ insertDomLines(null, [oneEntry.domInfo], null);
+ rep.alines = Changeset.splitAttributionLines(
+ Changeset.makeAttribution("\n"), "\n");
+
+ bindTheEventHandlers();
+
+ });
+
+ scheduler.setTimeout(function() {
+ parent.readyFunc(); // defined in code that sets up the inner iframe
+ }, 0);
+
+ isSetUp = true;
+ }
+
+ function focus() {
+ window.focus();
+ }
+
+ function handleBlur(evt) {
+ if (browser.msie) {
+ // a fix: in IE, clicking on a control like a button outside the
+ // iframe can "blur" the editor, causing it to stop getting
+ // events, though typing still affects it(!).
+ setSelection(null);
+ }
+ }
+
+ function bindEventHandler(target, type, func) {
+ var handler;
+ if ((typeof func._wrapper) != "function") {
+ func._wrapper = function(event) {
+ func(fixEvent(event || window.event || {}));
+ }
+ }
+ var handler = func._wrapper;
+ if (target.addEventListener)
+ target.addEventListener(type, handler, false);
+ else
+ target.attachEvent("on" + type, handler);
+ _teardownActions.push(function() {
+ unbindEventHandler(target, type, func);
+ });
+ }
+
+ function unbindEventHandler(target, type, func) {
+ var handler = func._wrapper;
+ if (target.removeEventListener)
+ target.removeEventListener(type, handler, false);
+ else
+ target.detachEvent("on" + type, handler);
+ }
+
+ /*forEach(['rep', 'getCleanNodeByKey', 'getDirtyRanges', 'isNodeDirty',
+ 'getSelection', 'setSelection', 'updateBrowserSelectionFromRep',
+ 'makeRecentSet', 'resetProfiler', 'getScrollXY', 'makeIdleAction'], function (k) {
+ top['_'+k] = eval(k);
+ });*/
+
+ function getSelectionPointX(point) {
+ // doesn't work in wrap-mode
+ var node = point.node;
+ var index = point.index;
+ function leftOf(n) { return n.offsetLeft; }
+ function rightOf(n) { return n.offsetLeft + n.offsetWidth; }
+ if (! isNodeText(node)) {
+ if (index == 0) return leftOf(node);
+ else return rightOf(node);
+ }
+ else {
+ // we can get bounds of element nodes, so look for those.
+ // allow consecutive text nodes for robustness.
+ var charsToLeft = index;
+ var charsToRight = node.nodeValue.length - index;
+ var n;
+ for(n = node.previousSibling; n && isNodeText(n); n = n.previousSibling)
+ charsToLeft += n.nodeValue;
+ var leftEdge = (n ? rightOf(n) : leftOf(node.parentNode));
+ for(n = node.nextSibling; n && isNodeText(n); n = n.nextSibling)
+ charsToRight += n.nodeValue;
+ var rightEdge = (n ? leftOf(n) : rightOf(node.parentNode));
+ var frac = (charsToLeft / (charsToLeft + charsToRight));
+ var pixLoc = leftEdge + frac*(rightEdge - leftEdge);
+ return Math.round(pixLoc);
+ }
+ }
+
+ function getPageHeight() {
+ var win = outerWin;
+ var odoc = win.document;
+ if (win.innerHeight && win.scrollMaxY) return win.innerHeight + win.scrollMaxY;
+ else if (odoc.body.scrollHeight > odoc.body.offsetHeight) return odoc.body.scrollHeight;
+ else return odoc.body.offsetHeight;
+ }
+
+ function getPageWidth() {
+ var win = outerWin;
+ var odoc = win.document;
+ if (win.innerWidth && win.scrollMaxX) return win.innerWidth + win.scrollMaxX;
+ else if (odoc.body.scrollWidth > odoc.body.offsetWidth) return odoc.body.scrollWidth;
+ else return odoc.body.offsetWidth;
+ }
+
+ function getInnerHeight() {
+ var win = outerWin;
+ var odoc = win.document;
+ var h;
+ if (browser.opera) h = win.innerHeight;
+ else h = odoc.documentElement.clientHeight;
+ if (h) return h;
+
+ // deal with case where iframe is hidden, hope that
+ // style.height of iframe container is set in px
+ return Number(editorInfo.frame.parentNode.style.height.replace(/[^0-9]/g,'')
+ || 0);
+ }
+
+ function getInnerWidth() {
+ var win = outerWin;
+ var odoc = win.document;
+ return odoc.documentElement.clientWidth;
+ }
+
+ function scrollNodeVerticallyIntoView(node) {
+ // requires element (non-text) node;
+ // if node extends above top of viewport or below bottom of viewport (or top of scrollbar),
+ // scroll it the minimum distance needed to be completely in view.
+ var win = outerWin;
+ var odoc = outerWin.document;
+ var distBelowTop = node.offsetTop + iframePadTop - win.scrollY;
+ var distAboveBottom = win.scrollY + getInnerHeight() -
+ (node.offsetTop +iframePadTop + node.offsetHeight);
+
+ if (distBelowTop < 0) {
+ win.scrollBy(0, distBelowTop);
+ }
+ else if (distAboveBottom < 0) {
+ win.scrollBy(0, -distAboveBottom);
+ }
+ }
+
+ function scrollXHorizontallyIntoView(pixelX) {
+ var win = outerWin;
+ var odoc = outerWin.document;
+ pixelX += iframePadLeft;
+ var distInsideLeft = pixelX - win.scrollX;
+ var distInsideRight = win.scrollX + getInnerWidth() - pixelX;
+ if (distInsideLeft < 0) {
+ win.scrollBy(distInsideLeft, 0);
+ }
+ else if (distInsideRight < 0) {
+ win.scrollBy(-distInsideRight+1, 0);
+ }
+ }
+
+ function scrollSelectionIntoView() {
+ if (! rep.selStart) return;
+ fixView();
+ var focusLine = (rep.selFocusAtStart ? rep.selStart[0] : rep.selEnd[0]);
+ scrollNodeVerticallyIntoView(rep.lines.atIndex(focusLine).lineNode);
+ if (! doesWrap) {
+ var browserSelection = getSelection();
+ if (browserSelection) {
+ var focusPoint = (browserSelection.focusAtStart ? browserSelection.startPoint :
+ browserSelection.endPoint);
+ var selectionPointX = getSelectionPointX(focusPoint);
+ scrollXHorizontallyIntoView(selectionPointX);
+ fixView();
+ }
+ }
+ }
+
+ function getLineListType(lineNum) {
+ // get "list" attribute of first char of line
+ var aline = rep.alines[lineNum];
+ if (aline) {
+ var opIter = Changeset.opIterator(aline);
+ if (opIter.hasNext()) {
+ return Changeset.opAttributeValue(opIter.next(), 'list', rep.apool) || '';
+ }
+ }
+ return '';
+ }
+
+ function setLineListType(lineNum, listType) {
+ setLineListTypes([[lineNum, listType]]);
+ }
+
+ function setLineListTypes(lineNumTypePairsInOrder) {
+ var loc = [0,0];
+ var builder = Changeset.builder(rep.lines.totalWidth());
+ for(var i=0;i<lineNumTypePairsInOrder.length;i++) {
+ var pair = lineNumTypePairsInOrder[i];
+ var lineNum = pair[0];
+ var listType = pair[1];
+ buildKeepRange(builder, loc, (loc = [lineNum,0]));
+ if (getLineListType(lineNum)) {
+ // already a line marker
+ if (listType) {
+ // make different list type
+ buildKeepRange(builder, loc, (loc = [lineNum,1]),
+ [['list',listType]], rep.apool);
+ }
+ else {
+ // remove list marker
+ buildRemoveRange(builder, loc, (loc = [lineNum,1]));
+ }
+ }
+ else {
+ // currently no line marker
+ if (listType) {
+ // add a line marker
+ builder.insert('*', [['author', thisAuthor],
+ ['insertorder', 'first'],
+ ['list', listType]], rep.apool);
+ }
+ }
+ }
+
+ var cs = builder.toString();
+ if (! Changeset.isIdentity(cs)) {
+ performDocumentApplyChangeset(cs);
+ }
+ }
+
+ function doInsertUnorderedList() {
+ if (! (rep.selStart && rep.selEnd)) {
+ return;
+ }
+
+ var firstLine, lastLine;
+ firstLine = rep.selStart[0];
+ lastLine = Math.max(firstLine,
+ rep.selEnd[0] - ((rep.selEnd[1] == 0) ? 1 : 0));
+
+ var allLinesAreList = true;
+ for(var n=firstLine;n<=lastLine;n++) {
+ if (! getLineListType(n)) {
+ allLinesAreList = false;
+ break;
+ }
+ }
+
+ var mods = [];
+ for(var n=firstLine;n<=lastLine;n++) {
+ var t = getLineListType(n);
+ mods.push([n, allLinesAreList ? '' : (t ? t : 'bullet1')]);
+ }
+ setLineListTypes(mods);
+ }
+
+ var mozillaFakeArrows = (browser.mozilla && (function() {
+ // In Firefox 2, arrow keys are unstable while DOM-manipulating
+ // operations are going on. Specifically, if an operation
+ // (computation that ties up the event queue) is going on (in the
+ // call-stack of some event, like a timeout) that at some point
+ // mutates nodes involved in the selection, then the arrow
+ // keypress may (randomly) move the caret to the beginning or end
+ // of the document. If the operation also mutates the selection
+ // range, the old selection or the new selection may be used, or
+ // neither.
+
+ // As long as the arrow is pressed during the busy operation, it
+ // doesn't seem to matter that the keydown and keypress events
+ // aren't generated until afterwards, or that the arrow movement
+ // can still be stopped (meaning it hasn't been performed yet);
+ // Firefox must be preserving some old information about the
+ // selection or the DOM from when the key was initially pressed.
+ // However, it also doesn't seem to matter when the key was
+ // actually pressed relative to the time of the mutation within
+ // the prolonged operation. Also, even in very controlled tests
+ // (like a mutation followed by a long period of busyWaiting), the
+ // problem shows up often but not every time, with no discernable
+ // pattern. Who knows, it could have something to do with the
+ // caret-blinking timer, or DOM changes not being applied
+ // immediately.
+
+ // This problem, mercifully, does not show up at all in IE or
+ // Safari. My solution is to have my own, full-featured arrow-key
+ // implementation for Firefox.
+
+ // Note that the problem addressed here is potentially very subtle,
+ // especially if the operation is quick and is timed to usually happen
+ // when the user is idle.
+
+ // features:
+ // - 'up' and 'down' arrows preserve column when passing through shorter lines
+ // - shift-arrows extend the "focus" point, which may be start or end of range
+ // - the focus point is kept horizontally and vertically scrolled into view
+ // - arrows without shift cause caret to move to beginning or end of selection (left,right)
+ // or move focus point up or down a line (up,down)
+ // - command-(left,right,up,down) on Mac acts like (line-start, line-end, doc-start, doc-end)
+ // - takes wrapping into account when doesWrap is true, i.e. up-arrow and down-arrow move
+ // between the virtual lines within a wrapped line; this was difficult, and unfortunately
+ // requires mutating the DOM to get the necessary information
+
+ var savedFocusColumn = 0; // a value of 0 has no effect
+ var updatingSelectionNow = false;
+
+ function getVirtualLineView(lineNum) {
+ var lineNode = rep.lines.atIndex(lineNum).lineNode;
+ while (lineNode.firstChild && isBlockElement(lineNode.firstChild)) {
+ lineNode = lineNode.firstChild;
+ }
+ return makeVirtualLineView(lineNode);
+ }
+
+ function markerlessLineAndChar(line, chr) {
+ return [line, chr - rep.lines.atIndex(line).lineMarker];
+ }
+ function markerfulLineAndChar(line, chr) {
+ return [line, chr + rep.lines.atIndex(line).lineMarker];
+ }
+
+ return {
+ notifySelectionChanged: function() {
+ if (! updatingSelectionNow) {
+ savedFocusColumn = 0;
+ }
+ },
+ handleKeyEvent: function(evt) {
+ // returns "true" if handled
+ if (evt.type != "keypress") return false;
+ var keyCode = evt.keyCode;
+ if (keyCode < 37 || keyCode > 40) return false;
+ incorporateUserChanges();
+
+ if (!(rep.selStart && rep.selEnd)) return true;
+
+ // {byWord,toEnd,normal}
+ var moveMode = (evt.altKey ? "byWord" :
+ (evt.ctrlKey ? "byWord" :
+ (evt.metaKey ? "toEnd" :
+ "normal")));
+
+ var anchorCaret =
+ markerlessLineAndChar(rep.selStart[0], rep.selStart[1]);
+ var focusCaret =
+ markerlessLineAndChar(rep.selEnd[0], rep.selEnd[1]);
+ var wasCaret = isCaret();
+ if (rep.selFocusAtStart) {
+ var tmp = anchorCaret; anchorCaret = focusCaret; focusCaret = tmp;
+ }
+ var K_UP = 38, K_DOWN = 40, K_LEFT = 37, K_RIGHT = 39;
+ var dontMove = false;
+ if (wasCaret && ! evt.shiftKey) {
+ // collapse, will mutate both together
+ anchorCaret = focusCaret;
+ }
+ else if ((! wasCaret) && (! evt.shiftKey)) {
+ if (keyCode == K_LEFT) {
+ // place caret at beginning
+ if (rep.selFocusAtStart) anchorCaret = focusCaret;
+ else focusCaret = anchorCaret;
+ if (moveMode == "normal") dontMove = true;
+ }
+ else if (keyCode == K_RIGHT) {
+ // place caret at end
+ if (rep.selFocusAtStart) focusCaret = anchorCaret;
+ else anchorCaret = focusCaret;
+ if (moveMode == "normal") dontMove = true;
+ }
+ else {
+ // collapse, will mutate both together
+ anchorCaret = focusCaret;
+ }
+ }
+ if (! dontMove) {
+ function lineLength(i) {
+ var entry = rep.lines.atIndex(i);
+ return entry.text.length - entry.lineMarker;
+ }
+ function lineText(i) {
+ var entry = rep.lines.atIndex(i);
+ return entry.text.substring(entry.lineMarker);
+ }
+
+ if (keyCode == K_UP || keyCode == K_DOWN) {
+ var up = (keyCode == K_UP);
+ var canChangeLines = ((up && focusCaret[0]) ||
+ ((!up) && focusCaret[0] < rep.lines.length()-1));
+ var virtualLineView, virtualLineSpot, canChangeVirtualLines = false;
+ if (doesWrap) {
+ virtualLineView = getVirtualLineView(focusCaret[0]);
+ virtualLineSpot = virtualLineView.getVLineAndOffsetForChar(focusCaret[1]);
+ canChangeVirtualLines = ((up && virtualLineSpot.vline > 0) ||
+ ((!up) && virtualLineSpot.vline < (
+ virtualLineView.getNumVirtualLines() - 1)));
+ }
+ var newColByVirtualLineChange;
+ if (moveMode == "toEnd") {
+ if (up) {
+ focusCaret[0] = 0;
+ focusCaret[1] = 0;
+ }
+ else {
+ focusCaret[0] = rep.lines.length()-1;
+ focusCaret[1] = lineLength(focusCaret[0]);
+ }
+ }
+ else if (moveMode == "byWord") {
+ // move by "paragraph", a feature that Firefox lacks but IE and Safari both have
+ if (up) {
+ if (focusCaret[1] == 0 && canChangeLines) {
+ focusCaret[0]--;
+ focusCaret[1] = 0;
+ }
+ else focusCaret[1] = 0;
+ }
+ else {
+ var lineLen = lineLength(focusCaret[0]);
+ if (browser.windows) {
+ if (canChangeLines) {
+ focusCaret[0]++;
+ focusCaret[1] = 0;
+ }
+ else {
+ focusCaret[1] = lineLen;
+ }
+ }
+ else {
+ if (focusCaret[1] == lineLen && canChangeLines) {
+ focusCaret[0]++;
+ focusCaret[1] = lineLength(focusCaret[0]);
+ }
+ else {
+ focusCaret[1] = lineLen;
+ }
+ }
+ }
+ savedFocusColumn = 0;
+ }
+ else if (canChangeVirtualLines) {
+ var vline = virtualLineSpot.vline;
+ var offset = virtualLineSpot.offset;
+ if (up) vline--;
+ else vline++;
+ if (savedFocusColumn > offset) offset = savedFocusColumn;
+ else {
+ savedFocusColumn = offset;
+ }
+ var newSpot = virtualLineView.getCharForVLineAndOffset(vline, offset);
+ focusCaret[1] = newSpot.lineChar;
+ }
+ else if (canChangeLines) {
+ if (up) focusCaret[0]--;
+ else focusCaret[0]++;
+ var offset = focusCaret[1];
+ if (doesWrap) {
+ offset = virtualLineSpot.offset;
+ }
+ if (savedFocusColumn > offset) offset = savedFocusColumn;
+ else {
+ savedFocusColumn = offset;
+ }
+ if (doesWrap) {
+ var newLineView = getVirtualLineView(focusCaret[0]);
+ var vline = (up ? newLineView.getNumVirtualLines()-1 : 0);
+ var newSpot = newLineView.getCharForVLineAndOffset(vline, offset);
+ focusCaret[1] = newSpot.lineChar;
+ }
+ else {
+ var lineLen = lineLength(focusCaret[0]);
+ if (offset > lineLen) offset = lineLen;
+ focusCaret[1] = offset;
+ }
+ }
+ else {
+ if (up) focusCaret[1] = 0;
+ else focusCaret[1] = lineLength(focusCaret[0]);
+ savedFocusColumn = 0;
+ }
+ }
+ else if (keyCode == K_LEFT || keyCode == K_RIGHT) {
+ var left = (keyCode == K_LEFT);
+ if (left) {
+ if (moveMode == "toEnd") focusCaret[1] = 0;
+ else if (focusCaret[1] > 0) {
+ if (moveMode == "byWord") {
+ focusCaret[1] = moveByWordInLine(lineText(focusCaret[0]), focusCaret[1], false);
+ }
+ else {
+ focusCaret[1]--;
+ }
+ }
+ else if (focusCaret[0] > 0) {
+ focusCaret[0]--;
+ focusCaret[1] = lineLength(focusCaret[0]);
+ if (moveMode == "byWord") {
+ focusCaret[1] = moveByWordInLine(lineText(focusCaret[0]), focusCaret[1], false);
+ }
+ }
+ }
+ else {
+ var lineLen = lineLength(focusCaret[0]);
+ if (moveMode == "toEnd") focusCaret[1] = lineLen;
+ else if (focusCaret[1] < lineLen) {
+ if (moveMode == "byWord") {
+ focusCaret[1] = moveByWordInLine(lineText(focusCaret[0]), focusCaret[1], true);
+ }
+ else {
+ focusCaret[1]++;
+ }
+ }
+ else if (focusCaret[0] < rep.lines.length()-1) {
+ focusCaret[0]++;
+ focusCaret[1] = 0;
+ if (moveMode == "byWord") {
+ focusCaret[1] = moveByWordInLine(lineText(focusCaret[0]), focusCaret[1], true);
+ }
+ }
+ }
+ savedFocusColumn = 0;
+ }
+ }
+
+ var newSelFocusAtStart = ((focusCaret[0] < anchorCaret[0]) ||
+ (focusCaret[0] == anchorCaret[0] &&
+ focusCaret[1] < anchorCaret[1]));
+ var newSelStart = (newSelFocusAtStart ? focusCaret : anchorCaret);
+ var newSelEnd = (newSelFocusAtStart ? anchorCaret : focusCaret);
+ updatingSelectionNow = true;
+ performSelectionChange(markerfulLineAndChar(newSelStart[0],
+ newSelStart[1]),
+ markerfulLineAndChar(newSelEnd[0],
+ newSelEnd[1]),
+ newSelFocusAtStart);
+ updatingSelectionNow = false;
+ currentCallStack.userChangedSelection = true;
+ return true;
+ }
+ };
+ })());
+
+
+ // stolen from jquery-1.2.1
+ function fixEvent(event) {
+ // store a copy of the original event object
+ // and clone to set read-only properties
+ var originalEvent = event;
+ event = extend({}, originalEvent);
+
+ // add preventDefault and stopPropagation since
+ // they will not work on the clone
+ event.preventDefault = function() {
+ // if preventDefault exists run it on the original event
+ if (originalEvent.preventDefault)
+ originalEvent.preventDefault();
+ // otherwise set the returnValue property of the original event to false (IE)
+ originalEvent.returnValue = false;
+ };
+ event.stopPropagation = function() {
+ // if stopPropagation exists run it on the original event
+ if (originalEvent.stopPropagation)
+ originalEvent.stopPropagation();
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ originalEvent.cancelBubble = true;
+ };
+
+ // Fix target property, if necessary
+ if ( !event.target && event.srcElement )
+ event.target = event.srcElement;
+
+ // check if target is a textnode (safari)
+ if (browser.safari && event.target.nodeType == 3)
+ event.target = originalEvent.target.parentNode;
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement )
+ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var e = document.documentElement, b = document.body;
+ event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
+ event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
+ }
+
+ // Add which for key events
+ if ( !event.which && (event.charCode || event.keyCode) )
+ event.which = event.charCode || event.keyCode;
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey )
+ event.metaKey = event.ctrlKey;
+
+ // Add which for click: 1 == left; 2 == middle; 3 == right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button )
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
+ return event;
+ }
+
+ var lineNumbersShown;
+ var sideDivInner;
+ function initLineNumbers() {
+ lineNumbersShown = 1;
+ sideDiv.innerHTML =
+ '<table border="0" cellpadding="0" cellspacing="0" align="right">'+
+ '<tr><td id="sidedivinner"><div>1</div></td></tr></table>';
+ sideDivInner = outerWin.document.getElementById("sidedivinner");
+ }
+
+ function updateLineNumbers() {
+ var newNumLines = rep.lines.length();
+ if (newNumLines < 1) newNumLines = 1;
+ if (newNumLines != lineNumbersShown) {
+ var container = sideDivInner;
+ var odoc = outerWin.document;
+ while (lineNumbersShown < newNumLines) {
+ lineNumbersShown++;
+ var n = lineNumbersShown;
+ var div = odoc.createElement("DIV");
+ div.appendChild(odoc.createTextNode(String(n)));
+ container.appendChild(div);
+ }
+ while (lineNumbersShown > newNumLines) {
+ container.removeChild(container.lastChild);
+ lineNumbersShown--;
+ }
+ }
+
+ if (currentCallStack && currentCallStack.domClean) {
+ var a = sideDivInner.firstChild;
+ var b = doc.body.firstChild;
+ while (a && b) {
+ var h = (b.clientHeight || b.offsetHeight);
+ if (b.nextSibling) {
+ // when text is zoomed in mozilla, divs have fractional
+ // heights (though the properties are always integers)
+ // and the line-numbers don't line up unless we pay
+ // attention to where the divs are actually placed...
+ // (also: padding on TTs/SPANs in IE...)
+ h = b.nextSibling.offsetTop - b.offsetTop;
+ }
+ if (h) {
+ var hpx = h+"px";
+ if (a.style.height != hpx)
+ a.style.height = hpx;
+ }
+ a = a.nextSibling;
+ b = b.nextSibling;
+ }
+
+ // fix if first line has margin (f.e. h1 in first line)
+ sideDivInner.firstChild.style.marginTop =
+ (doc.body.firstChild.offsetTop - sideDivInner.firstChild.offsetTop +
+ parseInt(sideDivInner.firstChild.style.marginTop + "0")) + "px";
+ }
+ }
+
+};
+
+OUTER(this);
diff --git a/trunk/infrastructure/ace/www/ace2_outer.js b/trunk/infrastructure/ace/www/ace2_outer.js
new file mode 100644
index 0000000..b0fc20c
--- /dev/null
+++ b/trunk/infrastructure/ace/www/ace2_outer.js
@@ -0,0 +1,214 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+Ace2Editor.registry = { nextId: 1 };
+
+function Ace2Editor() {
+ var thisFunctionsName = "Ace2Editor";
+ var ace2 = Ace2Editor;
+
+ var editor = {};
+ var info = { editor: editor, id: (ace2.registry.nextId++) };
+ var loaded = false;
+
+ var actionsPendingInit = [];
+ function pendingInit(func, optDoNow) {
+ return function() {
+ var that = this;
+ var args = arguments;
+ function action() {
+ func.apply(that, args);
+ }
+ if (optDoNow) {
+ optDoNow.apply(that, args);
+ }
+ if (loaded) {
+ action();
+ }
+ else {
+ actionsPendingInit.push(action);
+ }
+ };
+ }
+ function doActionsPendingInit() {
+ for(var i=0;i<actionsPendingInit.length;i++) {
+ actionsPendingInit[i]();
+ }
+ actionsPendingInit = [];
+ }
+
+ ace2.registry[info.id] = info;
+
+ editor.importText = pendingInit(function(newCode, undoable) {
+ info.ace_importText(newCode, undoable); });
+ editor.importAText = pendingInit(function(newCode, apoolJsonObj, undoable) {
+ info.ace_importAText(newCode, apoolJsonObj, undoable); });
+ editor.exportText = function() {
+ if (! loaded) return "(awaiting init)\n";
+ return info.ace_exportText();
+ };
+ editor.getFrame = function() { return info.frame || null; };
+ editor.focus = pendingInit(function() { info.ace_focus(); });
+ editor.adjustSize = pendingInit(function() {
+ var frameParent = info.frame.parentNode;
+ var parentHeight = frameParent.clientHeight;
+ // deal with case where iframe is hidden, no clientHeight
+ info.frame.style.height = (parentHeight ? parentHeight+"px" :
+ frameParent.style.height);
+ info.ace_editorChangedSize();
+ });
+ editor.setEditable = pendingInit(function(newVal) { info.ace_setEditable(newVal); });
+ editor.getFormattedCode = function() { return info.ace_getFormattedCode(); };
+ editor.setOnKeyPress = pendingInit(function (handler) { info.ace_setOnKeyPress(handler); });
+ editor.setOnKeyDown = pendingInit(function (handler) { info.ace_setOnKeyDown(handler); });
+ editor.setNotifyDirty = pendingInit(function (handler) { info.ace_setNotifyDirty(handler); });
+
+ editor.setProperty = pendingInit(function(key, value) { info.ace_setProperty(key, value); });
+ editor.getDebugProperty = function(prop) { return info.ace_getDebugProperty(prop); };
+
+ editor.setBaseText = pendingInit(function(txt) { info.ace_setBaseText(txt); });
+ editor.setBaseAttributedText = pendingInit(function(atxt, apoolJsonObj) {
+ info.ace_setBaseAttributedText(atxt, apoolJsonObj); });
+ editor.applyChangesToBase = pendingInit(function (changes, optAuthor,apoolJsonObj) {
+ info.ace_applyChangesToBase(changes, optAuthor, apoolJsonObj); });
+ // prepareUserChangeset:
+ // Returns null if no new changes or ACE not ready. Otherwise, bundles up all user changes
+ // to the latest base text into a Changeset, which is returned (as a string if encodeAsString).
+ // If this method returns a truthy value, then applyPreparedChangesetToBase can be called
+ // at some later point to consider these changes part of the base, after which prepareUserChangeset
+ // must be called again before applyPreparedChangesetToBase. Multiple consecutive calls
+ // to prepareUserChangeset will return an updated changeset that takes into account the
+ // latest user changes, and modify the changeset to be applied by applyPreparedChangesetToBase
+ // accordingly.
+ editor.prepareUserChangeset = function() {
+ if (! loaded) return null;
+ return info.ace_prepareUserChangeset();
+ };
+ editor.applyPreparedChangesetToBase = pendingInit(
+ function() { info.ace_applyPreparedChangesetToBase(); });
+ editor.setUserChangeNotificationCallback = pendingInit(function(callback) {
+ info.ace_setUserChangeNotificationCallback(callback);
+ });
+ editor.setAuthorInfo = pendingInit(function(author, authorInfo) {
+ info.ace_setAuthorInfo(author, authorInfo);
+ });
+ editor.setAuthorSelectionRange = pendingInit(function(author, start, end) {
+ info.ace_setAuthorSelectionRange(author, start, end);
+ });
+
+ editor.getUnhandledErrors = function() {
+ if (! loaded) return [];
+ // returns array of {error: <browser Error object>, time: +new Date()}
+ return info.ace_getUnhandledErrors();
+ };
+ editor.execCommand = pendingInit(function(cmd, arg1) {
+ info.ace_execCommand(cmd, arg1);
+ });
+
+ // calls to these functions ($$INCLUDE_...) are replaced when this file is processed
+ // and compressed, putting the compressed code from the named file directly into the
+ // source here.
+
+ var $$INCLUDE_CSS = function(fileName) {
+ return '<link rel="stylesheet" type="text/css" href="'+fileName+'"/>';
+ };
+ var $$INCLUDE_JS = function(fileName) {
+ return '\x3cscript type="text/javascript" src="'+fileName+'">\x3c/script>';
+ };
+ var $$INCLUDE_JS_DEV = $$INCLUDE_JS;
+ var $$INCLUDE_CSS_DEV = $$INCLUDE_CSS;
+
+ var $$INCLUDE_CSS_Q = function(fileName) {
+ return '\'<link rel="stylesheet" type="text/css" href="'+fileName+'"/>\'';
+ };
+ var $$INCLUDE_JS_Q = function(fileName) {
+ return '\'\\x3cscript type="text/javascript" src="'+fileName+'">\\x3c/script>\'';
+ };
+ var $$INCLUDE_JS_Q_DEV = $$INCLUDE_JS_Q;
+ var $$INCLUDE_CSS_Q_DEV = $$INCLUDE_CSS_Q;
+
+ editor.destroy = pendingInit(function() {
+ info.ace_dispose();
+ info.frame.parentNode.removeChild(info.frame);
+ delete ace2.registry[info.id];
+ info = null; // prevent IE 6 closure memory leaks
+ });
+
+ editor.init = function(containerId, initialCode, doneFunc) {
+
+ editor.importText(initialCode);
+
+ info.onEditorReady = function() {
+ loaded = true;
+ doActionsPendingInit();
+ doneFunc();
+ };
+
+ (function() {
+ var doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '+
+ '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
+
+ var iframeHTML = ["'"+doctype+"<html><head>'"];
+ // these lines must conform to a specific format because they are passed by the build script:
+ iframeHTML.push($$INCLUDE_CSS_Q("editor.css syntax.css inner.css"));
+ //iframeHTML.push(INCLUDE_JS_Q_DEV("ace2_common_dev.js"));
+ //iframeHTML.push(INCLUDE_JS_Q_DEV("profiler.js"));
+ iframeHTML.push($$INCLUDE_JS_Q("ace2_common.js skiplist.js virtual_lines.js easysync2.js cssmanager.js colorutils.js undomodule.js contentcollector.js changesettracker.js linestylefilter.js domline.js"));
+ iframeHTML.push($$INCLUDE_JS_Q("ace2_inner.js"));
+ iframeHTML.push('\'\\n<style type="text/css" title="dynamicsyntax"></style>\\n\'');
+ iframeHTML.push('\'</head><body id="innerdocbody" class="syntax" spellcheck="false">&nbsp;</body></html>\'');
+
+ var outerScript = 'editorId = "'+info.id+'"; editorInfo = parent.'+
+ thisFunctionsName+'.registry[editorId]; '+
+ 'window.onload = function() '+
+ '{ window.onload = null; setTimeout'+
+ '(function() '+
+ '{ var iframe = document.createElement("IFRAME"); '+
+ 'iframe.scrolling = "no"; var outerdocbody = document.getElementById("outerdocbody"); '+
+ 'iframe.frameBorder = 0; iframe.allowTransparency = true; '+ // for IE
+ 'outerdocbody.insertBefore(iframe, outerdocbody.firstChild); '+
+ 'iframe.ace_outerWin = window; '+
+ 'readyFunc = function() { editorInfo.onEditorReady(); readyFunc = null; editorInfo = null; }; '+
+ 'var doc = iframe.contentWindow.document; doc.open(); doc.write('+
+ iframeHTML.join('+')+'); doc.close(); '+
+ '}, 0); }';
+
+ var outerHTML = [doctype, '<html><head>',
+ $$INCLUDE_CSS("editor.css"),
+ // bizarrely, in FF2, a file with no "external" dependencies won't finish loading properly
+ // (throbs busy while typing)
+ '<link rel="stylesheet" type="text/css" href="data:text/css,"/>',
+ '\x3cscript>', outerScript, '\x3c/script>',
+ '</head><body id="outerdocbody"><div id="sidediv"><!-- --></div><div id="linemetricsdiv">x</div><div id="overlaysdiv"><!-- --></div></body></html>'];
+
+ var outerFrame = document.createElement("IFRAME");
+ outerFrame.frameBorder = 0; // for IE
+ info.frame = outerFrame;
+ document.getElementById(containerId).appendChild(outerFrame);
+
+ var editorDocument = outerFrame.contentWindow.document;
+
+ editorDocument.open();
+ editorDocument.write(outerHTML.join(''));
+ editorDocument.close();
+
+ editor.adjustSize();
+ })();
+ };
+
+ return editor;
+}
diff --git a/trunk/infrastructure/ace/www/ace2_wrapper.js b/trunk/infrastructure/ace/www/ace2_wrapper.js
new file mode 100644
index 0000000..b62e09d
--- /dev/null
+++ b/trunk/infrastructure/ace/www/ace2_wrapper.js
@@ -0,0 +1,226 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Exposes interface of Aaron's ace.js, including switching between plain and fancy editor.
+// Currently uses Aaron's code and depends on JQuery for plain editor.
+// -- David
+
+
+AppjetCodeEditor = function() {
+ this.browserSupportsModern = false;
+ this.aceImpl = null;
+ this.containerDiv = null;
+ this.containerId = null;
+ this.onKeyPress = null;
+ this.onKeyDown = null;
+ this.notifyDirty = null;
+ this.isEditable = true;
+};
+
+// TODO: take editorType as a param
+
+AppjetCodeEditor.prototype.init = function(containerId,
+ initialCode,
+ startModern,
+ done) {
+ this.containerId = containerId;
+ this.containerDiv = document.getElementById(containerId);
+
+ if (startModern) {
+ this.aceImplModern = new Ace2Editor();
+ this.aceImpl = this.aceImplModern;
+ } else {
+ this.aceImplPlain = new ACEPlain();
+ this.aceImpl = this.aceImplPlain;
+ }
+ this.aceImpl.init(containerId, initialCode, done);
+};
+
+AppjetCodeEditor.prototype.updateBottomLinks = function() {
+ if (ACEPlain.prototype.isPrototypeOf(this.aceImpl)) {
+ this.toggleModernLink.innerHTML = 'switch to rich text';
+ } else {
+ this.toggleModernLink.innerHTML = 'switch to plaintext';
+ }
+};
+
+AppjetCodeEditor.prototype.toggleModernImpl = function() {
+ var codeSave = this.aceImpl.exportCode();
+
+ if (ACEPlain.prototype.isPrototypeOf(this.aceImpl)) {
+ this.aceImpl.destroy();
+ this.aceImpl = new Ace2Editor();
+ } else {
+ this.aceImpl.destroy();
+ this.aceImpl = new ACEPlain();
+ }
+ var cont = this.containerDiv;
+ while (cont.firstChild) {
+ cont.removeChild(cont.firstChild);
+ }
+ this.aceImpl.init(this.containerId, codeSave, function() {} );
+
+ var ace = this;
+ function capitalize(str) { return str.substr(0,1).toUpperCase()+str.substr(1); }
+ $.each(["onKeyPress", "onKeyDown", "notifyDirty"], function() {
+ var setter = 'set'+capitalize(this);
+ if (ace[this]) {
+ ace.aceImpl[setter](ace[this]);
+ }
+ });
+ this.aceImpl.setEditable(this.isEditable);
+};
+
+AppjetCodeEditor.prototype.adjustContainerSizes = function() {
+ // TODO: adjust container sizes here.
+};
+
+//================================================================
+// Interface to ACE
+//================================================================
+
+AppjetCodeEditor.prototype.setOnKeyPress = function(f) {
+ this.onKeyPress = f;
+ this.aceImpl.setOnKeyPress(this.onKeyPress);
+};
+
+AppjetCodeEditor.prototype.setOnKeyDown = function(f) {
+ this.onKeyDown = f;
+ this.aceImpl.setOnKeyDown(this.onKeyDown);
+};
+
+AppjetCodeEditor.prototype.setNotifyDirty = function(f) {
+ this.notifyDirty = f;
+ this.aceImpl.setNotifyDirty(this.notifyDirty);
+};
+
+AppjetCodeEditor.prototype.setEditable = function(x) {
+ this.isEditable = x;
+ this.aceImpl.setEditable(x);
+};
+
+AppjetCodeEditor.prototype.adjustSize = function() {
+ this.adjustContainerSizes();
+ this.aceImpl.adjustSize();
+};
+
+//------- straight pass-through functions ---------------
+
+AppjetCodeEditor.prototype.importCode = function(rawCode) {
+ this.aceImpl.importCode(rawCode);
+};
+
+AppjetCodeEditor.prototype.exportCode = function() {
+ return this.aceImpl.exportCode();
+};
+
+AppjetCodeEditor.prototype.getFormattedCode = function() {
+ return this.aceImpl.getFormattedCode();
+};
+
+AppjetCodeEditor.prototype.focus = function() {
+ this.aceImpl.focus();
+};
+
+/* implementation of ACE with simple textarea */
+
+ACEPlain = function() {
+ this.containerDiv = null;
+ this.textArea = null;
+ this.onKeyPress = null;
+ this.onKeyDown = null;
+ this.notifyDirty = null;
+};
+
+ACEPlain.prototype.init = function(containerId, initialCode, done) {
+ var container = $('#'+containerId); //document.getElementById(containerId);
+
+ // empty container div
+ container.empty();
+ container.css('padding', 0);
+
+ // create textarea
+ var textArea = $('<textarea></textarea>');
+ textArea.css('border', 0).
+ css('margin', 0).
+ css('padding', 0).
+ css('background', 'transparent').
+ css('color', '#000').
+ attr('spellcheck', false);
+
+ // add textarea to container
+ container.append(textArea);
+
+ // remember nodes
+ this.textArea = textArea;
+ this.containerDiv = container;
+
+ // first-time size adjustments
+ this.adjustSize();
+
+ // remember keystrokes
+ var ace = this;
+ textArea.keydown(function(e) {
+ if (ace.onKeyDown) { ace.onKeyDown(e); }
+ });
+ textArea.keypress(function(e) {
+ if (ace.notifyDirty) { ace.notifyDirty(); }
+ if (ace.onKeyPress) { ace.onKeyPress(e); }
+ });
+
+ // set initial code
+ textArea.get(0).value = initialCode;
+
+ // callback
+ done();
+};
+
+ACEPlain.prototype.importCode = function(rawCode) {
+ this.textArea.attr('value', rawCode);
+};
+
+ACEPlain.prototype.exportCode = function() {
+ return this.textArea.attr('value');
+};
+
+ACEPlain.prototype.adjustSize = function() {
+ this.textArea.width('100%');
+ this.textArea.height(this.containerDiv.height());
+};
+
+ACEPlain.prototype.setOnKeyPress = function(f) { this.onKeyPress = f; };
+ACEPlain.prototype.setOnKeyDown = function(f) { this.onKeyDown = f; };
+ACEPlain.prototype.setNotifyDirty = function(f) { this.notifyDirty = f; };
+
+ACEPlain.prototype.getFormattedCode = function() {
+ return ('<pre>' + this.textArea.attr('value') + '</pre>');
+};
+
+ACEPlain.prototype.setEditable = function(editable) {
+ if (editable) {
+ this.textArea.removeAttr('disabled');
+ } else {
+ this.textArea.attr('disabled', true);
+ }
+};
+
+ACEPlain.prototype.focus = function() {
+ this.textArea.focus();
+};
+
+ACEPlain.prototype.destroy = function() {
+ // nothing
+};
diff --git a/trunk/infrastructure/ace/www/bbtree.js b/trunk/infrastructure/ace/www/bbtree.js
new file mode 100644
index 0000000..70cb8c0
--- /dev/null
+++ b/trunk/infrastructure/ace/www/bbtree.js
@@ -0,0 +1,372 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+function makeBBTree(transferContents, augment) {
+
+ var nil = [];
+ nil.push(nil,nil);
+ nil.level = 0;
+ var root = nil;
+ augment = (augment || (function(n) {}));
+
+ function skew(t) {
+ if (t != nil && t[0].level == t.level) {
+ // rotate right
+ var tmp = t;
+ t = t[0];
+ tmp[0] = t[1];
+ t[1] = tmp;
+ reaugment(tmp);
+ reaugment(t);
+ }
+ return t;
+ }
+
+ function split(t) {
+ if (t != nil && t[1][1].level == t.level) {
+ // rotate left
+ var tmp = t;
+ t = t[1];
+ tmp[1] = t[0];
+ t[0] = tmp;
+ t.level++;
+ reaugment(tmp);
+ reaugment(t);
+ }
+ return t;
+ }
+
+ function reaugment(n) {
+ if (n != nil) augment(n);
+ }
+
+ var self = {};
+
+ self.insert = function(compare) {
+ var n;
+ function recurse(t) {
+ if (t == nil) {
+ t = [nil,nil];
+ t.level = 1;
+ n = t;
+ }
+ else {
+ var cmp = compare(t);
+ if (cmp < 0) {
+ t[0] = recurse(t[0]);
+ }
+ else if (cmp > 0) {
+ t[1] = recurse(t[1]);
+ }
+ t = skew(t);
+ t = split(t);
+ }
+ reaugment(t);
+ return t;
+ }
+ root = recurse(root);
+ return n;
+ }
+
+ self.remove = function(compare) {
+ var deleted = nil;
+ var last;
+ var deletedEqual = false;
+ function recurse(t) {
+ if (t != nil) {
+ last = t;
+ var cmp = compare(t);
+ if (cmp < 0) {
+ t[0] = recurse(t[0]);
+ }
+ else {
+ deleted = t;
+ // whether the node called "deleted" is actually a
+ // match for deletion
+ deletedEqual = (cmp == 0);
+ t[1] = recurse(t[1]);
+ }
+ if (t == last && deleted != nil && deletedEqual) {
+ // t may be same node as deleted
+ transferContents(t, deleted);
+ t = t[1];
+ reaugment(deleted);
+ deleted = nil;
+ }
+ else {
+ reaugment(t);
+ if (t[0].level < t.level-1 ||
+ t[1].level < t.level-1) {
+ t.level--;
+ if (t[1].level > t.level)
+ t[1].level = t.level;
+ t = skew(t);
+ t[1] = skew(t[1]);
+ t[1][1] = skew(t[1][1]);
+ t = split(t);
+ t[1] = split(t[1]);
+ }
+ }
+ }
+ return t;
+ }
+ root = recurse(root);
+ }
+
+ self.find = function(compare) {
+ function recurse(t) {
+ if (t == nil) return t;
+ var cmp = compare(t);
+ if (cmp < 0) {
+ return recurse(t[0]);
+ }
+ else if (cmp > 0) {
+ return recurse(t[1]);
+ }
+ else {
+ return t;
+ }
+ }
+ var result = recurse(root);
+ return (result != nil && result) || null;
+ }
+
+ self.root = function() { return root; }
+
+ self.forEach = function(func) {
+ function recurse(t) {
+ if (t != nil) {
+ recurse(t[0]);
+ func(t);
+ recurse(t[1]);
+ }
+ }
+ recurse(root);
+ }
+
+ return self;
+}
+
+function makeBBList() {
+ var length = 0;
+ var totalWidth = 0;
+
+ function _treeSize(n) { return n.size || 0; }
+ function _treeWidth(n) { return n.width || 0; }
+ function _width(n) { return (n && n.entry && n.entry.width) || 0; }
+
+ function _transferContents(a, b) {
+ b.key = a.key;
+ b.entry = a.entry;
+ }
+ function _augment(n) {
+ n.size = _treeSize(n[0]) + _treeSize(n[1]) + 1;
+ n.width = _treeWidth(n[0]) + _treeWidth(n[1]) + _width(n);
+ }
+
+ var keyToEntry = {};
+
+ var bb = makeBBTree(transferContents, augment);
+
+ function makeIndexComparator(indexFunc) {
+ var curIndex = _treeSize(bb.root()[0]);
+ return function (n) {
+ var dir = indexFunc(curIndex, n);
+ if (dir < 0) {
+ curIndex -= _treeSize(n[0][1]) + 1;
+ }
+ else if (dir >= 0) {
+ curIndex += _treeSize(n[1][0]) + 1;
+ }
+ return dir;
+ }
+ }
+
+ function makeWidthComparator(widthFunc) {
+ var curIndex = _treeWidth(bb.root()[0]);
+ return function (n) {
+ var dir = indexFunc(curIndex, n);
+ if (dir < 0) {
+ curIndex -= _treeWidth(n[0][1]) + _width(n[0]);
+ }
+ else if (dir >= 0) {
+ curIndex += _treeWidth(n[1][0]) + _width(n);
+ }
+ return dir;
+ }
+ }
+
+ function numcomp(a,b) { if (a < b) return -1; if (a > b) return 1; return 0; }
+
+ function removeByIndex(idx) {
+ var entry;
+ bb.remove(makeComparator(function (curIndex, n) {
+ var cmp = numcomp(idx, curIndex);
+ if (cmp == 0) entry = n.entry;
+ return cmp;
+ }));
+ return entry;
+ }
+
+ function insertAtIndex(idx, entry) {
+ var newNode = bb.insert(makeComparator(function (curIndex) {
+ if (idx <= curIndex) return -1;
+ return 1;
+ }));
+ newNode.entry = entry;
+ return newNode;
+ }
+
+ var entriesByKey = {};
+
+ var self = {
+ splice: function (start, deleteCount, newEntryArray) {
+ for(var i=0;i<deleteCount;i++) {
+ var oldEntry = removeByIndex(start);
+ length--;
+ totalWidth -= (entry.width || 0);
+ delete entriesByKey[oldEntry.key];
+ }
+ for(var i=0;i<newEntryArray.length;i++) {
+ var entry = newEntryArray[i];
+ var newNode = insertAtIndex(start+i, entry);
+ length++;
+ totalWidth += (entry.width || 0);
+ entriesByKey[entry.key] = entry;
+ }
+ },
+ next: function (entry) {
+
+ }
+ };
+
+ return self;
+}
+
+/*function size(n) {
+ return n.size || 0;
+}
+
+var a = makeBBTree(function (a,b) {
+ b.data = a.data;
+},
+ function (n) {
+ n.size = size(n[0]) + size(n[1]) + 1;
+ });
+
+var arrayRep = [];
+
+function makeComparator(indexFunc) {
+ var curIndex = size(a.root()[0]);
+ return function (n) {
+ var dir = indexFunc(curIndex);
+ if (dir < 0) {
+ curIndex -= size(n[0][1]) + 1;
+ }
+ else if (dir >= 0) {
+ curIndex += size(n[1][0]) + 1;
+ }
+ return dir;
+ }
+}
+
+function insert(idx, data) {
+ arrayRep.splice(idx, 0, data);
+ var newNode = a.insert(makeComparator(function (curIndex) {
+ if (idx <= curIndex) return -1;
+ return 1;
+ }));
+ newNode.data = data;
+ checkRep();
+}
+
+function remove(idx) {
+ arrayRep.splice(idx, 1);
+ a.remove(makeComparator(function (curIndex) {
+ return numcomp(idx, curIndex);
+ }));
+ checkRep();
+}
+
+function genArray() {
+ var array = [];
+ a.forEach(function (n) { array.push(n.data); });
+ return array;
+}
+
+function checkRep() {
+ var array2 = genArray();
+ var str1 = array2.join(',');
+ var str2 = arrayRep.join(',');
+ if (str1 != str2) console.error(str1+" != "+str2);
+
+ a.forEach(function(n) {
+ if (size(n) != size(n[0]) + size(n[1]) + 1) {
+ console.error("size of "+n.data+" is wrong");
+ }
+ });
+}
+
+function print() {
+ console.log(genArray().join(','));
+}
+
+insert(0,1);
+insert(0,2);
+insert(0,3);
+insert(1,4);
+insert(4,5);
+insert(0,6);
+print();
+
+function numcomp(a,b) { if (a < b) return -1; if (a > b) return 1; return 0; }
+*/
+/*var tree = makeBBTree(function(a, b) { b.key = a.key; });
+function insert(x) { tree.insert(function(n) { return numcomp(x, n.key) }).key = x; }
+function remove(x) { tree.remove(function (n) { return numcomp(x, n.key); }); }
+function contains(x) { return !! tree.find(function (n) { return numcomp(x, n.key); }); }
+
+function print() {
+ function recurse(t) {
+ if (! ('key' in t)) return '';
+ return '('+recurse(t[0])+','+t.key+','+recurse(t[1])+')';
+ }
+ return recurse(tree.root());
+}
+
+
+insert(2);
+insert(1);
+insert(8);
+insert(7);
+console.log(print());
+insert(6);
+insert(3);
+insert(5);
+insert(4);
+console.log(print());
+remove(2);
+remove(1);
+remove(8);
+remove(7);
+console.log(print());
+//remove(6);
+//remove(3);
+//remove(5);
+//remove(4);
+//console.log(print());
+*/ \ No newline at end of file
diff --git a/trunk/infrastructure/ace/www/changesettracker.js b/trunk/infrastructure/ace/www/changesettracker.js
new file mode 100644
index 0000000..d6fe018
--- /dev/null
+++ b/trunk/infrastructure/ace/www/changesettracker.js
@@ -0,0 +1,170 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+function makeChangesetTracker(scheduler, apool, aceCallbacksProvider) {
+
+ // latest official text from server
+ var baseAText = Changeset.makeAText("\n");
+ // changes applied to baseText that have been submitted
+ var submittedChangeset = null;
+ // changes applied to submittedChangeset since it was prepared
+ var userChangeset = Changeset.identity(1);
+ // is the changesetTracker enabled
+ var tracking = false;
+ // stack state flag so that when we change the rep we don't
+ // handle the notification recursively. When setting, always
+ // unset in a "finally" block. When set to true, the setter
+ // takes change of userChangeset.
+ var applyingNonUserChanges = false;
+
+ var changeCallback = null;
+
+ var changeCallbackTimeout = null;
+ function setChangeCallbackTimeout() {
+ // can call this multiple times per call-stack, because
+ // we only schedule a call to changeCallback if it exists
+ // and if there isn't a timeout already scheduled.
+ if (changeCallback && changeCallbackTimeout === null) {
+ changeCallbackTimeout = scheduler.setTimeout(function() {
+ try {
+ changeCallback();
+ }
+ finally {
+ changeCallbackTimeout = null;
+ }
+ }, 0);
+ }
+ }
+
+ var self;
+ return self = {
+ isTracking: function() { return tracking; },
+ setBaseText: function(text) {
+ self.setBaseAttributedText(Changeset.makeAText(text), null);
+ },
+ setBaseAttributedText: function(atext, apoolJsonObj) {
+ aceCallbacksProvider.withCallbacks("setBaseText", function(callbacks) {
+ tracking = true;
+ baseAText = Changeset.cloneAText(atext);
+ if (apoolJsonObj) {
+ var wireApool = (new AttribPool()).fromJsonable(apoolJsonObj);
+ baseAText.attribs = Changeset.moveOpsToNewPool(baseAText.attribs, wireApool, apool);
+ }
+ submittedChangeset = null;
+ userChangeset = Changeset.identity(atext.text.length);
+ applyingNonUserChanges = true;
+ try {
+ callbacks.setDocumentAttributedText(atext);
+ }
+ finally {
+ applyingNonUserChanges = false;
+ }
+ });
+ },
+ composeUserChangeset: function(c) {
+ if (! tracking) return;
+ if (applyingNonUserChanges) return;
+ if (Changeset.isIdentity(c)) return;
+ userChangeset = Changeset.compose(userChangeset, c, apool);
+
+ setChangeCallbackTimeout();
+ },
+ applyChangesToBase: function (c, optAuthor, apoolJsonObj) {
+ if (! tracking) return;
+
+ aceCallbacksProvider.withCallbacks("applyChangesToBase", function(callbacks) {
+
+ if (apoolJsonObj) {
+ var wireApool = (new AttribPool()).fromJsonable(apoolJsonObj);
+ c = Changeset.moveOpsToNewPool(c, wireApool, apool);
+ }
+
+ baseAText = Changeset.applyToAText(c, baseAText, apool);
+
+ var c2 = c;
+ if (submittedChangeset) {
+ var oldSubmittedChangeset = submittedChangeset;
+ submittedChangeset = Changeset.follow(c, oldSubmittedChangeset, false, apool);
+ c2 = Changeset.follow(oldSubmittedChangeset, c, true, apool);
+ }
+
+ var preferInsertingAfterUserChanges = true;
+ var oldUserChangeset = userChangeset;
+ userChangeset = Changeset.follow(c2, oldUserChangeset, preferInsertingAfterUserChanges, apool);
+ var postChange =
+ Changeset.follow(oldUserChangeset, c2, ! preferInsertingAfterUserChanges, apool);
+
+ var preferInsertionAfterCaret = true; //(optAuthor && optAuthor > thisAuthor);
+
+ applyingNonUserChanges = true;
+ try {
+ callbacks.applyChangesetToDocument(postChange, preferInsertionAfterCaret);
+ }
+ finally {
+ applyingNonUserChanges = false;
+ }
+ });
+ },
+ prepareUserChangeset: function() {
+ // If there are user changes to submit, 'changeset' will be the
+ // changeset, else it will be null.
+ var toSubmit;
+ if (submittedChangeset) {
+ // submission must have been canceled, prepare new changeset
+ // that includes old submittedChangeset
+ toSubmit = Changeset.compose(submittedChangeset, userChangeset, apool);
+ }
+ else {
+ if (Changeset.isIdentity(userChangeset)) toSubmit = null;
+ else toSubmit = userChangeset;
+ }
+
+ var cs = null;
+ if (toSubmit) {
+ submittedChangeset = toSubmit;
+ userChangeset = Changeset.identity(Changeset.newLen(toSubmit));
+
+ cs = toSubmit;
+ }
+ var wireApool = null;
+ if (cs) {
+ var forWire = Changeset.prepareForWire(cs, apool);
+ wireApool = forWire.pool.toJsonable();
+ cs = forWire.translated;
+ }
+
+ var data = { changeset: cs, apool: wireApool };
+ return data;
+ },
+ applyPreparedChangesetToBase: function() {
+ if (! submittedChangeset) {
+ // violation of protocol; use prepareUserChangeset first
+ throw new Error("applySubmittedChangesToBase: no submitted changes to apply");
+ }
+ //bumpDebug("applying committed changeset: "+submittedChangeset.encodeToString(false));
+ baseAText = Changeset.applyToAText(submittedChangeset, baseAText, apool);
+ submittedChangeset = null;
+ },
+ setUserChangeNotificationCallback: function (callback) {
+ changeCallback = callback;
+ },
+ hasUncommittedChanges: function() {
+ return !!(submittedChangeset || (! Changeset.isIdentity(userChangeset)));
+ }
+ };
+
+}
diff --git a/trunk/infrastructure/ace/www/colorutils.js b/trunk/infrastructure/ace/www/colorutils.js
new file mode 100644
index 0000000..bb61de3
--- /dev/null
+++ b/trunk/infrastructure/ace/www/colorutils.js
@@ -0,0 +1,91 @@
+// THIS FILE IS ALSO SERVED AS CLIENT-SIDE JS
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var colorutils = {};
+
+// "#ffffff" or "#fff" or "ffffff" or "fff" to [1.0, 1.0, 1.0]
+colorutils.css2triple = function(cssColor) {
+ var sixHex = colorutils.css2sixhex(cssColor);
+ function hexToFloat(hh) {
+ return Number("0x"+hh)/255;
+ }
+ return [hexToFloat(sixHex.substr(0,2)),
+ hexToFloat(sixHex.substr(2,2)),
+ hexToFloat(sixHex.substr(4,2))];
+}
+
+// "#ffffff" or "#fff" or "ffffff" or "fff" to "ffffff"
+colorutils.css2sixhex = function(cssColor) {
+ var h = /[0-9a-fA-F]+/.exec(cssColor)[0];
+ if (h.length != 6) {
+ var a = h.charAt(0);
+ var b = h.charAt(1);
+ var c = h.charAt(2);
+ h = a+a+b+b+c+c;
+ }
+ return h;
+}
+
+// [1.0, 1.0, 1.0] -> "#ffffff"
+colorutils.triple2css = function(triple) {
+ function floatToHex(n) {
+ var n2 = colorutils.clamp(Math.round(n*255), 0, 255);
+ return ("0"+n2.toString(16)).slice(-2);
+ }
+ return "#" + floatToHex(triple[0]) +
+ floatToHex(triple[1]) + floatToHex(triple[2]);
+}
+
+
+colorutils.clamp = function(v,bot,top) { return v < bot ? bot : (v > top ? top : v); };
+colorutils.min3 = function(a,b,c) { return (a < b) ? (a < c ? a : c) : (b < c ? b : c); };
+colorutils.max3 = function(a,b,c) { return (a > b) ? (a > c ? a : c) : (b > c ? b : c); };
+colorutils.colorMin = function(c) { return colorutils.min3(c[0], c[1], c[2]); };
+colorutils.colorMax = function(c) { return colorutils.max3(c[0], c[1], c[2]); };
+colorutils.scale = function(v, bot, top) { return colorutils.clamp(bot + v*(top-bot), 0, 1); };
+colorutils.unscale = function(v, bot, top) { return colorutils.clamp((v-bot)/(top-bot), 0, 1); };
+
+colorutils.scaleColor = function(c, bot, top) {
+ return [colorutils.scale(c[0], bot, top),
+ colorutils.scale(c[1], bot, top),
+ colorutils.scale(c[2], bot, top)];
+}
+
+colorutils.unscaleColor = function(c, bot, top) {
+ return [colorutils.unscale(c[0], bot, top),
+ colorutils.unscale(c[1], bot, top),
+ colorutils.unscale(c[2], bot, top)];
+}
+
+colorutils.luminosity = function(c) {
+ // rule of thumb for RGB brightness; 1.0 is white
+ return c[0]*0.30 + c[1]*0.59 + c[2]*0.11;
+}
+
+colorutils.saturate = function(c) {
+ var min = colorutils.colorMin(c);
+ var max = colorutils.colorMax(c);
+ if (max - min <= 0) return [1.0, 1.0, 1.0];
+ return colorutils.unscaleColor(c, min, max);
+}
+
+colorutils.blend = function(c1, c2, t) {
+ return [colorutils.scale(t, c1[0], c2[0]),
+ colorutils.scale(t, c1[1], c2[1]),
+ colorutils.scale(t, c1[2], c2[2])];
+}
diff --git a/trunk/infrastructure/ace/www/contentcollector.js b/trunk/infrastructure/ace/www/contentcollector.js
new file mode 100644
index 0000000..573672e
--- /dev/null
+++ b/trunk/infrastructure/ace/www/contentcollector.js
@@ -0,0 +1,527 @@
+// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.contentcollector
+// %APPJET%: import("etherpad.collab.ace.easysync2.Changeset")
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var _MAX_LIST_LEVEL = 8;
+
+function sanitizeUnicode(s) {
+ return s.replace(/[\uffff\ufffe\ufeff\ufdd0-\ufdef\ud800-\udfff]/g, '?');
+}
+
+function makeContentCollector(collectStyles, browser, apool, domInterface,
+ className2Author) {
+ browser = browser || {};
+
+ var dom = domInterface || {
+ isNodeText: function(n) {
+ return (n.nodeType == 3);
+ },
+ nodeTagName: function(n) {
+ return n.tagName;
+ },
+ nodeValue: function(n) {
+ return n.nodeValue;
+ },
+ nodeNumChildren: function(n) {
+ return n.childNodes.length;
+ },
+ nodeChild: function(n, i) {
+ return n.childNodes.item(i);
+ },
+ nodeProp: function(n, p) {
+ return n[p];
+ },
+ nodeAttr: function(n, a) {
+ return n.getAttribute(a);
+ },
+ optNodeInnerHTML: function(n) {
+ return n.innerHTML;
+ }
+ };
+
+ var _blockElems = { "div":1, "p":1, "pre":1, "li":1 };
+ function isBlockElement(n) {
+ return !!_blockElems[(dom.nodeTagName(n) || "").toLowerCase()];
+ }
+ function textify(str) {
+ return sanitizeUnicode(
+ str.replace(/[\n\r ]/g, ' ').replace(/\xa0/g, ' ').replace(/\t/g, ' '));
+ }
+ function getAssoc(node, name) {
+ return dom.nodeProp(node, "_magicdom_"+name);
+ }
+
+ var lines = (function() {
+ var textArray = [];
+ var attribsArray = [];
+ var attribsBuilder = null;
+ var op = Changeset.newOp('+');
+ var self = {
+ length: function() { return textArray.length; },
+ atColumnZero: function() {
+ return textArray[textArray.length-1] === "";
+ },
+ startNew: function() {
+ textArray.push("");
+ self.flush(true);
+ attribsBuilder = Changeset.smartOpAssembler();
+ },
+ textOfLine: function(i) { return textArray[i]; },
+ appendText: function(txt, attrString) {
+ textArray[textArray.length-1] += txt;
+ //dmesg(txt+" / "+attrString);
+ op.attribs = attrString;
+ op.chars = txt.length;
+ attribsBuilder.append(op);
+ },
+ textLines: function() { return textArray.slice(); },
+ attribLines: function() { return attribsArray; },
+ // call flush only when you're done
+ flush: function(withNewline) {
+ if (attribsBuilder) {
+ attribsArray.push(attribsBuilder.toString());
+ attribsBuilder = null;
+ }
+ }
+ };
+ self.startNew();
+ return self;
+ }());
+ var cc = {};
+ function _ensureColumnZero(state) {
+ if (! lines.atColumnZero()) {
+ _startNewLine(state);
+ }
+ }
+ var selection, startPoint, endPoint;
+ var selStart = [-1,-1], selEnd = [-1,-1];
+ var blockElems = { "div":1, "p":1, "pre":1 };
+ function _isEmpty(node, state) {
+ // consider clean blank lines pasted in IE to be empty
+ if (dom.nodeNumChildren(node) == 0) return true;
+ if (dom.nodeNumChildren(node) == 1 &&
+ getAssoc(node, "shouldBeEmpty") && dom.optNodeInnerHTML(node) == "&nbsp;"
+ && ! getAssoc(node, "unpasted")) {
+ if (state) {
+ var child = dom.nodeChild(node, 0);
+ _reachPoint(child, 0, state);
+ _reachPoint(child, 1, state);
+ }
+ return true;
+ }
+ return false;
+ }
+ function _pointHere(charsAfter, state) {
+ var ln = lines.length()-1;
+ var chr = lines.textOfLine(ln).length;
+ if (chr == 0 && state.listType && state.listType != 'none') {
+ chr += 1; // listMarker
+ }
+ chr += charsAfter;
+ return [ln, chr];
+ }
+ function _reachBlockPoint(nd, idx, state) {
+ if (! dom.isNodeText(nd)) _reachPoint(nd, idx, state);
+ }
+ function _reachPoint(nd, idx, state) {
+ if (startPoint && nd == startPoint.node && startPoint.index == idx) {
+ selStart = _pointHere(0, state);
+ }
+ if (endPoint && nd == endPoint.node && endPoint.index == idx) {
+ selEnd = _pointHere(0, state);
+ }
+ }
+ function _incrementFlag(state, flagName) {
+ state.flags[flagName] = (state.flags[flagName] || 0)+1;
+ }
+ function _decrementFlag(state, flagName) {
+ state.flags[flagName]--;
+ }
+ function _incrementAttrib(state, attribName) {
+ if (! state.attribs[attribName]) {
+ state.attribs[attribName] = 1;
+ }
+ else {
+ state.attribs[attribName]++;
+ }
+ _recalcAttribString(state);
+ }
+ function _decrementAttrib(state, attribName) {
+ state.attribs[attribName]--;
+ _recalcAttribString(state);
+ }
+ function _enterList(state, listType) {
+ var oldListType = state.listType;
+ state.listLevel = (state.listLevel || 0)+1;
+ if (listType != 'none') {
+ state.listNesting = (state.listNesting || 0)+1;
+ }
+ state.listType = listType;
+ _recalcAttribString(state);
+ return oldListType;
+ }
+ function _exitList(state, oldListType) {
+ state.listLevel--;
+ if (state.listType != 'none') {
+ state.listNesting--;
+ }
+ state.listType = oldListType;
+ _recalcAttribString(state);
+ }
+ function _enterAuthor(state, author) {
+ var oldAuthor = state.author;
+ state.authorLevel = (state.authorLevel || 0)+1;
+ state.author = author;
+ _recalcAttribString(state);
+ return oldAuthor;
+ }
+ function _exitAuthor(state, oldAuthor) {
+ state.authorLevel--;
+ state.author = oldAuthor;
+ _recalcAttribString(state);
+ }
+ function _recalcAttribString(state) {
+ var lst = [];
+ for(var a in state.attribs) {
+ if (state.attribs[a]) {
+ lst.push([a,'true']);
+ }
+ }
+ if (state.authorLevel > 0) {
+ var authorAttrib = ['author', state.author];
+ if (apool.putAttrib(authorAttrib, true) >= 0) {
+ // require that author already be in pool
+ // (don't add authors from other documents, etc.)
+ lst.push(authorAttrib);
+ }
+ }
+ state.attribString = Changeset.makeAttribsString('+', lst, apool);
+ }
+ function _produceListMarker(state) {
+ lines.appendText('*', Changeset.makeAttribsString(
+ '+', [['list', state.listType],
+ ['insertorder', 'first']],
+ apool));
+ }
+ function _startNewLine(state) {
+ if (state) {
+ var atBeginningOfLine = lines.textOfLine(lines.length()-1).length == 0;
+ if (atBeginningOfLine && state.listType && state.listType != 'none') {
+ _produceListMarker(state);
+ }
+ }
+ lines.startNew();
+ }
+ cc.notifySelection = function (sel) {
+ if (sel) {
+ selection = sel;
+ startPoint = selection.startPoint;
+ endPoint = selection.endPoint;
+ }
+ };
+ cc.collectContent = function (node, state) {
+ if (! state) {
+ state = {flags: {/*name -> nesting counter*/},
+ attribs: {/*name -> nesting counter*/},
+ attribString: ''};
+ }
+ var isBlock = isBlockElement(node);
+ var isEmpty = _isEmpty(node, state);
+ if (isBlock) _ensureColumnZero(state);
+ var startLine = lines.length()-1;
+ _reachBlockPoint(node, 0, state);
+ if (dom.isNodeText(node)) {
+ var txt = dom.nodeValue(node);
+ var rest = '';
+ var x = 0; // offset into original text
+ if (txt.length == 0) {
+ if (startPoint && node == startPoint.node) {
+ selStart = _pointHere(0, state);
+ }
+ if (endPoint && node == endPoint.node) {
+ selEnd = _pointHere(0, state);
+ }
+ }
+ while (txt.length > 0) {
+ var consumed = 0;
+ if (state.flags.preMode) {
+ var firstLine = txt.split('\n',1)[0];
+ consumed = firstLine.length+1;
+ rest = txt.substring(consumed);
+ txt = firstLine;
+ }
+ else { /* will only run this loop body once */ }
+ if (startPoint && node == startPoint.node &&
+ startPoint.index-x <= txt.length) {
+ selStart = _pointHere(startPoint.index-x, state);
+ }
+ if (endPoint && node == endPoint.node &&
+ endPoint.index-x <= txt.length) {
+ selEnd = _pointHere(endPoint.index-x, state);
+ }
+ var txt2 = txt;
+ if ((! state.flags.preMode) && /^[\r\n]*$/.exec(txt)) {
+ // prevents textnodes containing just "\n" from being significant
+ // in safari when pasting text, now that we convert them to
+ // spaces instead of removing them, because in other cases
+ // removing "\n" from pasted HTML will collapse words together.
+ txt2 = "";
+ }
+ var atBeginningOfLine = lines.textOfLine(lines.length()-1).length == 0;
+ if (atBeginningOfLine) {
+ // newlines in the source mustn't become spaces at beginning of line box
+ txt2 = txt2.replace(/^\n*/, '');
+ }
+ if (atBeginningOfLine && state.listType && state.listType != 'none') {
+ _produceListMarker(state);
+ }
+ lines.appendText(textify(txt2), state.attribString);
+ x += consumed;
+ txt = rest;
+ if (txt.length > 0) {
+ _startNewLine(state);
+ }
+ }
+ }
+ else {
+ var tname = (dom.nodeTagName(node) || "").toLowerCase();
+ if (tname == "br") {
+ _startNewLine(state);
+ }
+ else if (tname == "script" || tname == "style") {
+ // ignore
+ }
+ else if (! isEmpty) {
+ var styl = dom.nodeAttr(node, "style");
+ var cls = dom.nodeProp(node, "className");
+
+ var isPre = (tname == "pre");
+ if ((! isPre) && browser.safari) {
+ isPre = (styl && /\bwhite-space:\s*pre\b/i.exec(styl));
+ }
+ if (isPre) _incrementFlag(state, 'preMode');
+ var attribs = null;
+ var oldListTypeOrNull = null;
+ var oldAuthorOrNull = null;
+ if (collectStyles) {
+ function doAttrib(na) {
+ attribs = (attribs || []);
+ attribs.push(na);
+ _incrementAttrib(state, na);
+ }
+ if (tname == "b" || (styl && /\bfont-weight:\s*bold\b/i.exec(styl)) ||
+ tname == "strong") {
+ doAttrib("bold");
+ }
+ if (tname == "i" || (styl && /\bfont-style:\s*italic\b/i.exec(styl)) ||
+ tname == "em") {
+ doAttrib("italic");
+ }
+ if (tname == "u" || (styl && /\btext-decoration:\s*underline\b/i.exec(styl)) ||
+ tname == "ins") {
+ doAttrib("underline");
+ }
+ if (tname == "s" || (styl && /\btext-decoration:\s*line-through\b/i.exec(styl)) ||
+ tname == "del") {
+ doAttrib("strikethrough");
+ }
+ if (tname == "h1") {
+ doAttrib("h1");
+ }
+ if (tname == "h2") {
+ doAttrib("h2");
+ }
+ if (tname == "h3") {
+ doAttrib("h3");
+ }
+ if (tname == "h4") {
+ doAttrib("h4");
+ }
+ if (tname == "h5") {
+ doAttrib("h5");
+ }
+ if (tname == "h6") {
+ doAttrib("h6");
+ }
+ if (tname == "ul") {
+ var type;
+ var rr = cls && /(?:^| )list-(bullet[12345678])\b/.exec(cls);
+ type = rr && rr[1] || "bullet"+
+ String(Math.min(_MAX_LIST_LEVEL, (state.listNesting||0)+1));
+ oldListTypeOrNull = (_enterList(state, type) || 'none');
+ }
+ else if ((tname == "div" || tname == "p") && cls &&
+ cls.match(/(?:^| )ace-line\b/)) {
+ oldListTypeOrNull = (_enterList(state, type) || 'none');
+ }
+ if (className2Author && cls) {
+ var classes = cls.match(/\S+/g);
+ if (classes && classes.length > 0) {
+ for(var i=0;i<classes.length;i++) {
+ var c = classes[i];
+ var a = className2Author(c);
+ if (a) {
+ oldAuthorOrNull = (_enterAuthor(state, a) || 'none');
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ var nc = dom.nodeNumChildren(node);
+ for(var i=0;i<nc;i++) {
+ var c = dom.nodeChild(node, i);
+ cc.collectContent(c, state);
+ }
+
+ if (isPre) _decrementFlag(state, 'preMode');
+ if (attribs) {
+ for(var i=0;i<attribs.length;i++) {
+ _decrementAttrib(state, attribs[i]);
+ }
+ }
+ if (oldListTypeOrNull) {
+ _exitList(state, oldListTypeOrNull);
+ }
+ if (oldAuthorOrNull) {
+ _exitAuthor(state, oldAuthorOrNull);
+ }
+ }
+ }
+ if (! browser.msie) {
+ _reachBlockPoint(node, 1, state);
+ }
+ if (isBlock) {
+ if (lines.length()-1 == startLine) {
+ _startNewLine(state);
+ }
+ else {
+ _ensureColumnZero(state);
+ }
+ }
+
+ if (browser.msie) {
+ // in IE, a point immediately after a DIV appears on the next line
+ _reachBlockPoint(node, 1, state);
+ }
+ };
+ // can pass a falsy value for end of doc
+ cc.notifyNextNode = function (node) {
+ // an "empty block" won't end a line; this addresses an issue in IE with
+ // typing into a blank line at the end of the document. typed text
+ // goes into the body, and the empty line div still looks clean.
+ // it is incorporated as dirty by the rule that a dirty region has
+ // to end a line.
+ if ((!node) || (isBlockElement(node) && !_isEmpty(node))) {
+ _ensureColumnZero(null);
+ }
+ };
+ // each returns [line, char] or [-1,-1]
+ var getSelectionStart = function() { return selStart; };
+ var getSelectionEnd = function() { return selEnd; };
+
+ // returns array of strings for lines found, last entry will be "" if
+ // last line is complete (i.e. if a following span should be on a new line).
+ // can be called at any point
+ cc.getLines = function() { return lines.textLines(); };
+
+ //cc.applyHints = function(hints) {
+ //if (hints.pastedLines) {
+ //
+ //}
+ //}
+
+ cc.finish = function() {
+ lines.flush();
+ var lineAttribs = lines.attribLines();
+ var lineStrings = cc.getLines();
+
+ lineStrings.length--;
+ lineAttribs.length--;
+
+ var ss = getSelectionStart();
+ var se = getSelectionEnd();
+
+ function fixLongLines() {
+ // design mode does not deal with with really long lines!
+ var lineLimit = 2000; // chars
+ var buffer = 10; // chars allowed over before wrapping
+ var linesWrapped = 0;
+ var numLinesAfter = 0;
+ for(var i=lineStrings.length-1; i>=0; i--) {
+ var oldString = lineStrings[i];
+ var oldAttribString = lineAttribs[i];
+ if (oldString.length > lineLimit+buffer) {
+ var newStrings = [];
+ var newAttribStrings = [];
+ while (oldString.length > lineLimit) {
+ //var semiloc = oldString.lastIndexOf(';', lineLimit-1);
+ //var lengthToTake = (semiloc >= 0 ? (semiloc+1) : lineLimit);
+ lengthToTake = lineLimit;
+ newStrings.push(oldString.substring(0, lengthToTake));
+ oldString = oldString.substring(lengthToTake);
+ newAttribStrings.push(Changeset.subattribution(oldAttribString,
+ 0, lengthToTake));
+ oldAttribString = Changeset.subattribution(oldAttribString,
+ lengthToTake);
+ }
+ if (oldString.length > 0) {
+ newStrings.push(oldString);
+ newAttribStrings.push(oldAttribString);
+ }
+ function fixLineNumber(lineChar) {
+ if (lineChar[0] < 0) return;
+ var n = lineChar[0];
+ var c = lineChar[1];
+ if (n > i) {
+ n += (newStrings.length-1);
+ }
+ else if (n == i) {
+ var a = 0;
+ while (c > newStrings[a].length) {
+ c -= newStrings[a].length;
+ a++;
+ }
+ n += a;
+ }
+ lineChar[0] = n;
+ lineChar[1] = c;
+ }
+ fixLineNumber(ss);
+ fixLineNumber(se);
+ linesWrapped++;
+ numLinesAfter += newStrings.length;
+
+ newStrings.unshift(i, 1);
+ lineStrings.splice.apply(lineStrings, newStrings);
+ newAttribStrings.unshift(i, 1);
+ lineAttribs.splice.apply(lineAttribs, newAttribStrings);
+ }
+ }
+ return {linesWrapped:linesWrapped, numLinesAfter:numLinesAfter};
+ }
+ var wrapData = fixLongLines();
+
+ return { selStart: ss, selEnd: se, linesWrapped: wrapData.linesWrapped,
+ numLinesAfter: wrapData.numLinesAfter,
+ lines: lineStrings, lineAttribs: lineAttribs };
+ }
+
+ return cc;
+}
diff --git a/trunk/infrastructure/ace/www/cssmanager.js b/trunk/infrastructure/ace/www/cssmanager.js
new file mode 100644
index 0000000..a5c549b
--- /dev/null
+++ b/trunk/infrastructure/ace/www/cssmanager.js
@@ -0,0 +1,88 @@
+
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function makeCSSManager(emptyStylesheetTitle) {
+
+ function getSheetByTitle(title) {
+ var allSheets = document.styleSheets;
+ for(var i=0;i<allSheets.length;i++) {
+ var s = allSheets[i];
+ if (s.title == title) {
+ return s;
+ }
+ }
+ return null;
+ }
+
+ /*function getSheetTagByTitle(title) {
+ var allStyleTags = document.getElementsByTagName("style");
+ for(var i=0;i<allStyleTags.length;i++) {
+ var t = allStyleTags[i];
+ if (t.title == title) {
+ return t;
+ }
+ }
+ return null;
+ }*/
+
+ var browserSheet = getSheetByTitle(emptyStylesheetTitle);
+ //var browserTag = getSheetTagByTitle(emptyStylesheetTitle);
+ function browserRules() { return (browserSheet.cssRules || browserSheet.rules); }
+ function browserDeleteRule(i) {
+ if (browserSheet.deleteRule) browserSheet.deleteRule(i);
+ else browserSheet.removeRule(i);
+ }
+ function browserInsertRule(i, selector) {
+ if (browserSheet.insertRule) browserSheet.insertRule(selector+' {}', i);
+ else browserSheet.addRule(selector, null, i);
+ }
+ var selectorList = [];
+
+ function indexOfSelector(selector) {
+ for(var i=0;i<selectorList.length;i++) {
+ if (selectorList[i] == selector) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ function selectorStyle(selector) {
+ var i = indexOfSelector(selector);
+ if (i < 0) {
+ // add selector
+ browserInsertRule(0, selector);
+ selectorList.splice(0, 0, selector);
+ i = 0;
+ }
+ return browserRules().item(i).style;
+ }
+
+ function removeSelectorStyle(selector) {
+ var i = indexOfSelector(selector);
+ if (i >= 0) {
+ browserDeleteRule(i);
+ selectorList.splice(i, 1);
+ }
+ }
+
+ return {selectorStyle:selectorStyle, removeSelectorStyle:removeSelectorStyle,
+ info: function() {
+ return selectorList.length+":"+browserRules().length;
+ }};
+}
diff --git a/trunk/infrastructure/ace/www/dev.html b/trunk/infrastructure/ace/www/dev.html
new file mode 100644
index 0000000..0a9768e
--- /dev/null
+++ b/trunk/infrastructure/ace/www/dev.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html debug="true">
+ <head>
+ <script src="jquery-1.2.1.js"></script>
+ <script src="ace2_common.js"></script>
+ <script src="ace2_outer.js"></script>
+ <script src="firebug/firebug.js"></script>
+ <script>
+function updateHTMLDisplay(html) {
+ $("#htmldisplay").html(html);
+}
+
+function addMessage(str) {
+ var li = document.createElement("li");
+ li.innerHTML = str;
+ $("#messages").prepend(li);
+}
+ </script>
+ <style>
+ #devstuff {
+ background-color: #ddd;
+ padding: 1em;
+ }
+ #iframecontainer iframe { width: 500px; height: 300px; }
+ </style>
+ </head>
+ <body>
+ <div id="iframecontainer"><!-- --></div>
+ <hr>
+ <div id="devstuff">
+ <p><input type="text" id="cmdinput" size="100">
+ <button onclick="$('#cmdresult').html(htmlPrettyEscape(String(eval($('#cmdinput').get(0).value))))">Execute</button></p>
+ <p id="cmdresult"><!-- --></p>
+ <p id="htmldisplay"><!-- --></p>
+ <ul id="messages"><!-- --></ul>
+ </div>
+ </body>
+</html>
diff --git a/trunk/infrastructure/ace/www/domline.js b/trunk/infrastructure/ace/www/domline.js
new file mode 100644
index 0000000..70f86cc
--- /dev/null
+++ b/trunk/infrastructure/ace/www/domline.js
@@ -0,0 +1,210 @@
+// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.domline
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var domline = {};
+domline.noop = function() {};
+domline.identity = function(x) { return x; };
+
+domline.addToLineClass = function(lineClass, cls) {
+ // an "empty span" at any point can be used to add classes to
+ // the line, using line:className. otherwise, we ignore
+ // the span.
+ cls.replace(/\S+/g, function (c) {
+ if (c.indexOf("line:") == 0) {
+ // add class to line
+ lineClass = (lineClass ? lineClass+' ' : '')+c.substring(5);
+ }
+ });
+ return lineClass;
+}
+
+// if "document" is falsy we don't create a DOM node, just
+// an object with innerHTML and className
+domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) {
+ var result = { node: null,
+ appendSpan: domline.noop,
+ prepareForAdd: domline.noop,
+ notifyAdded: domline.noop,
+ clearSpans: domline.noop,
+ finishUpdate: domline.noop,
+ lineMarker: 0 };
+
+ var browser = (optBrowser || {});
+ var document = optDocument;
+
+ if (document) {
+ result.node = document.createElement("div");
+ }
+ else {
+ result.node = {innerHTML: '', className: ''};
+ }
+
+ var html = [];
+ var preHtml, postHtml;
+ var curHTML = null;
+ function processSpaces(s) {
+ return domline.processSpaces(s, doesWrap);
+ }
+ var identity = domline.identity;
+ var perTextNodeProcess = (doesWrap ? identity : processSpaces);
+ var perHtmlLineProcess = (doesWrap ? processSpaces : identity);
+ var lineClass = 'ace-line';
+ result.appendSpan = function(txt, cls) {
+ if (cls.indexOf('list') >= 0) {
+ var listType = /(?:^| )list:(\S+)/.exec(cls);
+ if (listType) {
+ listType = listType[1];
+ if (listType) {
+ preHtml = '<ul class="list-'+listType+'"><li>';
+ postHtml = '</li></ul>';
+ }
+ result.lineMarker += txt.length;
+ return; // don't append any text
+ }
+ }
+ var href = null;
+ var simpleTags = null;
+ if (cls.indexOf('url') >= 0) {
+ cls = cls.replace(/(^| )url:(\S+)/g, function(x0, space, url) {
+ href = url;
+ return space+"url";
+ });
+ }
+ if (cls.indexOf('tag') >= 0) {
+ cls = cls.replace(/(^| )tag:(\S+)/g, function(x0, space, tag) {
+ if (! simpleTags) simpleTags = [];
+ simpleTags.push(tag.toLowerCase());
+ return space+tag;
+ });
+ }
+ if ((! txt) && cls) {
+ lineClass = domline.addToLineClass(lineClass, cls);
+ }
+ else if (txt) {
+ var extraOpenTags = "";
+ var extraCloseTags = "";
+ if (href) {
+ extraOpenTags = extraOpenTags+'<a href="'+
+ href.replace(/\"/g, '&quot;')+'">';
+ extraCloseTags = '</a>'+extraCloseTags;
+ }
+ if (simpleTags) {
+ simpleTags.sort();
+ extraOpenTags = extraOpenTags+'<'+simpleTags.join('><')+'>';
+ simpleTags.reverse();
+ extraCloseTags = '</'+simpleTags.join('></')+'>'+extraCloseTags;
+ }
+ html.push('<span class="',cls||'','">',extraOpenTags,
+ perTextNodeProcess(domline.escapeHTML(txt)),
+ extraCloseTags,'</span>');
+ }
+ };
+ result.clearSpans = function() {
+ html = [];
+ lineClass = ''; // non-null to cause update
+ result.lineMarker = 0;
+ };
+ function writeHTML() {
+ var newHTML = perHtmlLineProcess(html.join(''));
+ if (! newHTML) {
+ if ((! document) || (! optBrowser)) {
+ newHTML += '&nbsp;';
+ }
+ else if (! browser.msie) {
+ newHTML += '<br/>';
+ }
+ }
+ if (nonEmpty) {
+ newHTML = (preHtml||'')+newHTML+(postHtml||'');
+ }
+ html = preHtml = postHtml = null; // free memory
+ if (newHTML !== curHTML) {
+ curHTML = newHTML;
+ result.node.innerHTML = curHTML;
+ }
+ if (lineClass !== null) result.node.className = lineClass;
+ }
+ result.prepareForAdd = writeHTML;
+ result.finishUpdate = writeHTML;
+ result.getInnerHTML = function() { return curHTML || ''; };
+
+ return result;
+};
+
+domline.escapeHTML = function(s) {
+ var re = /[&<>'"]/g; /']/; // stupid indentation thing
+ if (! re.MAP) {
+ // persisted across function calls!
+ re.MAP = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&#34;',
+ "'": '&#39;'
+ };
+ }
+ return s.replace(re, function(c) { return re.MAP[c]; });
+};
+
+domline.processSpaces = function(s, doesWrap) {
+ if (s.indexOf("<") < 0 && ! doesWrap) {
+ // short-cut
+ return s.replace(/ /g, '&nbsp;');
+ }
+ var parts = [];
+ s.replace(/<[^>]*>?| |[^ <]+/g, function(m) { parts.push(m); });
+ if (doesWrap) {
+ var endOfLine = true;
+ var beforeSpace = false;
+ // last space in a run is normal, others are nbsp,
+ // end of line is nbsp
+ for(var i=parts.length-1;i>=0;i--) {
+ var p = parts[i];
+ if (p == " ") {
+ if (endOfLine || beforeSpace)
+ parts[i] = '&nbsp;';
+ endOfLine = false;
+ beforeSpace = true;
+ }
+ else if (p.charAt(0) != "<") {
+ endOfLine = false;
+ beforeSpace = false;
+ }
+ }
+ // beginning of line is nbsp
+ for(var i=0;i<parts.length;i++) {
+ var p = parts[i];
+ if (p == " ") {
+ parts[i] = '&nbsp;';
+ break;
+ }
+ else if (p.charAt(0) != "<") {
+ break;
+ }
+ }
+ }
+ else {
+ for(var i=0;i<parts.length;i++) {
+ var p = parts[i];
+ if (p == " ") {
+ parts[i] = '&nbsp;';
+ }
+ }
+ }
+ return parts.join('');
+};
diff --git a/trunk/infrastructure/ace/www/easy_sync.js b/trunk/infrastructure/ace/www/easy_sync.js
new file mode 100644
index 0000000..86a4327
--- /dev/null
+++ b/trunk/infrastructure/ace/www/easy_sync.js
@@ -0,0 +1,923 @@
+// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.easysync1
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function Changeset(arg) {
+
+ var array;
+ if ((typeof arg) == "string") {
+ // constant
+ array = [Changeset.MAGIC, 0, arg.length, 0, 0, arg];
+ }
+ else if ((typeof arg) == "number") {
+ var n = Math.round(arg);
+ // delete-all on n-length text (useful for making a "builder")
+ array = [Changeset.MAGIC, n, 0, 0, 0, ""];
+ }
+ else if (! arg) {
+ // identity on 0-length text
+ array = [Changeset.MAGIC, 0, 0, 0, 0, ""];
+ }
+ else if (arg.isChangeset) {
+ return arg;
+ }
+ else array = arg;
+
+ array.isChangeset = true;
+
+ // OOP style: attach generic methods to array object, hold no state in environment
+
+ //function error(msg) { top.console.error(msg); top.console.trace(); }
+ function error(msg) { var e = new Error(msg); e.easysync = true; throw e; }
+ function assert(b, msg) { if (! b) error("Changeset: "+String(msg)); }
+ function min(x, y) { return (x < y) ? x : y; }
+ Changeset._assert = assert;
+
+ array.isIdentity = function() {
+ return this.length == 6 && this[1] == this[2] && this[3] == 0 &&
+ this[4] == this[1] && this[5] == "";
+ }
+
+ array.eachStrip = function(func, thisObj) {
+ // inside "func", the method receiver will be "this" by default,
+ // or you can pass an object.
+ for(var i=0;i<this.numStrips();i++) {
+ var ptr = 3 + i*3;
+ if (func.call(thisObj || this, this[ptr], this[ptr+1], this[ptr+2], i))
+ return true;
+ }
+ return false;
+ }
+
+ array.numStrips = function() { return (this.length-3)/3; };
+ array.oldLen = function() { return this[1]; };
+ array.newLen = function() { return this[2]; };
+
+ array.checkRep = function() {
+ assert(this[0] == Changeset.MAGIC, "bad magic");
+ assert(this[1] >= 0, "bad old text length");
+ assert(this[2] >= 0, "bad new text length");
+ assert((this.length % 3) == 0, "bad array length");
+ assert(this.length >= 6, "must be at least one strip");
+ var numStrips = this.numStrips();
+ var oldLen = this[1];
+ var newLen = this[2];
+ // iterate over the "text strips"
+ var actualNewLen = 0;
+ this.eachStrip(function(startIndex, numTaken, newText, i) {
+ var s = startIndex, t = numTaken, n = newText;
+ var isFirst = (i == 0);
+ var isLast = (i == numStrips-1);
+ assert(t >= 0, "can't take negative number of chars");
+ assert(isFirst || t > 0, "all strips but first must take");
+ assert((t > 0) || (s == 0), "if first strip doesn't take, must have 0 startIndex");
+ assert(s >= 0 && s + t <= oldLen, "bad index: "+this.toString());
+ assert(t > 0 || n.length > 0 || (isFirst && isLast), "empty strip must be first and only");
+ if (! isLast) {
+ var s2 = this[3 + i*3 + 3]; // startIndex of following strip
+ var gap = s2 - (s + t);
+ assert(gap >= 0, "overlapping or out-of-order strips: "+this.toString());
+ assert(gap > 0 || n.length > 0, "touching strips with no added text");
+ }
+ actualNewLen += t + n.length;
+ });
+ assert(newLen == actualNewLen, "calculated new text length doesn't match");
+ }
+
+ array.applyToText = function(text) {
+ assert(text.length == this.oldLen(), "mismatched apply: "+text.length+" / "+this.oldLen());
+ var buf = [];
+ this.eachStrip(function (s, t, n) {
+ buf.push(text.substr(s, t), n);
+ });
+ return buf.join('');
+ }
+
+ function _makeBuilder(oldLen, supportAuthors) {
+ var C = Changeset(oldLen);
+ if (supportAuthors) {
+ _ensureAuthors(C);
+ }
+ return C.builder();
+ }
+
+ function _getNumInserted(C) {
+ var numChars = 0;
+ C.eachStrip(function(s,t,n) {
+ numChars += n.length;
+ });
+ return numChars;
+ }
+
+ function _ensureAuthors(C) {
+ if (! C.authors) {
+ C.setAuthor();
+ }
+ return C;
+ }
+
+ array.setAuthor = function(author) {
+ var C = this;
+ // authors array has even length >= 2;
+ // alternates [numChars1, author1, numChars2, author2];
+ // all numChars > 0 unless there is exactly one, in which
+ // case it can be == 0.
+ C.authors = [_getNumInserted(C), author || ''];
+ return C;
+ }
+
+ array.builder = function() {
+ // normal pattern is Changeset(oldLength).builder().appendOldText(...). ...
+ // builder methods mutate this!
+ var C = this;
+ // OOP style: state in environment
+ var self;
+ return self = {
+ appendNewText: function(str, author) {
+ C[C.length-1] += str;
+ C[2] += str.length;
+
+ if (C.authors) {
+ var a = (author || '');
+ var lastAuthorPtr = C.authors.length-1;
+ var lastAuthorLengthPtr = C.authors.length-2;
+ if ((!a) || a == C.authors[lastAuthorPtr]) {
+ C.authors[lastAuthorLengthPtr] += str.length;
+ }
+ else if (0 == C.authors[lastAuthorLengthPtr]) {
+ C.authors[lastAuthorLengthPtr] = str.length;
+ C.authors[lastAuthorPtr] = (a || C.authors[lastAuthorPtr]);
+ }
+ else {
+ C.authors.push(str.length, a);
+ }
+ }
+
+ return self;
+ },
+ appendOldText: function(startIndex, numTaken) {
+ if (numTaken == 0) return self;
+ // properties of last strip...
+ var s = C[C.length-3], t = C[C.length-2], n = C[C.length-1];
+ if (t == 0 && n == "") {
+ // must be empty changeset, one strip that doesn't take old chars or add new ones
+ C[C.length-3] = startIndex;
+ C[C.length-2] = numTaken;
+ }
+ else if (n == "" && (s+t == startIndex)) {
+ C[C.length-2] += numTaken; // take more
+ }
+ else C.push(startIndex, numTaken, ""); // add a strip
+ C[2] += numTaken;
+ C.checkRep();
+ return self;
+ },
+ toChangeset: function() { return C; }
+ };
+ }
+
+ array.authorSlicer = function(outputBuilder) {
+ return _makeAuthorSlicer(this, outputBuilder);
+ }
+
+ function _makeAuthorSlicer(changesetOrAuthorsIn, builderOut) {
+ // "builderOut" only needs to support appendNewText
+ var authors; // considered immutable
+ if (changesetOrAuthorsIn.isChangeset) {
+ authors = changesetOrAuthorsIn.authors;
+ }
+ else {
+ authors = changesetOrAuthorsIn;
+ }
+
+ // OOP style: state in environment
+ var authorPtr = 0;
+ var charIndex = 0;
+ var charWithinAuthor = 0; // 0 <= charWithinAuthor <= authors[authorPtr]; max value iff atEnd
+ var atEnd = false;
+ function curAuthor() { return authors[authorPtr+1]; }
+ function curAuthorWidth() { return authors[authorPtr]; }
+ function assertNotAtEnd() { assert(! atEnd, "_authorSlicer: can't move past end"); }
+ function forwardInAuthor(numChars) {
+ charWithinAuthor += numChars;
+ charIndex += numChars;
+ }
+ function nextAuthor() {
+ assertNotAtEnd();
+ assert(charWithinAuthor == curAuthorWidth(), "_authorSlicer: not at author end");
+ charWithinAuthor = 0;
+ authorPtr += 2;
+ if (authorPtr == authors.length) {
+ atEnd = true;
+ }
+ }
+
+ var self;
+ return self = {
+ skipChars: function(n) {
+ assert(n >= 0, "_authorSlicer: can't skip negative n");
+ if (n == 0) return;
+ assertNotAtEnd();
+
+ var leftToSkip = n;
+ while (leftToSkip > 0) {
+ var leftInAuthor = curAuthorWidth() - charWithinAuthor;
+ if (leftToSkip >= leftInAuthor) {
+ forwardInAuthor(leftInAuthor);
+ leftToSkip -= leftInAuthor;
+ nextAuthor();
+ }
+ else {
+ forwardInAuthor(leftToSkip);
+ leftToSkip = 0;
+ }
+ }
+ },
+ takeChars: function(n, text) {
+ assert(n >= 0, "_authorSlicer: can't take negative n");
+ if (n == 0) return;
+ assertNotAtEnd();
+ assert(n == text.length, "_authorSlicer: bad text length");
+
+ var textLeft = text;
+ var leftToTake = n;
+ while (leftToTake > 0) {
+ if (curAuthorWidth() > 0 && charWithinAuthor < curAuthorWidth()) {
+ // at least one char to take from current author
+ var leftInAuthor = (curAuthorWidth() - charWithinAuthor);
+ assert(leftInAuthor > 0, "_authorSlicer: should have leftInAuthor > 0");
+ var toTake = min(leftInAuthor, leftToTake);
+ assert(toTake > 0, "_authorSlicer: should have toTake > 0");
+ builderOut.appendNewText(textLeft.substring(0, toTake), curAuthor());
+ forwardInAuthor(toTake);
+ leftToTake -= toTake;
+ textLeft = textLeft.substring(toTake);
+ }
+ assert(charWithinAuthor <= curAuthorWidth(), "_authorSlicer: past end of author");
+ if (charWithinAuthor == curAuthorWidth()) {
+ nextAuthor();
+ }
+ }
+ },
+ setBuilder: function(builder) {
+ builderOut = builder;
+ }
+ };
+ }
+
+ function _makeSlicer(C, output) {
+ // C: Changeset, output: builder from _makeBuilder
+ // C is considered immutable, won't change or be changed
+
+ // OOP style: state in environment
+ var charIndex = 0; // 0 <= charIndex <= C.newLen(); maximum value iff atEnd
+ var stripIndex = 0; // 0 <= stripIndex <= C.numStrips(); maximum value iff atEnd
+ var charWithinStrip = 0; // 0 <= charWithinStrip < curStripWidth()
+ var atEnd = false;
+
+ var authorSlicer;
+ if (C.authors) {
+ authorSlicer = _makeAuthorSlicer(C.authors, output);
+ }
+
+ var ptr = 3;
+ function curStartIndex() { return C[ptr]; }
+ function curNumTaken() { return C[ptr+1]; }
+ function curNewText() { return C[ptr+2]; }
+ function curStripWidth() { return curNumTaken() + curNewText().length; }
+ function assertNotAtEnd() { assert(! atEnd, "_slicer: can't move past changeset end"); }
+ function forwardInStrip(numChars) {
+ charWithinStrip += numChars;
+ charIndex += numChars;
+ }
+ function nextStrip() {
+ assertNotAtEnd();
+ assert(charWithinStrip == curStripWidth(), "_slicer: not at strip end");
+ charWithinStrip = 0;
+ stripIndex++;
+ ptr += 3;
+ if (stripIndex == C.numStrips()) {
+ atEnd = true;
+ }
+ }
+ function curNumNewCharsInRange(start, end) {
+ // takes two indices into the current strip's combined "taken" and "new"
+ // chars, and returns how many "new" chars are included in the range
+ assert(start <= end, "_slicer: curNumNewCharsInRange given out-of-order indices");
+ var nt = curNumTaken();
+ var nn = curNewText().length;
+ var s = nt;
+ var e = nt+nn;
+ if (s < start) s = start;
+ if (e > end) e = end;
+ if (e < s) return 0;
+ return e-s;
+ }
+
+ var self;
+ return self = {
+ skipChars: function (n) {
+ assert(n >= 0, "_slicer: can't skip negative n");
+ if (n == 0) return;
+ assertNotAtEnd();
+
+ var leftToSkip = n;
+ while (leftToSkip > 0) {
+ var leftInStrip = curStripWidth() - charWithinStrip;
+ if (leftToSkip >= leftInStrip) {
+ forwardInStrip(leftInStrip);
+
+ if (authorSlicer)
+ authorSlicer.skipChars(curNumNewCharsInRange(charWithinStrip,
+ charWithinStrip + leftInStrip));
+
+ leftToSkip -= leftInStrip;
+ nextStrip();
+ }
+ else {
+ if (authorSlicer)
+ authorSlicer.skipChars(curNumNewCharsInRange(charWithinStrip,
+ charWithinStrip + leftToSkip));
+
+ forwardInStrip(leftToSkip);
+ leftToSkip = 0;
+ }
+ }
+ },
+ takeChars: function (n) {
+ assert(n >= 0, "_slicer: can't take negative n");
+ if (n == 0) return;
+ assertNotAtEnd();
+
+ var leftToTake = n;
+ while (leftToTake > 0) {
+ if (curNumTaken() > 0 && charWithinStrip < curNumTaken()) {
+ // at least one char to take from current strip's numTaken
+ var leftInTaken = (curNumTaken() - charWithinStrip);
+ assert(leftInTaken > 0, "_slicer: should have leftInTaken > 0");
+ var toTake = min(leftInTaken, leftToTake);
+ assert(toTake > 0, "_slicer: should have toTake > 0");
+ output.appendOldText(curStartIndex() + charWithinStrip, toTake);
+ forwardInStrip(toTake);
+ leftToTake -= toTake;
+ }
+ if (leftToTake > 0 && curNewText().length > 0 && charWithinStrip >= curNumTaken() &&
+ charWithinStrip < curStripWidth()) {
+ // at least one char to take from current strip's newText
+ var leftInNewText = (curStripWidth() - charWithinStrip);
+ assert(leftInNewText > 0, "_slicer: should have leftInNewText > 0");
+ var toTake = min(leftInNewText, leftToTake);
+ assert(toTake > 0, "_slicer: should have toTake > 0");
+ var newText = curNewText().substr(charWithinStrip - curNumTaken(), toTake);
+ if (authorSlicer) {
+ authorSlicer.takeChars(newText.length, newText);
+ }
+ else {
+ output.appendNewText(newText);
+ }
+ forwardInStrip(toTake);
+ leftToTake -= toTake;
+ }
+ assert(charWithinStrip <= curStripWidth(), "_slicer: past end of strip");
+ if (charWithinStrip == curStripWidth()) {
+ nextStrip();
+ }
+ }
+ },
+ skipTo: function(n) {
+ self.skipChars(n - charIndex);
+ }
+ };
+ }
+
+ array.slicer = function(outputBuilder) {
+ return _makeSlicer(this, outputBuilder);
+ }
+
+ array.compose = function(next) {
+ assert(next.oldLen() == this.newLen(), "mismatched composition");
+
+ var builder = _makeBuilder(this.oldLen(), !!(this.authors || next.authors));
+ var slicer = _makeSlicer(this, builder);
+
+ var authorSlicer;
+ if (next.authors) {
+ authorSlicer = _makeAuthorSlicer(next.authors, builder);
+ }
+
+ next.eachStrip(function(s, t, n) {
+ slicer.skipTo(s);
+ slicer.takeChars(t);
+ if (authorSlicer) {
+ authorSlicer.takeChars(n.length, n);
+ }
+ else {
+ builder.appendNewText(n);
+ }
+ }, this);
+
+ return builder.toChangeset();
+ };
+
+ array.traverser = function() {
+ return _makeTraverser(this);
+ }
+
+ function _makeTraverser(C) {
+ var s = C[3], t = C[4], n = C[5];
+ var nextIndex = 6;
+ var indexIntoNewText = 0;
+
+ var authorSlicer;
+ if (C.authors) {
+ authorSlicer = _makeAuthorSlicer(C.authors, null);
+ }
+
+ function advanceIfPossible() {
+ if (t == 0 && n == "" && nextIndex < C.length) {
+ s = C[nextIndex];
+ t = C[nextIndex+1];
+ n = C[nextIndex+2];
+ nextIndex += 3;
+ }
+ }
+
+ var self;
+ return self = {
+ numTakenChars: function() {
+ // if starts with taken characters, then how many, else 0
+ return (t > 0) ? t : 0;
+ },
+ numNewChars: function() {
+ // if starts with new characters, then how many, else 0
+ return (t == 0 && n.length > 0) ? n.length : 0;
+ },
+ takenCharsStart: function() {
+ return (self.numTakenChars() > 0) ? s : 0;
+ },
+ hasMore: function() {
+ return self.numTakenChars() > 0 || self.numNewChars() > 0;
+ },
+ curIndex: function() {
+ return indexIntoNewText;
+ },
+ consumeTakenChars: function (x) {
+ assert(self.numTakenChars() > 0, "_traverser: no taken chars");
+ assert(x >= 0 && x <= self.numTakenChars(), "_traverser: bad number of taken chars");
+ if (x == 0) return;
+ if (t == x) { s = 0; t = 0; }
+ else { s += x; t -= x; }
+ indexIntoNewText += x;
+ advanceIfPossible();
+ },
+ consumeNewChars: function(x) {
+ return self.appendNewChars(x, null);
+ },
+ appendNewChars: function(x, builder) {
+ assert(self.numNewChars() > 0, "_traverser: no new chars");
+ assert(x >= 0 && x <= self.numNewChars(), "_traverser: bad number of new chars");
+ if (x == 0) return "";
+ var str = n.substring(0, x);
+ n = n.substring(x);
+ indexIntoNewText += x;
+ advanceIfPossible();
+
+ if (builder) {
+ if (authorSlicer) {
+ authorSlicer.setBuilder(builder);
+ authorSlicer.takeChars(x, str);
+ }
+ else {
+ builder.appendNewText(str);
+ }
+ }
+ else {
+ if (authorSlicer) authorSlicer.skipChars(x);
+ return str;
+ }
+ },
+ consumeAvailableTakenChars: function() {
+ return self.consumeTakenChars(self.numTakenChars());
+ },
+ consumeAvailableNewChars: function() {
+ return self.consumeNewChars(self.numNewChars());
+ },
+ appendAvailableNewChars: function(builder) {
+ return self.appendNewChars(self.numNewChars(), builder);
+ }
+ };
+ }
+
+ array.follow = function(prev, reverseInsertOrder) {
+ // prev: Changeset, reverseInsertOrder: boolean
+
+ // A.compose(B.follow(A)) is the merging of Changesets A and B, which operate on the same old text.
+ // It is always the same as B.compose(A.follow(B, true)).
+
+ assert(prev.oldLen() == this.oldLen(), "mismatched follow: "+prev.oldLen()+"/"+this.oldLen());
+ var builder = _makeBuilder(prev.newLen(), !! this.authors);
+ var a = _makeTraverser(prev);
+ var b = _makeTraverser(this);
+ while (a.hasMore() || b.hasMore()) {
+ if (a.numNewChars() > 0 && ! reverseInsertOrder) {
+ builder.appendOldText(a.curIndex(), a.numNewChars());
+ a.consumeAvailableNewChars();
+ }
+ else if (b.numNewChars() > 0) {
+ b.appendAvailableNewChars(builder);
+ }
+ else if (a.numNewChars() > 0 && reverseInsertOrder) {
+ builder.appendOldText(a.curIndex(), a.numNewChars());
+ a.consumeAvailableNewChars();
+ }
+ else if (! b.hasMore()) a.consumeAvailableTakenChars();
+ else if (! a.hasMore()) b.consumeAvailableTakenChars();
+ else {
+ var x = a.takenCharsStart();
+ var y = b.takenCharsStart();
+ if (x < y) a.consumeTakenChars(min(a.numTakenChars(), y-x));
+ else if (y < x) b.consumeTakenChars(min(b.numTakenChars(), x-y));
+ else {
+ var takenByBoth = min(a.numTakenChars(), b.numTakenChars());
+ builder.appendOldText(a.curIndex(), takenByBoth);
+ a.consumeTakenChars(takenByBoth);
+ b.consumeTakenChars(takenByBoth);
+ }
+ }
+ }
+ return builder.toChangeset();
+ }
+
+ array.encodeToString = function(asBinary) {
+ var stringDataArray = [];
+ var numsArray = [];
+ if (! asBinary) numsArray.push(this[0]);
+ numsArray.push(this[1], this[2]);
+ this.eachStrip(function(s, t, n) {
+ numsArray.push(s, t, n.length);
+ stringDataArray.push(n);
+ }, this);
+ if (! asBinary) {
+ return numsArray.join(',')+'|'+stringDataArray.join('');
+ }
+ else {
+ return "A" + Changeset.numberArrayToString(numsArray)
+ +escapeCrazyUnicode(stringDataArray.join(''));
+ }
+ }
+
+ function escapeCrazyUnicode(str) {
+ return str.replace(/\\/g, '\\\\').replace(/[\ud800-\udfff]/g, function (c) {
+ return "\\u"+("0000"+c.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+
+ array.applyToAttributedText = Changeset.applyToAttributedText;
+
+ function splicesFromChanges(c) {
+ var splices = [];
+ // get a list of splices, [startChar, endChar, newText]
+ var traverser = c.traverser();
+ var oldTextLength = c.oldLen();
+ var indexIntoOldText = 0;
+ while (traverser.hasMore() || indexIntoOldText < oldTextLength) {
+ var newText = "";
+ var startChar = indexIntoOldText;
+ var endChar = indexIntoOldText;
+ if (traverser.numNewChars() > 0) {
+ newText = traverser.consumeAvailableNewChars();
+ }
+ if (traverser.hasMore()) {
+ endChar = traverser.takenCharsStart();
+ indexIntoOldText = endChar + traverser.numTakenChars();
+ traverser.consumeAvailableTakenChars();
+ }
+ else {
+ endChar = oldTextLength;
+ indexIntoOldText = endChar;
+ }
+ if (endChar != startChar || newText.length > 0) {
+ splices.push([startChar, endChar, newText]);
+ }
+ }
+ return splices;
+ }
+
+ array.toSplices = function() {
+ return splicesFromChanges(this);
+ }
+
+ array.characterRangeFollowThis = function(selStartChar, selEndChar, insertionsAfter) {
+ var changeset = this;
+ // represent the selection as a changeset that replaces the selection with some finite string.
+ // Because insertions indicate intention, it doesn't matter what this string is, and even
+ // if the selectionChangeset is made to "follow" other changes it will still be the only
+ // insertion.
+ var selectionChangeset =
+ Changeset(changeset.oldLen()).builder().appendOldText(0, selStartChar).appendNewText(
+ "X").appendOldText(selEndChar, changeset.oldLen() - selEndChar).toChangeset();
+ var newSelectionChangeset = selectionChangeset.follow(changeset, insertionsAfter);
+ var selectionSplices = newSelectionChangeset.toSplices();
+ function includeChar(i) {
+ if (! includeChar.calledYet) {
+ selStartChar = i;
+ selEndChar = i;
+ includeChar.calledYet = true;
+ }
+ else {
+ if (i < selStartChar) selStartChar = i;
+ if (i > selEndChar) selEndChar = i;
+ }
+ }
+ for(var i=0; i<selectionSplices.length; i++) {
+ var s = selectionSplices[i];
+ includeChar(s[0]);
+ includeChar(s[1]);
+ }
+ return [selStartChar, selEndChar];
+ }
+
+ return array;
+}
+
+Changeset.MAGIC = "Changeset";
+Changeset.makeSplice = function(oldLength, spliceStart, numRemoved, stringInserted) {
+ oldLength = (oldLength || 0);
+ spliceStart = (spliceStart || 0);
+ numRemoved = (numRemoved || 0);
+ stringInserted = String(stringInserted || "");
+
+ var builder = Changeset(oldLength).builder();
+ builder.appendOldText(0, spliceStart);
+ builder.appendNewText(stringInserted);
+ builder.appendOldText(spliceStart + numRemoved, oldLength - numRemoved - spliceStart);
+ return builder.toChangeset();
+};
+Changeset.identity = function(len) {
+ return Changeset(len).builder().appendOldText(0, len).toChangeset();
+};
+Changeset.decodeFromString = function(str) {
+ function error(msg) { var e = new Error(msg); e.easysync = true; throw e; }
+ function toHex(str) {
+ var a = [];
+ a.push("length["+str.length+"]:");
+ var TRUNC=20;
+ for(var i=0;i<str.substring(0,TRUNC).length;i++) {
+ a.push(("000"+str.charCodeAt(i).toString(16)).slice(-4));
+ }
+ if (str.length > TRUNC) a.push("...");
+ return a.join(' ');
+ }
+ function unescapeCrazyUnicode(str) {
+ return str.replace(/\\(u....|\\)/g, function(seq) {
+ if (seq == "\\\\") return "\\";
+ return String.fromCharCode(Number("0x"+seq.substring(2)));
+ });
+ }
+
+ var numData, stringData;
+ var binary = false;
+ var typ = str.charAt(0);
+ if (typ == "B" || typ == "A") {
+ var result = Changeset.numberArrayFromString(str, 1);
+ numData = result[0];
+ stringData = result[1];
+ if (typ == "A") {
+ stringData = unescapeCrazyUnicode(stringData);
+ }
+ binary = true;
+ }
+ else if (typ == "C") {
+ var barPosition = str.indexOf('|');
+ numData = str.substring(0, barPosition).split(',');
+ stringData = str.substring(barPosition+1);
+ }
+ else {
+ error("Not a changeset: "+toHex(str));
+ }
+ var stringDataOffset = 0;
+ var array = [];
+ var ptr;
+ if (binary) {
+ array.push("Changeset", numData[0], numData[1]);
+ var ptr = 2;
+ }
+ else {
+ array.push(numData[0], Number(numData[1]), Number(numData[2]));
+ var ptr = 3;
+ }
+ while (ptr < numData.length) {
+ array.push(Number(numData[ptr++]), Number(numData[ptr++]));
+ var newTextLength = Number(numData[ptr++]);
+ array.push(stringData.substr(stringDataOffset, newTextLength));
+ stringDataOffset += newTextLength;
+ }
+ if (stringDataOffset != stringData.length) {
+ error("Extra character data beyond end of encoded string ("+toHex(str)+")");
+ }
+ return Changeset(array);
+};
+
+Changeset.numberArrayToString = function(nums) {
+ var array = [];
+ function writeNum(n) {
+ // does not support negative numbers
+ var twentyEightBit = (n & 0xfffffff);
+ if (twentyEightBit <= 0x7fff) {
+ array.push(String.fromCharCode(twentyEightBit));
+ }
+ else {
+ array.push(String.fromCharCode(0xa000 | (twentyEightBit >> 15),
+ twentyEightBit & 0x7fff));
+ }
+ }
+ writeNum(nums.length);
+ var len = nums.length;
+ for(var i=0;i<len;i++) {
+ writeNum(nums[i]);
+ }
+ return array.join('');
+};
+
+Changeset.numberArrayFromString = function(str, startIndex) {
+ // returns [numberArray, remainingString]
+ var nums = [];
+ var strIndex = (startIndex || 0);
+ function readNum() {
+ var n = str.charCodeAt(strIndex++);
+ if (n > 0x7fff) {
+ if (n >= 0xa000) {
+ n = (((n & 0x1fff) << 15) | str.charCodeAt(strIndex++));
+ }
+ else {
+ // legacy format
+ n = (((n & 0x1fff) << 16) | str.charCodeAt(strIndex++));
+ }
+ }
+ return n;
+ }
+ var len = readNum();
+ for(var i=0;i<len;i++) {
+ nums.push(readNum());
+ }
+ return [nums, str.substring(strIndex)];
+};
+
+(function() {
+ function repeatString(str, times) {
+ if (times <= 0) return "";
+ var s = repeatString(str, times >> 1);
+ s += s;
+ if (times & 1) s += str;
+ return s;
+ }
+ function chr(n) { return String.fromCharCode(n+48); }
+ function ord(c) { return c.charCodeAt(0)-48; }
+ function runMatcher(c) {
+ // Takes "A" and returns /\u0041+/g .
+ // Avoid creating new objects unnecessarily by caching matchers
+ // as properties of this function.
+ var re = runMatcher[c];
+ if (re) return re;
+ re = runMatcher[c] = new RegExp("\\u"+("0000"+c.charCodeAt(0).toString(16)).slice(-4)+"+", 'g');
+ return re;
+ }
+ function runLength(str, idx, c) {
+ var re = runMatcher(c);
+ re.lastIndex = idx;
+ var result = re.exec(str);
+ if (result && result[0]) {
+ return result[0].length;
+ }
+ return 0;
+ }
+
+ // emptyObj may be a StorableObject
+ Changeset.initAttributedText = function(emptyObj, initialString, initialAuthor) {
+ var obj = emptyObj;
+ obj.authorMap = { 1: (initialAuthor || '') };
+ obj.text = (initialString || '');
+ obj.attribs = repeatString(chr(1), obj.text.length);
+ return obj;
+ };
+ Changeset.gcAttributedText = function(atObj) {
+ // "garbage collect" the list of authors
+ var removedAuthors = [];
+ for(var a in atObj.authorMap) {
+ if (atObj.attribs.indexOf(chr(Number(a))) < 0) {
+ removedAuthors.push(atObj.authorMap[a]);
+ delete atObj.authorMap[a];
+ }
+ }
+ return removedAuthors;
+ };
+ Changeset.cloneAttributedText = function(emptyObj, atObj) {
+ var obj = emptyObj;
+ obj.text = atObj.text; // string
+ if (atObj.attribs) obj.attribs = atObj.attribs; // string
+ if (atObj.attribs_c) obj.attribs_c = atObj.attribs_c; // string
+ obj.authorMap = {};
+ for(var a in atObj.authorMap) {
+ obj.authorMap[a] = atObj.authorMap[a];
+ }
+ return obj;
+ };
+ Changeset.applyToAttributedText = function(atObj, C) {
+ C = (C || this);
+ var oldText = atObj.text;
+ var oldAttribs = atObj.attribs;
+ Changeset._assert(C.isChangeset, "applyToAttributedText: 'this' is not a changeset");
+ Changeset._assert(oldText.length == C.oldLen(),
+ "applyToAttributedText: mismatch "+oldText.length+" / "+C.oldLen());
+ var textBuf = [];
+ var attribsBuf = [];
+ var authorMap = atObj.authorMap;
+ function authorId(author) {
+ for(var a in authorMap) {
+ if (authorMap[Number(a)] === author) {
+ return Number(a);
+ }
+ }
+ for(var i=1;i<=60000;i++) {
+ // don't use "in" because it's currently broken on StorableObjects
+ if (authorMap[i] === undefined) {
+ authorMap[i] = author;
+ return i;
+ }
+ }
+ }
+ var myBuilder = { appendNewText: function(txt, author) {
+ // object that acts as a "builder" in that it receives requests from
+ // authorSlicer to append text attributed to different authors
+ attribsBuf.push(repeatString(chr(authorId(author)), txt.length));
+ } };
+ var authorSlicer;
+ if (C.authors) {
+ authorSlicer = C.authorSlicer(myBuilder);
+ }
+ C.eachStrip(function (s, t, n) {
+ textBuf.push(oldText.substr(s, t), n);
+ attribsBuf.push(oldAttribs.substr(s, t));
+ if (authorSlicer) {
+ authorSlicer.takeChars(n.length, n);
+ }
+ else {
+ myBuilder.appendNewText(n, '');
+ }
+ });
+ atObj.text = textBuf.join('');
+ atObj.attribs = attribsBuf.join('');
+ return atObj;
+ };
+ Changeset.getAttributedTextCharAuthor = function(atObj, idx) {
+ return atObj.authorMap[ord(atObj.attribs.charAt(idx))];
+ };
+ Changeset.getAttributedTextCharRunLength = function(atObj, idx) {
+ var c = atObj.attribs.charAt(idx);
+ return runLength(atObj.attribs, idx, c);
+ };
+ Changeset.eachAuthorInAttributedText = function(atObj, func) {
+ // call func(author, authorNum)
+ for(var a in atObj.authorMap) {
+ if (func(atObj.authorMap[a], Number(a))) break;
+ }
+ };
+ Changeset.getAttributedTextAuthorByNum = function(atObj, n) {
+ return atObj.authorMap[n];
+ };
+ // Compressed attributed text can be cloned, but nothing else until uncompressed!!
+ Changeset.compressAttributedText = function(atObj) {
+ // idempotent, mutates the object, returns it
+ if (atObj.attribs) {
+ atObj.attribs_c = atObj.attribs.replace(/([\s\S])\1{0,63}/g, function(run) {
+ return run.charAt(0)+chr(run.length);;
+ });
+ delete atObj.attribs;
+ }
+ return atObj;
+ };
+ Changeset.decompressAttributedText = function(atObj) {
+ // idempotent, mutates the object, returns it
+ if (atObj.attribs_c) {
+ atObj.attribs = atObj.attribs_c.replace(/[\s\S][\s\S]/g, function(run) {
+ return repeatString(run.charAt(0), ord(run.charAt(1)));
+ });
+ delete atObj.attribs_c;
+ }
+ return atObj;
+ };
+})();
diff --git a/trunk/infrastructure/ace/www/easysync2.js b/trunk/infrastructure/ace/www/easysync2.js
new file mode 100644
index 0000000..efc5b99
--- /dev/null
+++ b/trunk/infrastructure/ace/www/easysync2.js
@@ -0,0 +1,1968 @@
+// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.easysync2
+// %APPJET%: jimport("com.etherpad.Easysync2Support");
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//var _opt = (this.Easysync2Support || null);
+var _opt = null; // disable optimization for now
+
+function AttribPool() {
+ var p = {};
+ p.numToAttrib = {}; // e.g. {0: ['foo','bar']}
+ p.attribToNum = {}; // e.g. {'foo,bar': 0}
+ p.nextNum = 0;
+
+ p.putAttrib = function(attrib, dontAddIfAbsent) {
+ var str = String(attrib);
+ if (str in p.attribToNum) {
+ return p.attribToNum[str];
+ }
+ if (dontAddIfAbsent) {
+ return -1;
+ }
+ var num = p.nextNum++;
+ p.attribToNum[str] = num;
+ p.numToAttrib[num] = [String(attrib[0]||''),
+ String(attrib[1]||'')];
+ return num;
+ };
+
+ p.getAttrib = function(num) {
+ var pair = p.numToAttrib[num];
+ if (! pair) return pair;
+ return [pair[0], pair[1]]; // return a mutable copy
+ };
+
+ p.getAttribKey = function(num) {
+ var pair = p.numToAttrib[num];
+ if (! pair) return '';
+ return pair[0];
+ };
+
+ p.getAttribValue = function(num) {
+ var pair = p.numToAttrib[num];
+ if (! pair) return '';
+ return pair[1];
+ };
+
+ p.eachAttrib = function(func) {
+ for(var n in p.numToAttrib) {
+ var pair = p.numToAttrib[n];
+ func(pair[0], pair[1]);
+ }
+ };
+
+ p.toJsonable = function() {
+ return {numToAttrib: p.numToAttrib, nextNum: p.nextNum};
+ };
+
+ p.fromJsonable = function(obj) {
+ p.numToAttrib = obj.numToAttrib;
+ p.nextNum = obj.nextNum;
+ p.attribToNum = {};
+ for(var n in p.numToAttrib) {
+ p.attribToNum[String(p.numToAttrib[n])] = Number(n);
+ }
+ return p;
+ };
+
+ return p;
+}
+
+var Changeset = {};
+
+Changeset.error = function error(msg) { var e = new Error(msg); e.easysync = true; throw e; };
+Changeset.assert = function assert(b, msgParts) {
+ if (! b) {
+ var msg = Array.prototype.slice.call(arguments, 1).join('');
+ Changeset.error("Changeset: "+msg);
+ }
+};
+
+Changeset.parseNum = function(str) { return parseInt(str, 36); };
+Changeset.numToString = function(num) { return num.toString(36).toLowerCase(); };
+Changeset.toBaseTen = function(cs) {
+ var dollarIndex = cs.indexOf('$');
+ var beforeDollar = cs.substring(0, dollarIndex);
+ var fromDollar = cs.substring(dollarIndex);
+ return beforeDollar.replace(/[0-9a-z]+/g, function(s) {
+ return String(Changeset.parseNum(s)); }) + fromDollar;
+};
+
+Changeset.oldLen = function(cs) {
+ return Changeset.unpack(cs).oldLen;
+};
+Changeset.newLen = function(cs) {
+ return Changeset.unpack(cs).newLen;
+};
+
+Changeset.opIterator = function(opsStr, optStartIndex) {
+ //print(opsStr);
+ var regex = /((?:\*[0-9a-z]+)*)(?:\|([0-9a-z]+))?([-+=])([0-9a-z]+)|\?|/g;
+ var startIndex = (optStartIndex || 0);
+ var curIndex = startIndex;
+ var prevIndex = curIndex;
+ function nextRegexMatch() {
+ prevIndex = curIndex;
+ var result;
+ if (_opt) {
+ result = _opt.nextOpInString(opsStr, curIndex);
+ if (result) {
+ if (result.opcode() == '?') {
+ Changeset.error("Hit error opcode in op stream");
+ }
+ curIndex = result.lastIndex();
+ }
+ }
+ else {
+ regex.lastIndex = curIndex;
+ result = regex.exec(opsStr);
+ curIndex = regex.lastIndex;
+ if (result[0] == '?') {
+ Changeset.error("Hit error opcode in op stream");
+ }
+ }
+ return result;
+ }
+ var regexResult = nextRegexMatch();
+ var obj = Changeset.newOp();
+ function next(optObj) {
+ var op = (optObj || obj);
+ if (_opt && regexResult) {
+ op.attribs = regexResult.attribs();
+ op.lines = regexResult.lines();
+ op.chars = regexResult.chars();
+ op.opcode = regexResult.opcode();
+ regexResult = nextRegexMatch();
+ }
+ else if ((! _opt) && regexResult[0]) {
+ op.attribs = regexResult[1];
+ op.lines = Changeset.parseNum(regexResult[2] || 0);
+ op.opcode = regexResult[3];
+ op.chars = Changeset.parseNum(regexResult[4]);
+ regexResult = nextRegexMatch();
+ }
+ else {
+ Changeset.clearOp(op);
+ }
+ return op;
+ }
+ function hasNext() { return !! (_opt ? regexResult : regexResult[0]); }
+ function lastIndex() { return prevIndex; }
+ return {next: next, hasNext: hasNext, lastIndex: lastIndex};
+};
+
+Changeset.clearOp = function(op) {
+ op.opcode = '';
+ op.chars = 0;
+ op.lines = 0;
+ op.attribs = '';
+};
+Changeset.newOp = function(optOpcode) {
+ return {opcode:(optOpcode || ''), chars:0, lines:0, attribs:''};
+};
+Changeset.cloneOp = function(op) {
+ return {opcode: op.opcode, chars: op.chars, lines: op.lines, attribs: op.attribs};
+};
+Changeset.copyOp = function(op1, op2) {
+ op2.opcode = op1.opcode;
+ op2.chars = op1.chars;
+ op2.lines = op1.lines;
+ op2.attribs = op1.attribs;
+};
+Changeset.opString = function(op) {
+ // just for debugging
+ if (! op.opcode) return 'null';
+ var assem = Changeset.opAssembler();
+ assem.append(op);
+ return assem.toString();
+};
+Changeset.stringOp = function(str) {
+ // just for debugging
+ return Changeset.opIterator(str).next();
+};
+
+Changeset.checkRep = function(cs) {
+ // doesn't check things that require access to attrib pool (e.g. attribute order)
+ // or original string (e.g. newline positions)
+ var unpacked = Changeset.unpack(cs);
+ var oldLen = unpacked.oldLen;
+ var newLen = unpacked.newLen;
+ var ops = unpacked.ops;
+ var charBank = unpacked.charBank;
+
+ var assem = Changeset.smartOpAssembler();
+ var oldPos = 0;
+ var calcNewLen = 0;
+ var numInserted = 0;
+ var iter = Changeset.opIterator(ops);
+ while (iter.hasNext()) {
+ var o = iter.next();
+ switch (o.opcode) {
+ case '=': oldPos += o.chars; calcNewLen += o.chars; break;
+ case '-': oldPos += o.chars; Changeset.assert(oldPos < oldLen, oldPos," >= ",oldLen," in ",cs); break;
+ case '+': {
+ calcNewLen += o.chars; numInserted += o.chars;
+ Changeset.assert(calcNewLen < newLen, calcNewLen," >= ",newLen," in ",cs);
+ break;
+ }
+ }
+ assem.append(o);
+ }
+
+ calcNewLen += oldLen - oldPos;
+ charBank = charBank.substring(0, numInserted);
+ while (charBank.length < numInserted) {
+ charBank += "?";
+ }
+
+ assem.endDocument();
+ var normalized = Changeset.pack(oldLen, calcNewLen, assem.toString(), charBank);
+ Changeset.assert(normalized == cs, normalized,' != ',cs);
+
+ return cs;
+}
+
+Changeset.smartOpAssembler = function() {
+ // Like opAssembler but able to produce conforming changesets
+ // from slightly looser input, at the cost of speed.
+ // Specifically:
+ // - merges consecutive operations that can be merged
+ // - strips final "="
+ // - ignores 0-length changes
+ // - reorders consecutive + and - (which margingOpAssembler doesn't do)
+
+ var minusAssem = Changeset.mergingOpAssembler();
+ var plusAssem = Changeset.mergingOpAssembler();
+ var keepAssem = Changeset.mergingOpAssembler();
+ var assem = Changeset.stringAssembler();
+ var lastOpcode = '';
+ var lengthChange = 0;
+
+ function flushKeeps() {
+ assem.append(keepAssem.toString());
+ keepAssem.clear();
+ }
+
+ function flushPlusMinus() {
+ assem.append(minusAssem.toString());
+ minusAssem.clear();
+ assem.append(plusAssem.toString());
+ plusAssem.clear();
+ }
+
+ function append(op) {
+ if (! op.opcode) return;
+ if (! op.chars) return;
+
+ if (op.opcode == '-') {
+ if (lastOpcode == '=') {
+ flushKeeps();
+ }
+ minusAssem.append(op);
+ lengthChange -= op.chars;
+ }
+ else if (op.opcode == '+') {
+ if (lastOpcode == '=') {
+ flushKeeps();
+ }
+ plusAssem.append(op);
+ lengthChange += op.chars;
+ }
+ else if (op.opcode == '=') {
+ if (lastOpcode != '=') {
+ flushPlusMinus();
+ }
+ keepAssem.append(op);
+ }
+ lastOpcode = op.opcode;
+ }
+
+ function appendOpWithText(opcode, text, attribs, pool) {
+ var op = Changeset.newOp(opcode);
+ op.attribs = Changeset.makeAttribsString(opcode, attribs, pool);
+ var lastNewlinePos = text.lastIndexOf('\n');
+ if (lastNewlinePos < 0) {
+ op.chars = text.length;
+ op.lines = 0;
+ append(op);
+ }
+ else {
+ op.chars = lastNewlinePos+1;
+ op.lines = text.match(/\n/g).length;
+ append(op);
+ op.chars = text.length - (lastNewlinePos+1);
+ op.lines = 0;
+ append(op);
+ }
+ }
+
+ function toString() {
+ flushPlusMinus();
+ flushKeeps();
+ return assem.toString();
+ }
+
+ function clear() {
+ minusAssem.clear();
+ plusAssem.clear();
+ keepAssem.clear();
+ assem.clear();
+ lengthChange = 0;
+ }
+
+ function endDocument() {
+ keepAssem.endDocument();
+ }
+
+ function getLengthChange() {
+ return lengthChange;
+ }
+
+ return {append: append, toString: toString, clear: clear, endDocument: endDocument,
+ appendOpWithText: appendOpWithText, getLengthChange: getLengthChange };
+};
+
+if (_opt) {
+ Changeset.mergingOpAssembler = function() {
+ var assem = _opt.mergingOpAssembler();
+
+ function append(op) {
+ assem.append(op.opcode, op.chars, op.lines, op.attribs);
+ }
+ function toString() {
+ return assem.toString();
+ }
+ function clear() {
+ assem.clear();
+ }
+ function endDocument() {
+ assem.endDocument();
+ }
+
+ return {append: append, toString: toString, clear: clear, endDocument: endDocument};
+ };
+}
+else {
+ Changeset.mergingOpAssembler = function() {
+ // This assembler can be used in production; it efficiently
+ // merges consecutive operations that are mergeable, ignores
+ // no-ops, and drops final pure "keeps". It does not re-order
+ // operations.
+ var assem = Changeset.opAssembler();
+ var bufOp = Changeset.newOp();
+
+ // If we get, for example, insertions [xxx\n,yyy], those don't merge,
+ // but if we get [xxx\n,yyy,zzz\n], that merges to [xxx\nyyyzzz\n].
+ // This variable stores the length of yyy and any other newline-less
+ // ops immediately after it.
+ var bufOpAdditionalCharsAfterNewline = 0;
+
+ function flush(isEndDocument) {
+ if (bufOp.opcode) {
+ if (isEndDocument && bufOp.opcode == '=' && ! bufOp.attribs) {
+ // final merged keep, leave it implicit
+ }
+ else {
+ assem.append(bufOp);
+ if (bufOpAdditionalCharsAfterNewline) {
+ bufOp.chars = bufOpAdditionalCharsAfterNewline;
+ bufOp.lines = 0;
+ assem.append(bufOp);
+ bufOpAdditionalCharsAfterNewline = 0;
+ }
+ }
+ bufOp.opcode = '';
+ }
+ }
+ function append(op) {
+ if (op.chars > 0) {
+ if (bufOp.opcode == op.opcode && bufOp.attribs == op.attribs) {
+ if (op.lines > 0) {
+ // bufOp and additional chars are all mergeable into a multi-line op
+ bufOp.chars += bufOpAdditionalCharsAfterNewline + op.chars;
+ bufOp.lines += op.lines;
+ bufOpAdditionalCharsAfterNewline = 0;
+ }
+ else if (bufOp.lines == 0) {
+ // both bufOp and op are in-line
+ bufOp.chars += op.chars;
+ }
+ else {
+ // append in-line text to multi-line bufOp
+ bufOpAdditionalCharsAfterNewline += op.chars;
+ }
+ }
+ else {
+ flush();
+ Changeset.copyOp(op, bufOp);
+ }
+ }
+ }
+ function endDocument() {
+ flush(true);
+ }
+ function toString() {
+ flush();
+ return assem.toString();
+ }
+ function clear() {
+ assem.clear();
+ Changeset.clearOp(bufOp);
+ }
+ return {append: append, toString: toString, clear: clear, endDocument: endDocument};
+ };
+}
+
+if (_opt) {
+ Changeset.opAssembler = function() {
+ var assem = _opt.opAssembler();
+ // this function allows op to be mutated later (doesn't keep a ref)
+ function append(op) {
+ assem.append(op.opcode, op.chars, op.lines, op.attribs);
+ }
+ function toString() {
+ return assem.toString();
+ }
+ function clear() {
+ assem.clear();
+ }
+ return {append: append, toString: toString, clear: clear};
+ };
+}
+else {
+ Changeset.opAssembler = function() {
+ var pieces = [];
+ // this function allows op to be mutated later (doesn't keep a ref)
+ function append(op) {
+ pieces.push(op.attribs);
+ if (op.lines) {
+ pieces.push('|', Changeset.numToString(op.lines));
+ }
+ pieces.push(op.opcode);
+ pieces.push(Changeset.numToString(op.chars));
+ }
+ function toString() {
+ return pieces.join('');
+ }
+ function clear() {
+ pieces.length = 0;
+ }
+ return {append: append, toString: toString, clear: clear};
+ };
+}
+
+Changeset.stringIterator = function(str) {
+ var curIndex = 0;
+ function assertRemaining(n) {
+ Changeset.assert(n <= remaining(), "!(",n," <= ",remaining(),")");
+ }
+ function take(n) {
+ assertRemaining(n);
+ var s = str.substr(curIndex, n);
+ curIndex += n;
+ return s;
+ }
+ function peek(n) {
+ assertRemaining(n);
+ var s = str.substr(curIndex, n);
+ return s;
+ }
+ function skip(n) {
+ assertRemaining(n);
+ curIndex += n;
+ }
+ function remaining() {
+ return str.length - curIndex;
+ }
+ return {take:take, skip:skip, remaining:remaining, peek:peek};
+};
+
+Changeset.stringAssembler = function() {
+ var pieces = [];
+ function append(x) {
+ pieces.push(String(x));
+ }
+ function toString() {
+ return pieces.join('');
+ }
+ return {append: append, toString: toString};
+};
+
+// "lines" need not be an array as long as it supports certain calls (lines_foo inside).
+Changeset.textLinesMutator = function(lines) {
+ // Mutates lines, an array of strings, in place.
+ // Mutation operations have the same constraints as changeset operations
+ // with respect to newlines, but not the other additional constraints
+ // (i.e. ins/del ordering, forbidden no-ops, non-mergeability, final newline).
+ // Can be used to mutate lists of strings where the last char of each string
+ // is not actually a newline, but for the purposes of N and L values,
+ // the caller should pretend it is, and for things to work right in that case, the input
+ // to insert() should be a single line with no newlines.
+
+ var curSplice = [0,0];
+ var inSplice = false;
+ // position in document after curSplice is applied:
+ var curLine = 0, curCol = 0;
+ // invariant: if (inSplice) then (curLine is in curSplice[0] + curSplice.length - {2,3}) &&
+ // curLine >= curSplice[0]
+ // invariant: if (inSplice && (curLine >= curSplice[0] + curSplice.length - 2)) then
+ // curCol == 0
+
+ function lines_applySplice(s) {
+ lines.splice.apply(lines, s);
+ }
+ function lines_toSource() {
+ return lines.toSource();
+ }
+ function lines_get(idx) {
+ if (lines.get) {
+ return lines.get(idx);
+ }
+ else {
+ return lines[idx];
+ }
+ }
+ // can be unimplemented if removeLines's return value not needed
+ function lines_slice(start, end) {
+ if (lines.slice) {
+ return lines.slice(start, end);
+ }
+ else {
+ return [];
+ }
+ }
+ function lines_length() {
+ if ((typeof lines.length) == "number") {
+ return lines.length;
+ }
+ else {
+ return lines.length();
+ }
+ }
+
+ function enterSplice() {
+ curSplice[0] = curLine;
+ curSplice[1] = 0;
+ if (curCol > 0) {
+ putCurLineInSplice();
+ }
+ inSplice = true;
+ }
+ function leaveSplice() {
+ lines_applySplice(curSplice);
+ curSplice.length = 2;
+ curSplice[0] = curSplice[1] = 0;
+ inSplice = false;
+ }
+ function isCurLineInSplice() {
+ return (curLine - curSplice[0] < (curSplice.length - 2));
+ }
+ function debugPrint(typ) {
+ print(typ+": "+curSplice.toSource()+" / "+curLine+","+curCol+" / "+lines_toSource());
+ }
+ function putCurLineInSplice() {
+ if (! isCurLineInSplice()) {
+ curSplice.push(lines_get(curSplice[0] + curSplice[1]));
+ curSplice[1]++;
+ }
+ return 2 + curLine - curSplice[0];
+ }
+
+ function skipLines(L, includeInSplice) {
+ if (L) {
+ if (includeInSplice) {
+ if (! inSplice) {
+ enterSplice();
+ }
+ for(var i=0;i<L;i++) {
+ curCol = 0;
+ putCurLineInSplice();
+ curLine++;
+ }
+ }
+ else {
+ if (inSplice) {
+ if (L > 1) {
+ leaveSplice();
+ }
+ else {
+ putCurLineInSplice();
+ }
+ }
+ curLine += L;
+ curCol = 0;
+ }
+ //print(inSplice+" / "+isCurLineInSplice()+" / "+curSplice[0]+" / "+curSplice[1]+" / "+lines.length);
+ /*if (inSplice && (! isCurLineInSplice()) && (curSplice[0] + curSplice[1] < lines.length)) {
+ print("BLAH");
+ putCurLineInSplice();
+ }*/ // tests case foo in remove(), which isn't otherwise covered in current impl
+ }
+ //debugPrint("skip");
+ }
+
+ function skip(N, L, includeInSplice) {
+ if (N) {
+ if (L) {
+ skipLines(L, includeInSplice);
+ }
+ else {
+ if (includeInSplice && ! inSplice) {
+ enterSplice();
+ }
+ if (inSplice) {
+ putCurLineInSplice();
+ }
+ curCol += N;
+ //debugPrint("skip");
+ }
+ }
+ }
+
+ function removeLines(L) {
+ var removed = '';
+ if (L) {
+ if (! inSplice) {
+ enterSplice();
+ }
+ function nextKLinesText(k) {
+ var m = curSplice[0] + curSplice[1];
+ return lines_slice(m, m+k).join('');
+ }
+ if (isCurLineInSplice()) {
+ //print(curCol);
+ if (curCol == 0) {
+ removed = curSplice[curSplice.length-1];
+ // print("FOO"); // case foo
+ curSplice.length--;
+ removed += nextKLinesText(L-1);
+ curSplice[1] += L-1;
+ }
+ else {
+ removed = nextKLinesText(L-1);
+ curSplice[1] += L-1;
+ var sline = curSplice.length - 1;
+ removed = curSplice[sline].substring(curCol) + removed;
+ curSplice[sline] = curSplice[sline].substring(0, curCol) +
+ lines_get(curSplice[0] + curSplice[1]);
+ curSplice[1] += 1;
+ }
+ }
+ else {
+ removed = nextKLinesText(L);
+ curSplice[1] += L;
+ }
+ //debugPrint("remove");
+ }
+ return removed;
+ }
+
+ function remove(N, L) {
+ var removed = '';
+ if (N) {
+ if (L) {
+ return removeLines(L);
+ }
+ else {
+ if (! inSplice) {
+ enterSplice();
+ }
+ var sline = putCurLineInSplice();
+ removed = curSplice[sline].substring(curCol, curCol+N);
+ curSplice[sline] = curSplice[sline].substring(0, curCol) +
+ curSplice[sline].substring(curCol+N);
+ //debugPrint("remove");
+ }
+ }
+ return removed;
+ }
+
+ function insert(text, L) {
+ if (text) {
+ if (! inSplice) {
+ enterSplice();
+ }
+ if (L) {
+ var newLines = Changeset.splitTextLines(text);
+ if (isCurLineInSplice()) {
+ //if (curCol == 0) {
+ //curSplice.length--;
+ //curSplice[1]--;
+ //Array.prototype.push.apply(curSplice, newLines);
+ //curLine += newLines.length;
+ //}
+ //else {
+ var sline = curSplice.length - 1;
+ var theLine = curSplice[sline];
+ var lineCol = curCol;
+ curSplice[sline] = theLine.substring(0, lineCol) + newLines[0];
+ curLine++;
+ newLines.splice(0, 1);
+ Array.prototype.push.apply(curSplice, newLines);
+ curLine += newLines.length;
+ curSplice.push(theLine.substring(lineCol));
+ curCol = 0;
+ //}
+ }
+ else {
+ Array.prototype.push.apply(curSplice, newLines);
+ curLine += newLines.length;
+ }
+ }
+ else {
+ var sline = putCurLineInSplice();
+ curSplice[sline] = curSplice[sline].substring(0, curCol) +
+ text + curSplice[sline].substring(curCol);
+ curCol += text.length;
+ }
+ //debugPrint("insert");
+ }
+ }
+
+ function hasMore() {
+ //print(lines.length+" / "+inSplice+" / "+(curSplice.length - 2)+" / "+curSplice[1]);
+ var docLines = lines_length();
+ if (inSplice) {
+ docLines += curSplice.length - 2 - curSplice[1];
+ }
+ return curLine < docLines;
+ }
+
+ function close() {
+ if (inSplice) {
+ leaveSplice();
+ }
+ //debugPrint("close");
+ }
+
+ var self = {skip:skip, remove:remove, insert:insert, close:close, hasMore:hasMore,
+ removeLines:removeLines, skipLines: skipLines};
+ return self;
+};
+
+Changeset.applyZip = function(in1, idx1, in2, idx2, func) {
+ var iter1 = Changeset.opIterator(in1, idx1);
+ var iter2 = Changeset.opIterator(in2, idx2);
+ var assem = Changeset.smartOpAssembler();
+ var op1 = Changeset.newOp();
+ var op2 = Changeset.newOp();
+ var opOut = Changeset.newOp();
+ while (op1.opcode || iter1.hasNext() || op2.opcode || iter2.hasNext()) {
+ if ((! op1.opcode) && iter1.hasNext()) iter1.next(op1);
+ if ((! op2.opcode) && iter2.hasNext()) iter2.next(op2);
+ func(op1, op2, opOut);
+ if (opOut.opcode) {
+ //print(opOut.toSource());
+ assem.append(opOut);
+ opOut.opcode = '';
+ }
+ }
+ assem.endDocument();
+ return assem.toString();
+};
+
+Changeset.unpack = function(cs) {
+ var headerRegex = /Z:([0-9a-z]+)([><])([0-9a-z]+)|/;
+ var headerMatch = headerRegex.exec(cs);
+ if ((! headerMatch) || (! headerMatch[0])) {
+ Changeset.error("Not a changeset: "+cs);
+ }
+ var oldLen = Changeset.parseNum(headerMatch[1]);
+ var changeSign = (headerMatch[2] == '>') ? 1 : -1;
+ var changeMag = Changeset.parseNum(headerMatch[3]);
+ var newLen = oldLen + changeSign*changeMag;
+ var opsStart = headerMatch[0].length;
+ var opsEnd = cs.indexOf("$");
+ if (opsEnd < 0) opsEnd = cs.length;
+ return {oldLen: oldLen, newLen: newLen, ops: cs.substring(opsStart, opsEnd),
+ charBank: cs.substring(opsEnd+1)};
+};
+
+Changeset.pack = function(oldLen, newLen, opsStr, bank) {
+ var lenDiff = newLen - oldLen;
+ var lenDiffStr = (lenDiff >= 0 ?
+ '>'+Changeset.numToString(lenDiff) :
+ '<'+Changeset.numToString(-lenDiff));
+ var a = [];
+ a.push('Z:', Changeset.numToString(oldLen), lenDiffStr, opsStr, '$', bank);
+ return a.join('');
+};
+
+Changeset.applyToText = function(cs, str) {
+ var unpacked = Changeset.unpack(cs);
+ Changeset.assert(str.length == unpacked.oldLen,
+ "mismatched apply: ",str.length," / ",unpacked.oldLen);
+ var csIter = Changeset.opIterator(unpacked.ops);
+ var bankIter = Changeset.stringIterator(unpacked.charBank);
+ var strIter = Changeset.stringIterator(str);
+ var assem = Changeset.stringAssembler();
+ while (csIter.hasNext()) {
+ var op = csIter.next();
+ switch(op.opcode) {
+ case '+': assem.append(bankIter.take(op.chars)); break;
+ case '-': strIter.skip(op.chars); break;
+ case '=': assem.append(strIter.take(op.chars)); break;
+ }
+ }
+ assem.append(strIter.take(strIter.remaining()));
+ return assem.toString();
+};
+
+Changeset.mutateTextLines = function(cs, lines) {
+ var unpacked = Changeset.unpack(cs);
+ var csIter = Changeset.opIterator(unpacked.ops);
+ var bankIter = Changeset.stringIterator(unpacked.charBank);
+ var mut = Changeset.textLinesMutator(lines);
+ while (csIter.hasNext()) {
+ var op = csIter.next();
+ switch(op.opcode) {
+ case '+': mut.insert(bankIter.take(op.chars), op.lines); break;
+ case '-': mut.remove(op.chars, op.lines); break;
+ case '=': mut.skip(op.chars, op.lines, (!! op.attribs)); break;
+ }
+ }
+ mut.close();
+};
+
+Changeset.composeAttributes = function(att1, att2, resultIsMutation, pool) {
+ // att1 and att2 are strings like "*3*f*1c", asMutation is a boolean.
+
+ // Sometimes attribute (key,value) pairs are treated as attribute presence
+ // information, while other times they are treated as operations that
+ // mutate a set of attributes, and this affects whether an empty value
+ // is a deletion or a change.
+ // Examples, of the form (att1Items, att2Items, resultIsMutation) -> result
+ // ([], [(bold, )], true) -> [(bold, )]
+ // ([], [(bold, )], false) -> []
+ // ([], [(bold, true)], true) -> [(bold, true)]
+ // ([], [(bold, true)], false) -> [(bold, true)]
+ // ([(bold, true)], [(bold, )], true) -> [(bold, )]
+ // ([(bold, true)], [(bold, )], false) -> []
+
+ // pool can be null if att2 has no attributes.
+
+ if ((! att1) && resultIsMutation) {
+ // In the case of a mutation (i.e. composing two changesets),
+ // an att2 composed with an empy att1 is just att2. If att1
+ // is part of an attribution string, then att2 may remove
+ // attributes that are already gone, so don't do this optimization.
+ return att2;
+ }
+ if (! att2) return att1;
+ var atts = [];
+ att1.replace(/\*([0-9a-z]+)/g, function(_, a) {
+ atts.push(pool.getAttrib(Changeset.parseNum(a)));
+ return '';
+ });
+ att2.replace(/\*([0-9a-z]+)/g, function(_, a) {
+ var pair = pool.getAttrib(Changeset.parseNum(a));
+ var found = false;
+ for(var i=0;i<atts.length;i++) {
+ var oldPair = atts[i];
+ if (oldPair[0] == pair[0]) {
+ if (pair[1] || resultIsMutation) {
+ oldPair[1] = pair[1];
+ }
+ else {
+ atts.splice(i, 1);
+ }
+ found = true;
+ break;
+ }
+ }
+ if ((! found) && (pair[1] || resultIsMutation)) {
+ atts.push(pair);
+ }
+ return '';
+ });
+ atts.sort();
+ var buf = Changeset.stringAssembler();
+ for(var i=0;i<atts.length;i++) {
+ buf.append('*');
+ buf.append(Changeset.numToString(pool.putAttrib(atts[i])));
+ }
+ //print(att1+" / "+att2+" / "+buf.toString());
+ return buf.toString();
+};
+
+Changeset._slicerZipperFunc = function(attOp, csOp, opOut, pool) {
+ // attOp is the op from the sequence that is being operated on, either an
+ // attribution string or the earlier of two changesets being composed.
+ // pool can be null if definitely not needed.
+
+ //print(csOp.toSource()+" "+attOp.toSource()+" "+opOut.toSource());
+ if (attOp.opcode == '-') {
+ Changeset.copyOp(attOp, opOut);
+ attOp.opcode = '';
+ }
+ else if (! attOp.opcode) {
+ Changeset.copyOp(csOp, opOut);
+ csOp.opcode = '';
+ }
+ else {
+ switch (csOp.opcode) {
+ case '-': {
+ if (csOp.chars <= attOp.chars) {
+ // delete or delete part
+ if (attOp.opcode == '=') {
+ opOut.opcode = '-';
+ opOut.chars = csOp.chars;
+ opOut.lines = csOp.lines;
+ opOut.attribs = '';
+ }
+ attOp.chars -= csOp.chars;
+ attOp.lines -= csOp.lines;
+ csOp.opcode = '';
+ if (! attOp.chars) {
+ attOp.opcode = '';
+ }
+ }
+ else {
+ // delete and keep going
+ if (attOp.opcode == '=') {
+ opOut.opcode = '-';
+ opOut.chars = attOp.chars;
+ opOut.lines = attOp.lines;
+ opOut.attribs = '';
+ }
+ csOp.chars -= attOp.chars;
+ csOp.lines -= attOp.lines;
+ attOp.opcode = '';
+ }
+ break;
+ }
+ case '+': {
+ // insert
+ Changeset.copyOp(csOp, opOut);
+ csOp.opcode = '';
+ break;
+ }
+ case '=': {
+ if (csOp.chars <= attOp.chars) {
+ // keep or keep part
+ opOut.opcode = attOp.opcode;
+ opOut.chars = csOp.chars;
+ opOut.lines = csOp.lines;
+ opOut.attribs = Changeset.composeAttributes(attOp.attribs, csOp.attribs,
+ attOp.opcode == '=', pool);
+ csOp.opcode = '';
+ attOp.chars -= csOp.chars;
+ attOp.lines -= csOp.lines;
+ if (! attOp.chars) {
+ attOp.opcode = '';
+ }
+ }
+ else {
+ // keep and keep going
+ opOut.opcode = attOp.opcode;
+ opOut.chars = attOp.chars;
+ opOut.lines = attOp.lines;
+ opOut.attribs = Changeset.composeAttributes(attOp.attribs, csOp.attribs,
+ attOp.opcode == '=', pool);
+ attOp.opcode = '';
+ csOp.chars -= attOp.chars;
+ csOp.lines -= attOp.lines;
+ }
+ break;
+ }
+ case '': {
+ Changeset.copyOp(attOp, opOut);
+ attOp.opcode = '';
+ break;
+ }
+ }
+ }
+};
+
+Changeset.applyToAttribution = function(cs, astr, pool) {
+ var unpacked = Changeset.unpack(cs);
+
+ return Changeset.applyZip(astr, 0, unpacked.ops, 0, function(op1, op2, opOut) {
+ return Changeset._slicerZipperFunc(op1, op2, opOut, pool);
+ });
+};
+
+/*Changeset.oneInsertedLineAtATimeOpIterator = function(opsStr, optStartIndex, charBank) {
+ var iter = Changeset.opIterator(opsStr, optStartIndex);
+ var bankIndex = 0;
+
+};*/
+
+Changeset.mutateAttributionLines = function(cs, lines, pool) {
+ //dmesg(cs);
+ //dmesg(lines.toSource()+" ->");
+
+ var unpacked = Changeset.unpack(cs);
+ var csIter = Changeset.opIterator(unpacked.ops);
+ var csBank = unpacked.charBank;
+ var csBankIndex = 0;
+ // treat the attribution lines as text lines, mutating a line at a time
+ var mut = Changeset.textLinesMutator(lines);
+
+ var lineIter = null;
+ function isNextMutOp() {
+ return (lineIter && lineIter.hasNext()) || mut.hasMore();
+ }
+ function nextMutOp(destOp) {
+ if ((!(lineIter && lineIter.hasNext())) && mut.hasMore()) {
+ var line = mut.removeLines(1);
+ lineIter = Changeset.opIterator(line);
+ }
+ if (lineIter && lineIter.hasNext()) {
+ lineIter.next(destOp);
+ }
+ else {
+ destOp.opcode = '';
+ }
+ }
+ var lineAssem = null;
+ function outputMutOp(op) {
+ //print("outputMutOp: "+op.toSource());
+ if (! lineAssem) {
+ lineAssem = Changeset.mergingOpAssembler();
+ }
+ lineAssem.append(op);
+ if (op.lines > 0) {
+ Changeset.assert(op.lines == 1, "Can't have op.lines of ",op.lines," in attribution lines");
+ // ship it to the mut
+ mut.insert(lineAssem.toString(), 1);
+ lineAssem = null;
+ }
+ }
+
+ var csOp = Changeset.newOp();
+ var attOp = Changeset.newOp();
+ var opOut = Changeset.newOp();
+ while (csOp.opcode || csIter.hasNext() || attOp.opcode || isNextMutOp()) {
+ if ((! csOp.opcode) && csIter.hasNext()) {
+ csIter.next(csOp);
+ }
+ //print(csOp.toSource()+" "+attOp.toSource()+" "+opOut.toSource());
+ //print(csOp.opcode+"/"+csOp.lines+"/"+csOp.attribs+"/"+lineAssem+"/"+lineIter+"/"+(lineIter?lineIter.hasNext():null));
+ //print("csOp: "+csOp.toSource());
+ if ((! csOp.opcode) && (! attOp.opcode) &&
+ (! lineAssem) && (! (lineIter && lineIter.hasNext()))) {
+ break; // done
+ }
+ else if (csOp.opcode == '=' && csOp.lines > 0 && (! csOp.attribs) && (! attOp.opcode) &&
+ (! lineAssem) && (! (lineIter && lineIter.hasNext()))) {
+ // skip multiple lines; this is what makes small changes not order of the document size
+ mut.skipLines(csOp.lines);
+ //print("skipped: "+csOp.lines);
+ csOp.opcode = '';
+ }
+ else if (csOp.opcode == '+') {
+ if (csOp.lines > 1) {
+ var firstLineLen = csBank.indexOf('\n', csBankIndex) + 1 - csBankIndex;
+ Changeset.copyOp(csOp, opOut);
+ csOp.chars -= firstLineLen;
+ csOp.lines--;
+ opOut.lines = 1;
+ opOut.chars = firstLineLen;
+ }
+ else {
+ Changeset.copyOp(csOp, opOut);
+ csOp.opcode = '';
+ }
+ outputMutOp(opOut);
+ csBankIndex += opOut.chars;
+ opOut.opcode = '';
+ }
+ else {
+ if ((! attOp.opcode) && isNextMutOp()) {
+ nextMutOp(attOp);
+ }
+ //print("attOp: "+attOp.toSource());
+ Changeset._slicerZipperFunc(attOp, csOp, opOut, pool);
+ if (opOut.opcode) {
+ outputMutOp(opOut);
+ opOut.opcode = '';
+ }
+ }
+ }
+
+ Changeset.assert(! lineAssem, "line assembler not finished");
+ mut.close();
+
+ //dmesg("-> "+lines.toSource());
+};
+
+Changeset.joinAttributionLines = function(theAlines) {
+ var assem = Changeset.mergingOpAssembler();
+ for(var i=0;i<theAlines.length;i++) {
+ var aline = theAlines[i];
+ var iter = Changeset.opIterator(aline);
+ while (iter.hasNext()) {
+ assem.append(iter.next());
+ }
+ }
+ return assem.toString();
+};
+
+Changeset.splitAttributionLines = function(attrOps, text) {
+ var iter = Changeset.opIterator(attrOps);
+ var assem = Changeset.mergingOpAssembler();
+ var lines = [];
+ var pos = 0;
+
+ function appendOp(op) {
+ assem.append(op);
+ if (op.lines > 0) {
+ lines.push(assem.toString());
+ assem.clear();
+ }
+ pos += op.chars;
+ }
+
+ while (iter.hasNext()) {
+ var op = iter.next();
+ var numChars = op.chars;
+ var numLines = op.lines;
+ while (numLines > 1) {
+ var newlineEnd = text.indexOf('\n', pos)+1;
+ Changeset.assert(newlineEnd > 0, "newlineEnd <= 0 in splitAttributionLines");
+ op.chars = newlineEnd - pos;
+ op.lines = 1;
+ appendOp(op);
+ numChars -= op.chars;
+ numLines -= op.lines;
+ }
+ if (numLines == 1) {
+ op.chars = numChars;
+ op.lines = 1;
+ }
+ appendOp(op);
+ }
+
+ return lines;
+};
+
+Changeset.splitTextLines = function(text) {
+ return text.match(/[^\n]*(?:\n|[^\n]$)/g);
+};
+
+Changeset.compose = function(cs1, cs2, pool) {
+ var unpacked1 = Changeset.unpack(cs1);
+ var unpacked2 = Changeset.unpack(cs2);
+ var len1 = unpacked1.oldLen;
+ var len2 = unpacked1.newLen;
+ Changeset.assert(len2 == unpacked2.oldLen, "mismatched composition");
+ var len3 = unpacked2.newLen;
+ var bankIter1 = Changeset.stringIterator(unpacked1.charBank);
+ var bankIter2 = Changeset.stringIterator(unpacked2.charBank);
+ var bankAssem = Changeset.stringAssembler();
+
+ var newOps = Changeset.applyZip(unpacked1.ops, 0, unpacked2.ops, 0, function(op1, op2, opOut) {
+ //var debugBuilder = Changeset.stringAssembler();
+ //debugBuilder.append(Changeset.opString(op1));
+ //debugBuilder.append(',');
+ //debugBuilder.append(Changeset.opString(op2));
+ //debugBuilder.append(' / ');
+
+ var op1code = op1.opcode;
+ var op2code = op2.opcode;
+ if (op1code == '+' && op2code == '-') {
+ bankIter1.skip(Math.min(op1.chars, op2.chars));
+ }
+ Changeset._slicerZipperFunc(op1, op2, opOut, pool);
+ if (opOut.opcode == '+') {
+ if (op2code == '+') {
+ bankAssem.append(bankIter2.take(opOut.chars));
+ }
+ else {
+ bankAssem.append(bankIter1.take(opOut.chars));
+ }
+ }
+
+ //debugBuilder.append(Changeset.opString(op1));
+ //debugBuilder.append(',');
+ //debugBuilder.append(Changeset.opString(op2));
+ //debugBuilder.append(' -> ');
+ //debugBuilder.append(Changeset.opString(opOut));
+ //print(debugBuilder.toString());
+ });
+
+ return Changeset.pack(len1, len3, newOps, bankAssem.toString());
+};
+
+Changeset.attributeTester = function(attribPair, pool) {
+ // returns a function that tests if a string of attributes
+ // (e.g. *3*4) contains a given attribute key,value that
+ // is already present in the pool.
+ if (! pool) {
+ return never;
+ }
+ var attribNum = pool.putAttrib(attribPair, true);
+ if (attribNum < 0) {
+ return never;
+ }
+ else {
+ var re = new RegExp('\\*'+Changeset.numToString(attribNum)+
+ '(?!\\w)');
+ return function(attribs) {
+ return re.test(attribs);
+ };
+ }
+ function never(attribs) { return false; }
+};
+
+Changeset.identity = function(N) {
+ return Changeset.pack(N, N, "", "");
+};
+
+Changeset.makeSplice = function(oldFullText, spliceStart, numRemoved, newText, optNewTextAPairs, pool) {
+ var oldLen = oldFullText.length;
+
+ if (spliceStart >= oldLen) {
+ spliceStart = oldLen - 1;
+ }
+ if (numRemoved > oldFullText.length - spliceStart - 1) {
+ numRemoved = oldFullText.length - spliceStart - 1;
+ }
+ var oldText = oldFullText.substring(spliceStart, spliceStart+numRemoved);
+ var newLen = oldLen + newText.length - oldText.length;
+
+ var assem = Changeset.smartOpAssembler();
+ assem.appendOpWithText('=', oldFullText.substring(0, spliceStart));
+ assem.appendOpWithText('-', oldText);
+ assem.appendOpWithText('+', newText, optNewTextAPairs, pool);
+ assem.endDocument();
+ return Changeset.pack(oldLen, newLen, assem.toString(), newText);
+};
+
+Changeset.toSplices = function(cs) {
+ // get a list of splices, [startChar, endChar, newText]
+
+ var unpacked = Changeset.unpack(cs);
+ var splices = [];
+
+ var oldPos = 0;
+ var iter = Changeset.opIterator(unpacked.ops);
+ var charIter = Changeset.stringIterator(unpacked.charBank);
+ var inSplice = false;
+ while (iter.hasNext()) {
+ var op = iter.next();
+ if (op.opcode == '=') {
+ oldPos += op.chars;
+ inSplice = false;
+ }
+ else {
+ if (! inSplice) {
+ splices.push([oldPos, oldPos, ""]);
+ inSplice = true;
+ }
+ if (op.opcode == '-') {
+ oldPos += op.chars;
+ splices[splices.length-1][1] += op.chars;
+ }
+ else if (op.opcode == '+') {
+ splices[splices.length-1][2] += charIter.take(op.chars);
+ }
+ }
+ }
+
+ return splices;
+};
+
+Changeset.characterRangeFollow = function(cs, startChar, endChar, insertionsAfter) {
+ var newStartChar = startChar;
+ var newEndChar = endChar;
+ var splices = Changeset.toSplices(cs);
+ var lengthChangeSoFar = 0;
+ for(var i=0;i<splices.length;i++) {
+ var splice = splices[i];
+ var spliceStart = splice[0] + lengthChangeSoFar;
+ var spliceEnd = splice[1] + lengthChangeSoFar;
+ var newTextLength = splice[2].length;
+ var thisLengthChange = newTextLength - (spliceEnd - spliceStart);
+
+ if (spliceStart <= newStartChar && spliceEnd >= newEndChar) {
+ // splice fully replaces/deletes range
+ // (also case that handles insertion at a collapsed selection)
+ if (insertionsAfter) {
+ newStartChar = newEndChar = spliceStart;
+ }
+ else {
+ newStartChar = newEndChar = spliceStart + newTextLength;
+ }
+ }
+ else if (spliceEnd <= newStartChar) {
+ // splice is before range
+ newStartChar += thisLengthChange;
+ newEndChar += thisLengthChange;
+ }
+ else if (spliceStart >= newEndChar) {
+ // splice is after range
+ }
+ else if (spliceStart >= newStartChar && spliceEnd <= newEndChar) {
+ // splice is inside range
+ newEndChar += thisLengthChange;
+ }
+ else if (spliceEnd < newEndChar) {
+ // splice overlaps beginning of range
+ newStartChar = spliceStart + newTextLength;
+ newEndChar += thisLengthChange;
+ }
+ else {
+ // splice overlaps end of range
+ newEndChar = spliceStart;
+ }
+
+ lengthChangeSoFar += thisLengthChange;
+ }
+
+ return [newStartChar, newEndChar];
+};
+
+Changeset.moveOpsToNewPool = function(cs, oldPool, newPool) {
+ // works on changeset or attribution string
+ var dollarPos = cs.indexOf('$');
+ if (dollarPos < 0) {
+ dollarPos = cs.length;
+ }
+ var upToDollar = cs.substring(0, dollarPos);
+ var fromDollar = cs.substring(dollarPos);
+ // order of attribs stays the same
+ return upToDollar.replace(/\*([0-9a-z]+)/g, function(_, a) {
+ var oldNum = Changeset.parseNum(a);
+ var pair = oldPool.getAttrib(oldNum);
+ var newNum = newPool.putAttrib(pair);
+ return '*'+Changeset.numToString(newNum);
+ }) + fromDollar;
+};
+
+Changeset.makeAttribution = function(text) {
+ var assem = Changeset.smartOpAssembler();
+ assem.appendOpWithText('+', text);
+ return assem.toString();
+};
+
+// callable on a changeset, attribution string, or attribs property of an op
+Changeset.eachAttribNumber = function(cs, func) {
+ var dollarPos = cs.indexOf('$');
+ if (dollarPos < 0) {
+ dollarPos = cs.length;
+ }
+ var upToDollar = cs.substring(0, dollarPos);
+
+ upToDollar.replace(/\*([0-9a-z]+)/g, function(_, a) {
+ func(Changeset.parseNum(a));
+ return '';
+ });
+};
+
+// callable on a changeset, attribution string, or attribs property of an op,
+// though it may easily create adjacent ops that can be merged.
+Changeset.filterAttribNumbers = function(cs, filter) {
+ return Changeset.mapAttribNumbers(cs, filter);
+};
+
+Changeset.mapAttribNumbers = function(cs, func) {
+ var dollarPos = cs.indexOf('$');
+ if (dollarPos < 0) {
+ dollarPos = cs.length;
+ }
+ var upToDollar = cs.substring(0, dollarPos);
+
+ var newUpToDollar = upToDollar.replace(/\*([0-9a-z]+)/g, function(s, a) {
+ var n = func(Changeset.parseNum(a));
+ if (n === true) {
+ return s;
+ }
+ else if ((typeof n) === "number") {
+ return '*'+Changeset.numToString(n);
+ }
+ else {
+ return '';
+ }
+ });
+
+ return newUpToDollar + cs.substring(dollarPos);
+};
+
+Changeset.makeAText = function(text, attribs) {
+ return { text: text, attribs: (attribs || Changeset.makeAttribution(text)) };
+};
+
+Changeset.applyToAText = function(cs, atext, pool) {
+ return { text: Changeset.applyToText(cs, atext.text),
+ attribs: Changeset.applyToAttribution(cs, atext.attribs, pool) };
+};
+
+Changeset.cloneAText = function(atext) {
+ return { text: atext.text, attribs: atext.attribs };
+};
+
+Changeset.copyAText = function(atext1, atext2) {
+ atext2.text = atext1.text;
+ atext2.attribs = atext1.attribs;
+};
+
+Changeset.appendATextToAssembler = function(atext, assem) {
+ // intentionally skips last newline char of atext
+ var iter = Changeset.opIterator(atext.attribs);
+ var op = Changeset.newOp();
+ while (iter.hasNext()) {
+ iter.next(op);
+ if (! iter.hasNext()) {
+ // last op, exclude final newline
+ if (op.lines <= 1) {
+ op.lines = 0;
+ op.chars--;
+ if (op.chars) {
+ assem.append(op);
+ }
+ }
+ else {
+ var nextToLastNewlineEnd =
+ atext.text.lastIndexOf('\n', atext.text.length-2) + 1;
+ var lastLineLength = atext.text.length - nextToLastNewlineEnd - 1;
+ op.lines--;
+ op.chars -= (lastLineLength + 1);
+ assem.append(op);
+ op.lines = 0;
+ op.chars = lastLineLength;
+ if (op.chars) {
+ assem.append(op);
+ }
+ }
+ }
+ else {
+ assem.append(op);
+ }
+ }
+};
+
+Changeset.prepareForWire = function(cs, pool) {
+ var newPool = new AttribPool();
+ var newCs = Changeset.moveOpsToNewPool(cs, pool, newPool);
+ return {translated: newCs, pool: newPool};
+};
+
+Changeset.isIdentity = function(cs) {
+ var unpacked = Changeset.unpack(cs);
+ return unpacked.ops == "" && unpacked.oldLen == unpacked.newLen;
+};
+
+Changeset.opAttributeValue = function(op, key, pool) {
+ return Changeset.attribsAttributeValue(op.attribs, key, pool);
+};
+
+Changeset.attribsAttributeValue = function(attribs, key, pool) {
+ var value = '';
+ if (attribs) {
+ Changeset.eachAttribNumber(attribs, function(n) {
+ if (pool.getAttribKey(n) == key) {
+ value = pool.getAttribValue(n);
+ }
+ });
+ }
+ return value;
+};
+
+Changeset.builder = function(oldLen) {
+ var assem = Changeset.smartOpAssembler();
+ var o = Changeset.newOp();
+ var charBank = Changeset.stringAssembler();
+
+ var self = {
+ // attribs are [[key1,value1],[key2,value2],...] or '*0*1...' (no pool needed in latter case)
+ keep: function(N, L, attribs, pool) {
+ o.opcode = '=';
+ o.attribs = (attribs &&
+ Changeset.makeAttribsString('=', attribs, pool)) || '';
+ o.chars = N;
+ o.lines = (L || 0);
+ assem.append(o);
+ return self;
+ },
+ keepText: function(text, attribs, pool) {
+ assem.appendOpWithText('=', text, attribs, pool);
+ return self;
+ },
+ insert: function(text, attribs, pool) {
+ assem.appendOpWithText('+', text, attribs, pool);
+ charBank.append(text);
+ return self;
+ },
+ remove: function(N, L) {
+ o.opcode = '-';
+ o.attribs = '';
+ o.chars = N;
+ o.lines = (L || 0);
+ assem.append(o);
+ return self;
+ },
+ toString: function() {
+ assem.endDocument();
+ var newLen = oldLen + assem.getLengthChange();
+ return Changeset.pack(oldLen, newLen, assem.toString(),
+ charBank.toString());
+ }
+ };
+
+ return self;
+};
+
+Changeset.makeAttribsString = function(opcode, attribs, pool) {
+ // makeAttribsString(opcode, '*3') or makeAttribsString(opcode, [['foo','bar']], myPool) work
+ if (! attribs) {
+ return '';
+ }
+ else if ((typeof attribs) == "string") {
+ return attribs;
+ }
+ else if (pool && attribs && attribs.length) {
+ if (attribs.length > 1) {
+ attribs = attribs.slice();
+ attribs.sort();
+ }
+ var result = [];
+ for(var i=0;i<attribs.length;i++) {
+ var pair = attribs[i];
+ if (opcode == '=' || (opcode == '+' && pair[1])) {
+ result.push('*'+Changeset.numToString(pool.putAttrib(pair)));
+ }
+ }
+ return result.join('');
+ }
+};
+
+// like "substring" but on a single-line attribution string
+Changeset.subattribution = function(astr, start, optEnd) {
+ var iter = Changeset.opIterator(astr, 0);
+ var assem = Changeset.smartOpAssembler();
+ var attOp = Changeset.newOp();
+ var csOp = Changeset.newOp();
+ var opOut = Changeset.newOp();
+
+ function doCsOp() {
+ if (csOp.chars) {
+ while (csOp.opcode && (attOp.opcode || iter.hasNext())) {
+ if (! attOp.opcode) iter.next(attOp);
+
+ if (csOp.opcode && attOp.opcode && csOp.chars >= attOp.chars &&
+ attOp.lines > 0 && csOp.lines <= 0) {
+ csOp.lines++;
+ }
+
+ Changeset._slicerZipperFunc(attOp, csOp, opOut, null);
+ if (opOut.opcode) {
+ assem.append(opOut);
+ opOut.opcode = '';
+ }
+ }
+ }
+ }
+
+ csOp.opcode = '-';
+ csOp.chars = start;
+
+ doCsOp();
+
+ if (optEnd === undefined) {
+ if (attOp.opcode) {
+ assem.append(attOp);
+ }
+ while (iter.hasNext()) {
+ iter.next(attOp);
+ assem.append(attOp);
+ }
+ }
+ else {
+ csOp.opcode = '=';
+ csOp.chars = optEnd - start;
+ doCsOp();
+ }
+
+ return assem.toString();
+};
+
+Changeset.inverse = function(cs, lines, alines, pool) {
+ // lines and alines are what the changeset is meant to apply to.
+ // They may be arrays or objects with .get(i) and .length methods.
+ // They include final newlines on lines.
+ function lines_get(idx) {
+ if (lines.get) {
+ return lines.get(idx);
+ }
+ else {
+ return lines[idx];
+ }
+ }
+ function lines_length() {
+ if ((typeof lines.length) == "number") {
+ return lines.length;
+ }
+ else {
+ return lines.length();
+ }
+ }
+ function alines_get(idx) {
+ if (alines.get) {
+ return alines.get(idx);
+ }
+ else {
+ return alines[idx];
+ }
+ }
+ function alines_length() {
+ if ((typeof alines.length) == "number") {
+ return alines.length;
+ }
+ else {
+ return alines.length();
+ }
+ }
+
+ var curLine = 0;
+ var curChar = 0;
+ var curLineOpIter = null;
+ var curLineOpIterLine;
+ var curLineNextOp = Changeset.newOp('+');
+
+ var unpacked = Changeset.unpack(cs);
+ var csIter = Changeset.opIterator(unpacked.ops);
+ var builder = Changeset.builder(unpacked.newLen);
+
+ function consumeAttribRuns(numChars, func/*(len, attribs, endsLine)*/) {
+
+ if ((! curLineOpIter) || (curLineOpIterLine != curLine)) {
+ // create curLineOpIter and advance it to curChar
+ curLineOpIter = Changeset.opIterator(alines_get(curLine));
+ curLineOpIterLine = curLine;
+ var indexIntoLine = 0;
+ var done = false;
+ while (! done) {
+ curLineOpIter.next(curLineNextOp);
+ if (indexIntoLine + curLineNextOp.chars >= curChar) {
+ curLineNextOp.chars -= (curChar - indexIntoLine);
+ done = true;
+ }
+ else {
+ indexIntoLine += curLineNextOp.chars;
+ }
+ }
+ }
+
+ while (numChars > 0) {
+ if ((! curLineNextOp.chars) && (! curLineOpIter.hasNext())) {
+ curLine++;
+ curChar = 0;
+ curLineOpIterLine = curLine;
+ curLineNextOp.chars = 0;
+ curLineOpIter = Changeset.opIterator(alines_get(curLine));
+ }
+ if (! curLineNextOp.chars) {
+ curLineOpIter.next(curLineNextOp);
+ }
+ var charsToUse = Math.min(numChars, curLineNextOp.chars);
+ func(charsToUse, curLineNextOp.attribs,
+ charsToUse == curLineNextOp.chars && curLineNextOp.lines > 0);
+ numChars -= charsToUse;
+ curLineNextOp.chars -= charsToUse;
+ curChar += charsToUse;
+ }
+
+ if ((! curLineNextOp.chars) && (! curLineOpIter.hasNext())) {
+ curLine++;
+ curChar = 0;
+ }
+ }
+
+ function skip(N, L) {
+ if (L) {
+ curLine += L;
+ curChar = 0;
+ }
+ else {
+ if (curLineOpIter && curLineOpIterLine == curLine) {
+ consumeAttribRuns(N, function() {});
+ }
+ else {
+ curChar += N;
+ }
+ }
+ }
+
+ function nextText(numChars) {
+ var len = 0;
+ var assem = Changeset.stringAssembler();
+ var firstString = lines_get(curLine).substring(curChar);
+ len += firstString.length;
+ assem.append(firstString);
+
+ var lineNum = curLine+1;
+ while (len < numChars) {
+ var nextString = lines_get(lineNum);
+ len += nextString.length;
+ assem.append(nextString);
+ lineNum++;
+ }
+
+ return assem.toString().substring(0, numChars);
+ }
+
+ function cachedStrFunc(func) {
+ var cache = {};
+ return function(s) {
+ if (! cache[s]) {
+ cache[s] = func(s);
+ }
+ return cache[s];
+ };
+ }
+
+ var attribKeys = [];
+ var attribValues = [];
+ while (csIter.hasNext()) {
+ var csOp = csIter.next();
+ if (csOp.opcode == '=') {
+ if (csOp.attribs) {
+ attribKeys.length = 0;
+ attribValues.length = 0;
+ Changeset.eachAttribNumber(csOp.attribs, function(n) {
+ attribKeys.push(pool.getAttribKey(n));
+ attribValues.push(pool.getAttribValue(n));
+ });
+ var undoBackToAttribs = cachedStrFunc(function(attribs) {
+ var backAttribs = [];
+ for(var i=0;i<attribKeys.length;i++) {
+ var appliedKey = attribKeys[i];
+ var appliedValue = attribValues[i];
+ var oldValue = Changeset.attribsAttributeValue(attribs, appliedKey, pool);
+ if (appliedValue != oldValue) {
+ backAttribs.push([appliedKey, oldValue]);
+ }
+ }
+ return Changeset.makeAttribsString('=', backAttribs, pool);
+ });
+ consumeAttribRuns(csOp.chars, function(len, attribs, endsLine) {
+ builder.keep(len, endsLine ? 1 : 0, undoBackToAttribs(attribs));
+ });
+ }
+ else {
+ skip(csOp.chars, csOp.lines);
+ builder.keep(csOp.chars, csOp.lines);
+ }
+ }
+ else if (csOp.opcode == '+') {
+ builder.remove(csOp.chars, csOp.lines);
+ }
+ else if (csOp.opcode == '-') {
+ var textBank = nextText(csOp.chars);
+ var textBankIndex = 0;
+ consumeAttribRuns(csOp.chars, function(len, attribs, endsLine) {
+ builder.insert(textBank.substr(textBankIndex, len), attribs);
+ textBankIndex += len;
+ });
+ }
+ }
+
+ return Changeset.checkRep(builder.toString());
+};
+
+// %CLIENT FILE ENDS HERE%
+
+Changeset.follow = function(cs1, cs2, reverseInsertOrder, pool) {
+ var unpacked1 = Changeset.unpack(cs1);
+ var unpacked2 = Changeset.unpack(cs2);
+ var len1 = unpacked1.oldLen;
+ var len2 = unpacked2.oldLen;
+ Changeset.assert(len1 == len2, "mismatched follow");
+ var chars1 = Changeset.stringIterator(unpacked1.charBank);
+ var chars2 = Changeset.stringIterator(unpacked2.charBank);
+
+ var oldLen = unpacked1.newLen;
+ var oldPos = 0;
+ var newLen = 0;
+
+ var hasInsertFirst = Changeset.attributeTester(['insertorder','first'],
+ pool);
+
+ var newOps = Changeset.applyZip(unpacked1.ops, 0, unpacked2.ops, 0, function(op1, op2, opOut) {
+ if (op1.opcode == '+' || op2.opcode == '+') {
+ var whichToDo;
+ if (op2.opcode != '+') {
+ whichToDo = 1;
+ }
+ else if (op1.opcode != '+') {
+ whichToDo = 2;
+ }
+ else {
+ // both +
+ var firstChar1 = chars1.peek(1);
+ var firstChar2 = chars2.peek(1);
+ var insertFirst1 = hasInsertFirst(op1.attribs);
+ var insertFirst2 = hasInsertFirst(op2.attribs);
+ if (insertFirst1 && ! insertFirst2) {
+ whichToDo = 1;
+ }
+ else if (insertFirst2 && ! insertFirst1) {
+ whichToDo = 2;
+ }
+ // insert string that doesn't start with a newline first so as not to break up lines
+ else if (firstChar1 == '\n' && firstChar2 != '\n') {
+ whichToDo = 2;
+ }
+ else if (firstChar1 != '\n' && firstChar2 == '\n') {
+ whichToDo = 1;
+ }
+ // break symmetry:
+ else if (reverseInsertOrder) {
+ whichToDo = 2;
+ }
+ else {
+ whichToDo = 1;
+ }
+ }
+ if (whichToDo == 1) {
+ chars1.skip(op1.chars);
+ opOut.opcode = '=';
+ opOut.lines = op1.lines;
+ opOut.chars = op1.chars;
+ opOut.attribs = '';
+ op1.opcode = '';
+ }
+ else {
+ // whichToDo == 2
+ chars2.skip(op2.chars);
+ Changeset.copyOp(op2, opOut);
+ op2.opcode = '';
+ }
+ }
+ else if (op1.opcode == '-') {
+ if (! op2.opcode) {
+ op1.opcode = '';
+ }
+ else {
+ if (op1.chars <= op2.chars) {
+ op2.chars -= op1.chars;
+ op2.lines -= op1.lines;
+ op1.opcode = '';
+ if (! op2.chars) {
+ op2.opcode = '';
+ }
+ }
+ else {
+ op1.chars -= op2.chars;
+ op1.lines -= op2.lines;
+ op2.opcode = '';
+ }
+ }
+ }
+ else if (op2.opcode == '-') {
+ Changeset.copyOp(op2, opOut);
+ if (! op1.opcode) {
+ op2.opcode = '';
+ }
+ else if (op2.chars <= op1.chars) {
+ // delete part or all of a keep
+ op1.chars -= op2.chars;
+ op1.lines -= op2.lines;
+ op2.opcode = '';
+ if (! op1.chars) {
+ op1.opcode = '';
+ }
+ }
+ else {
+ // delete all of a keep, and keep going
+ opOut.lines = op1.lines;
+ opOut.chars = op1.chars;
+ op2.lines -= op1.lines;
+ op2.chars -= op1.chars;
+ op1.opcode = '';
+ }
+ }
+ else if (! op1.opcode) {
+ Changeset.copyOp(op2, opOut);
+ op2.opcode = '';
+ }
+ else if (! op2.opcode) {
+ Changeset.copyOp(op1, opOut);
+ op1.opcode = '';
+ }
+ else {
+ // both keeps
+ opOut.opcode = '=';
+ opOut.attribs = Changeset.followAttributes(op1.attribs, op2.attribs, pool);
+ if (op1.chars <= op2.chars) {
+ opOut.chars = op1.chars;
+ opOut.lines = op1.lines;
+ op2.chars -= op1.chars;
+ op2.lines -= op1.lines;
+ op1.opcode = '';
+ if (! op2.chars) {
+ op2.opcode = '';
+ }
+ }
+ else {
+ opOut.chars = op2.chars;
+ opOut.lines = op2.lines;
+ op1.chars -= op2.chars;
+ op1.lines -= op2.lines;
+ op2.opcode = '';
+ }
+ }
+ switch (opOut.opcode) {
+ case '=': oldPos += opOut.chars; newLen += opOut.chars; break;
+ case '-': oldPos += opOut.chars; break;
+ case '+': newLen += opOut.chars; break;
+ }
+ });
+ newLen += oldLen - oldPos;
+
+ return Changeset.pack(oldLen, newLen, newOps, unpacked2.charBank);
+};
+
+Changeset.followAttributes = function(att1, att2, pool) {
+ // The merge of two sets of attribute changes to the same text
+ // takes the lexically-earlier value if there are two values
+ // for the same key. Otherwise, all key/value changes from
+ // both attribute sets are taken. This operation is the "follow",
+ // so a set of changes is produced that can be applied to att1
+ // to produce the merged set.
+ if ((! att2) || (! pool)) return '';
+ if (! att1) return att2;
+ var atts = [];
+ att2.replace(/\*([0-9a-z]+)/g, function(_, a) {
+ atts.push(pool.getAttrib(Changeset.parseNum(a)));
+ return '';
+ });
+ att1.replace(/\*([0-9a-z]+)/g, function(_, a) {
+ var pair1 = pool.getAttrib(Changeset.parseNum(a));
+ for(var i=0;i<atts.length;i++) {
+ var pair2 = atts[i];
+ if (pair1[0] == pair2[0]) {
+ if (pair1[1] <= pair2[1]) {
+ // winner of merge is pair1, delete this attribute
+ atts.splice(i, 1);
+ }
+ break;
+ }
+ }
+ return '';
+ });
+ // we've only removed attributes, so they're already sorted
+ var buf = Changeset.stringAssembler();
+ for(var i=0;i<atts.length;i++) {
+ buf.append('*');
+ buf.append(Changeset.numToString(pool.putAttrib(atts[i])));
+ }
+ return buf.toString();
+};
diff --git a/trunk/infrastructure/ace/www/easysync2_tests.js b/trunk/infrastructure/ace/www/easysync2_tests.js
new file mode 100644
index 0000000..2fcf202
--- /dev/null
+++ b/trunk/infrastructure/ace/www/easysync2_tests.js
@@ -0,0 +1,877 @@
+// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.easysync2_tests
+// %APPJET%: import("etherpad.collab.ace.easysync2.*")
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function runTests() {
+
+ function print(str) {
+ java.lang.System.out.println(str);
+ }
+
+ function assert(code, optMsg) {
+ if (! eval(code)) throw new Error("FALSE: "+(optMsg || code));
+ }
+ function literal(v) {
+ if ((typeof v) == "string") {
+ return '"'+v.replace(/[\\\"]/g, '\\$1').replace(/\n/g, '\\n')+'"';
+ }
+ else return v.toSource();
+ }
+ function assertEqualArrays(a, b) {
+ assert(literal(a)+".toSource() == "+literal(b)+".toSource()");
+ }
+ function assertEqualStrings(a, b) {
+ assert(literal(a)+" == "+literal(b));
+ }
+
+ function throughIterator(opsStr) {
+ var iter = Changeset.opIterator(opsStr);
+ var assem = Changeset.opAssembler();
+ while (iter.hasNext()) {
+ assem.append(iter.next());
+ }
+ return assem.toString();
+ }
+
+ function throughSmartAssembler(opsStr) {
+ var iter = Changeset.opIterator(opsStr);
+ var assem = Changeset.smartOpAssembler();
+ while (iter.hasNext()) {
+ assem.append(iter.next());
+ }
+ assem.endDocument();
+ return assem.toString();
+ }
+
+ (function() {
+ print("> throughIterator");
+ var x = '-c*3*4+6|3=az*asdf0*1*2*3+1=1-1+1*0+1=1-1+1|c=c-1';
+ assert("throughIterator("+literal(x)+") == "+literal(x));
+ })();
+
+ (function() {
+ print("> throughSmartAssembler");
+ var x = '-c*3*4+6|3=az*asdf0*1*2*3+1=1-1+1*0+1=1-1+1|c=c-1';
+ assert("throughSmartAssembler("+literal(x)+") == "+literal(x));
+ })();
+
+ function applyMutations(mu, arrayOfArrays) {
+ arrayOfArrays.forEach(function (a) {
+ var result = mu[a[0]].apply(mu, a.slice(1));
+ if (a[0] == 'remove' && a[3]) {
+ assertEqualStrings(a[3], result);
+ }
+ });
+ }
+
+ function mutationsToChangeset(oldLen, arrayOfArrays) {
+ var assem = Changeset.smartOpAssembler();
+ var op = Changeset.newOp();
+ var bank = Changeset.stringAssembler();
+ var oldPos = 0;
+ var newLen = 0;
+ arrayOfArrays.forEach(function (a) {
+ if (a[0] == 'skip') {
+ op.opcode = '=';
+ op.chars = a[1];
+ op.lines = (a[2] || 0);
+ assem.append(op);
+ oldPos += op.chars;
+ newLen += op.chars;
+ }
+ else if (a[0] == 'remove') {
+ op.opcode = '-';
+ op.chars = a[1];
+ op.lines = (a[2] || 0);
+ assem.append(op);
+ oldPos += op.chars;
+ }
+ else if (a[0] == 'insert') {
+ op.opcode = '+';
+ bank.append(a[1]);
+ op.chars = a[1].length;
+ op.lines = (a[2] || 0);
+ assem.append(op);
+ newLen += op.chars;
+ }
+ });
+ newLen += oldLen - oldPos;
+ assem.endDocument();
+ return Changeset.pack(oldLen, newLen, assem.toString(),
+ bank.toString());
+ }
+
+ function runMutationTest(testId, origLines, muts, correct) {
+ print("> runMutationTest#"+testId);
+ var lines = origLines.slice();
+ var mu = Changeset.textLinesMutator(lines);
+ applyMutations(mu, muts);
+ mu.close();
+ assertEqualArrays(correct, lines);
+
+ var inText = origLines.join('');
+ var cs = mutationsToChangeset(inText.length, muts);
+ lines = origLines.slice();
+ Changeset.mutateTextLines(cs, lines);
+ assertEqualArrays(correct, lines);
+
+ var correctText = correct.join('');
+ //print(literal(cs));
+ var outText = Changeset.applyToText(cs, inText);
+ assertEqualStrings(correctText, outText);
+ }
+
+ runMutationTest(1, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"],
+ [['remove',1,0,"a"],['insert',"tu"],['remove',1,0,"p"],['skip',4,1],['skip',7,1],
+ ['insert',"cream\npie\n",2],['skip',2],['insert',"bot"],['insert',"\n",1],
+ ['insert',"bu"],['skip',3],['remove',3,1,"ge\n"],['remove',6,0,"duffle"]],
+ ["tuple\n","banana\n","cream\n","pie\n", "cabot\n","bubba\n","eggplant\n"]);
+
+ runMutationTest(2, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"],
+ [['remove',1,0,"a"],['remove',1,0,"p"],['insert',"tu"],['skip',11,2],
+ ['insert',"cream\npie\n",2],['skip',2],['insert',"bot"],['insert',"\n",1],
+ ['insert',"bu"],['skip',3],['remove',3,1,"ge\n"],['remove',6,0,"duffle"]],
+ ["tuple\n","banana\n","cream\n","pie\n", "cabot\n","bubba\n","eggplant\n"]);
+
+ runMutationTest(3, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"],
+ [['remove',6,1,"apple\n"],['skip',15,2],['skip',6],['remove',1,1,"\n"],
+ ['remove',8,0,"eggplant"],['skip',1,1]],
+ ["banana\n","cabbage\n","duffle\n"]);
+
+ runMutationTest(4, ["15\n"],
+ [['skip',1],['insert',"\n2\n3\n4\n",4],['skip',2,1]],
+ ["1\n","2\n","3\n","4\n","5\n"]);
+
+ runMutationTest(5, ["1\n","2\n","3\n","4\n","5\n"],
+ [['skip',1],['remove',7,4,"\n2\n3\n4\n"],['skip',2,1]],
+ ["15\n"]);
+
+ runMutationTest(6, ["123\n","abc\n","def\n","ghi\n","xyz\n"],
+ [['insert',"0"],['skip',4,1],['skip',4,1],['remove',8,2,"def\nghi\n"],['skip',4,1]],
+ ["0123\n", "abc\n", "xyz\n"]);
+
+ runMutationTest(7, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"],
+ [['remove',6,1,"apple\n"],['skip',15,2,true],['skip',6,0,true],['remove',1,1,"\n"],
+ ['remove',8,0,"eggplant"],['skip',1,1,true]],
+ ["banana\n","cabbage\n","duffle\n"]);
+
+ function poolOrArray(attribs) {
+ if (attribs.getAttrib) {
+ return attribs; // it's already an attrib pool
+ }
+ else {
+ // assume it's an array of attrib strings to be split and added
+ var p = new AttribPool();
+ attribs.forEach(function (kv) { p.putAttrib(kv.split(',')); });
+ return p;
+ }
+ }
+
+ function runApplyToAttributionTest(testId, attribs, cs, inAttr, outCorrect) {
+ print("> applyToAttribution#"+testId);
+ var p = poolOrArray(attribs);
+ var result = Changeset.applyToAttribution(
+ Changeset.checkRep(cs), inAttr, p);
+ assertEqualStrings(outCorrect, result);
+ }
+
+ // turn c<b>a</b>ctus\n into a<b>c</b>tusabcd\n
+ runApplyToAttributionTest(1, ['bold,', 'bold,true'],
+ "Z:7>3-1*0=1*1=1=3+4$abcd",
+ "+1*1+1|1+5", "+1*1+1|1+8");
+
+ // turn "david\ngreenspan\n" into "<b>david\ngreen</b>\n"
+ runApplyToAttributionTest(2, ['bold,', 'bold,true'],
+ "Z:g<4*1|1=6*1=5-4$",
+ "|2+g", "*1|1+6*1+5|1+1");
+
+ (function() {
+ print("> mutatorHasMore");
+ var lines = ["1\n", "2\n", "3\n", "4\n"];
+ var mu;
+
+ mu = Changeset.textLinesMutator(lines);
+ assert(mu.hasMore()+' == true');
+ mu.skip(8,4);
+ assert(mu.hasMore()+' == false');
+ mu.close();
+ assert(mu.hasMore()+' == false');
+
+ // still 1,2,3,4
+ mu = Changeset.textLinesMutator(lines);
+ assert(mu.hasMore()+' == true');
+ mu.remove(2,1);
+ assert(mu.hasMore()+' == true');
+ mu.skip(2,1);
+ assert(mu.hasMore()+' == true');
+ mu.skip(2,1);
+ assert(mu.hasMore()+' == true');
+ mu.skip(2,1);
+ assert(mu.hasMore()+' == false');
+ mu.insert("5\n", 1);
+ assert(mu.hasMore()+' == false');
+ mu.close();
+ assert(mu.hasMore()+' == false');
+
+ // 2,3,4,5 now
+ mu = Changeset.textLinesMutator(lines);
+ assert(mu.hasMore()+' == true');
+ mu.remove(6,3);
+ assert(mu.hasMore()+' == true');
+ mu.remove(2,1);
+ assert(mu.hasMore()+' == false');
+ mu.insert("hello\n", 1);
+ assert(mu.hasMore()+' == false');
+ mu.close();
+ assert(mu.hasMore()+' == false');
+
+ })();
+
+ function runMutateAttributionTest(testId, attribs, cs, alines, outCorrect) {
+ print("> runMutateAttributionTest#"+testId);
+ var p = poolOrArray(attribs);
+ var alines2 = Array.prototype.slice.call(alines);
+ var result = Changeset.mutateAttributionLines(
+ Changeset.checkRep(cs), alines2, p);
+ assertEqualArrays(outCorrect, alines2);
+
+ print("> runMutateAttributionTest#"+testId+".applyToAttribution");
+ function removeQuestionMarks(a) { return a.replace(/\?/g, ''); }
+ var inMerged = Changeset.joinAttributionLines(alines.map(removeQuestionMarks));
+ var correctMerged = Changeset.joinAttributionLines(outCorrect.map(removeQuestionMarks));
+ var mergedResult = Changeset.applyToAttribution(cs, inMerged, p);
+ assertEqualStrings(correctMerged, mergedResult);
+ }
+
+ // turn 123\n 456\n 789\n into 123\n 4<b>5</b>6\n 789\n
+ runMutateAttributionTest(1, ["bold,true"], "Z:c>0|1=4=1*0=1$", ["|1+4", "|1+4", "|1+4"],
+ ["|1+4", "+1*0+1|1+2", "|1+4"]);
+
+ // make a document bold
+ runMutateAttributionTest(2, ["bold,true"], "Z:c>0*0|3=c$", ["|1+4", "|1+4", "|1+4"],
+ ["*0|1+4", "*0|1+4", "*0|1+4"]);
+
+ // clear bold on document
+ runMutateAttributionTest(3, ["bold,","bold,true"], "Z:c>0*0|3=c$",
+ ["*1+1+1*1+1|1+1", "+1*1+1|1+2", "*1+1+1*1+1|1+1"],
+ ["|1+4", "|1+4", "|1+4"]);
+
+ // add a character on line 3 of a document with 5 blank lines, and make sure
+ // the optimization that skips purely-kept lines is working; if any attribution string
+ // with a '?' is parsed it will cause an error.
+ runMutateAttributionTest(4, ['foo,bar','line,1','line,2','line,3','line,4','line,5'],
+ "Z:5>1|2=2+1$x",
+ ["?*1|1+1", "?*2|1+1", "*3|1+1", "?*4|1+1", "?*5|1+1"],
+ ["?*1|1+1", "?*2|1+1", "+1*3|1+1", "?*4|1+1", "?*5|1+1"]);
+
+ var testPoolWithChars = (function() {
+ var p = new AttribPool();
+ p.putAttrib(['char','newline']);
+ for(var i=1;i<36;i++) {
+ p.putAttrib(['char',Changeset.numToString(i)]);
+ }
+ p.putAttrib(['char','']);
+ return p;
+ })();
+
+ // based on runMutationTest#1
+ runMutateAttributionTest(5, testPoolWithChars,
+ "Z:11>7-2*t+1*u+1|2=b|2+a=2*b+1*o+1*t+1*0|1+1*b+1*u+1=3|1-3-6$"+
+ "tucream\npie\nbot\nbu",
+ ["*a+1*p+2*l+1*e+1*0|1+1",
+ "*b+1*a+1*n+1*a+1*n+1*a+1*0|1+1",
+ "*c+1*a+1*b+2*a+1*g+1*e+1*0|1+1",
+ "*d+1*u+1*f+2*l+1*e+1*0|1+1",
+ "*e+1*g+2*p+1*l+1*a+1*n+1*t+1*0|1+1"],
+ ["*t+1*u+1*p+1*l+1*e+1*0|1+1",
+ "*b+1*a+1*n+1*a+1*n+1*a+1*0|1+1",
+ "|1+6",
+ "|1+4",
+ "*c+1*a+1*b+1*o+1*t+1*0|1+1",
+ "*b+1*u+1*b+2*a+1*0|1+1",
+ "*e+1*g+2*p+1*l+1*a+1*n+1*t+1*0|1+1"]);
+
+ // based on runMutationTest#3
+ runMutateAttributionTest(6, testPoolWithChars,
+ "Z:11<f|1-6|2=f=6|1-1-8$",
+ ["*a|1+6", "*b|1+7", "*c|1+8", "*d|1+7", "*e|1+9"],
+ ["*b|1+7", "*c|1+8", "*d+6*e|1+1"]);
+
+ // based on runMutationTest#4
+ runMutateAttributionTest(7, testPoolWithChars,
+ "Z:3>7=1|4+7$\n2\n3\n4\n",
+ ["*1+1*5|1+2"],
+ ["*1+1|1+1","|1+2","|1+2","|1+2","*5|1+2"]);
+
+ // based on runMutationTest#5
+ runMutateAttributionTest(8, testPoolWithChars,
+ "Z:a<7=1|4-7$",
+ ["*1|1+2","*2|1+2","*3|1+2","*4|1+2","*5|1+2"],
+ ["*1+1*5|1+2"]);
+
+ // based on runMutationTest#6
+ runMutateAttributionTest(9, testPoolWithChars,
+ "Z:k<7*0+1*10|2=8|2-8$0",
+ ["*1+1*2+1*3+1|1+1","*a+1*b+1*c+1|1+1",
+ "*d+1*e+1*f+1|1+1","*g+1*h+1*i+1|1+1","?*x+1*y+1*z+1|1+1"],
+ ["*0+1|1+4", "|1+4", "?*x+1*y+1*z+1|1+1"]);
+
+ runMutateAttributionTest(10, testPoolWithChars,
+ "Z:6>4=1+1=1+1|1=1+1=1*0+1$abcd",
+ ["|1+3", "|1+3"],
+ ["|1+5", "+2*0+1|1+2"]);
+
+
+ runMutateAttributionTest(11, testPoolWithChars,
+ "Z:s>1|1=4=6|1+1$\n",
+ ["*0|1+4", "*0|1+8", "*0+5|1+1", "*0|1+1", "*0|1+5", "*0|1+1", "*0|1+1", "*0|1+1", "|1+1"],
+ ["*0|1+4", "*0+6|1+1", "*0|1+2", "*0+5|1+1", "*0|1+1", "*0|1+5", "*0|1+1", "*0|1+1", "*0|1+1", "|1+1"]);
+
+ function randomInlineString(len, rand) {
+ var assem = Changeset.stringAssembler();
+ for(var i=0;i<len;i++) {
+ assem.append(String.fromCharCode(rand.nextInt(26) + 97));
+ }
+ return assem.toString();
+ }
+
+ function randomMultiline(approxMaxLines, approxMaxCols, rand) {
+ var numParts = rand.nextInt(approxMaxLines*2)+1;
+ var txt = Changeset.stringAssembler();
+ txt.append(rand.nextInt(2) ? '\n' : '');
+ for(var i=0;i<numParts;i++) {
+ if ((i % 2) == 0) {
+ if (rand.nextInt(10)) {
+ txt.append(randomInlineString(rand.nextInt(approxMaxCols)+1, rand));
+ }
+ else {
+ txt.append('\n');
+ }
+ }
+ else {
+ txt.append('\n');
+ }
+ }
+ return txt.toString();
+ }
+
+ function randomStringOperation(numCharsLeft, rand) {
+ var result;
+ switch(rand.nextInt(9)) {
+ case 0: {
+ // insert char
+ result = {insert: randomInlineString(1, rand)};
+ break;
+ }
+ case 1: {
+ // delete char
+ result = {remove: 1};
+ break;
+ }
+ case 2: {
+ // skip char
+ result = {skip: 1};
+ break;
+ }
+ case 3: {
+ // insert small
+ result = {insert: randomInlineString(rand.nextInt(4)+1, rand)};
+ break;
+ }
+ case 4: {
+ // delete small
+ result = {remove: rand.nextInt(4)+1};
+ break;
+ }
+ case 5: {
+ // skip small
+ result = {skip: rand.nextInt(4)+1};
+ break;
+ }
+ case 6: {
+ // insert multiline;
+ result = {insert: randomMultiline(5, 20, rand)};
+ break;
+ }
+ case 7: {
+ // delete multiline
+ result = {remove: Math.round(numCharsLeft * rand.nextDouble() * rand.nextDouble()) };
+ break;
+ }
+ case 8: {
+ // skip multiline
+ result = {skip: Math.round(numCharsLeft * rand.nextDouble() * rand.nextDouble()) };
+ break;
+ }
+ case 9: {
+ // delete to end
+ result = {remove: numCharsLeft};
+ break;
+ }
+ case 10: {
+ // skip to end
+ result = {skip: numCharsLeft};
+ break;
+ }
+ }
+ var maxOrig = numCharsLeft - 1;
+ if ('remove' in result) {
+ result.remove = Math.min(result.remove, maxOrig);
+ }
+ else if ('skip' in result) {
+ result.skip = Math.min(result.skip, maxOrig);
+ }
+ return result;
+ }
+
+ function randomTwoPropAttribs(opcode, rand) {
+ // assumes attrib pool like ['apple,','apple,true','banana,','banana,true']
+ if (opcode == '-' || rand.nextInt(3)) {
+ return '';
+ }
+ else if (rand.nextInt(3)) {
+ if (opcode == '+' || rand.nextInt(2)) {
+ return '*'+Changeset.numToString(rand.nextInt(2)*2+1);
+ }
+ else {
+ return '*'+Changeset.numToString(rand.nextInt(2)*2);
+ }
+ }
+ else {
+ if (opcode == '+' || rand.nextInt(4) == 0) {
+ return '*1*3';
+ }
+ else {
+ return ['*0*2', '*0*3', '*1*2'][rand.nextInt(3)];
+ }
+ }
+ }
+
+ function randomTestChangeset(origText, rand, withAttribs) {
+ var charBank = Changeset.stringAssembler();
+ var textLeft = origText; // always keep final newline
+ var outTextAssem = Changeset.stringAssembler();
+ var opAssem = Changeset.smartOpAssembler();
+ var oldLen = origText.length;
+
+ var nextOp = Changeset.newOp();
+ function appendMultilineOp(opcode, txt) {
+ nextOp.opcode = opcode;
+ if (withAttribs) {
+ nextOp.attribs = randomTwoPropAttribs(opcode, rand);
+ }
+ txt.replace(/\n|[^\n]+/g, function (t) {
+ if (t == '\n') {
+ nextOp.chars = 1;
+ nextOp.lines = 1;
+ opAssem.append(nextOp);
+ }
+ else {
+ nextOp.chars = t.length;
+ nextOp.lines = 0;
+ opAssem.append(nextOp);
+ }
+ return '';
+ });
+ }
+
+ function doOp() {
+ var o = randomStringOperation(textLeft.length, rand);
+ if (o.insert) {
+ var txt = o.insert;
+ charBank.append(txt);
+ outTextAssem.append(txt);
+ appendMultilineOp('+', txt);
+ }
+ else if (o.skip) {
+ var txt = textLeft.substring(0, o.skip);
+ textLeft = textLeft.substring(o.skip);
+ outTextAssem.append(txt);
+ appendMultilineOp('=', txt);
+ }
+ else if (o.remove) {
+ var txt = textLeft.substring(0, o.remove);
+ textLeft = textLeft.substring(o.remove);
+ appendMultilineOp('-', txt);
+ }
+ }
+
+ while (textLeft.length > 1) doOp();
+ for(var i=0;i<5;i++) doOp(); // do some more (only insertions will happen)
+
+ var outText = outTextAssem.toString()+'\n';
+ opAssem.endDocument();
+ var cs = Changeset.pack(oldLen, outText.length, opAssem.toString(), charBank.toString());
+ Changeset.checkRep(cs);
+ return [cs, outText];
+ }
+
+ function testCompose(randomSeed) {
+ var rand = new java.util.Random(randomSeed);
+ print("> testCompose#"+randomSeed);
+
+ var p = new AttribPool();
+
+ var startText = randomMultiline(10, 20, rand)+'\n';
+
+ var x1 = randomTestChangeset(startText, rand);
+ var change1 = x1[0];
+ var text1 = x1[1];
+
+ var x2 = randomTestChangeset(text1, rand);
+ var change2 = x2[0];
+ var text2 = x2[1];
+
+ var x3 = randomTestChangeset(text2, rand);
+ var change3 = x3[0];
+ var text3 = x3[1];
+
+ //print(literal(Changeset.toBaseTen(startText)));
+ //print(literal(Changeset.toBaseTen(change1)));
+ //print(literal(Changeset.toBaseTen(change2)));
+ var change12 = Changeset.checkRep(Changeset.compose(change1, change2, p));
+ var change23 = Changeset.checkRep(Changeset.compose(change2, change3, p));
+ var change123 = Changeset.checkRep(Changeset.compose(change12, change3, p));
+ var change123a = Changeset.checkRep(Changeset.compose(change1, change23, p));
+ assertEqualStrings(change123, change123a);
+
+ assertEqualStrings(text2, Changeset.applyToText(change12, startText));
+ assertEqualStrings(text3, Changeset.applyToText(change23, text1));
+ assertEqualStrings(text3, Changeset.applyToText(change123, startText));
+ }
+
+ for(var i=0;i<30;i++) testCompose(i);
+
+ (function simpleComposeAttributesTest() {
+ print("> simpleComposeAttributesTest");
+ var p = new AttribPool();
+ p.putAttrib(['bold','']);
+ p.putAttrib(['bold','true']);
+ var cs1 = Changeset.checkRep("Z:2>1*1+1*1=1$x");
+ var cs2 = Changeset.checkRep("Z:3>0*0|1=3$");
+ var cs12 = Changeset.checkRep(Changeset.compose(cs1, cs2, p));
+ assertEqualStrings("Z:2>1+1*0|1=2$x", cs12);
+ })();
+
+ (function followAttributesTest() {
+ var p = new AttribPool();
+ p.putAttrib(['x','']);
+ p.putAttrib(['x','abc']);
+ p.putAttrib(['x','def']);
+ p.putAttrib(['y','']);
+ p.putAttrib(['y','abc']);
+ p.putAttrib(['y','def']);
+
+ function testFollow(a, b, afb, bfa, merge) {
+ assertEqualStrings(afb, Changeset.followAttributes(a, b, p));
+ assertEqualStrings(bfa, Changeset.followAttributes(b, a, p));
+ assertEqualStrings(merge, Changeset.composeAttributes(a, afb, true, p));
+ assertEqualStrings(merge, Changeset.composeAttributes(b, bfa, true, p));
+ }
+
+ testFollow('', '', '', '', '');
+ testFollow('*0', '', '', '*0', '*0');
+ testFollow('*0', '*0', '', '', '*0');
+ testFollow('*0', '*1', '', '*0', '*0');
+ testFollow('*1', '*2', '', '*1', '*1');
+ testFollow('*0*1', '', '', '*0*1', '*0*1');
+ testFollow('*0*4', '*2*3', '*3', '*0', '*0*3');
+ testFollow('*0*4', '*2', '', '*0*4', '*0*4');
+ })();
+
+ function testFollow(randomSeed) {
+ var rand = new java.util.Random(randomSeed + 1000);
+ print("> testFollow#"+randomSeed);
+
+ var p = new AttribPool();
+
+ var startText = randomMultiline(10, 20, rand)+'\n';
+
+ var cs1 = randomTestChangeset(startText, rand)[0];
+ var cs2 = randomTestChangeset(startText, rand)[0];
+
+ var afb = Changeset.checkRep(Changeset.follow(cs1, cs2, false, p));
+ var bfa = Changeset.checkRep(Changeset.follow(cs2, cs1, true, p));
+
+ var merge1 = Changeset.checkRep(Changeset.compose(cs1, afb));
+ var merge2 = Changeset.checkRep(Changeset.compose(cs2, bfa));
+
+ assertEqualStrings(merge1, merge2);
+ }
+
+ for(var i=0;i<30;i++) testFollow(i);
+
+ function testSplitJoinAttributionLines(randomSeed) {
+ var rand = new java.util.Random(randomSeed + 2000);
+ print("> testSplitJoinAttributionLines#"+randomSeed);
+
+ var doc = randomMultiline(10, 20, rand)+'\n';
+
+ function stringToOps(str) {
+ var assem = Changeset.mergingOpAssembler();
+ var o = Changeset.newOp('+');
+ o.chars = 1;
+ for(var i=0;i<str.length;i++) {
+ var c = str.charAt(i);
+ o.lines = (c == '\n' ? 1 : 0);
+ o.attribs = (c == 'a' || c == 'b' ? '*'+c : '');
+ assem.append(o);
+ }
+ return assem.toString();
+ }
+
+ var theJoined = stringToOps(doc);
+ var theSplit = doc.match(/[^\n]*\n/g).map(stringToOps);
+
+ assertEqualArrays(theSplit, Changeset.splitAttributionLines(theJoined, doc));
+ assertEqualStrings(theJoined, Changeset.joinAttributionLines(theSplit));
+ }
+
+ for(var i=0;i<10;i++) testSplitJoinAttributionLines(i);
+
+ (function testMoveOpsToNewPool() {
+ print("> testMoveOpsToNewPool");
+
+ var pool1 = new AttribPool();
+ var pool2 = new AttribPool();
+
+ pool1.putAttrib(['baz','qux']);
+ pool1.putAttrib(['foo','bar']);
+
+ pool2.putAttrib(['foo','bar']);
+
+ assertEqualStrings(Changeset.moveOpsToNewPool('Z:1>2*1+1*0+1$ab', pool1, pool2), 'Z:1>2*0+1*1+1$ab');
+ assertEqualStrings(Changeset.moveOpsToNewPool('*1+1*0+1', pool1, pool2), '*0+1*1+1');
+ })();
+
+
+ (function testMakeSplice() {
+ print("> testMakeSplice");
+
+ var t = "a\nb\nc\n";
+ var t2 = Changeset.applyToText(Changeset.makeSplice(t, 5, 0, "def"), t);
+ assertEqualStrings("a\nb\ncdef\n", t2);
+
+ })();
+
+ (function testToSplices() {
+ print("> testToSplices");
+
+ var cs = Changeset.checkRep('Z:z>9*0=1=4-3+9=1|1-4-4+1*0+a$123456789abcdefghijk');
+ var correctSplices = [[5, 8, "123456789"], [9, 17, "abcdefghijk"]];
+ assertEqualArrays(correctSplices, Changeset.toSplices(cs));
+ })();
+
+ function testCharacterRangeFollow(testId, cs, oldRange, insertionsAfter, correctNewRange) {
+ print("> testCharacterRangeFollow#"+testId);
+
+ var cs = Changeset.checkRep(cs);
+ assertEqualArrays(correctNewRange, Changeset.characterRangeFollow(cs, oldRange[0], oldRange[1],
+ insertionsAfter));
+
+ }
+
+ testCharacterRangeFollow(1, 'Z:z>9*0=1=4-3+9=1|1-4-4+1*0+a$123456789abcdefghijk',
+ [7, 10], false, [14, 15]);
+ testCharacterRangeFollow(2, "Z:bc<6|x=b4|2-6$", [400, 407], false, [400, 401]);
+ testCharacterRangeFollow(3, "Z:4>0-3+3$abc", [0,3], false, [3,3]);
+ testCharacterRangeFollow(4, "Z:4>0-3+3$abc", [0,3], true, [0,0]);
+ testCharacterRangeFollow(5, "Z:5>1+1=1-3+3$abcd", [1,4], false, [5,5]);
+ testCharacterRangeFollow(6, "Z:5>1+1=1-3+3$abcd", [1,4], true, [2,2]);
+ testCharacterRangeFollow(7, "Z:5>1+1=1-3+3$abcd", [0,6], false, [1,7]);
+ testCharacterRangeFollow(8, "Z:5>1+1=1-3+3$abcd", [0,3], false, [1,2]);
+ testCharacterRangeFollow(9, "Z:5>1+1=1-3+3$abcd", [2,5], false, [5,6]);
+ testCharacterRangeFollow(10, "Z:2>1+1$a", [0,0], false, [1,1]);
+ testCharacterRangeFollow(11, "Z:2>1+1$a", [0,0], true, [0,0]);
+
+ (function testOpAttributeValue() {
+ print("> testOpAttributeValue");
+
+ var p = new AttribPool();
+ p.putAttrib(['name','david']);
+ p.putAttrib(['color','green']);
+
+ assertEqualStrings("david", Changeset.opAttributeValue(Changeset.stringOp('*0*1+1'), 'name', p));
+ assertEqualStrings("david", Changeset.opAttributeValue(Changeset.stringOp('*0+1'), 'name', p));
+ assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('*1+1'), 'name', p));
+ assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('+1'), 'name', p));
+ assertEqualStrings("green", Changeset.opAttributeValue(Changeset.stringOp('*0*1+1'), 'color', p));
+ assertEqualStrings("green", Changeset.opAttributeValue(Changeset.stringOp('*1+1'), 'color', p));
+ assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('*0+1'), 'color', p));
+ assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('+1'), 'color', p));
+ })();
+
+ function testAppendATextToAssembler(testId, atext, correctOps) {
+ print("> testAppendATextToAssembler#"+testId);
+
+ var assem = Changeset.smartOpAssembler();
+ Changeset.appendATextToAssembler(atext, assem);
+ assertEqualStrings(correctOps, assem.toString());
+ }
+
+ testAppendATextToAssembler(1, {text:"\n", attribs:"|1+1"}, "");
+ testAppendATextToAssembler(2, {text:"\n\n", attribs:"|2+2"}, "|1+1");
+ testAppendATextToAssembler(3, {text:"\n\n", attribs:"*x|2+2"}, "*x|1+1");
+ testAppendATextToAssembler(4, {text:"\n\n", attribs:"*x|1+1|1+1"}, "*x|1+1");
+ testAppendATextToAssembler(5, {text:"foo\n", attribs:"|1+4"}, "+3");
+ testAppendATextToAssembler(6, {text:"\nfoo\n", attribs:"|2+5"}, "|1+1+3");
+ testAppendATextToAssembler(7, {text:"\nfoo\n", attribs:"*x|2+5"}, "*x|1+1*x+3");
+ testAppendATextToAssembler(8, {text:"\n\n\nfoo\n", attribs:"|2+2*x|2+5"}, "|2+2*x|1+1*x+3");
+
+ function testMakeAttribsString(testId, pool, opcode, attribs, correctString) {
+ print("> testMakeAttribsString#"+testId);
+
+ var p = poolOrArray(pool);
+ var str = Changeset.makeAttribsString(opcode, attribs, p);
+ assertEqualStrings(correctString, str);
+ }
+
+ testMakeAttribsString(1, ['bold,'], '+', [['bold','']], '');
+ testMakeAttribsString(2, ['abc,def','bold,'], '=', [['bold','']], '*1');
+ testMakeAttribsString(3, ['abc,def','bold,true'], '+', [['abc','def'],['bold','true']], '*0*1');
+ testMakeAttribsString(4, ['abc,def','bold,true'], '+', [['bold','true'],['abc','def']], '*0*1');
+
+ function testSubattribution(testId, astr, start, end, correctOutput) {
+ print("> testSubattribution#"+testId);
+
+ var str = Changeset.subattribution(astr, start, end);
+ assertEqualStrings(correctOutput, str);
+ }
+
+ testSubattribution(1, "+1", 0, 0, "");
+ testSubattribution(2, "+1", 0, 1, "+1");
+ testSubattribution(3, "+1", 0, undefined, "+1");
+ testSubattribution(4, "|1+1", 0, 0, "");
+ testSubattribution(5, "|1+1", 0, 1, "|1+1");
+ testSubattribution(6, "|1+1", 0, undefined, "|1+1");
+ testSubattribution(7, "*0+1", 0, 0, "");
+ testSubattribution(8, "*0+1", 0, 1, "*0+1");
+ testSubattribution(9, "*0+1", 0, undefined, "*0+1");
+ testSubattribution(10, "*0|1+1", 0, 0, "");
+ testSubattribution(11, "*0|1+1", 0, 1, "*0|1+1");
+ testSubattribution(12, "*0|1+1", 0, undefined, "*0|1+1");
+ testSubattribution(13, "*0+2+1*1+3", 0, 1, "*0+1");
+ testSubattribution(14, "*0+2+1*1+3", 0, 2, "*0+2");
+ testSubattribution(15, "*0+2+1*1+3", 0, 3, "*0+2+1");
+ testSubattribution(16, "*0+2+1*1+3", 0, 4, "*0+2+1*1+1");
+ testSubattribution(17, "*0+2+1*1+3", 0, 5, "*0+2+1*1+2");
+ testSubattribution(18, "*0+2+1*1+3", 0, 6, "*0+2+1*1+3");
+ testSubattribution(19, "*0+2+1*1+3", 0, 7, "*0+2+1*1+3");
+ testSubattribution(20, "*0+2+1*1+3", 0, undefined, "*0+2+1*1+3");
+ testSubattribution(21, "*0+2+1*1+3", 1, undefined, "*0+1+1*1+3");
+ testSubattribution(22, "*0+2+1*1+3", 2, undefined, "+1*1+3");
+ testSubattribution(23, "*0+2+1*1+3", 3, undefined, "*1+3");
+ testSubattribution(24, "*0+2+1*1+3", 4, undefined, "*1+2");
+ testSubattribution(25, "*0+2+1*1+3", 5, undefined, "*1+1");
+ testSubattribution(26, "*0+2+1*1+3", 6, undefined, "");
+ testSubattribution(27, "*0+2+1*1|1+3", 0, 1, "*0+1");
+ testSubattribution(28, "*0+2+1*1|1+3", 0, 2, "*0+2");
+ testSubattribution(29, "*0+2+1*1|1+3", 0, 3, "*0+2+1");
+ testSubattribution(30, "*0+2+1*1|1+3", 0, 4, "*0+2+1*1+1");
+ testSubattribution(31, "*0+2+1*1|1+3", 0, 5, "*0+2+1*1+2");
+ testSubattribution(32, "*0+2+1*1|1+3", 0, 6, "*0+2+1*1|1+3");
+ testSubattribution(33, "*0+2+1*1|1+3", 0, 7, "*0+2+1*1|1+3");
+ testSubattribution(34, "*0+2+1*1|1+3", 0, undefined, "*0+2+1*1|1+3");
+ testSubattribution(35, "*0+2+1*1|1+3", 1, undefined, "*0+1+1*1|1+3");
+ testSubattribution(36, "*0+2+1*1|1+3", 2, undefined, "+1*1|1+3");
+ testSubattribution(37, "*0+2+1*1|1+3", 3, undefined, "*1|1+3");
+ testSubattribution(38, "*0+2+1*1|1+3", 4, undefined, "*1|1+2");
+ testSubattribution(39, "*0+2+1*1|1+3", 5, undefined, "*1|1+1");
+ testSubattribution(40, "*0+2+1*1|1+3", 1, 5, "*0+1+1*1+2");
+ testSubattribution(41, "*0+2+1*1|1+3", 2, 6, "+1*1|1+3");
+ testSubattribution(42, "*0+2+1*1+3", 2, 6, "+1*1+3");
+
+ function testFilterAttribNumbers(testId, cs, filter, correctOutput) {
+ print("> testFilterAttribNumbers#"+testId);
+
+ var str = Changeset.filterAttribNumbers(cs, filter);
+ assertEqualStrings(correctOutput, str);
+ }
+
+ testFilterAttribNumbers(1, "*0*1+1+2+3*1+4*2+5*0*2*1*b*c+6",
+ function(n) { return (n%2) == 0; },
+ "*0+1+2+3+4*2+5*0*2*c+6");
+ testFilterAttribNumbers(2, "*0*1+1+2+3*1+4*2+5*0*2*1*b*c+6",
+ function(n) { return (n%2) == 1; },
+ "*1+1+2+3*1+4+5*1*b+6");
+
+ function testInverse(testId, cs, lines, alines, pool, correctOutput) {
+ print("> testInverse#"+testId);
+
+ pool = poolOrArray(pool);
+ var str = Changeset.inverse(Changeset.checkRep(cs), lines, alines, pool);
+ assertEqualStrings(correctOutput, str);
+ }
+
+ // take "FFFFTTTTT" and apply "-FT--FFTT", the inverse of which is "--F--TT--"
+ testInverse(1, "Z:9>0=1*0=1*1=1=2*0=2*1|1=2$", null, ["+4*1+5"], ['bold,','bold,true'],
+ "Z:9>0=2*0=1=2*1=2$");
+
+ function testMutateTextLines(testId, cs, lines, correctLines) {
+ print("> testMutateTextLines#"+testId);
+
+ var a = lines.slice();
+ Changeset.mutateTextLines(cs, a);
+ assertEqualArrays(correctLines, a);
+ }
+
+ testMutateTextLines(1, "Z:4<1|1-2-1|1+1+1$\nc", ["a\n", "b\n"], ["\n", "c\n"]);
+ testMutateTextLines(2, "Z:4>0|1-2-1|2+3$\nc\n", ["a\n", "b\n"], ["\n", "c\n", "\n"]);
+
+ function testInverseRandom(randomSeed) {
+ var rand = new java.util.Random(randomSeed + 3000);
+ print("> testInverseRandom#"+randomSeed);
+
+ var p = poolOrArray(['apple,','apple,true','banana,','banana,true']);
+
+ var startText = randomMultiline(10, 20, rand)+'\n';
+ var alines = Changeset.splitAttributionLines(Changeset.makeAttribution(startText), startText);
+ var lines = startText.slice(0,-1).split('\n').map(function(s) { return s+'\n'; });
+
+ var stylifier = randomTestChangeset(startText, rand, true)[0];
+
+ //print(alines.join('\n'));
+ Changeset.mutateAttributionLines(stylifier, alines, p);
+ //print(stylifier);
+ //print(alines.join('\n'));
+ Changeset.mutateTextLines(stylifier, lines);
+
+ var changeset = randomTestChangeset(lines.join(''), rand, true)[0];
+ var inverseChangeset = Changeset.inverse(changeset, lines, alines, p);
+
+ var origLines = lines.slice();
+ var origALines = alines.slice();
+
+ Changeset.mutateTextLines(changeset, lines);
+ Changeset.mutateAttributionLines(changeset, alines, p);
+ //print(origALines.join('\n'));
+ //print(changeset);
+ //print(inverseChangeset);
+ //print(origLines.map(function(s) { return '1: '+s.slice(0,-1); }).join('\n'));
+ //print(lines.map(function(s) { return '2: '+s.slice(0,-1); }).join('\n'));
+ //print(alines.join('\n'));
+ Changeset.mutateTextLines(inverseChangeset, lines);
+ Changeset.mutateAttributionLines(inverseChangeset, alines, p);
+ //print(lines.map(function(s) { return '3: '+s.slice(0,-1); }).join('\n'));
+
+ assertEqualArrays(origLines, lines);
+ assertEqualArrays(origALines, alines);
+ }
+
+ for(var i=0;i<30;i++) testInverseRandom(i);
+} \ No newline at end of file
diff --git a/trunk/infrastructure/ace/www/editor.css b/trunk/infrastructure/ace/www/editor.css
new file mode 100644
index 0000000..9df127d
--- /dev/null
+++ b/trunk/infrastructure/ace/www/editor.css
@@ -0,0 +1,114 @@
+
+/* These CSS rules are included in both the outer and inner ACE iframe.
+ Also see inner.css, included only in the inner one.
+*/
+
+body {
+ margin: 0;
+ white-space: nowrap;
+}
+
+h1,h2,h3,h4,h5,h6 {
+ display: inline;
+ line-height: 2em;
+}
+
+#outerdocbody {
+ background-color: #fff;
+}
+body.grayedout { background-color: #eee !important }
+
+#innerdocbody {
+ font-size: 12px; /* overridden by body.style */
+ font-family: monospace; /* overridden by body.style */
+ line-height: 16px; /* overridden by body.style */
+}
+
+body.doesWrap {
+ white-space: normal;
+}
+
+#innerdocbody {
+ padding-top: 1px; /* important for some reason? */
+ padding-right: 10px;
+ padding-bottom: 8px;
+ padding-left: 1px /* prevents characters from looking chopped off in FF3 */;
+ overflow: hidden;
+ /* blank 1x1 gif, so that IE8 doesn't consider the body transparent */
+ background-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);
+}
+
+#sidediv {
+ font-size: 11px;
+ font-family: monospace;
+ line-height: 16px; /* overridden by sideDiv.style */
+ padding-top: 8px; /* EDIT_BODY_PADDING_TOP */
+ padding-right: 3px; /* LINE_NUMBER_PADDING_RIGHT - 1 */
+ position: absolute;
+ width: 20px; /* MIN_LINEDIV_WIDTH */
+ top: 0;
+ left: 0;
+ cursor: default;
+ color: white;
+}
+
+#sidedivinner {
+ text-align: right;
+}
+
+.sidedivdelayed { /* class set after sizes are set */
+ background-color: #eee;
+ color: #888 !important;
+ border-right: 1px solid #999;
+}
+.sidedivhidden {
+ display: none;
+}
+
+#outerdocbody iframe {
+ display: block; /* codemirror says it suppresses bugs */
+ position: relative;
+ left: 32px; /* MIN_LINEDIV_WIDTH + LINE_NUMBER_PADDING_RIGHT + EDIT_BODY_PADDING_LEFT */
+ top: 7px; /* EDIT_BODY_PADDING_TOP - 1*/
+ border: 0;
+ width: 1px; /* changed programmatically */
+ height: 1px; /* changed programmatically */
+}
+
+#outerdocbody .hotrect {
+ border: 1px solid #999;
+ position: absolute;
+}
+
+/* cause "body" area (e.g. where clicks are heard) to grow horizontally with text */
+body.mozilla, body.safari {
+ display: table-cell;
+}
+
+body.doesWrap {
+ display: block !important;
+}
+
+.safari div {
+ /* prevents the caret from disappearing on the longest line of the doc */
+ padding-right: 1px;
+}
+
+p {
+ margin: 0;
+}
+
+/*b, strong, .Apple-style-span { font-weight: normal !important; font-style: normal !important;
+ color: red !important; }*/
+
+#linemetricsdiv {
+ position: absolute;
+ left: -1000px;
+ top: -1000px;
+ color: white;
+ z-index: -1;
+ font-size: 12px; /* overridden by lineMetricsDiv.style */
+ font-family: monospace; /* overridden by lineMetricsDiv.style */
+}
+
+#overlaysdiv { position: absolute; left: -1000px; top: -1000px; }
diff --git a/trunk/infrastructure/ace/www/firebug/errorIcon.png b/trunk/infrastructure/ace/www/firebug/errorIcon.png
new file mode 100644
index 0000000..2d75261
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/errorIcon.png
Binary files differ
diff --git a/trunk/infrastructure/ace/www/firebug/firebug.css b/trunk/infrastructure/ace/www/firebug/firebug.css
new file mode 100644
index 0000000..1f041c4
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/firebug.css
@@ -0,0 +1,209 @@
+
+html, body {
+ margin: 0;
+ background: #FFFFFF;
+ font-family: Lucida Grande, Tahoma, sans-serif;
+ font-size: 11px;
+ overflow: hidden;
+}
+
+a {
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+.toolbar {
+ height: 14px;
+ border-top: 1px solid ThreeDHighlight;
+ border-bottom: 1px solid ThreeDShadow;
+ padding: 2px 6px;
+ background: ThreeDFace;
+}
+
+.toolbarRight {
+ position: absolute;
+ top: 4px;
+ right: 6px;
+}
+
+#log {
+ overflow: auto;
+ position: absolute;
+ left: 0;
+ width: 100%;
+}
+
+#commandLine {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 18px;
+ border: none;
+ border-top: 1px solid ThreeDShadow;
+}
+
+/************************************************************************************************/
+
+.logRow {
+ position: relative;
+ border-bottom: 1px solid #D7D7D7;
+ padding: 2px 4px 1px 6px;
+ background-color: #FFFFFF;
+}
+
+.logRow-command {
+ font-family: Monaco, monospace;
+ color: blue;
+}
+
+.objectBox-null {
+ padding: 0 2px;
+ border: 1px solid #666666;
+ background-color: #888888;
+ color: #FFFFFF;
+}
+
+.objectBox-string {
+ font-family: Monaco, monospace;
+ color: red;
+ white-space: pre;
+}
+
+.objectBox-number {
+ color: #000088;
+}
+
+.objectBox-function {
+ font-family: Monaco, monospace;
+ color: DarkGreen;
+}
+
+.objectBox-object {
+ color: DarkGreen;
+ font-weight: bold;
+}
+
+/************************************************************************************************/
+
+.logRow-info,
+.logRow-error,
+.logRow-warning {
+ background: #FFFFFF no-repeat 2px 2px;
+ padding-left: 20px;
+ padding-bottom: 3px;
+}
+
+.logRow-info {
+ background-image: url(infoIcon.png);
+}
+
+.logRow-warning {
+ background-color: cyan;
+ background-image: url(warningIcon.png);
+}
+
+.logRow-error {
+ background-color: LightYellow;
+ background-image: url(errorIcon.png);
+}
+
+.errorMessage {
+ vertical-align: top;
+ color: #FF0000;
+}
+
+.objectBox-sourceLink {
+ position: absolute;
+ right: 4px;
+ top: 2px;
+ padding-left: 8px;
+ font-family: Lucida Grande, sans-serif;
+ font-weight: bold;
+ color: #0000FF;
+}
+
+/************************************************************************************************/
+
+.logRow-group {
+ background: #EEEEEE;
+ border-bottom: none;
+}
+
+.logGroup {
+ background: #EEEEEE;
+}
+
+.logGroupBox {
+ margin-left: 24px;
+ border-top: 1px solid #D7D7D7;
+ border-left: 1px solid #D7D7D7;
+}
+
+/************************************************************************************************/
+
+.selectorTag,
+.selectorId,
+.selectorClass {
+ font-family: Monaco, monospace;
+ font-weight: normal;
+}
+
+.selectorTag {
+ color: #0000FF;
+}
+
+.selectorId {
+ color: DarkBlue;
+}
+
+.selectorClass {
+ color: red;
+}
+
+/************************************************************************************************/
+
+.objectBox-element {
+ font-family: Monaco, monospace;
+ color: #000088;
+}
+
+.nodeChildren {
+ margin-left: 16px;
+}
+
+.nodeTag {
+ color: blue;
+}
+
+.nodeValue {
+ color: #FF0000;
+ font-weight: normal;
+}
+
+.nodeText,
+.nodeComment {
+ margin: 0 2px;
+ vertical-align: top;
+}
+
+.nodeText {
+ color: #333333;
+}
+
+.nodeComment {
+ color: DarkGreen;
+}
+
+/************************************************************************************************/
+
+.propertyNameCell {
+ vertical-align: top;
+}
+
+.propertyName {
+ font-weight: bold;
+}
diff --git a/trunk/infrastructure/ace/www/firebug/firebug.html b/trunk/infrastructure/ace/www/firebug/firebug.html
new file mode 100644
index 0000000..861e639
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/firebug.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <title>Firebug</title>
+ <link rel="stylesheet" type="text/css" href="firebug.css">
+</head>
+
+<body>
+ <div id="toolbar" class="toolbar">
+ <a href="#" onclick="parent.console.clear()">Clear</a>
+ <span class="toolbarRight">
+ <a href="#" onclick="parent.console.close()">Close</a>
+ </span>
+ </div>
+ <div id="log"></div>
+ <input type="text" id="commandLine">
+
+ <script>parent.onFirebugReady(document);</script>
+</body>
+</html>
diff --git a/trunk/infrastructure/ace/www/firebug/firebug.js b/trunk/infrastructure/ace/www/firebug/firebug.js
new file mode 100644
index 0000000..d3c1978
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/firebug.js
@@ -0,0 +1,688 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+if (!("console" in window) || !("firebug" in console)) {
+(function()
+{
+ window.console =
+ {
+ log: function()
+ {
+ logFormatted(arguments, "");
+ },
+
+ debug: function()
+ {
+ logFormatted(arguments, "debug");
+ },
+
+ info: function()
+ {
+ logFormatted(arguments, "info");
+ },
+
+ warn: function()
+ {
+ logFormatted(arguments, "warning");
+ },
+
+ error: function()
+ {
+ logFormatted(arguments, "error");
+ },
+
+ assert: function(truth, message)
+ {
+ if (!truth)
+ {
+ var args = [];
+ for (var i = 1; i < arguments.length; ++i)
+ args.push(arguments[i]);
+
+ logFormatted(args.length ? args : ["Assertion Failure"], "error");
+ throw message ? message : "Assertion Failure";
+ }
+ },
+
+ dir: function(object)
+ {
+ var html = [];
+
+ var pairs = [];
+ for (var name in object)
+ {
+ try
+ {
+ pairs.push([name, object[name]]);
+ }
+ catch (exc)
+ {
+ }
+ }
+
+ pairs.sort(function(a, b) { return a[0] < b[0] ? -1 : 1; });
+
+ html.push('<table>');
+ for (var i = 0; i < pairs.length; ++i)
+ {
+ var name = pairs[i][0], value = pairs[i][1];
+
+ html.push('<tr>',
+ '<td class="propertyNameCell"><span class="propertyName">',
+ escapeHTML(name), '</span></td>', '<td><span class="propertyValue">');
+ appendObject(value, html);
+ html.push('</span></td></tr>');
+ }
+ html.push('</table>');
+
+ logRow(html, "dir");
+ },
+
+ dirxml: function(node)
+ {
+ var html = [];
+
+ appendNode(node, html);
+ logRow(html, "dirxml");
+ },
+
+ group: function()
+ {
+ logRow(arguments, "group", pushGroup);
+ },
+
+ groupEnd: function()
+ {
+ logRow(arguments, "", popGroup);
+ },
+
+ time: function(name)
+ {
+ timeMap[name] = (new Date()).getTime();
+ },
+
+ timeEnd: function(name)
+ {
+ if (name in timeMap)
+ {
+ var delta = (new Date()).getTime() - timeMap[name];
+ logFormatted([name+ ":", delta+"ms"]);
+ delete timeMap[name];
+ }
+ },
+
+ count: function()
+ {
+ this.warn(["count() not supported."]);
+ },
+
+ trace: function()
+ {
+ this.warn(["trace() not supported."]);
+ },
+
+ profile: function()
+ {
+ this.warn(["profile() not supported."]);
+ },
+
+ profileEnd: function()
+ {
+ },
+
+ clear: function()
+ {
+ consoleBody.innerHTML = "";
+ },
+
+ open: function()
+ {
+ toggleConsole(true);
+ },
+
+ close: function()
+ {
+ if (frameVisible)
+ toggleConsole();
+ }
+ };
+
+ // ********************************************************************************************
+
+ var consoleFrame = null;
+ var consoleBody = null;
+ var commandLine = null;
+
+ var frameVisible = false;
+ var messageQueue = [];
+ var groupStack = [];
+ var timeMap = {};
+
+ var clPrefix = ">>> ";
+
+ var isFirefox = navigator.userAgent.indexOf("Firefox") != -1;
+ var isIE = navigator.userAgent.indexOf("MSIE") != -1;
+ var isOpera = navigator.userAgent.indexOf("Opera") != -1;
+ var isSafari = navigator.userAgent.indexOf("AppleWebKit") != -1;
+
+ // ********************************************************************************************
+
+ function toggleConsole(forceOpen)
+ {
+ frameVisible = forceOpen || !frameVisible;
+ if (consoleFrame)
+ consoleFrame.style.visibility = frameVisible ? "visible" : "hidden";
+ else
+ waitForBody();
+ }
+
+ function focusCommandLine()
+ {
+ toggleConsole(true);
+ if (commandLine)
+ commandLine.focus();
+ }
+
+ function waitForBody()
+ {
+ if (document.body)
+ createFrame();
+ else
+ setTimeout(waitForBody, 200);
+ }
+
+ function createFrame()
+ {
+ if (consoleFrame)
+ return;
+
+ window.onFirebugReady = function(doc)
+ {
+ window.onFirebugReady = null;
+
+ var toolbar = doc.getElementById("toolbar");
+ toolbar.onmousedown = onSplitterMouseDown;
+
+ commandLine = doc.getElementById("commandLine");
+ addEvent(commandLine, "keydown", onCommandLineKeyDown);
+
+ addEvent(doc, isIE || isSafari ? "keydown" : "keypress", onKeyDown);
+
+ consoleBody = doc.getElementById("log");
+ layout();
+ flush();
+ }
+
+ var baseURL = getFirebugURL();
+
+ consoleFrame = document.createElement("iframe");
+ consoleFrame.setAttribute("src", baseURL+"/firebug.html");
+ consoleFrame.setAttribute("frameBorder", "0");
+ consoleFrame.style.visibility = (frameVisible ? "visible" : "hidden");
+ consoleFrame.style.zIndex = "2147483647";
+ consoleFrame.style.position = "fixed";
+ consoleFrame.style.width = "100%";
+ consoleFrame.style.left = "0";
+ consoleFrame.style.bottom = "0";
+ consoleFrame.style.height = "200px";
+ document.body.appendChild(consoleFrame);
+ }
+
+ function getFirebugURL()
+ {
+ var scripts = document.getElementsByTagName("script");
+ for (var i = 0; i < scripts.length; ++i)
+ {
+ if (scripts[i].src.indexOf("firebug.js") != -1)
+ {
+ var lastSlash = scripts[i].src.lastIndexOf("/");
+ return scripts[i].src.substr(0, lastSlash);
+ }
+ }
+ }
+
+ function evalCommandLine()
+ {
+ var text = commandLine.value;
+ commandLine.value = "";
+
+ logRow([clPrefix, text], "command");
+
+ var value;
+ try
+ {
+ value = eval(text);
+ }
+ catch (exc)
+ {
+ }
+
+ console.log(value);
+ }
+
+ function layout()
+ {
+ var toolbar = consoleBody.ownerDocument.getElementById("toolbar");
+ var height = consoleFrame.offsetHeight - (toolbar.offsetHeight + commandLine.offsetHeight);
+ consoleBody.style.top = toolbar.offsetHeight + "px";
+ consoleBody.style.height = height + "px";
+
+ commandLine.style.top = (consoleFrame.offsetHeight - commandLine.offsetHeight) + "px";
+ }
+
+ function logRow(message, className, handler)
+ {
+ if (consoleBody)
+ writeMessage(message, className, handler);
+ else
+ {
+ messageQueue.push([message, className, handler]);
+ waitForBody();
+ }
+ }
+
+ function flush()
+ {
+ var queue = messageQueue;
+ messageQueue = [];
+
+ for (var i = 0; i < queue.length; ++i)
+ writeMessage(queue[i][0], queue[i][1], queue[i][2]);
+ }
+
+ function writeMessage(message, className, handler)
+ {
+ var isScrolledToBottom =
+ consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;
+
+ if (!handler)
+ handler = writeRow;
+
+ handler(message, className);
+
+ if (isScrolledToBottom)
+ consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight;
+ }
+
+ function appendRow(row)
+ {
+ var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody;
+ container.appendChild(row);
+ }
+
+ function writeRow(message, className)
+ {
+ var row = consoleBody.ownerDocument.createElement("div");
+ row.className = "logRow" + (className ? " logRow-"+className : "");
+ row.innerHTML = message.join("");
+ appendRow(row);
+ }
+
+ function pushGroup(message, className)
+ {
+ logFormatted(message, className);
+
+ var groupRow = consoleBody.ownerDocument.createElement("div");
+ groupRow.className = "logGroup";
+ var groupRowBox = consoleBody.ownerDocument.createElement("div");
+ groupRowBox.className = "logGroupBox";
+ groupRow.appendChild(groupRowBox);
+ appendRow(groupRowBox);
+ groupStack.push(groupRowBox);
+ }
+
+ function popGroup()
+ {
+ groupStack.pop();
+ }
+
+ // ********************************************************************************************
+
+ function logFormatted(objects, className)
+ {
+ var html = [];
+
+ var format = objects[0];
+ var objIndex = 0;
+
+ if (typeof(format) != "string")
+ {
+ format = "";
+ objIndex = -1;
+ }
+
+ var parts = parseFormat(format);
+ for (var i = 0; i < parts.length; ++i)
+ {
+ var part = parts[i];
+ if (part && typeof(part) == "object")
+ {
+ var object = objects[++objIndex];
+ part.appender(object, html);
+ }
+ else
+ appendText(part, html);
+ }
+
+ for (var i = objIndex+1; i < objects.length; ++i)
+ {
+ appendText(" ", html);
+
+ var object = objects[i];
+ if (typeof(object) == "string")
+ appendText(object, html);
+ else
+ appendObject(object, html);
+ }
+
+ logRow(html, className);
+ }
+
+ function parseFormat(format)
+ {
+ var parts = [];
+
+ var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
+ var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
+
+ for (var m = reg.exec(format); m; m = reg.exec(format))
+ {
+ var type = m[8] ? m[8] : m[5];
+ var appender = type in appenderMap ? appenderMap[type] : appendObject;
+ var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
+
+ parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
+ parts.push({appender: appender, precision: precision});
+
+ format = format.substr(m.index+m[0].length);
+ }
+
+ parts.push(format);
+
+ return parts;
+ }
+
+ function escapeHTML(value)
+ {
+ function replaceChars(ch)
+ {
+ switch (ch)
+ {
+ case "<":
+ return "&lt;";
+ case ">":
+ return "&gt;";
+ case "&":
+ return "&amp;";
+ case "'":
+ return "&#39;";
+ case '"':
+ return "&quot;";
+ }
+ return "?";
+ };
+ return String(value).replace(/[<>&"']/g, replaceChars);
+ }
+
+ function objectToString(object)
+ {
+ try
+ {
+ return object+"";
+ }
+ catch (exc)
+ {
+ return null;
+ }
+ }
+
+ // ********************************************************************************************
+
+ function appendText(object, html)
+ {
+ html.push(escapeHTML(objectToString(object)));
+ }
+
+ function appendNull(object, html)
+ {
+ html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendString(object, html)
+ {
+ html.push('<span class="objectBox-string">&quot;', escapeHTML(objectToString(object)),
+ '&quot;</span>');
+ }
+
+ function appendInteger(object, html)
+ {
+ html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendFloat(object, html)
+ {
+ html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendFunction(object, html)
+ {
+ var reName = /function ?(.*?)\(/;
+ var m = reName.exec(objectToString(object));
+ var name = m ? m[1] : "function";
+ html.push('<span class="objectBox-function">', escapeHTML(name), '()</span>');
+ }
+
+ function appendObject(object, html)
+ {
+ try
+ {
+ if (object == undefined)
+ appendNull("undefined", html);
+ else if (object == null)
+ appendNull("null", html);
+ else if (typeof object == "string")
+ appendString(object, html);
+ else if (typeof object == "number")
+ appendInteger(object, html);
+ else if (typeof object == "function")
+ appendFunction(object, html);
+ else if (object.nodeType == 1)
+ appendSelector(object, html);
+ else if (typeof object == "object")
+ appendObjectFormatted(object, html);
+ else
+ appendText(object, html);
+ }
+ catch (exc)
+ {
+ }
+ }
+
+ function appendObjectFormatted(object, html)
+ {
+ var text = objectToString(object);
+ var reObject = /\[object (.*?)\]/;
+
+ var m = reObject.exec(text);
+ html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>')
+ }
+
+ function appendSelector(object, html)
+ {
+ html.push('<span class="objectBox-selector">');
+
+ html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
+ if (object.id)
+ html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
+ if (object.className)
+ html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
+
+ html.push('</span>');
+ }
+
+ function appendNode(node, html)
+ {
+ if (node.nodeType == 1)
+ {
+ html.push(
+ '<div class="objectBox-element">',
+ '&lt;<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
+
+ for (var i = 0; i < node.attributes.length; ++i)
+ {
+ var attr = node.attributes[i];
+ if (!attr.specified)
+ continue;
+
+ html.push('&nbsp;<span class="nodeName">', attr.nodeName.toLowerCase(),
+ '</span>=&quot;<span class="nodeValue">', escapeHTML(attr.nodeValue),
+ '</span>&quot;')
+ }
+
+ if (node.firstChild)
+ {
+ html.push('&gt;</div><div class="nodeChildren">');
+
+ for (var child = node.firstChild; child; child = child.nextSibling)
+ appendNode(child, html);
+
+ html.push('</div><div class="objectBox-element">&lt;/<span class="nodeTag">',
+ node.nodeName.toLowerCase(), '&gt;</span></div>');
+ }
+ else
+ html.push('/&gt;</div>');
+ }
+ else if (node.nodeType == 3)
+ {
+ html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
+ '</div>');
+ }
+ }
+
+ // ********************************************************************************************
+
+ function addEvent(object, name, handler)
+ {
+ if (document.all)
+ object.attachEvent("on"+name, handler);
+ else
+ object.addEventListener(name, handler, false);
+ }
+
+ function removeEvent(object, name, handler)
+ {
+ if (document.all)
+ object.detachEvent("on"+name, handler);
+ else
+ object.removeEventListener(name, handler, false);
+ }
+
+ function cancelEvent(event)
+ {
+ if (document.all)
+ event.cancelBubble = true;
+ else
+ event.stopPropagation();
+ }
+
+ function onError(msg, href, lineNo)
+ {
+ var html = [];
+
+ var lastSlash = href.lastIndexOf("/");
+ var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
+
+ html.push(
+ '<span class="errorMessage">', msg, '</span>',
+ '<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
+ );
+
+ logRow(html, "error");
+ };
+
+ function onKeyDown(event)
+ {
+ if (event.keyCode == 123)
+ toggleConsole();
+ else if ((event.keyCode == 108 || event.keyCode == 76) && event.shiftKey
+ && (event.metaKey || event.ctrlKey))
+ focusCommandLine();
+ else
+ return;
+
+ cancelEvent(event);
+ }
+
+ function onSplitterMouseDown(event)
+ {
+ if (isSafari || isOpera)
+ return;
+
+ addEvent(document, "mousemove", onSplitterMouseMove);
+ addEvent(document, "mouseup", onSplitterMouseUp);
+
+ for (var i = 0; i < frames.length; ++i)
+ {
+ addEvent(frames[i].document, "mousemove", onSplitterMouseMove);
+ addEvent(frames[i].document, "mouseup", onSplitterMouseUp);
+ }
+ }
+
+ function onSplitterMouseMove(event)
+ {
+ var win = document.all
+ ? event.srcElement.ownerDocument.parentWindow
+ : event.target.ownerDocument.defaultView;
+
+ var clientY = event.clientY;
+ if (win != win.parent)
+ clientY += win.frameElement ? win.frameElement.offsetTop : 0;
+
+ var height = consoleFrame.offsetTop + consoleFrame.clientHeight;
+ var y = height - clientY;
+
+ consoleFrame.style.height = y + "px";
+ layout();
+ }
+
+ function onSplitterMouseUp(event)
+ {
+ removeEvent(document, "mousemove", onSplitterMouseMove);
+ removeEvent(document, "mouseup", onSplitterMouseUp);
+
+ for (var i = 0; i < frames.length; ++i)
+ {
+ removeEvent(frames[i].document, "mousemove", onSplitterMouseMove);
+ removeEvent(frames[i].document, "mouseup", onSplitterMouseUp);
+ }
+ }
+
+ function onCommandLineKeyDown(event)
+ {
+ if (event.keyCode == 13)
+ evalCommandLine();
+ else if (event.keyCode == 27)
+ commandLine.value = "";
+ }
+
+ window.onerror = onError;
+ addEvent(document, isIE || isSafari ? "keydown" : "keypress", onKeyDown);
+
+ if (document.documentElement.getAttribute("debug") == "true")
+ toggleConsole(true);
+})();
+}
diff --git a/trunk/infrastructure/ace/www/firebug/firebugx.js b/trunk/infrastructure/ace/www/firebug/firebugx.js
new file mode 100644
index 0000000..b2cc49c
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/firebugx.js
@@ -0,0 +1,26 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+if (!("console" in window) || !("firebug" in console))
+{
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+ "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+
+ window.console = {};
+ for (var i = 0; i < names.length; ++i)
+ window.console[names[i]] = function() {}
+} \ No newline at end of file
diff --git a/trunk/infrastructure/ace/www/firebug/infoIcon.png b/trunk/infrastructure/ace/www/firebug/infoIcon.png
new file mode 100644
index 0000000..da1e533
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/infoIcon.png
Binary files differ
diff --git a/trunk/infrastructure/ace/www/firebug/warningIcon.png b/trunk/infrastructure/ace/www/firebug/warningIcon.png
new file mode 100644
index 0000000..de51084
--- /dev/null
+++ b/trunk/infrastructure/ace/www/firebug/warningIcon.png
Binary files differ
diff --git a/trunk/infrastructure/ace/www/index.html b/trunk/infrastructure/ace/www/index.html
new file mode 100644
index 0000000..a1e6e96
--- /dev/null
+++ b/trunk/infrastructure/ace/www/index.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <head>
+ <title>A Code Editor</title>
+ <script src="jquery-1.2.1.js"></script>
+ <!-- DEBUG -->
+ <script src="ace2_outer.js"></script>
+ <script src="firebug/firebugx.js"></script>
+ <!-- /DEBUG -->
+ <script src="testcode.js"></script>
+ <!-- PROD: <script src="ace2.js"></script> -->
+ <script>
+ $(document).ready(function() {
+ var editor = new Ace2Editor();
+ editor.init("editorcontainer", getTestCode(), editorReady);
+
+ editor.setOnKeyPress(function (evt) {
+ if (evt.ctrlKey && evt.which == "s".charCodeAt(0)) {
+ alert("You tried to save.");
+ return false;
+ }
+ return true;
+ });
+
+ function editorReady() {
+ resizeEditor();
+ $(window).bind("resize", resizeEditor);
+ setTimeout(function() {editor.focus();}, 0);
+ }
+
+ function resizeEditor() {
+ $("#editorcontainer").get(0).style.height = "100%";
+ editor.getFrame().style.height = ((document.documentElement.clientHeight)-1)+"px";
+ editor.adjustSize();
+ }
+ });
+ </script>
+ <style>
+ html { overflow: hidden } /* for Win IE 6 */
+ body { margin:0; padding:0; border:0; overflow: hidden; }
+ #editorcontainer { height: 1000px; /* changed programmatically */ }
+ #editorcontainer iframe { width: 100%; height: 100%; border:0; padding:0; margin:0; }
+ </style>
+ </head>
+ <body>
+ <div id="editorcontainer"><!-- --></div>
+ </body>
+</html>
diff --git a/trunk/infrastructure/ace/www/inner.css b/trunk/infrastructure/ace/www/inner.css
new file mode 100644
index 0000000..7479cfe
--- /dev/null
+++ b/trunk/infrastructure/ace/www/inner.css
@@ -0,0 +1,48 @@
+
+/* Firefox (3) is bad about keeping the text cursor in design mode;
+ various actions (clicking, dragging, scroll-wheel) lose it and it
+ doesn't come back easily, presumably because of optimizations.
+ These rules try to maximize the chance Firefox will think the cursor
+ needs changing again.
+*/
+html { cursor: text; } /* in Safari, produces text cursor for whole doc (inc. below body) */
+span { cursor: auto; }
+
+a { cursor: pointer !important; }
+
+/*span { padding-bottom: 1px; }/* padding-top: 1px; }*/
+
+/*.inspoint_atstart_generic { background: transparent url(/genimg/solid/2x10/000000.gif) repeat-y left top }
+.inspoint_atend_generic { background: transparent url(/genimg/solid/2x10/000000.gif) repeat-y right top }*/
+
+/*div { background: transparent url(/static/img/acecarets/default.gif) repeat-y left top }*/
+
+/*tt { padding-left: 3px; padding-right: 3px; margin-right: -3px; margin-left: -3px; }*/
+
+/*div { display: list-item; list-style: disc outside; margin-left: 20px; }*/
+/*div:before { content:"foo" }*/
+
+ul, ol, li {
+ padding: 0;
+ margin: 0;
+}
+ul { margin-left: 1.5em; }
+ul ul { margin-left: 0 !important; }
+ul.list-bullet1 { margin-left: 1.5em; }
+ul.list-bullet2 { margin-left: 3em; }
+ul.list-bullet3 { margin-left: 4.5em; }
+ul.list-bullet4 { margin-left: 6em; }
+ul.list-bullet5 { margin-left: 7.5em; }
+ul.list-bullet6 { margin-left: 9em; }
+ul.list-bullet7 { margin-left: 10.5em; }
+ul.list-bullet8 { margin-left: 12em; }
+
+ul { list-style-type: disc; }
+ul.list-bullet1 { list-style-type: disc; }
+ul.list-bullet2 { list-style-type: circle; }
+ul.list-bullet3 { list-style-type: square; }
+ul.list-bullet4 { list-style-type: disc; }
+ul.list-bullet5 { list-style-type: circle; }
+ul.list-bullet6 { list-style-type: square; }
+ul.list-bullet7 { list-style-type: disc; }
+ul.list-bullet8 { list-style-type: circle; }
diff --git a/trunk/infrastructure/ace/www/jquery-1.2.1.js b/trunk/infrastructure/ace/www/jquery-1.2.1.js
new file mode 100644
index 0000000..b4eb132
--- /dev/null
+++ b/trunk/infrastructure/ace/www/jquery-1.2.1.js
@@ -0,0 +1,2992 @@
+(function(){
+/*
+ * jQuery 1.2.1 - New Wave Javascript
+ *
+ * Copyright (c) 2007 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
+ * $Rev: 3353 $
+ */
+
+// Map over jQuery in case of overwrite
+if ( typeof jQuery != "undefined" )
+ var _jQuery = jQuery;
+
+var jQuery = window.jQuery = function(selector, context) {
+ // If the context is a namespace object, return a new object
+ return this instanceof jQuery ?
+ this.init(selector, context) :
+ new jQuery(selector, context);
+};
+
+// Map over the $ in case of overwrite
+if ( typeof $ != "undefined" )
+ var _$ = $;
+
+// Map the jQuery namespace to the '$' one
+window.$ = jQuery;
+
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
+
+jQuery.fn = jQuery.prototype = {
+ init: function(selector, context) {
+ // Make sure that a selection was provided
+ selector = selector || document;
+
+ // Handle HTML strings
+ if ( typeof selector == "string" ) {
+ var m = quickExpr.exec(selector);
+ if ( m && (m[1] || !context) ) {
+ // HANDLE: $(html) -> $(array)
+ if ( m[1] )
+ selector = jQuery.clean( [ m[1] ], context );
+
+ // HANDLE: $("#id")
+ else {
+ var tmp = document.getElementById( m[3] );
+ if ( tmp )
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( tmp.id != m[3] )
+ return jQuery().find( selector );
+ else {
+ this[0] = tmp;
+ this.length = 1;
+ return this;
+ }
+ else
+ selector = [];
+ }
+
+ // HANDLE: $(expr)
+ } else
+ return new jQuery( context ).find( selector );
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction(selector) )
+ return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+
+ return this.setArray(
+ // HANDLE: $(array)
+ selector.constructor == Array && selector ||
+
+ // HANDLE: $(arraylike)
+ // Watch for when an array-like object is passed as the selector
+ (selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
+
+ // HANDLE: $(*)
+ [ selector ] );
+ },
+
+ jquery: "1.2.1",
+
+ size: function() {
+ return this.length;
+ },
+
+ length: 0,
+
+ get: function( num ) {
+ return num == undefined ?
+
+ // Return a 'clean' array
+ jQuery.makeArray( this ) :
+
+ // Return just the object
+ this[num];
+ },
+
+ pushStack: function( a ) {
+ var ret = jQuery(a);
+ ret.prevObject = this;
+ return ret;
+ },
+
+ setArray: function( a ) {
+ this.length = 0;
+ Array.prototype.push.apply( this, a );
+ return this;
+ },
+
+ each: function( fn, args ) {
+ return jQuery.each( this, fn, args );
+ },
+
+ index: function( obj ) {
+ var pos = -1;
+ this.each(function(i){
+ if ( this == obj ) pos = i;
+ });
+ return pos;
+ },
+
+ attr: function( key, value, type ) {
+ var obj = key;
+
+ // Look for the case where we're accessing a style value
+ if ( key.constructor == String )
+ if ( value == undefined )
+ return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
+ else {
+ obj = {};
+ obj[ key ] = value;
+ }
+
+ // Check to see if we're setting style values
+ return this.each(function(index){
+ // Set all the styles
+ for ( var prop in obj )
+ jQuery.attr(
+ type ? this.style : this,
+ prop, jQuery.prop(this, obj[prop], type, index, prop)
+ );
+ });
+ },
+
+ css: function( key, value ) {
+ return this.attr( key, value, "curCSS" );
+ },
+
+ text: function(e) {
+ if ( typeof e != "object" && e != null )
+ return this.empty().append( document.createTextNode( e ) );
+
+ var t = "";
+ jQuery.each( e || this, function(){
+ jQuery.each( this.childNodes, function(){
+ if ( this.nodeType != 8 )
+ t += this.nodeType != 1 ?
+ this.nodeValue : jQuery.fn.text([ this ]);
+ });
+ });
+ return t;
+ },
+
+ wrapAll: function(html) {
+ if ( this[0] )
+ // The elements to wrap the target around
+ jQuery(html, this[0].ownerDocument)
+ .clone()
+ .insertBefore(this[0])
+ .map(function(){
+ var elem = this;
+ while ( elem.firstChild )
+ elem = elem.firstChild;
+ return elem;
+ })
+ .append(this);
+
+ return this;
+ },
+
+ wrapInner: function(html) {
+ return this.each(function(){
+ jQuery(this).contents().wrapAll(html);
+ });
+ },
+
+ wrap: function(html) {
+ return this.each(function(){
+ jQuery(this).wrapAll(html);
+ });
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, 1, function(a){
+ this.appendChild( a );
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, -1, function(a){
+ this.insertBefore( a, this.firstChild );
+ });
+ },
+
+ before: function() {
+ return this.domManip(arguments, false, 1, function(a){
+ this.parentNode.insertBefore( a, this );
+ });
+ },
+
+ after: function() {
+ return this.domManip(arguments, false, -1, function(a){
+ this.parentNode.insertBefore( a, this.nextSibling );
+ });
+ },
+
+ end: function() {
+ return this.prevObject || jQuery([]);
+ },
+
+ find: function(t) {
+ var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
+ return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
+ jQuery.unique( data ) : data );
+ },
+
+ clone: function(events) {
+ // Do the clone
+ var ret = this.map(function(){
+ return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true);
+ });
+
+ // Need to set the expando to null on the cloned set if it exists
+ // removeData doesn't work here, IE removes it from the original as well
+ // this is primarily for IE but the data expando shouldn't be copied over in any browser
+ var clone = ret.find("*").andSelf().each(function(){
+ if ( this[ expando ] != undefined )
+ this[ expando ] = null;
+ });
+
+ // Copy the events from the original to the clone
+ if (events === true)
+ this.find("*").andSelf().each(function(i) {
+ var events = jQuery.data(this, "events");
+ for ( var type in events )
+ for ( var handler in events[type] )
+ jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
+ });
+
+ // Return the cloned set
+ return ret;
+ },
+
+ filter: function(t) {
+ return this.pushStack(
+ jQuery.isFunction( t ) &&
+ jQuery.grep(this, function(el, index){
+ return t.apply(el, [index]);
+ }) ||
+
+ jQuery.multiFilter(t,this) );
+ },
+
+ not: function(t) {
+ return this.pushStack(
+ t.constructor == String &&
+ jQuery.multiFilter(t, this, true) ||
+
+ jQuery.grep(this, function(a) {
+ return ( t.constructor == Array || t.jquery )
+ ? jQuery.inArray( a, t ) < 0
+ : a != t;
+ })
+ );
+ },
+
+ add: function(t) {
+ return this.pushStack( jQuery.merge(
+ this.get(),
+ t.constructor == String ?
+ jQuery(t).get() :
+ t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ?
+ t : [t] )
+ );
+ },
+
+ is: function(expr) {
+ return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
+ },
+
+ hasClass: function(expr) {
+ return this.is("." + expr);
+ },
+
+ val: function( val ) {
+ if ( val == undefined ) {
+ if ( this.length ) {
+ var elem = this[0];
+
+ // We need to handle select boxes special
+ if ( jQuery.nodeName(elem, "select") ) {
+ var index = elem.selectedIndex,
+ a = [],
+ options = elem.options,
+ one = elem.type == "select-one";
+
+ // Nothing was selected
+ if ( index < 0 )
+ return null;
+
+ // Loop through all the selected options
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[i];
+ if ( option.selected ) {
+ // Get the specifc value for the option
+ var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
+
+ // We don't need an array for one selects
+ if ( one )
+ return val;
+
+ // Multi-Selects return an array
+ a.push(val);
+ }
+ }
+
+ return a;
+
+ // Everything else, we just grab the value
+ } else
+ return this[0].value.replace(/\r/g, "");
+ }
+ } else
+ return this.each(function(){
+ if ( val.constructor == Array && /radio|checkbox/.test(this.type) )
+ this.checked = (jQuery.inArray(this.value, val) >= 0 ||
+ jQuery.inArray(this.name, val) >= 0);
+ else if ( jQuery.nodeName(this, "select") ) {
+ var tmp = val.constructor == Array ? val : [val];
+
+ jQuery("option", this).each(function(){
+ this.selected = (jQuery.inArray(this.value, tmp) >= 0 ||
+ jQuery.inArray(this.text, tmp) >= 0);
+ });
+
+ if ( !tmp.length )
+ this.selectedIndex = -1;
+ } else
+ this.value = val;
+ });
+ },
+
+ html: function( val ) {
+ return val == undefined ?
+ ( this.length ? this[0].innerHTML : null ) :
+ this.empty().append( val );
+ },
+
+ replaceWith: function( val ) {
+ return this.after( val ).remove();
+ },
+
+ eq: function(i){
+ return this.slice(i, i+1);
+ },
+
+ slice: function() {
+ return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
+ },
+
+ map: function(fn) {
+ return this.pushStack(jQuery.map( this, function(elem,i){
+ return fn.call( elem, i, elem );
+ }));
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ },
+
+ domManip: function(args, table, dir, fn) {
+ var clone = this.length > 1, a;
+
+ return this.each(function(){
+ if ( !a ) {
+ a = jQuery.clean(args, this.ownerDocument);
+ if ( dir < 0 )
+ a.reverse();
+ }
+
+ var obj = this;
+
+ if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
+ obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
+
+ jQuery.each( a, function(){
+ var elem = clone ? this.cloneNode(true) : this;
+ if ( !evalScript(0, elem) )
+ fn.call( obj, elem );
+ });
+ });
+ }
+};
+
+function evalScript(i, elem){
+ var script = jQuery.nodeName(elem, "script");
+
+ if ( script ) {
+ if ( elem.src )
+ jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
+ else
+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+
+ if ( elem.parentNode )
+ elem.parentNode.removeChild(elem);
+
+ } else if ( elem.nodeType == 1 )
+ jQuery("script", elem).each(evalScript);
+
+ return script;
+}
+
+jQuery.extend = jQuery.fn.extend = function() {
+ // copy reference to target object
+ var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
+
+ // Handle a deep copy situation
+ if ( target.constructor == Boolean ) {
+ deep = target;
+ target = arguments[1] || {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( al == 1 ) {
+ target = this;
+ a = 0;
+ }
+
+ var prop;
+
+ for ( ; a < al; a++ )
+ // Only deal with non-null/undefined values
+ if ( (prop = arguments[a]) != null )
+ // Extend the base object
+ for ( var i in prop ) {
+ // Prevent never-ending loop
+ if ( target == prop[i] )
+ continue;
+
+ // Recurse if we're merging object values
+ if ( deep && typeof prop[i] == 'object' && target[i] )
+ jQuery.extend( target[i], prop[i] );
+
+ // Don't bring in undefined values
+ else if ( prop[i] != undefined )
+ target[i] = prop[i];
+ }
+
+ // Return the modified object
+ return target;
+};
+
+var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {};
+
+jQuery.extend({
+ noConflict: function(deep) {
+ window.$ = _$;
+ if ( deep )
+ window.jQuery = _jQuery;
+ return jQuery;
+ },
+
+ // This may seem like some crazy code, but trust me when I say that this
+ // is the only cross-browser way to do this. --John
+ isFunction: function( fn ) {
+ return !!fn && typeof fn != "string" && !fn.nodeName &&
+ fn.constructor != Array && /function/i.test( fn + "" );
+ },
+
+ // check if an element is in a XML document
+ isXMLDoc: function(elem) {
+ return elem.documentElement && !elem.body ||
+ elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+ },
+
+ // Evalulates a script in a global context
+ // Evaluates Async. in Safari 2 :-(
+ globalEval: function( data ) {
+ data = jQuery.trim( data );
+ if ( data ) {
+ if ( window.execScript )
+ window.execScript( data );
+ else if ( jQuery.browser.safari )
+ // safari doesn't provide a synchronous global eval
+ window.setTimeout( data, 0 );
+ else
+ eval.call( window, data );
+ }
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
+ },
+
+ cache: {},
+
+ data: function( elem, name, data ) {
+ elem = elem == window ? win : elem;
+
+ var id = elem[ expando ];
+
+ // Compute a unique ID for the element
+ if ( !id )
+ id = elem[ expando ] = ++uuid;
+
+ // Only generate the data cache if we're
+ // trying to access or manipulate it
+ if ( name && !jQuery.cache[ id ] )
+ jQuery.cache[ id ] = {};
+
+ // Prevent overriding the named cache with undefined values
+ if ( data != undefined )
+ jQuery.cache[ id ][ name ] = data;
+
+ // Return the named cache data, or the ID for the element
+ return name ? jQuery.cache[ id ][ name ] : id;
+ },
+
+ removeData: function( elem, name ) {
+ elem = elem == window ? win : elem;
+
+ var id = elem[ expando ];
+
+ // If we want to remove a specific section of the element's data
+ if ( name ) {
+ if ( jQuery.cache[ id ] ) {
+ // Remove the section of cache data
+ delete jQuery.cache[ id ][ name ];
+
+ // If we've removed all the data, remove the element's cache
+ name = "";
+ for ( name in jQuery.cache[ id ] ) break;
+ if ( !name )
+ jQuery.removeData( elem );
+ }
+
+ // Otherwise, we want to remove all of the element's data
+ } else {
+ // Clean up the element expando
+ try {
+ delete elem[ expando ];
+ } catch(e){
+ // IE has trouble directly removing the expando
+ // but it's ok with using removeAttribute
+ if ( elem.removeAttribute )
+ elem.removeAttribute( expando );
+ }
+
+ // Completely remove the data cache
+ delete jQuery.cache[ id ];
+ }
+ },
+
+ // args is for internal usage only
+ each: function( obj, fn, args ) {
+ if ( args ) {
+ if ( obj.length == undefined )
+ for ( var i in obj )
+ fn.apply( obj[i], args );
+ else
+ for ( var i = 0, ol = obj.length; i < ol; i++ )
+ if ( fn.apply( obj[i], args ) === false ) break;
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( obj.length == undefined )
+ for ( var i in obj )
+ fn.call( obj[i], i, obj[i] );
+ else
+ for ( var i = 0, ol = obj.length, val = obj[0];
+ i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
+ }
+
+ return obj;
+ },
+
+ prop: function(elem, value, type, index, prop){
+ // Handle executable functions
+ if ( jQuery.isFunction( value ) )
+ value = value.call( elem, [index] );
+
+ // exclude the following css properties to add px
+ var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
+
+ // Handle passing in a number to a CSS property
+ return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
+ value + "px" :
+ value;
+ },
+
+ className: {
+ // internal only, use addClass("class")
+ add: function( elem, c ){
+ jQuery.each( (c || "").split(/\s+/), function(i, cur){
+ if ( !jQuery.className.has( elem.className, cur ) )
+ elem.className += ( elem.className ? " " : "" ) + cur;
+ });
+ },
+
+ // internal only, use removeClass("class")
+ remove: function( elem, c ){
+ elem.className = c != undefined ?
+ jQuery.grep( elem.className.split(/\s+/), function(cur){
+ return !jQuery.className.has( c, cur );
+ }).join(" ") : "";
+ },
+
+ // internal only, use is(".class")
+ has: function( t, c ) {
+ return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
+ }
+ },
+
+ swap: function(e,o,f) {
+ for ( var i in o ) {
+ e.style["old"+i] = e.style[i];
+ e.style[i] = o[i];
+ }
+ f.apply( e, [] );
+ for ( var i in o )
+ e.style[i] = e.style["old"+i];
+ },
+
+ css: function(e,p) {
+ if ( p == "height" || p == "width" ) {
+ var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
+
+ jQuery.each( d, function(){
+ old["padding" + this] = 0;
+ old["border" + this + "Width"] = 0;
+ });
+
+ jQuery.swap( e, old, function() {
+ if ( jQuery(e).is(':visible') ) {
+ oHeight = e.offsetHeight;
+ oWidth = e.offsetWidth;
+ } else {
+ e = jQuery(e.cloneNode(true))
+ .find(":radio").removeAttr("checked").end()
+ .css({
+ visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
+ }).appendTo(e.parentNode)[0];
+
+ var parPos = jQuery.css(e.parentNode,"position") || "static";
+ if ( parPos == "static" )
+ e.parentNode.style.position = "relative";
+
+ oHeight = e.clientHeight;
+ oWidth = e.clientWidth;
+
+ if ( parPos == "static" )
+ e.parentNode.style.position = "static";
+
+ e.parentNode.removeChild(e);
+ }
+ });
+
+ return p == "height" ? oHeight : oWidth;
+ }
+
+ return jQuery.curCSS( e, p );
+ },
+
+ curCSS: function(elem, prop, force) {
+ var ret, stack = [], swap = [];
+
+ // A helper method for determining if an element's values are broken
+ function color(a){
+ if ( !jQuery.browser.safari )
+ return false;
+
+ var ret = document.defaultView.getComputedStyle(a,null);
+ return !ret || ret.getPropertyValue("color") == "";
+ }
+
+ if (prop == "opacity" && jQuery.browser.msie) {
+ ret = jQuery.attr(elem.style, "opacity");
+ return ret == "" ? "1" : ret;
+ }
+
+ if (prop.match(/float/i))
+ prop = styleFloat;
+
+ if (!force && elem.style[prop])
+ ret = elem.style[prop];
+
+ else if (document.defaultView && document.defaultView.getComputedStyle) {
+
+ if (prop.match(/float/i))
+ prop = "float";
+
+ prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
+ var cur = document.defaultView.getComputedStyle(elem, null);
+
+ if ( cur && !color(elem) )
+ ret = cur.getPropertyValue(prop);
+
+ // If the element isn't reporting its values properly in Safari
+ // then some display: none elements are involved
+ else {
+ // Locate all of the parent display: none elements
+ for ( var a = elem; a && color(a); a = a.parentNode )
+ stack.unshift(a);
+
+ // Go through and make them visible, but in reverse
+ // (It would be better if we knew the exact display type that they had)
+ for ( a = 0; a < stack.length; a++ )
+ if ( color(stack[a]) ) {
+ swap[a] = stack[a].style.display;
+ stack[a].style.display = "block";
+ }
+
+ // Since we flip the display style, we have to handle that
+ // one special, otherwise get the value
+ ret = prop == "display" && swap[stack.length-1] != null ?
+ "none" :
+ document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
+
+ // Finally, revert the display styles back
+ for ( a = 0; a < swap.length; a++ )
+ if ( swap[a] != null )
+ stack[a].style.display = swap[a];
+ }
+
+ if ( prop == "opacity" && ret == "" )
+ ret = "1";
+
+ } else if (elem.currentStyle) {
+ var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
+ ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {
+ var style = elem.style.left;
+ var runtimeStyle = elem.runtimeStyle.left;
+ elem.runtimeStyle.left = elem.currentStyle.left;
+ elem.style.left = ret || 0;
+ ret = elem.style.pixelLeft + "px";
+ elem.style.left = style;
+ elem.runtimeStyle.left = runtimeStyle;
+ }
+ }
+
+ return ret;
+ },
+
+ clean: function(a, doc) {
+ var r = [];
+ doc = doc || document;
+
+ jQuery.each( a, function(i,arg){
+ if ( !arg ) return;
+
+ if ( arg.constructor == Number )
+ arg = arg.toString();
+
+ // Convert html string into DOM nodes
+ if ( typeof arg == "string" ) {
+ // Fix "XHTML"-style tags in all browsers
+ arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
+ return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
+ });
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
+
+ var wrap =
+ // option or optgroup
+ !s.indexOf("<opt") &&
+ [1, "<select>", "</select>"] ||
+
+ !s.indexOf("<leg") &&
+ [1, "<fieldset>", "</fieldset>"] ||
+
+ s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
+ [1, "<table>", "</table>"] ||
+
+ !s.indexOf("<tr") &&
+ [2, "<table><tbody>", "</tbody></table>"] ||
+
+ // <thead> matched above
+ (!s.indexOf("<td") || !s.indexOf("<th")) &&
+ [3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
+
+ !s.indexOf("<col") &&
+ [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
+
+ // IE can't serialize <link> and <script> tags normally
+ jQuery.browser.msie &&
+ [1, "div<div>", "</div>"] ||
+
+ [0,"",""];
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + arg + wrap[2];
+
+ // Move to the right depth
+ while ( wrap[0]-- )
+ div = div.lastChild;
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( jQuery.browser.msie ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 )
+ tb = div.firstChild && div.firstChild.childNodes;
+
+ // String was a bare <thead> or <tfoot>
+ else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
+ tb = div.childNodes;
+
+ for ( var n = tb.length-1; n >= 0 ; --n )
+ if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
+ tb[n].parentNode.removeChild(tb[n]);
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( /^\s/.test(arg) )
+ div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
+
+ }
+
+ arg = jQuery.makeArray( div.childNodes );
+ }
+
+ if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
+ return;
+
+ if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
+ r.push( arg );
+ else
+ r = jQuery.merge( r, arg );
+
+ });
+
+ return r;
+ },
+
+ attr: function(elem, name, value){
+ var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
+
+ // Safari mis-reports the default selected property of a hidden option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name == "selected" && jQuery.browser.safari )
+ elem.parentNode.selectedIndex;
+
+ // Certain attributes only work when accessed via the old DOM 0 way
+ if ( fix[name] ) {
+ if ( value != undefined ) elem[fix[name]] = value;
+ return elem[fix[name]];
+ } else if ( jQuery.browser.msie && name == "style" )
+ return jQuery.attr( elem.style, "cssText", value );
+
+ else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
+ return elem.getAttributeNode(name).nodeValue;
+
+ // IE elem.getAttribute passes even for style
+ else if ( elem.tagName ) {
+
+ if ( value != undefined ) {
+ if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
+ throw "type property can't be changed";
+ elem.setAttribute( name, value );
+ }
+
+ if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) )
+ return elem.getAttribute( name, 2 );
+
+ return elem.getAttribute( name );
+
+ // elem is actually elem.style ... set the style
+ } else {
+ // IE actually uses filters for opacity
+ if ( name == "opacity" && jQuery.browser.msie ) {
+ if ( value != undefined ) {
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ elem.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
+ (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+ }
+
+ return elem.filter ?
+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
+ }
+ name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
+ if ( value != undefined ) elem[name] = value;
+ return elem[name];
+ }
+ },
+
+ trim: function(t){
+ return (t||"").replace(/^\s+|\s+$/g, "");
+ },
+
+ makeArray: function( a ) {
+ var r = [];
+
+ // Need to use typeof to fight Safari childNodes crashes
+ if ( typeof a != "array" )
+ for ( var i = 0, al = a.length; i < al; i++ )
+ r.push( a[i] );
+ else
+ r = a.slice( 0 );
+
+ return r;
+ },
+
+ inArray: function( b, a ) {
+ for ( var i = 0, al = a.length; i < al; i++ )
+ if ( a[i] == b )
+ return i;
+ return -1;
+ },
+
+ merge: function(first, second) {
+ // We have to loop this way because IE & Opera overwrite the length
+ // expando of getElementsByTagName
+
+ // Also, we need to make sure that the correct elements are being returned
+ // (IE returns comment nodes in a '*' query)
+ if ( jQuery.browser.msie ) {
+ for ( var i = 0; second[i]; i++ )
+ if ( second[i].nodeType != 8 )
+ first.push(second[i]);
+ } else
+ for ( var i = 0; second[i]; i++ )
+ first.push(second[i]);
+
+ return first;
+ },
+
+ unique: function(first) {
+ var r = [], done = {};
+
+ try {
+ for ( var i = 0, fl = first.length; i < fl; i++ ) {
+ var id = jQuery.data(first[i]);
+ if ( !done[id] ) {
+ done[id] = true;
+ r.push(first[i]);
+ }
+ }
+ } catch(e) {
+ r = first;
+ }
+
+ return r;
+ },
+
+ grep: function(elems, fn, inv) {
+ // If a string is passed in for the function, make a function
+ // for it (a handy shortcut)
+ if ( typeof fn == "string" )
+ fn = eval("false||function(a,i){return " + fn + "}");
+
+ var result = [];
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, el = elems.length; i < el; i++ )
+ if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
+ result.push( elems[i] );
+
+ return result;
+ },
+
+ map: function(elems, fn) {
+ // If a string is passed in for the function, make a function
+ // for it (a handy shortcut)
+ if ( typeof fn == "string" )
+ fn = eval("false||function(a){return " + fn + "}");
+
+ var result = [];
+
+ // Go through the array, translating each of the items to their
+ // new value (or values).
+ for ( var i = 0, el = elems.length; i < el; i++ ) {
+ var val = fn(elems[i],i);
+
+ if ( val !== null && val != undefined ) {
+ if ( val.constructor != Array ) val = [val];
+ result = result.concat( val );
+ }
+ }
+
+ return result;
+ }
+});
+
+var userAgent = navigator.userAgent.toLowerCase();
+
+// Figure out what browser is being used
+jQuery.browser = {
+ version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
+ safari: /webkit/.test(userAgent),
+ opera: /opera/.test(userAgent),
+ msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
+ mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
+};
+
+var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
+
+jQuery.extend({
+ // Check to see if the W3C box model is being used
+ boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
+
+ styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
+
+ props: {
+ "for": "htmlFor",
+ "class": "className",
+ "float": styleFloat,
+ cssFloat: styleFloat,
+ styleFloat: styleFloat,
+ innerHTML: "innerHTML",
+ className: "className",
+ value: "value",
+ disabled: "disabled",
+ checked: "checked",
+ readonly: "readOnly",
+ selected: "selected",
+ maxlength: "maxLength"
+ }
+});
+
+jQuery.each({
+ parent: "a.parentNode",
+ parents: "jQuery.dir(a,'parentNode')",
+ next: "jQuery.nth(a,2,'nextSibling')",
+ prev: "jQuery.nth(a,2,'previousSibling')",
+ nextAll: "jQuery.dir(a,'nextSibling')",
+ prevAll: "jQuery.dir(a,'previousSibling')",
+ siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
+ children: "jQuery.sibling(a.firstChild)",
+ contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
+}, function(i,n){
+ jQuery.fn[ i ] = function(a) {
+ var ret = jQuery.map(this,n);
+ if ( a && typeof a == "string" )
+ ret = jQuery.multiFilter(a,ret);
+ return this.pushStack( jQuery.unique(ret) );
+ };
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function(i,n){
+ jQuery.fn[ i ] = function(){
+ var a = arguments;
+ return this.each(function(){
+ for ( var j = 0, al = a.length; j < al; j++ )
+ jQuery(a[j])[n]( this );
+ });
+ };
+});
+
+jQuery.each( {
+ removeAttr: function( key ) {
+ jQuery.attr( this, key, "" );
+ this.removeAttribute( key );
+ },
+ addClass: function(c){
+ jQuery.className.add(this,c);
+ },
+ removeClass: function(c){
+ jQuery.className.remove(this,c);
+ },
+ toggleClass: function( c ){
+ jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
+ },
+ remove: function(a){
+ if ( !a || jQuery.filter( a, [this] ).r.length ) {
+ jQuery.removeData( this );
+ this.parentNode.removeChild( this );
+ }
+ },
+ empty: function() {
+ // Clean up the cache
+ jQuery("*", this).each(function(){ jQuery.removeData(this); });
+
+ while ( this.firstChild )
+ this.removeChild( this.firstChild );
+ }
+}, function(i,n){
+ jQuery.fn[ i ] = function() {
+ return this.each( n, arguments );
+ };
+});
+
+jQuery.each( [ "Height", "Width" ], function(i,name){
+ var n = name.toLowerCase();
+
+ jQuery.fn[ n ] = function(h) {
+ return this[0] == window ?
+ jQuery.browser.safari && self["inner" + name] ||
+ jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) ||
+ document.body["client" + name] :
+
+ this[0] == document ?
+ Math.max( document.body["scroll" + name], document.body["offset" + name] ) :
+
+ h == undefined ?
+ ( this.length ? jQuery.css( this[0], n ) : null ) :
+ this.css( n, h.constructor == String ? h : h + "px" );
+ };
+});
+
+var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
+ "(?:[\\w*_-]|\\\\.)" :
+ "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
+ quickChild = new RegExp("^>\\s*(" + chars + "+)"),
+ quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
+ quickClass = new RegExp("^([#.]?)(" + chars + "*)");
+
+jQuery.extend({
+ expr: {
+ "": "m[2]=='*'||jQuery.nodeName(a,m[2])",
+ "#": "a.getAttribute('id')==m[2]",
+ ":": {
+ // Position Checks
+ lt: "i<m[3]-0",
+ gt: "i>m[3]-0",
+ nth: "m[3]-0==i",
+ eq: "m[3]-0==i",
+ first: "i==0",
+ last: "i==r.length-1",
+ even: "i%2==0",
+ odd: "i%2",
+
+ // Child Checks
+ "first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
+ "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
+ "only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
+
+ // Parent Checks
+ parent: "a.firstChild",
+ empty: "!a.firstChild",
+
+ // Text Check
+ contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",
+
+ // Visibility
+ visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
+ hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
+
+ // Form attributes
+ enabled: "!a.disabled",
+ disabled: "a.disabled",
+ checked: "a.checked",
+ selected: "a.selected||jQuery.attr(a,'selected')",
+
+ // Form elements
+ text: "'text'==a.type",
+ radio: "'radio'==a.type",
+ checkbox: "'checkbox'==a.type",
+ file: "'file'==a.type",
+ password: "'password'==a.type",
+ submit: "'submit'==a.type",
+ image: "'image'==a.type",
+ reset: "'reset'==a.type",
+ button: '"button"==a.type||jQuery.nodeName(a,"button")',
+ input: "/input|select|textarea|button/i.test(a.nodeName)",
+
+ // :has()
+ has: "jQuery.find(m[3],a).length",
+
+ // :header
+ header: "/h\\d/i.test(a.nodeName)",
+
+ // :animated
+ animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"
+ }
+ },
+
+ // The regular expressions that power the parsing engine
+ parse: [
+ // Match: [@value='test'], [@foo]
+ /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
+
+ // Match: :contains('foo')
+ /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
+
+ // Match: :even, :last-chlid, #id, .class
+ new RegExp("^([:.#]*)(" + chars + "+)")
+ ],
+
+ multiFilter: function( expr, elems, not ) {
+ var old, cur = [];
+
+ while ( expr && expr != old ) {
+ old = expr;
+ var f = jQuery.filter( expr, elems, not );
+ expr = f.t.replace(/^\s*,\s*/, "" );
+ cur = not ? elems = f.r : jQuery.merge( cur, f.r );
+ }
+
+ return cur;
+ },
+
+ find: function( t, context ) {
+ // Quickly handle non-string expressions
+ if ( typeof t != "string" )
+ return [ t ];
+
+ // Make sure that the context is a DOM Element
+ if ( context && !context.nodeType )
+ context = null;
+
+ // Set the correct context (if none is provided)
+ context = context || document;
+
+ // Initialize the search
+ var ret = [context], done = [], last;
+
+ // Continue while a selector expression exists, and while
+ // we're no longer looping upon ourselves
+ while ( t && last != t ) {
+ var r = [];
+ last = t;
+
+ t = jQuery.trim(t);
+
+ var foundToken = false;
+
+ // An attempt at speeding up child selectors that
+ // point to a specific element tag
+ var re = quickChild;
+ var m = re.exec(t);
+
+ if ( m ) {
+ var nodeName = m[1].toUpperCase();
+
+ // Perform our own iteration and filter
+ for ( var i = 0; ret[i]; i++ )
+ for ( var c = ret[i].firstChild; c; c = c.nextSibling )
+ if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
+ r.push( c );
+
+ ret = r;
+ t = t.replace( re, "" );
+ if ( t.indexOf(" ") == 0 ) continue;
+ foundToken = true;
+ } else {
+ re = /^([>+~])\s*(\w*)/i;
+
+ if ( (m = re.exec(t)) != null ) {
+ r = [];
+
+ var nodeName = m[2], merge = {};
+ m = m[1];
+
+ for ( var j = 0, rl = ret.length; j < rl; j++ ) {
+ var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
+ for ( ; n; n = n.nextSibling )
+ if ( n.nodeType == 1 ) {
+ var id = jQuery.data(n);
+
+ if ( m == "~" && merge[id] ) break;
+
+ if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
+ if ( m == "~" ) merge[id] = true;
+ r.push( n );
+ }
+
+ if ( m == "+" ) break;
+ }
+ }
+
+ ret = r;
+
+ // And remove the token
+ t = jQuery.trim( t.replace( re, "" ) );
+ foundToken = true;
+ }
+ }
+
+ // See if there's still an expression, and that we haven't already
+ // matched a token
+ if ( t && !foundToken ) {
+ // Handle multiple expressions
+ if ( !t.indexOf(",") ) {
+ // Clean the result set
+ if ( context == ret[0] ) ret.shift();
+
+ // Merge the result sets
+ done = jQuery.merge( done, ret );
+
+ // Reset the context
+ r = ret = [context];
+
+ // Touch up the selector string
+ t = " " + t.substr(1,t.length);
+
+ } else {
+ // Optimize for the case nodeName#idName
+ var re2 = quickID;
+ var m = re2.exec(t);
+
+ // Re-organize the results, so that they're consistent
+ if ( m ) {
+ m = [ 0, m[2], m[3], m[1] ];
+
+ } else {
+ // Otherwise, do a traditional filter check for
+ // ID, class, and element selectors
+ re2 = quickClass;
+ m = re2.exec(t);
+ }
+
+ m[2] = m[2].replace(/\\/g, "");
+
+ var elem = ret[ret.length-1];
+
+ // Try to do a global search by ID, where we can
+ if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
+ // Optimization for HTML document case
+ var oid = elem.getElementById(m[2]);
+
+ // Do a quick check for the existence of the actual ID attribute
+ // to avoid selecting by the name attribute in IE
+ // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
+ if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
+ oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
+
+ // Do a quick check for node name (where applicable) so
+ // that div#foo searches will be really fast
+ ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
+ } else {
+ // We need to find all descendant elements
+ for ( var i = 0; ret[i]; i++ ) {
+ // Grab the tag name being searched for
+ var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
+
+ // Handle IE7 being really dumb about <object>s
+ if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
+ tag = "param";
+
+ r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
+ }
+
+ // It's faster to filter by class and be done with it
+ if ( m[1] == "." )
+ r = jQuery.classFilter( r, m[2] );
+
+ // Same with ID filtering
+ if ( m[1] == "#" ) {
+ var tmp = [];
+
+ // Try to find the element with the ID
+ for ( var i = 0; r[i]; i++ )
+ if ( r[i].getAttribute("id") == m[2] ) {
+ tmp = [ r[i] ];
+ break;
+ }
+
+ r = tmp;
+ }
+
+ ret = r;
+ }
+
+ t = t.replace( re2, "" );
+ }
+
+ }
+
+ // If a selector string still exists
+ if ( t ) {
+ // Attempt to filter it
+ var val = jQuery.filter(t,r);
+ ret = r = val.r;
+ t = jQuery.trim(val.t);
+ }
+ }
+
+ // An error occurred with the selector;
+ // just return an empty set instead
+ if ( t )
+ ret = [];
+
+ // Remove the root context
+ if ( ret && context == ret[0] )
+ ret.shift();
+
+ // And combine the results
+ done = jQuery.merge( done, ret );
+
+ return done;
+ },
+
+ classFilter: function(r,m,not){
+ m = " " + m + " ";
+ var tmp = [];
+ for ( var i = 0; r[i]; i++ ) {
+ var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
+ if ( !not && pass || not && !pass )
+ tmp.push( r[i] );
+ }
+ return tmp;
+ },
+
+ filter: function(t,r,not) {
+ var last;
+
+ // Look for common filter expressions
+ while ( t && t != last ) {
+ last = t;
+
+ var p = jQuery.parse, m;
+
+ for ( var i = 0; p[i]; i++ ) {
+ m = p[i].exec( t );
+
+ if ( m ) {
+ // Remove what we just matched
+ t = t.substring( m[0].length );
+
+ m[2] = m[2].replace(/\\/g, "");
+ break;
+ }
+ }
+
+ if ( !m )
+ break;
+
+ // :not() is a special case that can be optimized by
+ // keeping it out of the expression list
+ if ( m[1] == ":" && m[2] == "not" )
+ r = jQuery.filter(m[3], r, true).r;
+
+ // We can get a big speed boost by filtering by class here
+ else if ( m[1] == "." )
+ r = jQuery.classFilter(r, m[2], not);
+
+ else if ( m[1] == "[" ) {
+ var tmp = [], type = m[3];
+
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
+ var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
+
+ if ( z == null || /href|src|selected/.test(m[2]) )
+ z = jQuery.attr(a,m[2]) || '';
+
+ if ( (type == "" && !!z ||
+ type == "=" && z == m[5] ||
+ type == "!=" && z != m[5] ||
+ type == "^=" && z && !z.indexOf(m[5]) ||
+ type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
+ (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
+ tmp.push( a );
+ }
+
+ r = tmp;
+
+ // We can get a speed boost by handling nth-child here
+ } else if ( m[1] == ":" && m[2] == "nth-child" ) {
+ var merge = {}, tmp = [],
+ test = /(\d*)n\+?(\d*)/.exec(
+ m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
+ !/\D/.test(m[3]) && "n+" + m[3] || m[3]),
+ first = (test[1] || 1) - 0, last = test[2] - 0;
+
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
+ var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
+
+ if ( !merge[id] ) {
+ var c = 1;
+
+ for ( var n = parentNode.firstChild; n; n = n.nextSibling )
+ if ( n.nodeType == 1 )
+ n.nodeIndex = c++;
+
+ merge[id] = true;
+ }
+
+ var add = false;
+
+ if ( first == 1 ) {
+ if ( last == 0 || node.nodeIndex == last )
+ add = true;
+ } else if ( (node.nodeIndex + last) % first == 0 )
+ add = true;
+
+ if ( add ^ not )
+ tmp.push( node );
+ }
+
+ r = tmp;
+
+ // Otherwise, find the expression to execute
+ } else {
+ var f = jQuery.expr[m[1]];
+ if ( typeof f != "string" )
+ f = jQuery.expr[m[1]][m[2]];
+
+ // Build a custom macro to enclose it
+ f = eval("false||function(a,i){return " + f + "}");
+
+ // Execute it against the current filter
+ r = jQuery.grep( r, f, not );
+ }
+ }
+
+ // Return an array of filtered elements (r)
+ // and the modified expression string (t)
+ return { r: r, t: t };
+ },
+
+ dir: function( elem, dir ){
+ var matched = [];
+ var cur = elem[dir];
+ while ( cur && cur != document ) {
+ if ( cur.nodeType == 1 )
+ matched.push( cur );
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ nth: function(cur,result,dir,elem){
+ result = result || 1;
+ var num = 0;
+
+ for ( ; cur; cur = cur[dir] )
+ if ( cur.nodeType == 1 && ++num == result )
+ break;
+
+ return cur;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType == 1 && (!elem || n != elem) )
+ r.push( n );
+ }
+
+ return r;
+ }
+});
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code orignated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function(element, type, handler, data) {
+ // For whatever reason, IE has trouble passing the window object
+ // around, causing it to be cloned in the process
+ if ( jQuery.browser.msie && element.setInterval != undefined )
+ element = window;
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid )
+ handler.guid = this.guid++;
+
+ // if data is passed, bind to handler
+ if( data != undefined ) {
+ // Create temporary function pointer to original handler
+ var fn = handler;
+
+ // Create unique handler function, wrapped around original handler
+ handler = function() {
+ // Pass arguments and context to original handler
+ return fn.apply(this, arguments);
+ };
+
+ // Store data in unique handler
+ handler.data = data;
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ handler.guid = fn.guid;
+ }
+
+ // Namespaced event handlers
+ var parts = type.split(".");
+ type = parts[0];
+ handler.type = parts[1];
+
+ // Init the element's event structure
+ var events = jQuery.data(element, "events") || jQuery.data(element, "events", {});
+
+ var handle = jQuery.data(element, "handle", function(){
+ // returned undefined or false
+ var val;
+
+ // Handle the second event of a trigger and when
+ // an event is called after a page has unloaded
+ if ( typeof jQuery == "undefined" || jQuery.event.triggered )
+ return val;
+
+ val = jQuery.event.handle.apply(element, arguments);
+
+ return val;
+ });
+
+ // Get the current list of functions bound to this event
+ var handlers = events[type];
+
+ // Init the event handler queue
+ if (!handlers) {
+ handlers = events[type] = {};
+
+ // And bind the global event handler to the element
+ if (element.addEventListener)
+ element.addEventListener(type, handle, false);
+ else
+ element.attachEvent("on" + type, handle);
+ }
+
+ // Add the function to the element's handler list
+ handlers[handler.guid] = handler;
+
+ // Keep track of which events have been used, for global triggering
+ this.global[type] = true;
+ },
+
+ guid: 1,
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function(element, type, handler) {
+ var events = jQuery.data(element, "events"), ret, index;
+
+ // Namespaced event handlers
+ if ( typeof type == "string" ) {
+ var parts = type.split(".");
+ type = parts[0];
+ }
+
+ if ( events ) {
+ // type is actually an event object here
+ if ( type && type.type ) {
+ handler = type.handler;
+ type = type.type;
+ }
+
+ if ( !type ) {
+ for ( type in events )
+ this.remove( element, type );
+
+ } else if ( events[type] ) {
+ // remove the given handler for the given type
+ if ( handler )
+ delete events[type][handler.guid];
+
+ // remove all handlers for the given type
+ else
+ for ( handler in events[type] )
+ // Handle the removal of namespaced events
+ if ( !parts[1] || events[type][handler].type == parts[1] )
+ delete events[type][handler];
+
+ // remove generic event handler if no more handlers exist
+ for ( ret in events[type] ) break;
+ if ( !ret ) {
+ if (element.removeEventListener)
+ element.removeEventListener(type, jQuery.data(element, "handle"), false);
+ else
+ element.detachEvent("on" + type, jQuery.data(element, "handle"));
+ ret = null;
+ delete events[type];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ for ( ret in events ) break;
+ if ( !ret ) {
+ jQuery.removeData( element, "events" );
+ jQuery.removeData( element, "handle" );
+ }
+ }
+ },
+
+ trigger: function(type, data, element, donative, extra) {
+ // Clone the incoming data, if any
+ data = jQuery.makeArray(data || []);
+
+ // Handle a global trigger
+ if ( !element ) {
+ // Only trigger if we've ever bound an event for it
+ if ( this.global[type] )
+ jQuery("*").add([window, document]).trigger(type, data);
+
+ // Handle triggering a single element
+ } else {
+ var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
+ // Check to see if we need to provide a fake event, or not
+ evt = !data[0] || !data[0].preventDefault;
+
+ // Pass along a fake event
+ if ( evt )
+ data.unshift( this.fix({ type: type, target: element }) );
+
+ // Enforce the right trigger type
+ data[0].type = type;
+
+ // Trigger the event
+ if ( jQuery.isFunction( jQuery.data(element, "handle") ) )
+ val = jQuery.data(element, "handle").apply( element, data );
+
+ // Handle triggering native .onfoo handlers
+ if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
+ val = false;
+
+ // Extra functions don't get the custom event object
+ if ( evt )
+ data.shift();
+
+ // Handle triggering of extra function
+ if ( extra && extra.apply( element, data ) === false )
+ val = false;
+
+ // Trigger the native events (except for clicks on links)
+ if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
+ this.triggered = true;
+ element[ type ]();
+ }
+
+ this.triggered = false;
+ }
+
+ return val;
+ },
+
+ handle: function(event) {
+ // returned undefined or false
+ var val;
+
+ // Empty object is for triggered events with no data
+ event = jQuery.event.fix( event || window.event || {} );
+
+ // Namespaced event handlers
+ var parts = event.type.split(".");
+ event.type = parts[0];
+
+ var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
+ args.unshift( event );
+
+ for ( var j in c ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ args[0].handler = c[j];
+ args[0].data = c[j].data;
+
+ // Filter the functions by class
+ if ( !parts[1] || c[j].type == parts[1] ) {
+ var tmp = c[j].apply( this, args );
+
+ if ( val !== false )
+ val = tmp;
+
+ if ( tmp === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+
+ // Clean up added properties in IE to prevent memory leak
+ if (jQuery.browser.msie)
+ event.target = event.preventDefault = event.stopPropagation =
+ event.handler = event.data = null;
+
+ return val;
+ },
+
+ fix: function(event) {
+ // store a copy of the original event object
+ // and clone to set read-only properties
+ var originalEvent = event;
+ event = jQuery.extend({}, originalEvent);
+
+ // add preventDefault and stopPropagation since
+ // they will not work on the clone
+ event.preventDefault = function() {
+ // if preventDefault exists run it on the original event
+ if (originalEvent.preventDefault)
+ originalEvent.preventDefault();
+ // otherwise set the returnValue property of the original event to false (IE)
+ originalEvent.returnValue = false;
+ };
+ event.stopPropagation = function() {
+ // if stopPropagation exists run it on the original event
+ if (originalEvent.stopPropagation)
+ originalEvent.stopPropagation();
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ originalEvent.cancelBubble = true;
+ };
+
+ // Fix target property, if necessary
+ if ( !event.target && event.srcElement )
+ event.target = event.srcElement;
+
+ // check if target is a textnode (safari)
+ if (jQuery.browser.safari && event.target.nodeType == 3)
+ event.target = originalEvent.target.parentNode;
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement )
+ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var e = document.documentElement, b = document.body;
+ event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
+ event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
+ }
+
+ // Add which for key events
+ if ( !event.which && (event.charCode || event.keyCode) )
+ event.which = event.charCode || event.keyCode;
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey )
+ event.metaKey = event.ctrlKey;
+
+ // Add which for click: 1 == left; 2 == middle; 3 == right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button )
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
+ return event;
+ }
+};
+
+jQuery.fn.extend({
+ bind: function( type, data, fn ) {
+ return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+ jQuery.event.add( this, type, fn || data, fn && data );
+ });
+ },
+
+ one: function( type, data, fn ) {
+ return this.each(function(){
+ jQuery.event.add( this, type, function(event) {
+ jQuery(this).unbind(event);
+ return (fn || data).apply( this, arguments);
+ }, fn && data);
+ });
+ },
+
+ unbind: function( type, fn ) {
+ return this.each(function(){
+ jQuery.event.remove( this, type, fn );
+ });
+ },
+
+ trigger: function( type, data, fn ) {
+ return this.each(function(){
+ jQuery.event.trigger( type, data, this, true, fn );
+ });
+ },
+
+ triggerHandler: function( type, data, fn ) {
+ if ( this[0] )
+ return jQuery.event.trigger( type, data, this[0], false, fn );
+ },
+
+ toggle: function() {
+ // Save reference to arguments for access in closure
+ var a = arguments;
+
+ return this.click(function(e) {
+ // Figure out which function to execute
+ this.lastToggle = 0 == this.lastToggle ? 1 : 0;
+
+ // Make sure that clicks stop
+ e.preventDefault();
+
+ // and execute the function
+ return a[this.lastToggle].apply( this, [e] ) || false;
+ });
+ },
+
+ hover: function(f,g) {
+
+ // A private function for handling mouse 'hovering'
+ function handleHover(e) {
+ // Check if mouse(over|out) are still within the same parent element
+ var p = e.relatedTarget;
+
+ // Traverse up the tree
+ while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
+
+ // If we actually just moused on to a sub-element, ignore it
+ if ( p == this ) return false;
+
+ // Execute the right function
+ return (e.type == "mouseover" ? f : g).apply(this, [e]);
+ }
+
+ // Bind the function to the two event listeners
+ return this.mouseover(handleHover).mouseout(handleHover);
+ },
+
+ ready: function(f) {
+ // Attach the listeners
+ bindReady();
+
+ // If the DOM is already ready
+ if ( jQuery.isReady )
+ // Execute the function immediately
+ f.apply( document, [jQuery] );
+
+ // Otherwise, remember the function for later
+ else
+ // Add the function to the wait list
+ jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
+
+ return this;
+ }
+});
+
+jQuery.extend({
+ /*
+ * All the code that makes DOM Ready work nicely.
+ */
+ isReady: false,
+ readyList: [],
+
+ // Handle when the DOM is ready
+ ready: function() {
+ // Make sure that the DOM is not already loaded
+ if ( !jQuery.isReady ) {
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If there are functions bound, to execute
+ if ( jQuery.readyList ) {
+ // Execute all of them
+ jQuery.each( jQuery.readyList, function(){
+ this.apply( document );
+ });
+
+ // Reset the list of functions
+ jQuery.readyList = null;
+ }
+ // Remove event listener to avoid memory leak
+ if ( jQuery.browser.mozilla || jQuery.browser.opera )
+ document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
+
+ // Remove script element used by IE hack
+ if( !window.frames.length ) // don't remove if frames are present (#1187)
+ jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
+ }
+ }
+});
+
+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+ "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
+ "submit,keydown,keypress,keyup,error").split(","), function(i,o){
+
+ // Handle event binding
+ jQuery.fn[o] = function(f){
+ return f ? this.bind(o, f) : this.trigger(o);
+ };
+});
+
+var readyBound = false;
+
+function bindReady(){
+ if ( readyBound ) return;
+ readyBound = true;
+
+ // If Mozilla is used
+ if ( jQuery.browser.mozilla || jQuery.browser.opera )
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
+
+ // If IE is used, use the excellent hack by Matthias Miller
+ // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
+ else if ( jQuery.browser.msie ) {
+
+ // Only works if you document.write() it
+ document.write("<scr" + "ipt id=__ie_init defer=true " +
+ "src=//:><\/script>");
+
+ // Use the defer script hack
+ var script = document.getElementById("__ie_init");
+
+ // script does not exist if jQuery is loaded dynamically
+ if ( script )
+ script.onreadystatechange = function() {
+ if ( this.readyState != "complete" ) return;
+ jQuery.ready();
+ };
+
+ // Clear from memory
+ script = null;
+
+ // If Safari is used
+ } else if ( jQuery.browser.safari )
+ // Continually check to see if the document.readyState is valid
+ jQuery.safariTimer = setInterval(function(){
+ // loaded and complete are both valid states
+ if ( document.readyState == "loaded" ||
+ document.readyState == "complete" ) {
+
+ // If either one are found, remove the timer
+ clearInterval( jQuery.safariTimer );
+ jQuery.safariTimer = null;
+
+ // and execute any waiting functions
+ jQuery.ready();
+ }
+ }, 10);
+
+ // A fallback to window.onload, that will always work
+ jQuery.event.add( window, "load", jQuery.ready );
+}
+jQuery.fn.extend({
+ load: function( url, params, callback ) {
+ if ( jQuery.isFunction( url ) )
+ return this.bind("load", url);
+
+ var off = url.indexOf(" ");
+ if ( off >= 0 ) {
+ var selector = url.slice(off, url.length);
+ url = url.slice(0, off);
+ }
+
+ callback = callback || function(){};
+
+ // Default to a GET request
+ var type = "GET";
+
+ // If the second parameter was provided
+ if ( params )
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+ // We assume that it's the callback
+ callback = params;
+ params = null;
+
+ // Otherwise, build a param string
+ } else {
+ params = jQuery.param( params );
+ type = "POST";
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ data: params,
+ complete: function(res, status){
+ // If successful, inject the HTML into all the matched elements
+ if ( status == "success" || status == "notmodified" )
+ // See if a selector was specified
+ self.html( selector ?
+ // Create a dummy div to hold the results
+ jQuery("<div/>")
+ // inject the contents of the document in, removing the scripts
+ // to avoid any 'Permission Denied' errors in IE
+ .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+ // Locate the specified elements
+ .find(selector) :
+
+ // If not, just inject the full result
+ res.responseText );
+
+ // Add delay to account for Safari's delay in globalEval
+ setTimeout(function(){
+ self.each( callback, [res.responseText, status, res] );
+ }, 13);
+ }
+ });
+ return this;
+ },
+
+ serialize: function() {
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function() {
+ return this.map(function(){
+ return jQuery.nodeName(this, "form") ?
+ jQuery.makeArray(this.elements) : this;
+ })
+ .filter(function(){
+ return this.name && !this.disabled &&
+ (this.checked || /select|textarea/i.test(this.nodeName) ||
+ /text|hidden|password/i.test(this.type));
+ })
+ .map(function(i, elem){
+ var val = jQuery(this).val();
+ return val == null ? null :
+ val.constructor == Array ?
+ jQuery.map( val, function(val, i){
+ return {name: elem.name, value: val};
+ }) :
+ {name: elem.name, value: val};
+ }).get();
+ }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
+ jQuery.fn[o] = function(f){
+ return this.bind(o, f);
+ };
+});
+
+var jsc = (new Date).getTime();
+
+jQuery.extend({
+ get: function( url, data, callback, type ) {
+ // shift arguments if data argument was ommited
+ if ( jQuery.isFunction( data ) ) {
+ callback = data;
+ data = null;
+ }
+
+ return jQuery.ajax({
+ type: "GET",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get(url, null, callback, "script");
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get(url, data, callback, "json");
+ },
+
+ post: function( url, data, callback, type ) {
+ if ( jQuery.isFunction( data ) ) {
+ callback = data;
+ data = {};
+ }
+
+ return jQuery.ajax({
+ type: "POST",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ ajaxSetup: function( settings ) {
+ jQuery.extend( jQuery.ajaxSettings, settings );
+ },
+
+ ajaxSettings: {
+ global: true,
+ type: "GET",
+ timeout: 0,
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ data: null
+ },
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+
+ ajax: function( s ) {
+ var jsonp, jsre = /=(\?|%3F)/g, status, data;
+
+ // Extend the settings, but re-extend 's' so that it can be
+ // checked again later (in the test suite, specifically)
+ s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
+
+ // convert data if not already a string
+ if ( s.data && s.processData && typeof s.data != "string" )
+ s.data = jQuery.param(s.data);
+
+ // Handle JSONP Parameter Callbacks
+ if ( s.dataType == "jsonp" ) {
+ if ( s.type.toLowerCase() == "get" ) {
+ if ( !s.url.match(jsre) )
+ s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+ } else if ( !s.data || !s.data.match(jsre) )
+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+ s.dataType = "json";
+ }
+
+ // Build temporary JSONP function
+ if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
+ jsonp = "jsonp" + jsc++;
+
+ // Replace the =? sequence both in the query string and the data
+ if ( s.data )
+ s.data = s.data.replace(jsre, "=" + jsonp);
+ s.url = s.url.replace(jsre, "=" + jsonp);
+
+ // We need to make sure
+ // that a JSONP style response is executed properly
+ s.dataType = "script";
+
+ // Handle JSONP-style loading
+ window[ jsonp ] = function(tmp){
+ data = tmp;
+ success();
+ complete();
+ // Garbage collect
+ window[ jsonp ] = undefined;
+ try{ delete window[ jsonp ]; } catch(e){}
+ };
+ }
+
+ if ( s.dataType == "script" && s.cache == null )
+ s.cache = false;
+
+ if ( s.cache === false && s.type.toLowerCase() == "get" )
+ s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime();
+
+ // If data is available, append data to url for get requests
+ if ( s.data && s.type.toLowerCase() == "get" ) {
+ s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
+
+ // IE likes to send both get and post data, prevent this
+ s.data = null;
+ }
+
+ // Watch for a new set of requests
+ if ( s.global && ! jQuery.active++ )
+ jQuery.event.trigger( "ajaxStart" );
+
+ // If we're requesting a remote document
+ // and trying to load JSON or Script
+ if ( !s.url.indexOf("http") && s.dataType == "script" ) {
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement("script");
+ script.src = s.url;
+
+ // Handle Script loading
+ if ( !jsonp && (s.success || s.complete) ) {
+ var done = false;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function(){
+ if ( !done && (!this.readyState ||
+ this.readyState == "loaded" || this.readyState == "complete") ) {
+ done = true;
+ success();
+ complete();
+ head.removeChild( script );
+ }
+ };
+ }
+
+ head.appendChild(script);
+
+ // We handle everything using the script element injection
+ return;
+ }
+
+ var requestDone = false;
+
+ // Create the request object; Microsoft failed to properly
+ // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+ var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
+
+ // Open the socket
+ xml.open(s.type, s.url, s.async);
+
+ // Set the correct header, if data is being sent
+ if ( s.data )
+ xml.setRequestHeader("Content-Type", s.contentType);
+
+ // Set the If-Modified-Since header, if ifModified mode.
+ if ( s.ifModified )
+ xml.setRequestHeader("If-Modified-Since",
+ jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+
+ // Set header so the called script knows that it's an XMLHttpRequest
+ xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+ // Allow custom headers/mimetypes
+ if ( s.beforeSend )
+ s.beforeSend(xml);
+
+ if ( s.global )
+ jQuery.event.trigger("ajaxSend", [xml, s]);
+
+ // Wait for a response to come back
+ var onreadystatechange = function(isTimeout){
+ // The transfer is complete and the data is available, or the request timed out
+ if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
+ requestDone = true;
+
+ // clear poll interval
+ if (ival) {
+ clearInterval(ival);
+ ival = null;
+ }
+
+ status = isTimeout == "timeout" && "timeout" ||
+ !jQuery.httpSuccess( xml ) && "error" ||
+ s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||
+ "success";
+
+ if ( status == "success" ) {
+ // Watch for, and catch, XML document parse errors
+ try {
+ // process the data (runs the xml through httpData regardless of callback)
+ data = jQuery.httpData( xml, s.dataType );
+ } catch(e) {
+ status = "parsererror";
+ }
+ }
+
+ // Make sure that the request was successful or notmodified
+ if ( status == "success" ) {
+ // Cache Last-Modified header, if ifModified mode.
+ var modRes;
+ try {
+ modRes = xml.getResponseHeader("Last-Modified");
+ } catch(e) {} // swallow exception thrown by FF if header is not available
+
+ if ( s.ifModified && modRes )
+ jQuery.lastModified[s.url] = modRes;
+
+ // JSONP handles its own success callback
+ if ( !jsonp )
+ success();
+ } else
+ jQuery.handleError(s, xml, status);
+
+ // Fire the complete handlers
+ complete();
+
+ // Stop memory leaks
+ if ( s.async )
+ xml = null;
+ }
+ };
+
+ if ( s.async ) {
+ // don't attach the handler to the request, just poll it instead
+ var ival = setInterval(onreadystatechange, 13);
+
+ // Timeout checker
+ if ( s.timeout > 0 )
+ setTimeout(function(){
+ // Check to see if the request is still happening
+ if ( xml ) {
+ // Cancel the request
+ xml.abort();
+
+ if( !requestDone )
+ onreadystatechange( "timeout" );
+ }
+ }, s.timeout);
+ }
+
+ // Send the data
+ try {
+ xml.send(s.data);
+ } catch(e) {
+ jQuery.handleError(s, xml, null, e);
+ }
+
+ // firefox 1.5 doesn't fire statechange for sync requests
+ if ( !s.async )
+ onreadystatechange();
+
+ // return XMLHttpRequest to allow aborting the request etc.
+ return xml;
+
+ function success(){
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success )
+ s.success( data, status );
+
+ // Fire the global callback
+ if ( s.global )
+ jQuery.event.trigger( "ajaxSuccess", [xml, s] );
+ }
+
+ function complete(){
+ // Process result
+ if ( s.complete )
+ s.complete(xml, status);
+
+ // The request was completed
+ if ( s.global )
+ jQuery.event.trigger( "ajaxComplete", [xml, s] );
+
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active )
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ },
+
+ handleError: function( s, xml, status, e ) {
+ // If a local callback was specified, fire it
+ if ( s.error ) s.error( xml, status, e );
+
+ // Fire the global callback
+ if ( s.global )
+ jQuery.event.trigger( "ajaxError", [xml, s, e] );
+ },
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Determines if an XMLHttpRequest was successful or not
+ httpSuccess: function( r ) {
+ try {
+ return !r.status && location.protocol == "file:" ||
+ ( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
+ jQuery.browser.safari && r.status == undefined;
+ } catch(e){}
+ return false;
+ },
+
+ // Determines if an XMLHttpRequest returns NotModified
+ httpNotModified: function( xml, url ) {
+ try {
+ var xmlRes = xml.getResponseHeader("Last-Modified");
+
+ // Firefox always returns 200. check Last-Modified date
+ return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
+ jQuery.browser.safari && xml.status == undefined;
+ } catch(e){}
+ return false;
+ },
+
+ httpData: function( r, type ) {
+ var ct = r.getResponseHeader("content-type");
+ var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
+ var data = xml ? r.responseXML : r.responseText;
+
+ if ( xml && data.documentElement.tagName == "parsererror" )
+ throw "parsererror";
+
+ // If the type is "script", eval it in global context
+ if ( type == "script" )
+ jQuery.globalEval( data );
+
+ // Get the JavaScript object, if JSON is used.
+ if ( type == "json" )
+ data = eval("(" + data + ")");
+
+ return data;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a ) {
+ var s = [];
+
+ // If an array was passed in, assume that it is an array
+ // of form elements
+ if ( a.constructor == Array || a.jquery )
+ // Serialize the form elements
+ jQuery.each( a, function(){
+ s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
+ });
+
+ // Otherwise, assume that it's an object of key/value pairs
+ else
+ // Serialize the key/values
+ for ( var j in a )
+ // If the value is an array then the key names need to be repeated
+ if ( a[j] && a[j].constructor == Array )
+ jQuery.each( a[j], function(){
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
+ });
+ else
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
+
+ // Return the resulting serialization
+ return s.join("&").replace(/%20/g, "+");
+ }
+
+});
+jQuery.fn.extend({
+ show: function(speed,callback){
+ return speed ?
+ this.animate({
+ height: "show", width: "show", opacity: "show"
+ }, speed, callback) :
+
+ this.filter(":hidden").each(function(){
+ this.style.display = this.oldblock ? this.oldblock : "";
+ if ( jQuery.css(this,"display") == "none" )
+ this.style.display = "block";
+ }).end();
+ },
+
+ hide: function(speed,callback){
+ return speed ?
+ this.animate({
+ height: "hide", width: "hide", opacity: "hide"
+ }, speed, callback) :
+
+ this.filter(":visible").each(function(){
+ this.oldblock = this.oldblock || jQuery.css(this,"display");
+ if ( this.oldblock == "none" )
+ this.oldblock = "block";
+ this.style.display = "none";
+ }).end();
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2 ){
+ return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+ this._toggle( fn, fn2 ) :
+ fn ?
+ this.animate({
+ height: "toggle", width: "toggle", opacity: "toggle"
+ }, fn, fn2) :
+ this.each(function(){
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+ });
+ },
+
+ slideDown: function(speed,callback){
+ return this.animate({height: "show"}, speed, callback);
+ },
+
+ slideUp: function(speed,callback){
+ return this.animate({height: "hide"}, speed, callback);
+ },
+
+ slideToggle: function(speed, callback){
+ return this.animate({height: "toggle"}, speed, callback);
+ },
+
+ fadeIn: function(speed, callback){
+ return this.animate({opacity: "show"}, speed, callback);
+ },
+
+ fadeOut: function(speed, callback){
+ return this.animate({opacity: "hide"}, speed, callback);
+ },
+
+ fadeTo: function(speed,to,callback){
+ return this.animate({opacity: to}, speed, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var opt = jQuery.speed(speed, easing, callback);
+
+ return this[ opt.queue === false ? "each" : "queue" ](function(){
+ opt = jQuery.extend({}, opt);
+ var hidden = jQuery(this).is(":hidden"), self = this;
+
+ for ( var p in prop ) {
+ if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+ return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
+
+ if ( p == "height" || p == "width" ) {
+ // Store display property
+ opt.display = jQuery.css(this, "display");
+
+ // Make sure that nothing sneaks out
+ opt.overflow = this.style.overflow;
+ }
+ }
+
+ if ( opt.overflow != null )
+ this.style.overflow = "hidden";
+
+ opt.curAnim = jQuery.extend({}, prop);
+
+ jQuery.each( prop, function(name, val){
+ var e = new jQuery.fx( self, opt, name );
+
+ if ( /toggle|show|hide/.test(val) )
+ e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+ else {
+ var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
+ start = e.cur(true) || 0;
+
+ if ( parts ) {
+ var end = parseFloat(parts[2]),
+ unit = parts[3] || "px";
+
+ // We need to compute starting value
+ if ( unit != "px" ) {
+ self.style[ name ] = (end || 1) + unit;
+ start = ((end || 1) / e.cur(true)) * start;
+ self.style[ name ] = start + unit;
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] )
+ end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+
+ e.custom( start, end, unit );
+ } else
+ e.custom( start, val, "" );
+ }
+ });
+
+ // For JS strict compliance
+ return true;
+ });
+ },
+
+ queue: function(type, fn){
+ if ( jQuery.isFunction(type) ) {
+ fn = type;
+ type = "fx";
+ }
+
+ if ( !type || (typeof type == "string" && !fn) )
+ return queue( this[0], type );
+
+ return this.each(function(){
+ if ( fn.constructor == Array )
+ queue(this, type, fn);
+ else {
+ queue(this, type).push( fn );
+
+ if ( queue(this, type).length == 1 )
+ fn.apply(this);
+ }
+ });
+ },
+
+ stop: function(){
+ var timers = jQuery.timers;
+
+ return this.each(function(){
+ for ( var i = 0; i < timers.length; i++ )
+ if ( timers[i].elem == this )
+ timers.splice(i--, 1);
+ }).dequeue();
+ }
+
+});
+
+var queue = function( elem, type, array ) {
+ if ( !elem )
+ return;
+
+ var q = jQuery.data( elem, type + "queue" );
+
+ if ( !q || array )
+ q = jQuery.data( elem, type + "queue",
+ array ? jQuery.makeArray(array) : [] );
+
+ return q;
+};
+
+jQuery.fn.dequeue = function(type){
+ type = type || "fx";
+
+ return this.each(function(){
+ var q = queue(this, type);
+
+ q.shift();
+
+ if ( q.length )
+ q[0].apply( this );
+ });
+};
+
+jQuery.extend({
+
+ speed: function(speed, easing, fn) {
+ var opt = speed && speed.constructor == Object ? speed : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && easing.constructor != Function && easing
+ };
+
+ opt.duration = (opt.duration && opt.duration.constructor == Number ?
+ opt.duration :
+ { slow: 600, fast: 200 }[opt.duration]) || 400;
+
+ // Queueing
+ opt.old = opt.complete;
+ opt.complete = function(){
+ jQuery(this).dequeue();
+ if ( jQuery.isFunction( opt.old ) )
+ opt.old.apply( this );
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+
+ fx: function( elem, options, prop ){
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ if ( !options.orig )
+ options.orig = {};
+ }
+
+});
+
+jQuery.fx.prototype = {
+
+ // Simple function for setting a style value
+ update: function(){
+ if ( this.options.step )
+ this.options.step.apply( this.elem, [ this.now, this ] );
+
+ (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+
+ // Set display property to block for height/width animations
+ if ( this.prop == "height" || this.prop == "width" )
+ this.elem.style.display = "block";
+ },
+
+ // Get the current size
+ cur: function(force){
+ if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
+ return this.elem[ this.prop ];
+
+ var r = parseFloat(jQuery.curCSS(this.elem, this.prop, force));
+ return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, this.prop)) || 0;
+ },
+
+ // Start an animation from one number to another
+ custom: function(from, to, unit){
+ this.startTime = (new Date()).getTime();
+ this.start = from;
+ this.end = to;
+ this.unit = unit || this.unit || "px";
+ this.now = this.start;
+ this.pos = this.state = 0;
+ this.update();
+
+ var self = this;
+ function t(){
+ return self.step();
+ }
+
+ t.elem = this.elem;
+
+ jQuery.timers.push(t);
+
+ if ( jQuery.timers.length == 1 ) {
+ var timer = setInterval(function(){
+ var timers = jQuery.timers;
+
+ for ( var i = 0; i < timers.length; i++ )
+ if ( !timers[i]() )
+ timers.splice(i--, 1);
+
+ if ( !timers.length )
+ clearInterval( timer );
+ }, 13);
+ }
+ },
+
+ // Simple 'show' function
+ show: function(){
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ this.custom(0, this.cur());
+
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ if ( this.prop == "width" || this.prop == "height" )
+ this.elem.style[this.prop] = "1px";
+
+ // Start by showing the element
+ jQuery(this.elem).show();
+ },
+
+ // Simple 'hide' function
+ hide: function(){
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom(this.cur(), 0);
+ },
+
+ // Each step of an animation
+ step: function(){
+ var t = (new Date()).getTime();
+
+ if ( t > this.options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ this.options.curAnim[ this.prop ] = true;
+
+ var done = true;
+ for ( var i in this.options.curAnim )
+ if ( this.options.curAnim[i] !== true )
+ done = false;
+
+ if ( done ) {
+ if ( this.options.display != null ) {
+ // Reset the overflow
+ this.elem.style.overflow = this.options.overflow;
+
+ // Reset the display
+ this.elem.style.display = this.options.display;
+ if ( jQuery.css(this.elem, "display") == "none" )
+ this.elem.style.display = "block";
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( this.options.hide )
+ this.elem.style.display = "none";
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( this.options.hide || this.options.show )
+ for ( var p in this.options.curAnim )
+ jQuery.attr(this.elem.style, p, this.options.orig[p]);
+ }
+
+ // If a callback was provided, execute it
+ if ( done && jQuery.isFunction( this.options.complete ) )
+ // Execute the complete function
+ this.options.complete.apply( this.elem );
+
+ return false;
+ } else {
+ var n = t - this.startTime;
+ this.state = n / this.options.duration;
+
+ // Perform the easing function, defaults to swing
+ this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
+ this.now = this.start + ((this.end - this.start) * this.pos);
+
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+
+};
+
+jQuery.fx.step = {
+ scrollLeft: function(fx){
+ fx.elem.scrollLeft = fx.now;
+ },
+
+ scrollTop: function(fx){
+ fx.elem.scrollTop = fx.now;
+ },
+
+ opacity: function(fx){
+ jQuery.attr(fx.elem.style, "opacity", fx.now);
+ },
+
+ _default: function(fx){
+ fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+ }
+};
+// The Offset Method
+// Originally By Brandon Aaron, part of the Dimension Plugin
+// http://jquery.com/plugins/project/dimensions
+jQuery.fn.offset = function() {
+ var left = 0, top = 0, elem = this[0], results;
+
+ if ( elem ) with ( jQuery.browser ) {
+ var absolute = jQuery.css(elem, "position") == "absolute",
+ parent = elem.parentNode,
+ offsetParent = elem.offsetParent,
+ doc = elem.ownerDocument,
+ safari2 = safari && parseInt(version) < 522;
+
+ // Use getBoundingClientRect if available
+ if ( elem.getBoundingClientRect ) {
+ box = elem.getBoundingClientRect();
+
+ // Add the document scroll offsets
+ add(
+ box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
+ box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)
+ );
+
+ // IE adds the HTML element's border, by default it is medium which is 2px
+ // IE 6 and IE 7 quirks mode the border width is overwritable by the following css html { border: 0; }
+ // IE 7 standards mode, the border is always 2px
+ if ( msie ) {
+ var border = jQuery("html").css("borderWidth");
+ border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border;
+ add( -border, -border );
+ }
+
+ // Otherwise loop through the offsetParents and parentNodes
+ } else {
+
+ // Initial element offsets
+ add( elem.offsetLeft, elem.offsetTop );
+
+ // Get parent offsets
+ while ( offsetParent ) {
+ // Add offsetParent offsets
+ add( offsetParent.offsetLeft, offsetParent.offsetTop );
+
+ // Mozilla and Safari > 2 does not include the border on offset parents
+ // However Mozilla adds the border for table cells
+ if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )
+ border( offsetParent );
+
+ // Safari <= 2 doubles body offsets with an absolutely positioned element or parent
+ if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" )
+ absolute = true;
+
+ // Get next offsetParent
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ // Get parent scroll offsets
+ while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
+ // Work around opera inline/table scrollLeft/Top bug
+ if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )
+ // Subtract parent scroll offsets
+ add( -parent.scrollLeft, -parent.scrollTop );
+
+ // Mozilla does not add the border for a parent that has overflow != visible
+ if ( mozilla && jQuery.css(parent, "overflow") != "visible" )
+ border( parent );
+
+ // Get next parent
+ parent = parent.parentNode;
+ }
+
+ // Safari doubles body offsets with an absolutely positioned element or parent
+ if ( safari2 && absolute )
+ add( -doc.body.offsetLeft, -doc.body.offsetTop );
+ }
+
+ // Return an object with top and left properties
+ results = { top: top, left: left };
+ }
+
+ return results;
+
+ function border(elem) {
+ add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") );
+ }
+
+ function add(l, t) {
+ left += parseInt(l) || 0;
+ top += parseInt(t) || 0;
+ }
+};
+})();
diff --git a/trunk/infrastructure/ace/www/lang_html.js b/trunk/infrastructure/ace/www/lang_html.js
new file mode 100644
index 0000000..f9eff8e
--- /dev/null
+++ b/trunk/infrastructure/ace/www/lang_html.js
@@ -0,0 +1,1685 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+grammars=(window.grammars||{});grammars["text.html.basic"]=(function(){var G=function(M,K,L){K.lastIndex=L;
+var J=K.exec(M);return !!(J&&J[0]);};var C=function(V,L,O,R,K,U,N,b,S){S=(S&&" "+S);var W=new Array(R.length+1);
+var P=L;var T=O[0].length;for(var X=0;X<N.length;X++){var a=N[X];var Z=K[a];if(Z<0){continue;}var Q=(W[a]===undefined);
+var J=L+T;var M=U[a];for(var Y=0;Y<M.length;Y++){J-=(O[M[Y]]||"").length;}if(Q){J-=(O[Z]||"").length;
+}if(J>P){b(V.substring(P,J),(S+W.join("")).substring(1));}P=J;if(Q){W[a]=" "+R[a];}else{delete W[a];}}if(P<L+T){b(V.substring(P,L+T),(S+W.join("")).substring(1));
+}};var F=function(R,U,L,Q,S,N,K,J,P,M,O){L.lastIndex=U;var T=L.exec(R);if(!T){return false;}if(T[Q]){return false;
+}O&&O();C(R,U,T,S,N,K,J,P,M);return[T[0].length];};var E=function(O,N,M,J,Q,L,K,P){return(M?F(O,N,M[0],M[1],J,M[2],M[3],Q,L,K,P):false);
+};var A=[/\b(public|private|protected|static|final|native|synchronized|abstract|threadsafe|transient)(\b)|([\s\S])/g,/(>)|([\s\S])/g,/(?=\n)|(\/)([igm]*)|([\s\S])/g,/\\.|([\s\S])/g,/(?=^\s*#\s*endif\b.*(?=\n))|([\s\S])/g,/(<\?)(\s*([\-_a-zA-Z0-9]+))|([\s\S])/g,/(<!)(DOCTYPE)|([\s\S])/g,/<[!%]\-\-|([\s\S])/g,/(<)(((?:([\-_a-zA-Z0-9]+)((:)))?([\-_a-zA-Z0-9:]+))((?=(\s[^>]*)?><\/\3>)))|([\s\S])/g,/(<\/?)((?:([\-_a-zA-Z0-9]+)((:)))?([\-_a-zA-Z0-9:]+))|([\s\S])/g,/(&)(([a-zA-Z0-9_\-]+|#[0-9]+|#x[0-9a-fA-F]+)(;))|([\s\S])/g,/&|([\s\S])/g,/<%@|([\s\S])/g,/<%[!=]?(?!\-\-)|([\s\S])/g,/<!\[CDATA\[|([\s\S])/g,/<|([\s\S])/g,/"|([\s\S])/g,/#(\\"|[^"])*(?="|(?=\n)\n?)|([\s\S])/g,/\-\-(\\"|[^"])*(?="|(?=\n)\n?)|([\s\S])/g,/'(?=[^']*?")|([\s\S])/g,/`(?=[^`]*?")|([\s\S])/g,/\\"(?!([^\\"]|\\[^"])*\\")(?=(\\[^"]|.)*?")|([\s\S])/g,/\\"|([\s\S])/g,/`|([\s\S])/g,/'|([\s\S])/g,/^\t*(TEXTILE)((?=\n))|([\s\S])/g,/(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)|([\s\S])/g,/^\s*(#\s*(endif)(\b))|([\s\S])/g,/^\s*(#\s*(else)(\b))|([\s\S])/g,/|([\s\S])/g,/"""|/g,/\1|([\s\S])/g,/^\s*(end tell)|([\s\S])/g,/(?:^\s*([cC][rR][eE][aA][tT][eE])(\s+([aA][gG][gG][rR][eE][gG][aA][tT][eE]|[cC][oO][nN][vV][eE][rR][sS][iI][oO][nN]|[dD][aA][tT][aA][bB][aA][sS][eE]|[dD][oO][mM][aA][iI][nN]|[fF][uU][nN][cC][tT][iI][oO][nN]|[gG][rR][oO][uU][pP]|([uU][nN][iI][qQ][uU][eE]\s+)?[iI][nN][dD][eE][xX]|[lL][aA][nN][gG][uU][aA][gG][eE]|[oO][pP][eE][rR][aA][tT][oO][rR] [cC][lL][aA][sS][sS]|[oO][pP][eE][rR][aA][tT][oO][rR]|[rR][uU][lL][eE]|[sS][cC][hH][eE][mM][aA]|[sS][eE][qQ][uU][eE][nN][cC][eE]|[tT][aA][bB][lL][eE]|[tT][aA][bB][lL][eE][sS][pP][aA][cC][eE]|[tT][rR][iI][gG][gG][eE][rR]|[tT][yY][pP][eE]|[uU][sS][eE][rR]|[vV][iI][eE][wW])(\s+)))((['"`]?)(\w+)(\7))|([\s\S])/g,/(?:^\s*([dD][rR][oO][pP])(\s+([aA][gG][gG][rR][eE][gG][aA][tT][eE]|[cC][oO][nN][vV][eE][rR][sS][iI][oO][nN]|[dD][aA][tT][aA][bB][aA][sS][eE]|[dD][oO][mM][aA][iI][nN]|[fF][uU][nN][cC][tT][iI][oO][nN]|[gG][rR][oO][uU][pP]|[iI][nN][dD][eE][xX]|[lL][aA][nN][gG][uU][aA][gG][eE]|[oO][pP][eE][rR][aA][tT][oO][rR] [cC][lL][aA][sS][sS]|[oO][pP][eE][rR][aA][tT][oO][rR]|[rR][uU][lL][eE]|[sS][cC][hH][eE][mM][aA]|[sS][eE][qQ][uU][eE][nN][cC][eE]|[tT][aA][bB][lL][eE]|[tT][aA][bB][lL][eE][sS][pP][aA][cC][eE]|[tT][rR][iI][gG][gG][eE][rR]|[tT][yY][pP][eE]|[uU][sS][eE][rR]|[vV][iI][eE][wW])))|([\s\S])/g,/(?:\s*([dD][rR][oO][pP])(\s+([tT][aA][bB][lL][eE])(\s+(\w+)((\s+[cC][aA][sS][cC][aA][dD][eE])?(\b)))))|([\s\S])/g,/(?:^\s*([aA][lL][tT][eE][rR])(\s+([aA][gG][gG][rR][eE][gG][aA][tT][eE]|[cC][oO][nN][vV][eE][rR][sS][iI][oO][nN]|[dD][aA][tT][aA][bB][aA][sS][eE]|[dD][oO][mM][aA][iI][nN]|[fF][uU][nN][cC][tT][iI][oO][nN]|[gG][rR][oO][uU][pP]|[iI][nN][dD][eE][xX]|[lL][aA][nN][gG][uU][aA][gG][eE]|[oO][pP][eE][rR][aA][tT][oO][rR] [cC][lL][aA][sS][sS]|[oO][pP][eE][rR][aA][tT][oO][rR]|[rR][uU][lL][eE]|[sS][cC][hH][eE][mM][aA]|[sS][eE][qQ][uU][eE][nN][cC][eE]|[tT][aA][bB][lL][eE]|[tT][aA][bB][lL][eE][sS][pP][aA][cC][eE]|[tT][rR][iI][gG][gG][eE][rR]|[tT][yY][pP][eE]|[uU][sS][eE][rR]|[vV][iI][eE][wW])(\s+)))|([\s\S])/g,/(?:\n\n\t\t\t\t# [nN][oO][rR][mM][aA][lL] [sS][tT][uU][fF][fF], [cC][aA][pP][tT][uU][rR][eE] 1\n\t\t\t\t \b([bB][iI][gG][iI][nN][tT]|[bB][iI][gG][sS][eE][rR][iI][aA][lL]|[bB][iI][tT]|[bB][oO][oO][lL][eE][aA][nN]|[bB][oO][xX]|[bB][yY][tT][eE][aA]|[cC][iI][dD][rR]|[cC][iI][rR][cC][lL][eE]|[dD][aA][tT][eE]|[dD][oO][uU][bB][lL][eE]\s[pP][rR][eE][cC][iI][sS][iI][oO][nN]|[iI][nN][eE][tT]|[iI][nN][tT]|[iI][nN][tT][eE][gG][eE][rR]|[lL][iI][nN][eE]|[lL][sS][eE][gG]|[mM][aA][cC][aA][dD][dD][rR]|[mM][oO][nN][eE][yY]|[oO][iI][dD]|[pP][aA][tT][hH]|[pP][oO][iI][nN][tT]|[pP][oO][lL][yY][gG][oO][nN]|[rR][eE][aA][lL]|[sS][eE][rR][iI][aA][lL]|[sS][mM][aA][lL][lL][iI][nN][tT]|[sS][yY][sS][dD][aA][tT][eE]|[tT][eE][xX][tT])(\b\n\n\t\t\t\t# [nN][uU][mM][eE][rR][iI][cC] [sS][uU][fF][fF][iI][xX], [cC][aA][pP][tT][uU][rR][eE] 2 + 3[iI]\n\t\t\t\t)|\b([bB][iI][tT]\s[vV][aA][rR][yY][iI][nN][gG]|[cC][hH][aA][rR][aA][cC][tT][eE][rR]\s(?:[vV][aA][rR][yY][iI][nN][gG])?|[tT][iI][nN][yY][iI][nN][tT]|[vV][aA][rR]\s[cC][hH][aA][rR]|[fF][lL][oO][aA][tT]|[iI][nN][tT][eE][rR][vV][aA][lL])(\((\d+)(\)\n\n\t\t\t\t# [oO][pP][tT][iI][oO][nN][aA][lL] [nN][uU][mM][eE][rR][iI][cC] [sS][uU][fF][fF][iI][xX], [cC][aA][pP][tT][uU][rR][eE] 4 + 5[iI]\n\t\t\t\t))|\b([cC][hH][aA][rR]|[nN][uU][mM][bB][eE][rR]|[vV][aA][rR][cC][hH][aA][rR]\d?)(\b(?:\((\d+)(\)))?(\n\n\t\t\t\t# [sS][pP][eE][cC][iI][aA][lL] [cC][aA][sS][eE], [cC][aA][pP][tT][uU][rR][eE] 6 + 7[iI] + 8[iI]\n\t\t\t\t))|\b([nN][uU][mM][eE][rR][iI][cC])(\b(?:\((\d+)(,(\d+)(\))))?(\n\n\t\t\t\t# [sS][pP][eE][cC][iI][aA][lL] [cC][aA][sS][eE], [cC][aA][pP][tT][uU][rR][eE][sS] 9, 10[iI], 11\n\t\t\t\t))|\b([tT][iI][mM][eE][sS])((?:\((\d+)(\)))((\s[wW][iI][tT][hH][oO][uU][tT][sS][tT][iI][mM][eE][sS][zZ][oO][nN][eE]\b)?(\n\n\t\t\t\t# [sS][pP][eE][cC][iI][aA][lL] [cC][aA][sS][eE], [cC][aA][pP][tT][uU][rR][eE][sS] 12, 13, 14[iI], 15\n\t\t\t\t)))|\b([tT][iI][mM][eE][sS][tT][aA][mM][pP])((?:([sS])(\((\d+)(\)(\s[wW][iI][tT][hH][oO][uU][tT][sS][tT][iI][mM][eE][sS][zZ][oO][nN][eE]\b)?)))?(\n\n\t\t\t)))|([\s\S])/g,/(?:\b((?:[pP][rR][iI][mM][aA][rR][yY]|[fF][oO][rR][eE][iI][gG][nN])\s+[kK][eE][yY]|[rR][eE][fF][eE][rR][eE][nN][cC][eE][sS]|[oO][nN]\s[dD][eE][lL][eE][tT][eE](\s+[cC][aA][sS][cC][aA][dD][eE])?|[cC][hH][eE][cC][kK]|[cC][oO][nN][sS][tT][rR][aA][iI][nN][tT])\b)|([\s\S])/g,/\b\d+\b|([\s\S])/g,/(?:\b([sS][eE][lL][eE][cC][tT](\s+[dD][iI][sS][tT][iI][nN][cC][tT])?|[iI][nN][sS][eE][rR][tT]\s+([iI][gG][nN][oO][rR][eE]\s+)?[iI][nN][tT][oO]|[uU][pP][dD][aA][tT][eE]|[dD][eE][lL][eE][tT][eE]|[fF][rR][oO][mM]|[sS][eE][tT]|[wW][hH][eE][rR][eE]|[gG][rR][oO][uU][pP]\s[bB][yY]|[oO][rR]|[lL][iI][kK][eE]|[aA][nN][dD]|[uU][nN][iI][oO][nN](\s+[aA][lL][lL])?|[hH][aA][vV][iI][nN][gG]|[oO][rR][dD][eE][rR]\s[bB][yY]|[lL][iI][mM][iI][tT]|([iI][nN][nN][eE][rR]|[cC][rR][oO][sS][sS])\s+[jJ][oO][iI][nN]|[jJ][oO][iI][nN]|[sS][tT][rR][aA][iI][gG][hH][tT]_[jJ][oO][iI][nN]|([lL][eE][fF][tT]|[rR][iI][gG][hH][tT])(\s+[oO][uU][tT][eE][rR])?\s+[jJ][oO][iI][nN]|[nN][aA][tT][uU][rR][aA][lL](\s+([lL][eE][fF][tT]|[rR][iI][gG][hH][tT])(\s+[oO][uU][tT][eE][rR])?)?\s+[jJ][oO][iI][nN])\b)|([\s\S])/g,/(?:\b([oO][nN]|(([iI][sS]\s+)?[nN][oO][tT]\s+)?[nN][uU][lL][lL])\b)|([\s\S])/g,/(?:\b[vV][aA][lL][uU][eE][sS]\b)|([\s\S])/g,/(?:\b([bB][eE][gG][iI][nN](\s+[wW][oO][rR][kK])?|[sS][tT][aA][rR][tT]\s+[tT][rR][aA][nN][sS][aA][cC][tT][iI][oO][nN]|[cC][oO][mM][mM][iI][tT](\s+[wW][oO][rR][kK])?|[rR][oO][lL][lL][bB][aA][cC][kK](\s+[wW][oO][rR][kK])?)\b)|([\s\S])/g,/(?:\b([gG][rR][aA][nN][tT](\s[wW][iI][tT][hH]\s[gG][rR][aA][nN][tT]\s[oO][pP][tT][iI][oO][nN])?|[rR][eE][vV][oO][kK][eE])\b)|([\s\S])/g,/(?:\b[iI][nN]\b)|([\s\S])/g,/(?:^\s*([cC][oO][mM][mM][eE][nN][tT]\s+[oO][nN]\s+([tT][aA][bB][lL][eE]|[cC][oO][lL][uU][mM][nN]|[aA][gG][gG][rR][eE][gG][aA][tT][eE]|[cC][oO][nN][sS][tT][rR][aA][iI][nN][tT]|[dD][aA][tT][aA][bB][aA][sS][eE]|[dD][oO][mM][aA][iI][nN]|[fF][uU][nN][cC][tT][iI][oO][nN]|[iI][nN][dD][eE][xX]|[oO][pP][eE][rR][aA][tT][oO][rR]|[rR][uU][lL][eE]|[sS][cC][hH][eE][mM][aA]|[sS][eE][qQ][uU][eE][nN][cC][eE]|[tT][rR][iI][gG][gG][eE][rR]|[tT][yY][pP][eE]|[vV][iI][eE][wW]))\s+.*?\s+([iI][sS])\s+)|([\s\S])/g,/(?:\b[aA][sS]\b)|([\s\S])/g,/(?:\b([dD][eE][sS][cC]|[aA][sS][cC])\b)|([\s\S])/g,/\*|([\s\S])/g,/[!<>]?=|<>|<|>|([\s\S])/g,/\-|\+|\/|([\s\S])/g,/\|\||([\s\S])/g,/(?:\b([cC][uU][rR][rR][eE][nN][tT]_([dD][aA][tT][eE]|[tT][iI][mM][eE]([sS][tT][aA][mM][pP])?|[uU][sS][eE][rR])|([sS][eE][sS][sS][iI][oO][nN]|[sS][yY][sS][tT][eE][mM])_[uU][sS][eE][rR])\b)|([\s\S])/g,/(?:\b([aA][vV][gG]|[cC][oO][uU][nN][tT]|[mM][iI][nN]|[mM][aA][xX]|[sS][uU][mM])(?=\s*\())|([\s\S])/g,/(?:\b([cC][oO][nN][cC][aA][tT][eE][nN][aA][tT][eE]|[cC][oO][nN][vV][eE][rR][tT]|[lL][oO][wW][eE][rR]|[sS][uU][bB][sS][tT][rR][iI][nN][gG]|[tT][rR][aA][nN][sS][lL][aA][tT][eE]|[tT][rR][iI][mM]|[uU][pP][pP][eE][rR])\b)|([\s\S])/g,/(\w+?)(\.(\w+))|([\s\S])/g,/\b(for)(\s+(?=\({2}))|([\s\S])/g,/\b(for)(\s+((?:[^\s\\]|\\.)+)(\b))|([\s\S])/g,/\b(while|until)(\b)|([\s\S])/g,/\b(select)(\s+((?:[^\s\\]|\\.)+)(\b))|([\s\S])/g,/\b(case)(\b)|([\s\S])/g,/\b(if)(\b)|([\s\S])/g,/\-?\?>|([\s\S])/g,/(#)(.*?(?=\-?\?>))|([\s\S])/g,/\)|([\s\S])/g,/\(|([\s\S])/g,/(?![A-Za-z0-9_])|([\s\S])/g,/(&)(([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;))|([\s\S])/g,/(?=")|([\s\S])/g,/\\[\\']|([\s\S])/g,/(?:^\s*)((?!while|for|do|if|else|switch|catch|enumerate|r?iterate)[A-Za-z_][A-Za-z0-9_:]*)(\s*(\())|([\s\S])/g,/(:)((?=\s*[A-Za-z_][A-Za-z0-9_:]*\s*(\()))|([\s\S])/g,/^\s*(?=[uU]?[rR]?""")|([\s\S])/g,/^\s*(?=[uU]?[rR]?''')|([\s\S])/g,/\]|([\s\S])/g,/(\\)((.*)((?=\n)\n?))|([\s\S])/g,/>|([\s\S])/g,/\\>|\\\\|([\s\S])/g,/^\s*(#\s*(endif)(\b))(.*(?=\n))|([\s\S])/g,/((")("")|""")|([\s\S])/g,/(""")|([\s\S])/g,/\}|([\s\S])/g,/((?!while|for|do|if|else|switch|catch|enumerate|return|r?iterate)(?=((?:\b[A-Za-z_](?=([A-Za-z0-9_]*))\3\b|::)*))\2)(\s*(\())|([\s\S])/g,/\*\/|([\s\S])/g,/(?=')|([\s\S])/g,/(?=\s*\()|([\s\S])/g,/^\t*(MARKDOWN)((?=\n))|([\s\S])/g,/\b((Arithmetic|Assertion|Attribute|EOF|Environment|FloatingPoint|IO|Import|Indentation|Index|Key|Lookup|Memory|Name|OS|Overflow|NotImplemented|Reference|Runtime|Standard|Syntax|System|Tab|Type|UnboundLocal|Unicode(Translate|Encode|Decode)?|Value|ZeroDivision)Error|(Deprecation|Future|Overflow|PendingDeprecation|Runtime|Syntax|User)?Warning|KeyboardInterrupt|NotImplemented|StopIteration|SystemExit|(Base)?Exception)\b|([\s\S])/g,/(?=\n)\n?|([\s\S])/g,/(?=(\\\s*\n))\1|([\s\S])/g,/\s*(?:(?=\})|(,))|([\s\S])/g,/^\s*(#\s*(else)(\b))(.*)|([\s\S])/g,/=[=~]?|!=?|<|>|&&|\|\||([\s\S])/g,/\-(nt|ot|ef|eq|ne|l[te]|g[te]|[a-hknoprstuwxzOGLSN])|([\s\S])/g,/(?=\n)|([\s\S])/g,/[a-zA-Z0-9_]+|([\s\S])/g,/(')|(\n)|([\s\S])/g,/\b(done)(\b)|([\s\S])/g,/\1[eimnosux]*|([\s\S])/g,/(?=\s|(?=\n)\n?|#)|([\s\S])/g,/(?=(@)(\s*[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*))|([\s\S])/g,/\b(item|container|(computer|disk|trash)\-object|disk|folder|((alias|application|document|internet location) )?file|clipping|package)s?\b|([\s\S])/g,/\b((Finder|desktop|information|preferences|clipping) )windows?\b|([\s\S])/g,/\b(preferences|(icon|column|list) view options|(label|column|alias list)s?)\b|([\s\S])/g,/\b(copy|find|sort|clean up|eject|empty( trash)|erase|reveal|update)\b|([\s\S])/g,/\b(insertion location|product version|startup disk|desktop|trash|home|computer container|finder preferences)\b|([\s\S])/g,/\b(visible)\b|([\s\S])/g,/^(?!\s*\*).*(?=\n)\n?|([\s\S])/g,/^\s*\*\s*(@access)(\s+((public|private|protected)|(.+))(\s*(?=\n)))|([\s\S])/g,/((https?|s?ftp|ftps|file|smb|afp|nfs|(x\-)?man|gopher|txmt):\/\/|mailto:)[\-:@a-zA-Z0-9_\.~%\+\/\?=&#]*[\-@a-zA-Z0-9_~%\+\/=&#]|([\s\S])/g,/(@xlink)(\s+(.+)(\s*(?=\n)))|([\s\S])/g,/@(a(bstract|uthor)|c(ategory|opyright)|example|global|internal|li(cense|nk)|pa(ckage|ram)|return|s(ee|ince|tatic|ubpackage)|t(hrows|odo)|v(ar|ersion)|uses|deprecated|final)\b|([\s\S])/g,/\{(@(link))(.+?\})|([\s\S])/g,/(\})|([\s\S])/g,/([A-Za-z]+|((\|)([^\|\n]*(\|))))(\s*(:))|([\s\S])/g,/:|([\s\S])/g,/,|([\s\S])/g,/^\t*(HTML)((?=\n))|([\s\S])/g,/(@[^ \(]+)(\()|([\s\S])/g,/@\w*|([\s\S])/g,/final|([\s\S])/g,/\w+|([\s\S])/g,/(?=(^\s*)?<\?)|([\s\S])/g,/\b([a-zA-Z_][a-zA-Z_0-9]*)(\s*(=)((?!=)))|([\s\S])/g,/\}|/g,/|(?=#)|(;)|([\s\S])/g,/(?=#)|(;)|([\s\S])/g,/\bconst\b|([\s\S])/g,/(?=(?:\/\/|\/\*))|(?=\n)|([\s\S])/g,/(\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*?\b)|([\s\S])/g,/^=end|([\s\S])/g,/\b(esac)(\b)|([\s\S])/g,/\b(?:in)\b|([\s\S])/g,/^\s*(script)(\s+(\w+))|([\s\S])/g,/^\s*(to|on)(\s+([A-Za-z][A-Za-z0-9_]*)((\()((?:(\w+(?:\s*,\s*\w+)*))?(\)))))|([\s\S])/g,/^\s*(on)(\s+(\w+)((?=\s+(above|against|apart from|around|aside from|at|below|beneath|beside|between|by|for|from|instead of|into|on|onto|out of|over|thru|under)\s+)))|([\s\S])/g,/(?:([eE][xX][tT][eE][nN][dD][sS]))(\s+([a-zA-Z0-9_]+)(\s*))|([\s\S])/g,/(?:([iI][mM][pP][lL][eE][mM][eE][nN][tT][sS]))(\s+([a-zA-Z0-9_]+)(\s*))|([\s\S])/g,/\*\)|([\s\S])/g,/(>(<)(\/))((\2)(>))|([\s\S])/g,/(?=\})|([\s\S])/g,/(')([^'\\]*('))|([\s\S])/g,/(`)([^`\\]*(`))|([\s\S])/g,/(")([^"#]*("))|([\s\S])/g,/%\{|([\s\S])/g,/(\))|([\s\S])/g,/^\s*(end script)|([\s\S])/g,/"|/g,/((")|")|(\n)|([\s\S])/g,/(")|(\n)|([\s\S])/g,/(?!<?<<\s*(HTML|XML|SQL|JAVASCRIPT)\s*(?=\n))|([\s\S])/g,/(<<<)(\s*(HTML)(\s*(?=\n)\n?))|([\s\S])/g,/(<<<)(\s*(XML)(\s*(?=\n)\n?))|([\s\S])/g,/(<<<)(\s*(SQL)(\s*(?=\n)\n?))|([\s\S])/g,/(<<<)(\s*(JAVASCRIPT)(\s*(?=\n)\n?))|([\s\S])/g,/\\[\$`"\\\n]|([\s\S])/g,/\s*SQL(?=\n)|([\s\S])/g,/(\/?>)|([\s\S])/g,/^(XML)((;?)((?=\n)\n?))|([\s\S])/g,/;;|([\s\S])/g,/(\(|(?=\S))|([\s\S])/g,/\)|/g,/\]\](?=>)|([\s\S])/g,/\}[eimnosux]*|([\s\S])/g,/\\[0-7]{1,3}|([\s\S])/g,/\\x[0-9A-Fa-f]{1,2}|([\s\S])/g,/\\[nrt\\\$"]|([\s\S])/g,/((\$\{)(([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*)(\})))|([\s\S])/g,/((\$)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))((?:(\->)((?:(([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))|(\$([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))))|(\[)((?:(\d+)|((\$)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))|(\w+)|(.*?))(\])))?)|([\s\S])/g,/(?=(\$([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*)(?:\[([a-zA-Z0-9_\u007f-\u00ff]+|\$([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))\]|\->([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*)(\(.*?\))?)?|\$\{(?:([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*)(\[(?:([a-zA-Z0-9_\u007f-\u00ff]+|\$([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))|'(?:\\.|[^'\\])*'|"(?:\\.|[^"\\])*")\])?)\}))\{|([\s\S])/g,/\||([\s\S])/g,/\-\-\s*>|([\s\S])/g,/\-\-|([\s\S])/g,/\)[eimnosux]*|([\s\S])/g,/((\$)(GLOBALS|_(ENV|SERVER|SESSION)))|\b(global)\b|([\s\S])/g,/\b__(all|bases|class|debug|dict|doc|file|members|metaclass|methods|name|slots|weakref)__\b|([\s\S])/g,/\*\/|(?=<\/script)|([\s\S])/g,/(?=\)|:)|([\s\S])/g,/\(|,|/g,/\s*|([\s\S])/g,/(?=(@)(\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\())|([\s\S])/g,/(\()|([\s\S])/g,/\b((?:[a-z]\w*\.)*[A-Z]+\w*)<|([\s\S])/g,/\b((?:[a-z]\w*\.)*[A-Z]+\w*)(?=\[)|([\s\S])/g,/\b(?:[a-z]\w*(\.))*([A-Z]+\w*\b)|([\s\S])/g,/^\s*(tell)(\s+(?=app(lication)?\s+"(?:[tT][eE][xX][tT][mM][aA][tT][eE])")(?!.*\bto\b))|([\s\S])/g,/^\s*(tell)(\s+(?=app(lication)?\s+"(?:[fF][iI][nN][dD][eE][rR])")(?!.*\bto\b))|([\s\S])/g,/^\s*(tell)(\s+(?=app(lication)?\s+"(?:[sS][yY][sS][tT][eE][mM] [eE][vV][eE][nN][tT][sS])")(?!.*\bto\b))|([\s\S])/g,/^\s*(tell)(\s+(?=app(lication)?\s+"(?:[iI][tT][uU][nN][eE][sS])")(?!.*\bto\b))|([\s\S])/g,/^\s*(tell)(\s+(?=app(lication)?\b)(?!.*\bto\b))|([\s\S])/g,/^\s*(tell)(\s+(?=app(lication)?\b)(?=.*?to tell\s*(?!.*\bto\b)))|([\s\S])/g,/^\s*(tell)(\s+.*?(to tell)(\s*(?!.*\bto\b)))|([\s\S])/g,/^\s*(tell)(\s+(?!.*\bto\b))|([\s\S])/g,/(?=\n)|(?=#)|([\s\S])/g,/(\){2})|([\s\S])/g,/^\t*(\3)((?=\n))|([\s\S])/g,/\b(namespace)(\b\s*(?=(([_A-Za-z][_A-Za-z0-9]*\b)?))\3)|([\s\S])/g,/\b(class|struct)(\b\s*(?=(([_A-Za-z][_A-Za-z0-9]*\b)?))\3)|([\s\S])/g,/\b(extern)((?=\s*"))|([\s\S])/g,/(\()|\s*((?=\n)\n?|#.*(?=\n)\n?)|([\s\S])/g,/(?=[A-Za-z_][A-Za-z0-9_]*)|([\s\S])/g,/(\]{2})|([\s\S])/g,/^\1(?=\n)|([\s\S])/g,/(^\s*)?((((?:<)\?(?:[pP][hH][pP]|=)?)((\s*)((\?)(>))))(\1|(\s*(?=\n)\n)?))|([\s\S])/g,/^\s*(?=<\?)|([\s\S])/g,/\?>|/g,/((<)|<)(\?(?:[pP][hH][pP]|=)?)|([\s\S])/g,/(<)(\?(?:[pP][hH][pP]|=)?)|([\s\S])/g,/^(?=\s*[A-Z0-9_]+\s*(\{|\(|,))|([\s\S])/g,/(:)|([\s\S])/g,/\s+|([\s\S])/g,/\s*(array)(\s*(&)?(\s*((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))(\s*(=)(\s*(array)(\s*(\())))))|([\s\S])/g,/\s*(array)(\s*(&)?(\s*((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))((?:\s*(=)(\s*(?:([nN][uU][lL][lL])|(\S.*?))?))?(\s*(?=,|\))))))|([\s\S])/g,/\s*([A-Za-z_][A-Za-z_0-9]*)(\s*(&)?(\s*((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))((?:\s*(=)(\s*(?:([nN][uU][lL][lL])|(\S.*?))?))?(\s*(?=,|\))))))|([\s\S])/g,/(\s*&)?(\s*((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))(\s*(?=,|\))))|([\s\S])/g,/(\s*&)?(\s*((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))((?:\s*(=)(\s*))(\s*)))|([\s\S])/g,/\/\*|([\s\S])/g,/^<<\-?\w+|([\s\S])/g,/(?=\n)|"|([\s\S])/g,/\\(x[0-9a-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)|([\s\S])/g,/\s*(?:(,)|(?=\)))|([\s\S])/g,/(\))(\s*(?:(:)|(.*(?=\n)\n?)))|([\s\S])/g,/(class|(?:@)?interface|enum)(\s+(\w+))|([\s\S])/g,/extends|([\s\S])/g,/(implements)(\s)|([\s\S])/g,/\{|([\s\S])/g,/\/(?=\S.*\/)|([\s\S])/g,/%r\{|([\s\S])/g,/(\})((\s*\n)?)|([\s\S])/g,/(\s*(?=\n)\n)?|([\s\S])/g,/<\?(?:[pP][hH][pP]|=)?|([\s\S])/g,/>|[^\w\s,<]|([\s\S])/g,/'|"|/g,/(\$)([\-\*@#\?\$!0_])|([\s\S])/g,/(\$)([1-9])|([\s\S])/g,/(\$)([a-zA-Z_][a-zA-Z0-9_]*)|([\s\S])/g,/\$\{|([\s\S])/g,/^[\s\S]|/g,/\s|/g,/(?::|\.)(?=\s|;|&|(?=\n))|([\s\S])/g,/\b(?:alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|dirs|disown|echo|enable|eval|exec|exit|false|fc|fg|getopts|hash|help|history|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|times|trap|true|type|ulimit|umask|unalias|unset|wait)\b|([\s\S])/g,/(?=\n)|(?![\-a-z])|([\s\S])/g,/\b(azimuth|background\-attachment|background\-color|background\-image|background\-position|background\-repeat|background|border\-bottom\-color|border\-bottom\-style|border\-bottom\-width|border\-bottom|border\-collapse|border\-color|border\-left\-color|border\-left\-style|border\-left\-width|border\-left|border\-right\-color|border\-right\-style|border\-right\-width|border\-right|border\-spacing|border\-style|border\-top\-color|border\-top\-style|border\-top\-width|border\-top|border\-width|border|bottom|caption\-side|clear|clip|color|content|counter\-increment|counter\-reset|cue\-after|cue\-before|cue|cursor|direction|display|elevation|empty\-cells|float|font\-family|font\-size\-adjust|font\-size|font\-stretch|font\-style|font\-variant|font\-weight|font|height|left|letter\-spacing|line\-height|list\-style\-image|list\-style\-position|list\-style\-type|list\-style|margin\-bottom|margin\-left|margin\-right|margin\-top|marker\-offset|margin|marks|max\-height|max\-width|min\-height|min\-width|\-moz\-border\-radius|opacity|orphans|outline\-color|outline\-style|outline\-width|outline|overflow(\-[xy])?|padding\-bottom|padding\-left|padding\-right|padding\-top|padding|page\-break\-after|page\-break\-before|page\-break\-inside|page|pause\-after|pause\-before|pause|pitch\-range|pitch|play\-during|position|quotes|richness|right|size|speak\-header|speak\-numeral|speak\-punctuation|speech\-rate|speak|stress|table\-layout|text\-align|text\-decoration|text\-indent|text\-shadow|text\-transform|top|unicode\-bidi|vertical\-align|visibility|voice\-family|volume|white\-space|widows|width|word\-spacing|z\-index)\b|([\s\S])/g,/\b(?:void|boolean|byte|char|short|int|float|long|double)(\[\])*\b|([\s\S])/g,/(?=not)impossible|([\s\S])/g,/^(PYTHON)((?=\n))|([\s\S])/g,/(?=,|;|\})|([\s\S])/g,/(?=<<<\s*(HTML|XML|SQL|JAVASCRIPT)\s*(?=\n))|([\s\S])/g,/\/\*\*(?:#@\+)?\s*(?=\n)|([\s\S])/g,/(\/\/)(.*?((?=\n)\n?|(?=\?>)))|([\s\S])/g,/(#)(.*?((?=\n)\n?|(?=\?>)))|([\s\S])/g,/^(?:\s*([iI][nN][tT][eE][rR][fF][aA][cC][eE])(\s+([a-zA-Z0-9_]+)(\s*([eE][xX][tT][eE][nN][dD][sS])?(\s*))))|([\s\S])/g,/(?:^\s*([aA][bB][sS][tT][rR][aA][cC][tT]|[fF][iI][nN][aA][lL])?(\s*([cC][lL][aA][sS][sS])(\s+([a-zA-Z0-9_]+)(\s*))))|([\s\S])/g,/\b(break|c(ase|ontinue)|d(e(clare|fault)|ie|o)|e(lse(if)?|nd(declare|for(each)?|if|switch|while)|xit)|for(each)?|if|return|switch|use|while)\b|([\s\S])/g,/(?:\b((?:[rR][eE][qQ][uU][iI][rR][eE]|[iI][nN][cC][lL][uU][dD][eE])(?:_[oO][nN][cC][eE])?)(\b\s*))|([\s\S])/g,/\b(catch)(\b\s*\(\s*([A-Za-z_][A-Za-z_0-9]*)(\s*((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))(\s*\))))|([\s\S])/g,/\b(catch|try|throw|exception)\b|([\s\S])/g,/(?:^\s*)((?:(?:final|abstract|public|private|protected|static)\s+)*)((function)((?:\s+|(\s*&\s*))((?:(__(?:call|(?:con|de)struct|get|(?:is|un)?set|tostring|clone|set_state|sleep|wakeup|autoload))|([a-zA-Z0-9_]+))(\s*(\()))))|([\s\S])/g,/(?:\b([rR][eE][aA][lL]|[dD][oO][uU][bB][lL][eE]|[fF][lL][oO][aA][tT]|[iI][nN][tT]([eE][gG][eE][rR])?|[bB][oO][oO][lL]([eE][aA][nN])?|[sS][tT][rR][iI][nN][gG]|[cC][lL][aA][sS][sS]|[cC][lL][oO][nN][eE]|[vV][aA][rR]|[fF][uU][nN][cC][tT][iI][oO][nN]|[iI][nN][tT][eE][rR][fF][aA][cC][eE]|[pP][aA][rR][eE][nN][tT]|[sS][eE][lL][fF]|[oO][bB][jJ][eE][cC][tT])\b)|([\s\S])/g,/(?:\b([gG][lL][oO][bB][aA][lL]|[aA][bB][sS][tT][rR][aA][cC][tT]|[cC][oO][nN][sS][tT]|[eE][xX][tT][eE][nN][dD][sS]|[iI][mM][pP][lL][eE][mM][eE][nN][tT][sS]|[fF][iI][nN][aA][lL]|[pP]([rR]([iI][vV][aA][tT][eE]|[oO][tT][eE][cC][tT][eE][dD])|[uU][bB][lL][iI][cC])|[sS][tT][aA][tT][iI][cC])\b)|([\s\S])/g,/(::)((?:([A-Za-z_][A-Za-z_0-9]*)(\s*\()|((\$+)([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))|([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*))?)|([\s\S])/g,/(<<<)(\s*([a-zA-Z_]+[a-zA-Z0-9_]*))|([\s\S])/g,/=>|([\s\S])/g,/&(?=\s*(\$|new|[A-Za-z_][A-Za-z_0-9]+(?=\s*\()))|([\s\S])/g,/;|([\s\S])/g,/(@)|([\s\S])/g,/(\-\-|\+\+)|([\s\S])/g,/(\-|\+|\*|\/|%)|([\s\S])/g,/(?:(!|&&|\|\|)|\b([aA][nN][dD]|[oO][rR]|[xX][oO][rR]|[aA][sS])\b)|([\s\S])/g,/<<|>>|~|\^|&|\||([\s\S])/g,/(===|==|!==|!=|<=|>=|<>|<|>)|([\s\S])/g,/(\.=|\.)|([\s\S])/g,/=|([\s\S])/g,/(?:\b([iI][nN][sS][tT][aA][nN][cC][eE][oO][fF])(\b(?:\s+(\w+))?))|([\s\S])/g,/[a-zA-Z0-9_\u007f-\u00ff]|/g,/(\->)(([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*?)(\b))|([\s\S])/g,/^(RUBY)((?=\n))|([\s\S])/g,/\b(audio (data|file))\b|([\s\S])/g,/\b(alias(es)?|(Classic|local|network|system|user) domain objects?|disk( item)?s?|domains?|file( package)?s?|folders?|items?)\b|([\s\S])/g,/\b(delete|open|move)\b|([\s\S])/g,/\b(folder actions?|scripts?)\b|([\s\S])/g,/\b(attach action to|attached scripts|edit action of|remove action from)\b|([\s\S])/g,/\b(movie data|movie file)\b|([\s\S])/g,/\b(log out|restart|shut down|sleep)\b|([\s\S])/g,/\b(((application |desk accessory )?process|(check|combo )?box)(es)?|(action|attribute|browser|(busy|progress|relevance) indicator|color well|column|drawer|group|grow area|image|incrementor|list|menu( bar)?( item)?|(menu |pop up |radio )?button|outline|(radio|tab|splitter) group|row|scroll (area|bar)|sheet|slider|splitter|static text|table|text (area|field)|tool bar|UI element|window)s?)\b|([\s\S])/g,/\b(click|key code|keystroke|perform|select)\b|([\s\S])/g,/\b(property list (file|item))\b|([\s\S])/g,/\b(annotation|QuickTime (data|file)|track)s?\b|([\s\S])/g,/\b((abort|begin|end) transaction)\b|([\s\S])/g,/\b(XML (attribute|data|element|file)s?)\b|([\s\S])/g,/\b(print settings|users?|login items?)\b|([\s\S])/g,/\[|([\s\S])/g,/\b(colors?|documents?|items?|windows?)\b|([\s\S])/g,/\b(close|count|delete|duplicate|exists|make|move|open|print|quit|save|activate|select|data size)\b|([\s\S])/g,/\b(name|frontmost|version)\b|([\s\S])/g,/\b(selection)\b|([\s\S])/g,/\b(attachments?|attribute runs?|characters?|paragraphs?|texts?|words?)\b|([\s\S])/g,/\s*(?:(,)|(?=(?=\n)\n?|[\):]))|([\s\S])/g,/<%+#|([\s\S])/g,/<%+(?!>)=?|([\s\S])/g,/<\?r(?!>)=?|([\s\S])/g,/\b(function)(\s+((?:[^\s\\]|\\.)+)((?:\s*(\(\)))?))|([\s\S])/g,/\b((?:[^\s\\]|\\.)+)(\s*(\(\)))|([\s\S])/g,/'''|/g,/((')('')|''')|([\s\S])/g,/(''')|([\s\S])/g,/<\/(?:script|SCRIPT)|/g,/(>)((?:\s*\n)?)|([\s\S])/g,/(?!\-\-)%>|([\s\S])/g,/"\/(?=(?=((\\.|[^"\/])+))\1\/[imsxeADSUXu]*")|([\s\S])/g,/^(APPLESCRIPT)((?=\n))|([\s\S])/g,/\b(true|false|null)\b|([\s\S])/g,/\b(this|super)\b|([\s\S])/g,/\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|\-)?[0-9]+)?)([LlFfUuDd]|UL|ul)?\b|([\s\S])/g,/(\.)?(\b([A-Z][A-Z0-9_]+)(?!<|\.class|\s*\w+\s*=)\b)|([\s\S])/g,/([uU]r)(""")|([\s\S])/g,/([uU]R)(""")|([\s\S])/g,/(r)(""")|([\s\S])/g,/(R)(""")|([\s\S])/g,/([uU])(""")|([\s\S])/g,/([uU]r)(")|([\s\S])/g,/([uU]R)(")|([\s\S])/g,/(r)(")|([\s\S])/g,/(R)(")|([\s\S])/g,/([uU])(")|([\s\S])/g,/(""")((?=\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)))|([\s\S])/g,/(")((?=\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)))|([\s\S])/g,/(")|([\s\S])/g,/\\['\\]|([\s\S])/g,/;|/g,/\s*(\})|([\s\S])/g,/(?=\{|implements)|([\s\S])/g,/(?=\{)|([\s\S])/g,/\b(a|abbr|acronym|address|area|b|base|big|blockquote|body|br|button|caption|cite|code|col|colgroup|dd|del|dfn|div|dl|dt|em|fieldset|form|frame|frameset|(h[1-6])|head|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|meta|noframes|noscript|object|ol|optgroup|option|p|param|pre|q|samp|script|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|ul|var)\b|([\s\S])/g,/(\.)([a-zA-Z0-9_\-]+)|([\s\S])/g,/(#)([a-zA-Z][a-zA-Z0-9_\-]*)|([\s\S])/g,/(:+)(\b(after|before|first\-child|first\-letter|first\-line|selection)\b)|([\s\S])/g,/(:)(\b(active|hover|link|visited|focus)\b)|([\s\S])/g,/(\[)(\s*(\-?[_a-zA-Z\\\u0080-\uffff][_a-zA-Z0-9\-\\\u0080-\uffff]*)((?:\s*([~\|\^\$\*]?=)(\s*(?:(\-?[_a-zA-Z\\\u0080-\uffff][_a-zA-Z0-9\-\\\u0080-\uffff]*)|((?=((['"])((?:[^\\]|\\.)*?(\10))))\9))))?(\s*(\]))))|([\s\S])/g,/^\s*#\s*endif\b.*(?=\n)|([\s\S])/g,/(?=\s*\[)|([\s\S])/g,/[A-Za-z_][A-Za-z0-9_]*|([\s\S])/g,/#\{(\})|([\s\S])/g,/#\{|([\s\S])/g,/(#@)([a-zA-Z_]\w*)|([\s\S])/g,/(#@@)([a-zA-Z_]\w*)|([\s\S])/g,/(#\$)([a-zA-Z_]\w*)|([\s\S])/g,/\s*(;|(?=\}))|([\s\S])/g,/\b(absolute|all\-scroll|always|armenian|auto|baseline|below|bidi\-override|block|bold|bolder|both|bottom|break\-all|break\-word|capitalize|center|char|circle|cjk\-ideographic|col\-resize|collapse|crosshair|dashed|decimal\-leading\-zero|decimal|default|disabled|disc|distribute\-all\-lines|distribute\-letter|distribute\-space|distribute|dotted|double|e\-resize|ellipsis|fixed|georgian|groove|hand|hebrew|help|hidden|hiragana\-iroha|hiragana|horizontal|ideograph\-alpha|ideograph\-numeric|ideograph\-parenthesis|ideograph\-space|inactive|inherit|inline\-block|inline|inset|inside|inter\-ideograph|inter\-word|italic|justify|katakana\-iroha|katakana|keep\-all|left|lighter|line\-edge|line\-through|line|list\-item|loose|lower\-alpha|lower\-greek|lower\-latin|lower\-roman|lowercase|lr\-tb|ltr|medium|middle|move|n\-resize|ne\-resize|newspaper|no\-drop|no\-repeat|nw\-resize|none|normal|not\-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat\-x|repeat\-y|repeat|right|ridge|row\-resize|rtl|s\-resize|scroll|se\-resize|separate|small\-caps|solid|square|static|strict|super|sw\-resize|table\-footer\-group|table\-header\-group|tb\-rl|text\-bottom|text\-top|text|thick|thin|top|transparent|underline|upper\-alpha|upper\-latin|upper\-roman|uppercase|vertical\-ideographic|vertical\-text|visible|w\-resize|wait|whitespace|zero)\b|([\s\S])/g,/(\b(?:[aA][rR][iI][aA][lL]|[cC][eE][nN][tT][uU][rR][yY]|[cC][oO][mM][iI][cC]|[cC][oO][uU][rR][iI][eE][rR]|[gG][aA][rR][aA][mM][oO][nN][dD]|[gG][eE][oO][rR][gG][iI][aA]|[hH][eE][lL][vV][eE][tT][iI][cC][aA]|[iI][mM][pP][aA][cC][tT]|[lL][uU][cC][iI][dD][aA]|[sS][yY][mM][bB][oO][lL]|[sS][yY][sS][tT][eE][mM]|[tT][aA][hH][oO][mM][aA]|[tT][iI][mM][eE][sS]|[tT][rR][eE][bB][uU][cC][hH][eE][tT]|[uU][tT][oO][pP][iI][aA]|[vV][eE][rR][dD][aA][nN][aA]|[wW][eE][bB][dD][iI][nN][gG][sS]|[sS][aA][nN][sS]\-[sS][eE][rR][iI][fF]|[sS][eE][rR][iI][fF]|[mM][oO][nN][oO][sS][pP][aA][cC][eE])\b)|([\s\S])/g,/\b(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)\b|([\s\S])/g,/\b(aliceblue|antiquewhite|aquamarine|azure|beige|bisque|blanchedalmond|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|gainsboro|ghostwhite|gold|goldenrod|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|limegreen|linen|magenta|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|oldlace|olivedrab|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|thistle|tomato|turquoise|violet|wheat|whitesmoke|yellowgreen)\b|([\s\S])/g,/(\-|\+)?\s*[0-9]+(\.[0-9]+)?|([\s\S])/g,/\d|/g,/(px|pt|cm|mm|in|em|ex|pc)\b|%|([\s\S])/g,/%|([\s\S])/g,/(#)(([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b)|([\s\S])/g,/(rgb|url|attr|counter|counters)(\s*(\())|([\s\S])/g,/!\s*important|([\s\S])/g,/%>|([\s\S])/g,/(\])|([\s\S])/g,/\[|,|/g,/\s*(?![\],])|([\s\S])/g,/\b(sizeof)\b|([\s\S])/g,/(<<)(\-("|'|)(RUBY)(\3))|([\s\S])/g,/(<<)(("|'|)(RUBY)(\3))|([\s\S])/g,/(<<)(\-("|'|)(PYTHON)(\3))|([\s\S])/g,/(<<)(("|'|)(PYTHON)(\3))|([\s\S])/g,/(<<)(\-("|'|)(APPLESCRIPT)(\3))|([\s\S])/g,/(<<)(("|'|)(APPLESCRIPT)(\3))|([\s\S])/g,/(<<)(\-("|'|)(HTML)(\3))|([\s\S])/g,/(<<)(("|'|)(HTML)(\3))|([\s\S])/g,/(<<)(\-("|'|)(MARKDOWN)(\3))|([\s\S])/g,/(<<)(("|'|)(MARKDOWN)(\3))|([\s\S])/g,/(<<)(\-("|'|)(TEXTILE)(\3))|([\s\S])/g,/(<<)(("|'|)(TEXTILE)(\3))|([\s\S])/g,/(<<)(\-("|'|)\\?(\w+)(\3))|([\s\S])/g,/(<<)(("|'|)\\?(\w+)(\3))|([\s\S])/g,/;|&|(?=\n)|([\s\S])/g,/\s*((?=;|\}))|([\s\S])/g,/(url)(\s*(\()(\s*))|([\s\S])/g,/(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\[)|([\s\S])/g,/(\[)|([\s\S])/g,/\s*\2(?=\n)|([\s\S])/g,/%(\d+\$)?[#0\- \+']*[,;:_]?((\-?\d+)|\*(\-?\d+\$)?)?(\.((\-?\d+)|\*(\-?\d+\$)?)?)?(hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)?[diouxXDOUeEfFgGaACcSspn%]|([\s\S])/g,/(\\U[0-9A-Fa-f]{8})|(\\u[0-9A-Fa-f]{4})|(\\N\{[a-zA-Z ]+\})|([\s\S])/g,/(<\/)(((?:[sS][tT][yY][lL][eE]))((>)((?:\s*\n)?)))|([\s\S])/g,/(\/)([imsxeADSUXu]*)(')|([\s\S])/g,/(\{)(\d+(,\d+)?(\}))|([\s\S])/g,/(\\){1,2}[\.\$\^\[\]\{\}]|([\s\S])/g,/\\{1,2}[\\']|([\s\S])/g,/\[(?:\^?\])?|([\s\S])/g,/[\$\^\+\*]|([\s\S])/g,/\b(?:if|then|else|elif|fi|for|in|do|done|select|case|continue|esac|while|until|return)\b|([\s\S])/g,/\b(?:export|declare|typeset|local|readonly)\b|([\s\S])/g,/(?=\w+\s*\()|([\s\S])/g,/(?:\b([nN][eE][wW])(\s+(?:(\$[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*)|(\w+)))|(\w+)((?=::)))|([\s\S])/g,/\b(basestring|bool|buffer|classmethod|complex|dict|enumerate|file|float|frozenset|int|list|long|object|open|property|reversed|set|slice|staticmethod|str|super|tuple|type|unicode|xrange)\b|([\s\S])/g,/\-\-%?>|([\s\S])/g,/\){2}|([\s\S])/g,/^\s*(#\s*(pragma\s+mark)(\s+(.*)))|([\s\S])/g,/\\(?:[0-7]{1,3}|x[\da-fA-F]{1,2}|.)|([\s\S])/g,/\}|(?=;)|([\s\S])/g,/(\w+)(\s*\()|([\s\S])/g,/(?=\w.*\s+\w+\s*\()|([\s\S])/g,/#(\\'|[^'])*(?='|(?=\n)\n?)|([\s\S])/g,/\-\-(\\'|[^'])*(?='|(?=\n)\n?)|([\s\S])/g,/\\'(?!([^\\']|\\[^'])*\\')(?=(\\[^']|.)*?')|([\s\S])/g,/`(?=[^`]*?')|([\s\S])/g,/"(?=[^"]*?')|([\s\S])/g,/\\'|([\s\S])/g,/(?:\b([tT][rR][uU][eE]|[fF][aA][lL][sS][eE]|[nN][uU][lL][lL]|__([fF][iI][lL][eE]|[fF][uU][nN][cC][tT][iI][oO][nN]|[cC][lL][aA][sS][sS]|[mM][eE][tT][hH][oO][dD]|[lL][iI][nN][eE])__|[oO][nN]|[oO][fF][fF]|[yY][eE][sS]|[nN][oO]|[nN][lL]|[bB][rR]|[tT][aA][bB])\b)|([\s\S])/g,/\b(DEFAULT_INCLUDE_PATH|E_(ALL|COMPILE_(ERROR|WARNING)|CORE_(ERROR|WARNING)|(RECOVERABLE_)?ERROR|NOTICE|PARSE|STRICT|USER_(ERROR|NOTICE|WARNING)|WARNING)|PEAR_(EXTENSION_DIR|INSTALL_DIR)|PHP_(BINDIR|CONFIG_FILE_PATH|DATADIR|E(OL|XTENSION_DIR)|L(IBDIR|OCALSTATEDIR)|O(S|UTPUT_HANDLER_CONT|UTPUT_HANDLER_END|UTPUT_HANDLER_START)|SYSCONFDIR|VERSION))\b|([\s\S])/g,/\b(A(B(DAY_([1-7])|MON_([0-9]{1,2}))|LT_DIGITS|M_STR|SSERT_(ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(ASE_(LOWER|UPPER)|HAR_MAX|O(DESET|NNECTION_(ABORTED|NORMAL|TIMEOUT)|UNT_(NORMAL|RECURSIVE))|REDITS_(ALL|DOCS|FULLPAGE|GENERAL|GROUP|MODULES|QA|SAPI)|RNCYSTR|RYPT_(BLOWFISH|EXT_DES|MD5|SALT_LENGTH|STD_DES)|URRENCY_SYMBOL)|D(AY_([1-7])|ECIMAL_POINT|IRECTORY_SEPARATOR|_(FMT|T_FMT))|E(NT_(COMPAT|NOQUOTES|QUOTES)|RA(|_D_FMT|_D_T_FMT|_T_FMT|_YEAR)|XTR_(IF_EXISTS|OVERWRITE|PREFIX_(ALL|IF_EXISTS|INVALID|SAME)|SKIP))|FRAC_DIGITS|GROUPING|HTML_(ENTITIES|SPECIALCHARS)|IN(FO_(ALL|CONFIGURATION|CREDITS|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|I_(ALL|PERDIR|SYSTEM|USER)|T_(CURR_SYMBOL|FRAC_DIGITS))|L(C_(ALL|COLLATE|CTYPE|MESSAGES|MONETARY|NUMERIC|TIME)|O(CK_(EX|NB|SH|UN)|G_(ALERT|AUTH(|PRIV)|CONS|CRIT|CRON|DAEMON|DEBUG|EMERG|ERR|INFO|KERN|LOCAL([0-7])|LPR|MAIL|NDELAY|NEWS|NOTICE|NOWAIT|ODELAY|PERROR|PID|SYSLOG|USER|UUCP|WARNING)))|M(ON_([0-9]{1,2}|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|YSQL_(ASSOC|BOTH|NUM)|_(1_PI|2_(PI|SQRTPI)|E|L(N10|N2|OG(10E|2E))|PI(|_2|_4)|SQRT1_2|SQRT2))|N(EGATIVE_SIGN|O(EXPR|STR)|_(CS_PRECEDES|SEP_BY_SPACE|SIGN_POSN))|P(ATH(INFO_(BASENAME|DIRNAME|EXTENSION|FILENAME)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(CS_PRECEDES|SEP_BY_SPACE|SIGN_POSN))|RADIXCHAR|S(EEK_(CUR|END|SET)|ORT_(ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(BOTH|LEFT|RIGHT))|T(HOUS(ANDS_SEP|EP)|_(FMT(|_AMPM)))|YES(EXPR|STR))\b|([\s\S])/g,/[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*|([\s\S])/g,/^\s*(#(if)(\s+(0*1)(\b)))|([\s\S])/g,/\b(__import__|all|abs|any|apply|callable|chr|cmp|coerce|compile|delattr|dir|divmod|eval|execfile|filter|getattr|globals|hasattr|hash|hex|id|input|intern|isinstance|issubclass|iter|len|locals|map|max|min|oct|ord|pow|range|raw_input|reduce|reload|repr|round|setattr|sorted|sum|unichr|vars|zip)\b|([\s\S])/g,/(?:%(\([a-zA-Z_]+\))?#?0?\-? ?\+?([0-9]*|\*)(\.([0-9]*|\*))?[hHlL]?[a-zA-Z%])|([\s\S])/g,/\)|\]|/g,/(?!\s*\{)||(?=;)|([\s\S])/g,/(?!\s*\{)|(?=;)|([\s\S])/g,/|(?=;)|([\s\S])/g,/(?=;)|([\s\S])/g,/(\w+)(\s*(?=\[))|([\s\S])/g,/(?=\w.*\()|([\s\S])/g,/\b(print settings)\b|([\s\S])/g,/\b(get url|insert|reload bundles)\b|([\s\S])/g,/(#)(\s[a-zA-Z0-9,\. \t\?!-\u0080\-\uffff]*(?=\n))|([\s\S])/g,/\+{1,2}|\-{1,2}|!|~|\*{1,2}|\/|%|<[<=]?|>[>=]?|==|!=|^|\|{1,2}|&{1,2}|\?|:|,|=|[\*\/%\+\-&\^\|]=|<<=|>>=|([\s\S])/g,/0[xX][0-9a-fA-F]+|([\s\S])/g,/0\d+|([\s\S])/g,/\d{1,2}#[0-9a-zA-Z@_]+|([\s\S])/g,/\d+|([\s\S])/g,/\-?%>|([\s\S])/g,/(#)(.*?(?=\-?%>))|([\s\S])/g,/(\?>)|([\s\S])/g,/ ([a-zA-Z\-]+)|([\s\S])/g,/(DOCTYPE)|([\s\S])/g,/\[CDATA\[|([\s\S])/g,/(\s*)(?!\-\-|>)\S(\s*)|([\s\S])/g,/^\s*(#(if)(\s+(0)(\b)))(.*)|([\s\S])/g,/\{|,|/g,/\s*(?![\},])|([\s\S])/g,/:|/g,/(?!(^\s*)?<\?)|([\s\S])/g,/(?=^\s*#\s*(else|endif)\b.*(?=\n))|([\s\S])/g,/^(?=\s*[:\.\*#a-zA-Z])|([\s\S])/g,/^\s*((@)(import\b))|([\s\S])/g,/^\s*((@)(media))(\s+(((all|aural|braille|embossed|handheld|print|projection|screen|tty|tv)\s*,?\s*)+)(\s*\{))|([\s\S])/g,/^\s*(package)(\b(?:\s*([^ ;\$]+)(\s*(;)?))?)|([\s\S])/g,/^\s*(import)(\b(?:\s*([^ ;\$]+)(\s*(;)?))?)|([\s\S])/g,/(?![A-Za-z0-9_\.])|([\s\S])/g,/(\.)(?=[A-Za-z_][A-Za-z0-9_]*)|([\s\S])/g,/\.|/g,/(?=\s|;|(?=\n))|([\s\S])/g,/"\s*(?=(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)\b)|([\s\S])/g,/(?=\))|([\s\S])/g,/^(HTML)((?=\n))|([\s\S])/g,/\b(fi)(\b)|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.(prototype)(\s*(=)(\s*)))|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.(prototype)(\.([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*(=)(\s*(function)?(\s*(\()((.*?)(\))))))))|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.(prototype)(\.([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*(=)(\s*))))|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*(=)(\s*(function)(\s*(\()((.*?)(\)))))))|([\s\S])/g,/([a-zA-Z_\?\$][\w\?\$]*)(\s*(=)(\s*(function)(\s*(\()((.*?)(\))))))|([\s\S])/g,/\b(function)(\s+([a-zA-Z_\$]\w*)?(\s*(\()((.*?)(\)))))|([\s\S])/g,/\b([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*:\s*\b(function)?(\s*(\()((.*?)(\)))))|([\s\S])/g,/(?:((')((.*?)(')))|((")((.*?)("))))(\s*:\s*\b(function)?(\s*(\()((.*?)(\)))))|([\s\S])/g,/(new)(\s+(\w+(?:\.\w*)?))|([\s\S])/g,/\b(console)\b|([\s\S])/g,/\.(warn|info|log|error|time|timeEnd|assert)\b|([\s\S])/g,/\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?))\b|([\s\S])/g,/\/\*\*(?!\/)|([\s\S])/g,/(\/\/)(.*(?=\n)\n?)|([\s\S])/g,/(<!\-\-|\-\->)|([\s\S])/g,/\b(boolean|byte|char|class|double|enum|float|function|int|interface|long|short|var|void)\b|([\s\S])/g,/\b(const|export|extends|final|implements|native|private|protected|public|static|synchronized|throws|transient|volatile)\b|([\s\S])/g,/\b(break|case|catch|continue|default|do|else|finally|for|goto|if|import|package|return|switch|throw|try|while)\b|([\s\S])/g,/\b(delete|in|instanceof|new|typeof|with)\b|([\s\S])/g,/\btrue\b|([\s\S])/g,/\bfalse\b|([\s\S])/g,/\bnull\b|([\s\S])/g,/\b(super|this)\b|([\s\S])/g,/\b(debugger)\b|([\s\S])/g,/\b(Anchor|Applet|Area|Array|Boolean|Button|Checkbox|Date|document|event|FileUpload|Form|Frame|Function|Hidden|History|Image|JavaArray|JavaClass|JavaObject|JavaPackage|java|Layer|Link|Location|Math|MimeType|Number|navigator|netscape|Object|Option|Packages|Password|Plugin|Radio|RegExp|Reset|Select|String|Style|Submit|screen|sun|Text|Textarea|window|XMLHttpRequest)\b|([\s\S])/g,/\b(s(h(ift|ow(Mod(elessDialog|alDialog)|Help))|croll(X|By(Pages|Lines)?|Y|To)?|t(op|rike)|i(n|zeToContent|debar|gnText)|ort|u(p|b(str(ing)?)?)|pli(ce|t)|e(nd|t(Re(sizable|questHeader)|M(i(nutes|lliseconds)|onth)|Seconds|Ho(tKeys|urs)|Year|Cursor|Time(out)?|Interval|ZOptions|Date|UTC(M(i(nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(ome|andleEvent)|navigate|c(har(CodeAt|At)|o(s|n(cat|textual|firm)|mpile)|eil|lear(Timeout|Interval)?|a(ptureEvents|ll)|reate(StyleSheet|Popup|EventObject))|t(o(GMTString|S(tring|ource)|U(TCString|pperCase)|Lo(caleString|werCase))|est|a(n|int(Enabled)?))|i(s(NaN|Finite)|ndexOf|talics)|d(isableExternalCapture|ump|etachEvent)|u(n(shift|taint|escape|watch)|pdateCommands)|j(oin|avaEnabled)|p(o(p|w)|ush|lugins.refresh|a(ddings|rse(Int|Float)?)|r(int|ompt|eference))|e(scape|nableExternalCapture|val|lementFromPoint|x(p|ec(Script|Command)?))|valueOf|UTC|queryCommand(State|Indeterm|Enabled|Value)|f(i(nd|le(ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(nt(size|color)|rward)|loor|romCharCode)|watch|l(ink|o(ad|g)|astIndexOf)|a(sin|nchor|cos|t(tachEvent|ob|an(2)?)|pply|lert|b(s|ort))|r(ou(nd|teEvents)|e(size(By|To)|calc|turnValue|place|verse|l(oad|ease(Capture|Events)))|andom)|g(o|et(ResponseHeader|M(i(nutes|lliseconds)|onth)|Se(conds|lection)|Hours|Year|Time(zoneOffset)?|Da(y|te)|UTC(M(i(nutes|lliseconds)|onth)|Seconds|Hours|Da(y|te)|FullYear)|FullYear|A(ttention|llResponseHeaders)))|m(in|ove(B(y|elow)|To(Absolute)?|Above)|ergeAttributes|a(tch|rgins|x))|b(toa|ig|o(ld|rderWidths)|link|ack))\b(?=\()|([\s\S])/g,/\b(s(ub(stringData|mit)|plitText|e(t(NamedItem|Attribute(Node)?)|lect))|has(ChildNodes|Feature)|namedItem|c(l(ick|o(se|neNode))|reate(C(omment|DATASection|aption)|T(Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(ntityReference|lement)|Attribute))|tabIndex|i(nsert(Row|Before|Cell|Data)|tem)|open|delete(Row|C(ell|aption)|T(Head|Foot)|Data)|focus|write(ln)?|a(dd|ppend(Child|Data))|re(set|place(Child|Data)|move(NamedItem|Child|Attribute(Node)?)?)|get(NamedItem|Element(sBy(Name|TagName)|ById)|Attribute(Node)?)|blur)\b(?=\()|([\s\S])/g,/(s(ystemLanguage|cr(ipts|ollbars|een(X|Y|Top|Left))|t(yle(Sheets)?|atus(Text|bar)?)|ibling(Below|Above)|ource|uffixes|e(curity(Policy)?|l(ection|f)))|h(istory|ost(name)?|as(h|Focus))|y|X(MLDocument|SLDocument)|n(ext|ame(space(s|URI)|Prop))|M(IN_VALUE|AX_VALUE)|c(haracterSet|o(n(structor|trollers)|okieEnabled|lorDepth|mp(onents|lete))|urrent|puClass|l(i(p(boardData)?|entInformation)|osed|asses)|alle(e|r)|rypto)|t(o(olbar|p)|ext(Transform|Indent|Decoration|Align)|ags)|SQRT(1_2|2)|i(n(ner(Height|Width)|put)|ds|gnoreCase)|zIndex|o(scpu|n(readystatechange|Line)|uter(Height|Width)|p(sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(i(splay|alog(Height|Top|Width|Left|Arguments)|rectories)|e(scription|fault(Status|Ch(ecked|arset)|View)))|u(ser(Profile|Language|Agent)|n(iqueID|defined)|pdateInterval)|_content|p(ixelDepth|ort|ersonalbar|kcs11|l(ugins|atform)|a(thname|dding(Right|Bottom|Top|Left)|rent(Window|Layer)?|ge(X(Offset)?|Y(Offset)?))|r(o(to(col|type)|duct(Sub)?|mpter)|e(vious|fix)))|e(n(coding|abledPlugin)|x(ternal|pando)|mbeds)|v(isibility|endor(Sub)?|Linkcolor)|URLUnencoded|P(I|OSITIVE_INFINITY)|f(ilename|o(nt(Size|Family|Weight)|rmName)|rame(s|Element)|gColor)|E|whiteSpace|l(i(stStyleType|n(eHeight|kColor))|o(ca(tion(bar)?|lName)|wsrc)|e(ngth|ft(Context)?)|a(st(M(odified|atch)|Index|Paren)|yer(s|X)|nguage))|a(pp(MinorVersion|Name|Co(deName|re)|Version)|vail(Height|Top|Width|Left)|ll|r(ity|guments)|Linkcolor|bove)|r(ight(Context)?|e(sponse(XML|Text)|adyState))|global|x|m(imeTypes|ultiline|enubar|argin(Right|Bottom|Top|Left))|L(N(10|2)|OG(10E|2E))|b(o(ttom|rder(RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(Color|Image)))\b|([\s\S])/g,/(s(hape|ystemId|c(heme|ope|rolling)|ta(ndby|rt)|ize|ummary|pecified|e(ctionRowIndex|lected(Index)?)|rc)|h(space|t(tpEquiv|mlFor)|e(ight|aders)|ref(lang)?)|n(o(Resize|tation(s|Name)|Shade|Href|de(Name|Type|Value)|Wrap)|extSibling|ame)|c(h(ildNodes|Off|ecked|arset)?|ite|o(ntent|o(kie|rds)|de(Base|Type)?|l(s|Span|or)|mpact)|ell(s|Spacing|Padding)|l(ear|assName)|aption)|t(ype|Bodies|itle|Head|ext|a(rget|gName)|Foot)|i(sMap|ndex|d|m(plementation|ages))|o(ptions|wnerDocument|bject)|d(i(sabled|r)|o(c(type|umentElement)|main)|e(clare|f(er|ault(Selected|Checked|Value)))|at(eTime|a))|useMap|p(ublicId|arentNode|r(o(file|mpt)|eviousSibling))|e(n(ctype|tities)|vent|lements)|v(space|ersion|alue(Type)?|Link|Align)|URL|f(irstChild|orm(s)?|ace|rame(Border)?)|width|l(ink(s)?|o(ngDesc|wSrc)|a(stChild|ng|bel))|a(nchors|c(ce(ssKey|pt(Charset)?)|tion)|ttributes|pplets|l(t|ign)|r(chive|eas)|xis|Link|bbr)|r(ow(s|Span|Index)|ules|e(v|ferrer|l|adOnly))|m(ultiple|e(thod|dia)|a(rgin(Height|Width)|xLength))|b(o(dy|rder)|ackground|gColor))\b|([\s\S])/g,/\b(ELEMENT_NODE|ATTRIBUTE_NODE|TEXT_NODE|CDATA_SECTION_NODE|ENTITY_REFERENCE_NODE|ENTITY_NODE|PROCESSING_INSTRUCTION_NODE|COMMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE|DOCUMENT_FRAGMENT_NODE|NOTATION_NODE|INDEX_SIZE_ERR|DOMSTRING_SIZE_ERR|HIERARCHY_REQUEST_ERR|WRONG_DOCUMENT_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR|NOT_SUPPORTED_ERR|INUSE_ATTRIBUTE_ERR)\b|([\s\S])/g,/\bon(R(ow(s(inserted|delete)|e(nter|xit))|e(s(ize(start|end)?|et)|adystatechange))|Mouse(o(ut|ver)|down|up|move)|B(efore(cut|deactivate|u(nload|pdate)|p(aste|rint)|editfocus|activate)|lur)|S(croll|top|ubmit|elect(start|ionchange)?)|H(over|elp)|C(hange|ont(extmenu|rolselect)|ut|ellchange|l(ick|ose))|D(eactivate|ata(setc(hanged|omplete)|available)|r(op|ag(start|over|drop|en(ter|d)|leave)?)|blclick)|Unload|P(aste|ropertychange)|Error(update)?|Key(down|up|press)|Focus|Load|A(ctivate|fter(update|print)|bort))\b|([\s\S])/g,/\(|/g,/!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?:|\*=|\/=|%=|\+=|\-=|&=|\^=|\b(in|instanceof|new|delete|typeof|void)\b|([\s\S])/g,/!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?:|\*=|%=|\+=|\-=|&=|\^=|\b(in|instanceof|new|delete|typeof|void)\b|([\s\S])/g,/\b(Infinity|NaN|undefined)\b|([\s\S])/g,/[=\(:]|/g,/return|/g,/\s*(\/)((?![\/\*\+\{\}\?]))|([\s\S])/g,/,[ \|\t]*|([\s\S])/g,/\.|([\s\S])/g,/\{|\}|([\s\S])/g,/\(|\)|([\s\S])/g,/\[|\]|([\s\S])/g,/\\\)|\\\\|([\s\S])/g,/(?=,|\))|([\s\S])/g,/throws|([\s\S])/g,/\u00ac|([\s\S])/g,/\b((a )?(ref( to)|reference to)|(does not|doesn't) (come (before|after)|contain|equal)|(start|begin)s? with|comes (before|after)|is(n't| not)?( (in|contained by|(less than|greater than)( or equal( to)?)?|equal( to)?))?|ends? with|contains?|equals?|than|and|div|mod|not|or|as)\b|(\u2260|\u2265|\u2264|>=|<=|\u00f7|&|=|>|<|\*|\+|\-|\/|\^)|([\s\S])/g,/to|/g,/then|/g,/\s*\b(return|prop(erty)?)(\b)|([\s\S])/g,/[\(\)]|([\s\S])/g,/\b(on error|try|to|on|tell|if|then|else if|else|repeat( (while|until|with))?|using terms from|from|through|thru|with timeout|times|end (tell|repeat|if|timeout|using terms from|error|try)|end|my|where|whose|considering|ignoring|global|local|exit|continue|returning|set|copy|put)\b|([\s\S])/g,/\b(every|some|index|named|from|to|through|thru|before|(in )?front of|after receiving|after|(in )?back of|beginning of|end of|in|of|first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|\d+(st|nd|rd|th)|last|front|back|middle)\b|([\s\S])/g,/\b(all (caps|lowercase)|bold|condensed|expanded|hidden|italic|outline|plain|shadow|small caps|strikethrough|(sub|super)script|underline)\b|([\s\S])/g,/\b(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]|[yY][eE][sS]|[nN][oO])\b|([\s\S])/g,/\b(null)\b|([\s\S])/g,/\b(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?|weekdays?|Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\b|([\s\S])/g,/ignoring|/g,/considering|/g,/\b (application responses|current application|case|diacriticals|expansion|hyphens|punctuation|white space)\b|([\s\S])/g,/\b(space|return|tab)\b|([\s\S])/g,/\b(current application|it|me|version|result|pi|AppleScript)\b|([\s\S])/g,/\b(text item delimiters|print length|print depth)\b|([\s\S])/g,/\b(count (each|every)|number of|error|get|run)\b|([\s\S])/g,/\b(booleans?|integers?|reals?|numbers?|(linked )?lists?|vectors?|records?|items?|scripts?|events?|propert(y|ies)|constants?|prepositions?|reference forms?|handlers?|data|characters?|writing code( infos?)?|missing values?|references?|anything|missing value|upper case|app(lications?)?|text items?|((international|styled( Clipboard|Unicode)?|Unicode) )?text|(C | encoded| Pascal )?strings?|(type )?class(es)?|RGB colors?|pictures?|sounds?|versions?|file specifications?|alias(es)?|machines?|zones?|keystrokes?|seconds|dates?|months?|(cubic |square |cubic centi|square kilo|centi|kilo)met(er|re)s|(square |cubic )?(yards|feet)|(square )?miles|(cubic )?inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin))\b|([\s\S])/g,/\b\d+((\.(\d+\b)?)?(?:[eE]\+?\d*\b)?|\b)|([\s\S])/g,/set[ \t]|/g,/\s*([_a-zA-Z][_a-zA-Z0-9]*)(\s*(?=[ \t]+to))|([\s\S])/g,/\\\]|\\\\|([\s\S])/g,/(#\{)(([^\}]*)(\}))|([\s\S])/g,/&(?=\s*\$)|([\s\S])/g,/(array)(\s*(\())|([\s\S])/g,/\s*(:)|([\s\S])/g,/\b(self|cls)\b|([\s\S])/g,/^\s*(end)((?: (\3))?(\s*(?=\n)))|([\s\S])/g,/\b(above|against|apart from|around|aside from|at|below|beneath|beside|between|by|for|from|instead of|into|on|onto|out of|over|thru|under)(\s+(\w+)(\b))|([\s\S])/g,/\?>(?:\s*(?=\n)\n)?|([\s\S])/g,/\/|([\s\S])/g,/\\\/|([\s\S])/g,/(\{)|([\s\S])/g,/application |/g,/app |/g,/("|")|([\s\S])/g,/(\|)([^\|\n]*(\|))|([\s\S])/g,/(\u00ab)((data)( (utxt|utf8)(([0-9A-Fa-f]*)((\u00bb)((?: (as)( (Unicode text)))?)))))|([\s\S])/g,/(\->)((?:([A-Za-z_][A-Za-z_0-9]*)(\s*\()|((\$+)?([a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*)))?)|([\s\S])/g,/\b(__(?:abs|add|and|call|cmp|coerce|complex|contains|del|delattr|delete|delitem|delslice|div|divmod|enter|eq|exit|float|floordiv|ge|get|getattr|getattribute|getitem|getslice|gt|hash|hex|iadd|iand|idiv|ifloordiv|ilshift|imod|imul|init|int|invert|ior|ipow|irshift|isub|iter|itruediv|ixor|le|len|long|lshift|lt|mod|mul|ne|neg|new|nonzero|oct|or|pos|pow|radd|rand|rdiv|rdivmod|repr|rfloordiv|rlshift|rmod|rmul|ror|rpow|rrshift|rshift|rsub|rtruediv|rxor|set|setattr|setitem|setslice|str|sub|truediv|unicode|xor)__)\b|([\s\S])/g,/>[eimnosux]*|([\s\S])/g,/\.[a-zA-Z_][a-zA-Z_0-9]*\b(?!\s*\()|([\s\S])/g,/ (?:([\-_a-zA-Z0-9]+)((:)))?(([_a-zA-Z\-]+)(=))|([\s\S])/g,/^(MARKDOWN)((?=\n))|([\s\S])/g,/(<)(((?=([a-zA-Z0-9:]+))\4)((?=[^>]*><\/\3>)))|([\s\S])/g,/(<\?)(xml)|([\s\S])/g,/<!\-\-|([\s\S])/g,/<!|([\s\S])/g,/(?:^\s+)?(<)(((?:[sS][tT][yY][lL][eE]))(\b(?![^>]*\/>)))|([\s\S])/g,/(?:^\s+)?(<)(((?:[sS][cC][rR][iI][pP][tT]))(\b(?![^>]*\/>)))|([\s\S])/g,/(<\/?)((?:[bB][oO][dD][yY]|[hH][eE][aA][dD]|[hH][tT][mM][lL])\b)|([\s\S])/g,/(<\/?)((?:[aA][dD][dD][rR][eE][sS][sS]|[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE]|[dD][dD]|[dD][iI][vV]|[dD][lL]|[dD][tT]|[fF][iI][eE][lL][dD][sS][eE][tT]|[fF][oO][rR][mM]|[fF][rR][aA][mM][eE]|[fF][rR][aA][mM][eE][sS][eE][tT]|[hH]1|[hH]2|[hH]3|[hH]4|[hH]5|[hH]6|[iI][fF][rR][aA][mM][eE]|[nN][oO][fF][rR][aA][mM][eE][sS]|[oO][bB][jJ][eE][cC][tT]|[oO][lL]|[pP]|[uU][lL]|[aA][pP][pP][lL][eE][tT]|[cC][eE][nN][tT][eE][rR]|[dD][iI][rR]|[hH][rR]|[mM][eE][nN][uU]|[pP][rR][eE])\b)|([\s\S])/g,/(<\/?)((?:[aA]|[aA][bB][bB][rR]|[aA][cC][rR][oO][nN][yY][mM]|[aA][rR][eE][aA]|[bB]|[bB][aA][sS][eE]|[bB][aA][sS][eE][fF][oO][nN][tT]|[bB][dD][oO]|[bB][iI][gG]|[bB][rR]|[bB][uU][tT][tT][oO][nN]|[cC][aA][pP][tT][iI][oO][nN]|[cC][iI][tT][eE]|[cC][oO][dD][eE]|[cC][oO][lL]|[cC][oO][lL][gG][rR][oO][uU][pP]|[dD][eE][lL]|[dD][fF][nN]|[eE][mM]|[fF][oO][nN][tT]|[hH][eE][aA][dD]|[hH][tT][mM][lL]|[iI]|[iI][mM][gG]|[iI][nN][pP][uU][tT]|[iI][nN][sS]|[iI][sS][iI][nN][dD][eE][xX]|[kK][bB][dD]|[lL][aA][bB][eE][lL]|[lL][eE][gG][eE][nN][dD]|[lL][iI]|[lL][iI][nN][kK]|[mM][aA][pP]|[mM][eE][tT][aA]|[nN][oO][sS][cC][rR][iI][pP][tT]|[oO][pP][tT][gG][rR][oO][uU][pP]|[oO][pP][tT][iI][oO][nN]|[pP][aA][rR][aA][mM]|[qQ]|[sS]|[sS][aA][mM][pP]|[sS][cC][rR][iI][pP][tT]|[sS][eE][lL][eE][cC][tT]|[sS][mM][aA][lL][lL]|[sS][pP][aA][nN]|[sS][tT][rR][iI][kK][eE]|[sS][tT][rR][oO][nN][gG]|[sS][tT][yY][lL][eE]|[sS][uU][bB]|[sS][uU][pP]|[tT][aA][bB][lL][eE]|[tT][bB][oO][dD][yY]|[tT][dD]|[tT][eE][xX][tT][aA][rR][eE][aA]|[tT][fF][oO][oO][tT]|[tT][hH]|[tT][hH][eE][aA][dD]|[tT][iI][tT][lL][eE]|[tT][rR]|[tT][tT]|[uU]|[vV][aA][rR])\b)|([\s\S])/g,/(<\/?)([a-zA-Z0-9:]+)|([\s\S])/g,/<>|([\s\S])/g,/\\'|\\\\|([\s\S])/g,/(?=;;)|([\s\S])/g,/\\[\\'\[\]]|([\s\S])/g,/(?=\s*extends|(?=\n)|\{)|([\s\S])/g,/(?=\s*\b(?:([eE][xX][tT][eE][nN][dD][sS])))|(?=\n)|([\s\S])/g,/,\s*([a-zA-Z0-9_]+)(\s*)|([\s\S])/g,/(?=\)\s*:)|([\s\S])/g,/\b([a-zA-Z_][a-zA-Z_0-9]*)(\s*(?:(,)|(?=[\n\)])))|([\s\S])/g,/(?=\b(?:esac)\b)|([\s\S])/g,/^(JAVASCRIPT)((;?)((?=\n)\n?))|([\s\S])/g,/(\$)((_(COOKIE|FILES|GET|POST|REQUEST))\b)|([\s\S])/g,/\$|/g,/(#)((?!\{).*(?=\n)\n?)|([\s\S])/g,/((?: ?\/)?>)|([\s\S])/g,/(?=>)|([\s\S])/g,/"[^">]*"|([\s\S])/g,/(\-\-)(.*(?=\n)\n?)|([\s\S])/g,/\(\*|([\s\S])/g,/(\w*)(\s*(=))|([\s\S])/g,/\][eimnosux]*|([\s\S])/g,/(array)(\()|([\s\S])/g,/(?:\b([sS]([hH][uU][fF][fF][lL][eE]|[oO][rR][tT])|[nN]([eE][xX][tT]|[aA][tT]([sS][oO][rR][tT]|[cC][aA][sS][eE][sS][oO][rR][tT]))|[cC]([oO]([uU][nN][tT]|[mM][pP][aA][cC][tT])|[uU][rR][rR][eE][nN][tT])|[iI][nN]_[aA][rR][rR][aA][yY]|[uU]([sS][oO][rR][tT]|[kK][sS][oO][rR][tT]|[aA][sS][oO][rR][tT])|[pP][rR][eE][vV]|[eE]([nN][dD]|[xX][tT][rR][aA][cC][tT])|[kK]([sS][oO][rR][tT]|[eE][yY]|[rR][sS][oO][rR][tT])|[aA]([sS][oO][rR][tT]|[rR]([sS][oO][rR][tT]|[rR][aA][yY]_([sS]([hH][iI][fF][tT]|[uU][mM]|[pP][lL][iI][cC][eE]|[eE][aA][rR][cC][hH]|[lL][iI][cC][eE])|[cC]([hH]([uU][nN][kK]|[aA][nN][gG][eE]_[kK][eE][yY]_[cC][aA][sS][eE])|[oO]([uU][nN][tT]_[vV][aA][lL][uU][eE][sS]|[mM][bB][iI][nN][eE]))|[iI][nN][tT][eE][rR][sS][eE][cC][tT](_([uU]([kK][eE][yY]|[aA][sS][sS][oO][cC])|[kK][eE][yY]|[aA][sS][sS][oO][cC]))?|[dD][iI][fF][fF](_([uU]([kK][eE][yY]|[aA][sS][sS][oO][cC])|[kK][eE][yY]|[aA][sS][sS][oO][cC]))?|[uU]([nN]([sS][hH][iI][fF][tT]|[iI][qQ][uU][eE])|[iI][nN][tT][eE][rR][sS][eE][cC][tT](_([uU][aA][sS][sS][oO][cC]|[aA][sS][sS][oO][cC]))?|[dD][iI][fF][fF](_([uU][aA][sS][sS][oO][cC]|[aA][sS][sS][oO][cC]))?)|[pP]([oO][pP]|[uU][sS][hH]|[aA][dD]|[rR][oO][dD][uU][cC][tT])|[vV][aA][lL][uU][eE][sS]|[kK][eE][yY]([sS]|_[eE][xX][iI][sS][tT][sS])|[fF]([iI][lL]([tT][eE][rR]|[lL](_[kK][eE][yY][sS])?)|[lL][iI][pP])|[wW][aA][lL][kK](_[rR][eE][cC][uU][rR][sS][iI][vV][eE])?|[rR]([eE]([dD][uU][cC][eE]|[vV][eE][rR][sS][eE])|[aA][nN][dD])|[mM]([uU][lL][tT][iI][sS][oO][rR][tT]|[eE][rR][gG][eE](_[rR][eE][cC][uU][rR][sS][iI][vV][eE])?|[aA][pP]))))|[rR]([sS][oO][rR][tT]|[eE][sS][eE][tT]|[aA][nN][gG][eE])|[mM]([iI][nN]|[aA][xX]))(?=\s*\())|([\s\S])/g,/(?:\b[aA][sS][sS][eE][rR][tT](_[oO][pP][tT][iI][oO][nN][sS])?(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[aA][tT][tT][rR]_[iI][sS]_[iI][dD](?=\s*\())|([\s\S])/g,/(?:\b[bB][aA][sS][eE]64_([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE])(?=\s*\())|([\s\S])/g,/(?:\b([hH][iI][gG][hH][lL][iI][gG][hH][tT]_([sS][tT][rR][iI][nN][gG]|[fF][iI][lL][eE])|[sS]([yY][sS]_[gG][eE][tT][lL][oO][aA][dD][aA][vV][gG]|[eE][tT]_([iI][nN][cC][lL][uU][dD][eE]_[pP][aA][tT][hH]|[mM][aA][gG][iI][cC]_[qQ][uU][oO][tT][eE][sS]_[rR][uU][nN][tT][iI][mM][eE])|[lL][eE][eE][pP])|[cC]([oO][nN]([sS][tT][aA][nN][tT]|[nN][eE][cC][tT][iI][oO][nN]_([sS][tT][aA][tT][uU][sS]|[aA][bB][oO][rR][tT][eE][dD]))|[aA][lL][lL]_[uU][sS][eE][rR]_([fF][uU][nN][cC](_[aA][rR][rR][aA][yY])?|[mM][eE][tT][hH][oO][dD](_[aA][rR][rR][aA][yY])?))|[tT][iI][mM][eE]_([sS][lL][eE][eE][pP]_[uU][nN][tT][iI][lL]|[nN][aA][nN][oO][sS][lL][eE][eE][pP])|[iI]([sS]_[uU][pP][lL][oO][aA][dD][eE][dD]_[fF][iI][lL][eE]|[nN]([iI]_([sS][eE][tT]|[rR][eE][sS][tT][oO][rR][eE]|[gG][eE][tT](_[aA][lL][lL])?)|[eE][tT]_([nN][tT][oO][pP]|[pP][tT][oO][nN]))|[pP]2[lL][oO][nN][gG]|[gG][nN][oO][rR][eE]_[uU][sS][eE][rR]_[aA][bB][oO][rR][tT]|[mM][pP][oO][rR][tT]_[rR][eE][qQ][uU][eE][sS][tT]_[vV][aA][rR][iI][aA][bB][lL][eE][sS])|[uU]([sS][lL][eE][eE][pP]|[nN][rR][eE][gG][iI][sS][tT][eE][rR]_[tT][iI][cC][kK]_[fF][uU][nN][cC][tT][iI][oO][nN])|[eE][rR][rR][oO][rR]_([lL][oO][gG]|[gG][eE][tT]_[lL][aA][sS][tT])|[pP]([hH][pP]_[sS][tT][rR][iI][pP]_[wW][hH][iI][tT][eE][sS][pP][aA][cC][eE]|[uU][tT][eE][nN][vV]|[aA][rR][sS][eE]_[iI][nN][iI]_[fF][iI][lL][eE]|[rR][iI][nN][tT]_[rR])|[fF][lL][uU][sS][hH]|[lL][oO][nN][gG]2[iI][pP]|[rR][eE]([sS][tT][oO][rR][eE]_[iI][nN][cC][lL][uU][dD][eE]_[pP][aA][tT][hH]|[gG][iI][sS][tT][eE][rR]_([sS][hH][uU][tT][dD][oO][wW][nN]_[fF][uU][nN][cC][tT][iI][oO][nN]|[tT][iI][cC][kK]_[fF][uU][nN][cC][tT][iI][oO][nN]))|[gG][eE][tT]([sS][eE][rR][vV][bB][yY]([nN][aA][mM][eE]|[pP][oO][rR][tT])|[oO][pP][tT]|_([cC]([uU][rR][rR][eE][nN][tT]_[uU][sS][eE][rR]|[fF][gG]_[vV][aA][rR])|[iI][nN][cC][lL][uU][dD][eE]_[pP][aA][tT][hH]|[mM][aA][gG][iI][cC]_[qQ][uU][oO][tT][eE][sS]_([gG][pP][cC]|[rR][uU][nN][tT][iI][mM][eE]))|[pP][rR][oO][tT][oO][bB][yY][nN]([uU][mM][bB][eE][rR]|[aA][mM][eE])|[eE][nN][vV])|[mM][oO][vV][eE]_[uU][pP][lL][oO][aA][dD][eE][dD]_[fF][iI][lL][eE])(?=\s*\())|([\s\S])/g,/(?:\b[bB][cC]([sS]([cC][aA][lL][eE]|[uU][bB]|[qQ][rR][tT])|[cC][oO][mM][pP]|[dD][iI][vV]|[pP][oO][wW]([mM][oO][dD])?|[aA][dD][dD]|[mM]([oO][dD]|[uU][lL]))(?=\s*\())|([\s\S])/g,/(?:\b[bB][iI][rR][dD][sS][tT][eE][pP]_([cC]([oO]([nN][nN][eE][cC][tT]|[mM][mM][iI][tT])|[lL][oO][sS][eE])|[oO][fF][fF]_[aA][uU][tT][oO][cC][oO][mM][mM][iI][tT]|[eE][xX][eE][cC]|[fF]([iI][eE][lL][dD][nN]([uU][mM]|[aA][mM][eE])|[eE][tT][cC][hH]|[rR][eE][eE][rR][eE][sS][uU][lL][tT])|[aA][uU][tT][oO][cC][oO][mM][mM][iI][tT]|[rR]([oO][lL][lL][bB][aA][cC][kK]|[eE][sS][uU][lL][tT]))(?=\s*\())|([\s\S])/g,/(?:\b[gG][eE][tT]_[bB][rR][oO][wW][sS][eE][rR](?=\s*\())|([\s\S])/g,/(?:\b([sS]([tT][rR]([nN][cC]([aA][sS][eE][cC][mM][pP]|[mM][pP])|[cC]([aA][sS][eE][cC][mM][pP]|[mM][pP])|[lL][eE][nN])|[eE][tT]_[eE]([rR][rR][oO][rR]_[hH][aA][nN][dD][lL][eE][rR]|[xX][cC][eE][pP][tT][iI][oO][nN]_[hH][aA][nN][dD][lL][eE][rR]))|[cC]([lL][aA][sS][sS]_[eE][xX][iI][sS][tT][sS]|[rR][eE][aA][tT][eE]_[fF][uU][nN][cC][tT][iI][oO][nN])|[tT][rR][iI][gG][gG][eE][rR]_[eE][rR][rR][oO][rR]|[iI]([sS]_([sS][uU][bB][cC][lL][aA][sS][sS]_[oO][fF]|[aA])|[nN][tT][eE][rR][fF][aA][cC][eE]_[eE][xX][iI][sS][tT][sS])|[dD][eE]([fF][iI][nN][eE]([dD])?|[bB][uU][gG]_([pP][rR][iI][nN][tT]_[bB][aA][cC][kK][tT][rR][aA][cC][eE]|[bB][aA][cC][kK][tT][rR][aA][cC][eE]))|[zZ][eE][nN][dD]_[vV][eE][rR][sS][iI][oO][nN]|[pP][rR][oO][pP][eE][rR][tT][yY]_[eE][xX][iI][sS][tT][sS]|[eE]([aA][cC][hH]|[rR][rR][oO][rR]_[rR][eE][pP][oO][rR][tT][iI][nN][gG]|[xX][tT][eE][nN][sS][iI][oO][nN]_[lL][oO][aA][dD][eE][dD])|[fF][uU][nN][cC]([tT][iI][oO][nN]_[eE][xX][iI][sS][tT][sS]|_([nN][uU][mM]_[aA][rR][gG][sS]|[gG][eE][tT]_[aA][rR][gG]([sS])?))|[lL][eE][aA][kK]|[rR][eE][sS][tT][oO][rR][eE]_[eE]([rR][rR][oO][rR]_[hH][aA][nN][dD][lL][eE][rR]|[xX][cC][eE][pP][tT][iI][oO][nN]_[hH][aA][nN][dD][lL][eE][rR])|[gG][eE][tT]_([cC][lL][aA][sS][sS](_([vV][aA][rR][sS]|[mM][eE][tT][hH][oO][dD][sS]))?|[iI][nN][cC][lL][uU][dD][eE][dD]_[fF][iI][lL][eE][sS]|[dD][eE]([cC][lL][aA][rR][eE][dD]_([cC][lL][aA][sS][sS][eE][sS]|[iI][nN][tT][eE][rR][fF][aA][cC][eE][sS])|[fF][iI][nN][eE][dD]_([cC][oO][nN][sS][tT][aA][nN][tT][sS]|[vV][aA][rR][sS]|[fF][uU][nN][cC][tT][iI][oO][nN][sS]))|[oO][bB][jJ][eE][cC][tT]_[vV][aA][rR][sS]|[eE][xX][tT][eE][nN][sS][iI][oO][nN]_[fF][uU][nN][cC][sS]|[pP][aA][rR][eE][nN][tT]_[cC][lL][aA][sS][sS]|[lL][oO][aA][dD][eE][dD]_[eE][xX][tT][eE][nN][sS][iI][oO][nN][sS]|[rR][eE][sS][oO][uU][rR][cC][eE]_[tT][yY][pP][eE])|[mM][eE][tT][hH][oO][dD]_[eE][xX][iI][sS][tT][sS])(?=\s*\())|([\s\S])/g,/(?:\b[bB][zZ]([cC][oO][mM][pP][rR][eE][sS][sS]|[dD][eE][cC][oO][mM][pP][rR][eE][sS][sS]|[oO][pP][eE][nN]|[eE][rR][rR]([sS][tT][rR]|[nN][oO]|[oO][rR])|[rR][eE][aA][dD])(?=\s*\())|([\s\S])/g,/(?:\b([jJ][dD][tT][oO][uU][nN][iI][xX]|[uU][nN][iI][xX][tT][oO][jJ][dD])(?=\s*\())|([\s\S])/g,/(?:\b([cC][aA][lL]_([tT][oO]_[jJ][dD]|[iI][nN][fF][oO]|[dD][aA][yY][sS]_[iI][nN]_[mM][oO][nN][tT][hH]|[fF][rR][oO][mM]_[jJ][dD])|[jJ]([dD]([tT][oO]([jJ]([uU][lL][iI][aA][nN]|[eE][wW][iI][sS][hH])|[fF][rR][eE][nN][cC][hH]|[gG][rR][eE][gG][oO][rR][iI][aA][nN])|[dD][aA][yY][oO][fF][wW][eE][eE][kK]|[mM][oO][nN][tT][hH][nN][aA][mM][eE])|[uU][lL][iI][aA][nN][tT][oO][jJ][dD]|[eE][wW][iI][sS][hH][tT][oO][jJ][dD])|[fF][rR][eE][nN][cC][hH][tT][oO][jJ][dD]|[gG][rR][eE][gG][oO][rR][iI][aA][nN][tT][oO][jJ][dD])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[cC][hH][aA][rR][aA][cC][tT][eE][rR][dD][aA][tT][aA]_([sS][uU][bB][sS][tT][rR][iI][nN][gG]_[dD][aA][tT][aA]|[iI][nN][sS][eE][rR][tT]_[dD][aA][tT][aA]|[dD][eE][lL][eE][tT][eE]_[dD][aA][tT][aA]|[aA][pP][pP][eE][nN][dD]_[dD][aA][tT][aA]|[rR][eE][pP][lL][aA][cC][eE]_[dD][aA][tT][aA])(?=\s*\())|([\s\S])/g,/(?:\b[cC][oO][mM]_([cC][rR][eE][aA][tT][eE]_[gG][uU][iI][dD]|[pP][rR][iI][nN][tT]_[tT][yY][pP][eE][iI][nN][fF][oO]|[eE][vV][eE][nN][tT]_[sS][iI][nN][kK]|[lL][oO][aA][dD]_[tT][yY][pP][eE][lL][iI][bB]|[gG][eE][tT]_[aA][cC][tT][iI][vV][eE]_[oO][bB][jJ][eE][cC][tT]|[mM][eE][sS][sS][aA][gG][eE]_[pP][uU][mM][pP])(?=\s*\())|([\s\S])/g,/(?:\b[vV][aA][rR][iI][aA][nN][tT]_([sS]([uU][bB]|[eE][tT](_[tT][yY][pP][eE])?)|[nN]([oO][tT]|[eE][gG])|[cC]([aA]([sS][tT]|[tT])|[mM][pP])|[iI]([nN][tT]|[dD][iI][vV]|[mM][pP])|[oO][rR]|[dD]([iI][vV]|[aA][tT][eE]_([tT][oO]_[tT][iI][mM][eE][sS][tT][aA][mM][pP]|[fF][rR][oO][mM]_[tT][iI][mM][eE][sS][tT][aA][mM][pP]))|[pP][oO][wW]|[eE][qQ][vV]|[fF][iI][xX]|[aA]([nN][dD]|[dD][dD]|[bB][sS])|[gG][eE][tT]_[tT][yY][pP][eE]|[rR][oO][uU][nN][dD]|[xX][oO][rR]|[mM]([oO][dD]|[uU][lL]))(?=\s*\())|([\s\S])/g,/(?:\b[cC][rR][cC]32(?=\s*\())|([\s\S])/g,/(?:\b[cC][rR][yY][pP][tT](?=\s*\())|([\s\S])/g,/(?:\b[cC][tT][yY][pP][eE]_([sS][pP][aA][cC][eE]|[cC][nN][tT][rR][lL]|[dD][iI][gG][iI][tT]|[uU][pP][pP][eE][rR]|[pP]([uU][nN][cC][tT]|[rR][iI][nN][tT])|[lL][oO][wW][eE][rR]|[aA][lL]([nN][uU][mM]|[pP][hH][aA])|[gG][rR][aA][pP][hH]|[xX][dD][iI][gG][iI][tT])(?=\s*\())|([\s\S])/g,/(?:\b[cC][oO][nN][vV][eE][rR][tT]_[cC][yY][rR]_[sS][tT][rR][iI][nN][gG](?=\s*\())|([\s\S])/g,/(?:\b[sS][tT][rR][pP][tT][iI][mM][eE](?=\s*\())|([\s\S])/g,/(?:\b[dD][bB][aA]_([hH][aA][nN][dD][lL][eE][rR][sS]|[sS][yY][nN][cC]|[nN][eE][xX][tT][kK][eE][yY]|[cC][lL][oO][sS][eE]|[iI][nN][sS][eE][rR][tT]|[dD][eE][lL][eE][tT][eE]|[oO][pP]([tT][iI][mM][iI][zZ][eE]|[eE][nN])|[eE][xX][iI][sS][tT][sS]|[pP][oO][pP][eE][nN]|[kK][eE][yY]_[sS][pP][lL][iI][tT]|[fF]([iI][rR][sS][tT][kK][eE][yY]|[eE][tT][cC][hH])|[lL][iI][sS][tT]|[rR][eE][pP][lL][aA][cC][eE])(?=\s*\())|([\s\S])/g,/(?:\b[dD][bB][aA][sS][eE]_([nN][uU][mM]([fF][iI][eE][lL][dD][sS]|[rR][eE][cC][oO][rR][dD][sS])|[cC]([lL][oO][sS][eE]|[rR][eE][aA][tT][eE])|[dD][eE][lL][eE][tT][eE]_[rR][eE][cC][oO][rR][dD]|[oO][pP][eE][nN]|[pP][aA][cC][kK]|[aA][dD][dD]_[rR][eE][cC][oO][rR][dD]|[gG][eE][tT]_([hH][eE][aA][dD][eE][rR]_[iI][nN][fF][oO]|[rR][eE][cC][oO][rR][dD](_[wW][iI][tT][hH]_[nN][aA][mM][eE][sS])?)|[rR][eE][pP][lL][aA][cC][eE]_[rR][eE][cC][oO][rR][dD])(?=\s*\())|([\s\S])/g,/(?:\b([sS][cC][aA][nN][dD][iI][rR]|[cC]([hH]([dD][iI][rR]|[rR][oO][oO][tT])|[lL][oO][sS][eE][dD][iI][rR])|[dD][iI][rR]|[oO][pP][eE][nN][dD][iI][rR]|[rR][eE]([aA][dD][dD][iI][rR]|[wW][iI][nN][dD][dD][iI][rR])|[gG]([eE][tT][cC][wW][dD]|[lL][oO][bB]))(?=\s*\())|([\s\S])/g,/(?:\b[dD][lL](?=\s*\())|([\s\S])/g,/(?:\b([dD][nN][sS]_([cC][hH][eE][cC][kK]_[rR][eE][cC][oO][rR][dD]|[gG][eE][tT]_([rR][eE][cC][oO][rR][dD]|[mM][xX]))|[gG][eE][tT][hH][oO][sS][tT][bB][yY]([nN][aA][mM][eE]([lL])?|[aA][dD][dD][rR]))(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][cC][uU][mM][eE][nN][tT]_([sS]([cC][hH][eE][mM][aA]_[vV][aA][lL][iI][dD][aA][tT][eE](_[fF][iI][lL][eE])?|[aA][vV][eE](_[hH][tT][mM][lL](_[fF][iI][lL][eE])?|[xX][mM][lL])?)|[nN][oO][rR][mM][aA][lL][iI][zZ][eE]_[dD][oO][cC][uU][mM][eE][nN][tT]|[cC][rR][eE][aA][tT][eE]_([cC]([dD][aA][tT][aA][sS][eE][cC][tT][iI][oO][nN]|[oO][mM][mM][eE][nN][tT])|[tT][eE][xX][tT]_[nN][oO][dD][eE]|[dD][oO][cC][uU][mM][eE][nN][tT]_[fF][rR][aA][gG][mM][eE][nN][tT]|[pP][rR][oO][cC][eE][sS][sS][iI][nN][gG]_[iI][nN][sS][tT][rR][uU][cC][tT][iI][oO][nN]|[eE]([nN][tT][iI][tT][yY]_[rR][eE][fF][eE][rR][eE][nN][cC][eE]|[lL][eE][mM][eE][nN][tT](_[nN][sS])?)|[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN][sS])?)|[iI][mM][pP][oO][rR][tT]_[nN][oO][dD][eE]|[vV][aA][lL][iI][dD][aA][tT][eE]|[lL][oO][aA][dD](_[hH][tT][mM][lL](_[fF][iI][lL][eE])?|[xX][mM][lL])?|[aA][dD][oO][pP][tT]_[nN][oO][dD][eE]|[rR][eE]([nN][aA][mM][eE]_[nN][oO][dD][eE]|[lL][aA][xX][nN][gG]_[vV][aA][lL][iI][dD][aA][tT][eE]_([fF][iI][lL][eE]|[xX][mM][lL]))|[gG][eE][tT]_[eE][lL][eE][mM][eE][nN][tT]([sS]_[bB][yY]_[tT][aA][gG]_[nN][aA][mM][eE](_[nN][sS])?|_[bB][yY]_[iI][dD])|[xX][iI][nN][cC][lL][uU][dD][eE])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][mM][cC][oO][nN][fF][iI][gG][uU][rR][aA][tT][iI][oO][nN]_([sS][eE][tT]_[pP][aA][rR][aA][mM][eE][tT][eE][rR]|[cC][aA][nN]_[sS][eE][tT]_[pP][aA][rR][aA][mM][eE][tT][eE][rR]|[gG][eE][tT]_[pP][aA][rR][aA][mM][eE][tT][eE][rR])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][mM][eE][rR][rR][oO][rR][hH][aA][nN][dD][lL][eE][rR]_[hH][aA][nN][dD][lL][eE]_[eE][rR][rR][oO][rR](?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][mM][iI][mM][pP][lL][eE][mM][eE][nN][tT][aA][tT][iI][oO][nN]_([hH][aA][sS]_[fF][eE][aA][tT][uU][rR][eE]|[cC][rR][eE][aA][tT][eE]_[dD][oO][cC][uU][mM][eE][nN][tT](_[tT][yY][pP][eE])?|[gG][eE][tT]_[fF][eE][aA][tT][uU][rR][eE])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][mM][iI][mM][pP][lL][eE][mM][eE][nN][tT][aA][tT][iI][oO][nN][lL][iI][sS][tT]_[iI][tT][eE][mM](?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][mM][iI][mM][pP][lL][eE][mM][eE][nN][tT][aA][tT][iI][oO][nN][sS][oO][uU][rR][cC][eE]_[gG][eE][tT]_[dD][oO][mM][iI][mM][pP][lL][eE][mM][eE][nN][tT][aA][tT][iI][oO][nN]([sS])?(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[dD][oO][mM][sS][tT][rR][iI][nN][gG][lL][iI][sS][tT]_[iI][tT][eE][mM](?=\s*\())|([\s\S])/g,/(?:\b[eE][aA][sS][tT][eE][rR]_[dD][aA]([yY][sS]|[tT][eE])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[eE][lL][eE][mM][eE][nN][tT]_([hH][aA][sS]_[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN][sS])?|[sS][eE][tT]_([iI][dD]_[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN]([sS]|[oO][dD][eE]))?|[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN]([sS]|[oO][dD][eE](_[nN][sS])?))?)|[rR][eE][mM][oO][vV][eE]_[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN]([sS]|[oO][dD][eE]))?|[gG][eE][tT]_([eE][lL][eE][mM][eE][nN][tT][sS]_[bB][yY]_[tT][aA][gG]_[nN][aA][mM][eE](_[nN][sS])?|[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN]([sS]|[oO][dD][eE](_[nN][sS])?))?))(?=\s*\())|([\s\S])/g,/(?:\b([sS]([hH][eE][lL][lL]_[eE][xX][eE][cC]|[yY][sS][tT][eE][mM])|[pP]([aA][sS][sS][tT][hH][rR][uU]|[rR][oO][cC]_[nN][iI][cC][eE])|[eE]([sS][cC][aA][pP][eE][sS][hH][eE][lL][lL]([cC][mM][dD]|[aA][rR][gG])|[xX][eE][cC]))(?=\s*\())|([\s\S])/g,/(?:\b[eE][xX][iI][fF]_([iI][mM][aA][gG][eE][tT][yY][pP][eE]|[tT]([hH][uU][mM][bB][nN][aA][iI][lL]|[aA][gG][nN][aA][mM][eE])|[rR][eE][aA][dD]_[dD][aA][tT][aA])(?=\s*\())|([\s\S])/g,/(?:\b[fF][dD][fF]_([hH][eE][aA][dD][eE][rR]|[sS]([eE][tT]_([sS]([tT][aA][tT][uU][sS]|[uU][bB][mM][iI][tT]_[fF][oO][rR][mM]_[aA][cC][tT][iI][oO][nN])|[tT][aA][rR][gG][eE][tT]_[fF][rR][aA][mM][eE]|[oO]([nN]_[iI][mM][pP][oO][rR][tT]_[jJ][aA][vV][aA][sS][cC][rR][iI][pP][tT]|[pP][tT])|[jJ][aA][vV][aA][sS][cC][rR][iI][pP][tT]_[aA][cC][tT][iI][oO][nN]|[eE][nN][cC][oO][dD][iI][nN][gG]|[vV]([eE][rR][sS][iI][oO][nN]|[aA][lL][uU][eE])|[fF]([iI][lL][eE]|[lL][aA][gG][sS])|[aA][pP])|[aA][vV][eE](_[sS][tT][rR][iI][nN][gG])?)|[nN][eE][xX][tT]_[fF][iI][eE][lL][dD]_[nN][aA][mM][eE]|[cC]([lL][oO][sS][eE]|[rR][eE][aA][tT][eE])|[oO][pP][eE][nN](_[sS][tT][rR][iI][nN][gG])?|[eE]([nN][uU][mM]_[vV][aA][lL][uU][eE][sS]|[rR][rR]([nN][oO]|[oO][rR]))|[aA][dD][dD]_([tT][eE][mM][pP][lL][aA][tT][eE]|[dD][oO][cC]_[jJ][aA][vV][aA][sS][cC][rR][iI][pP][tT])|[rR][eE][mM][oO][vV][eE]_[iI][tT][eE][mM]|[gG][eE][tT]_([sS][tT][aA][tT][uU][sS]|[oO][pP][tT]|[eE][nN][cC][oO][dD][iI][nN][gG]|[vV]([eE][rR][sS][iI][oO][nN]|[aA][lL][uU][eE])|[fF]([iI][lL][eE]|[lL][aA][gG][sS])|[aA]([tT][tT][aA][cC][hH][mM][eE][nN][tT]|[pP])))(?=\s*\())|([\s\S])/g,/(?:\b([sS][yY][sS]_[gG][eE][tT]_[tT][eE][mM][pP]_[dD][iI][rR]|[cC][oO][pP][yY]|[tT]([eE][mM][pP][nN][aA][mM]|[mM][pP][fF][iI][lL][eE])|[uU]([nN][lL][iI][nN][kK]|[mM][aA][sS][kK])|[pP]([cC][lL][oO][sS][eE]|[oO][pP][eE][nN])|[fF]([sS]([cC][aA][nN][fF]|[tT][aA][tT]|[eE][eE][kK])|[nN][mM][aA][tT][cC][hH]|[cC][lL][oO][sS][eE]|[tT]([eE][lL][lL]|[rR][uU][nN][cC][aA][tT][eE])|[iI][lL][eE](_([pP][uU][tT]_[cC][oO][nN][tT][eE][nN][tT][sS]|[gG][eE][tT]_[cC][oO][nN][tT][eE][nN][tT][sS]))?|[oO][pP][eE][nN]|[pP]([uU][tT][cC][sS][vV]|[aA][sS][sS][tT][hH][rR][uU])|[eE][oO][fF]|[fF][lL][uU][sS][hH]|[wW][rR][iI][tT][eE]|[lL][oO][cC][kK]|[rR][eE][aA][dD]|[gG][eE][tT]([sS]([sS])?|[cC]([sS][vV])?))|[rR]([eE]([nN][aA][mM][eE]|[aA]([dD][fF][iI][lL][eE]|[lL][pP][aA][tT][hH])|[wW][iI][nN][dD])|[mM][dD][iI][rR])|[gG][eE][tT]_[mM][eE][tT][aA]_[tT][aA][gG][sS]|[mM][kK][dD][iI][rR])(?=\s*\())|([\s\S])/g,/(?:\b([sS][tT][aA][tT]|[cC]([hH]([oO][wW][nN]|[gG][rR][pP]|[mM][oO][dD])|[lL][eE][aA][rR][sS][tT][aA][tT][cC][aA][cC][hH][eE])|[iI][sS]_([dD][iI][rR]|[eE][xX][eE][cC][uU][tT][aA][bB][lL][eE]|[fF][iI][lL][eE]|[lL][iI][nN][kK]|[wW][rR][iI][tT][aA][bB][lL][eE]|[rR][eE][aA][dD][aA][bB][lL][eE])|[tT][oO][uU][cC][hH]|[dD][iI][sS][kK]_([tT][oO][tT][aA][lL]_[sS][pP][aA][cC][eE]|[fF][rR][eE][eE]_[sS][pP][aA][cC][eE])|[fF][iI][lL][eE]([sS][iI][zZ][eE]|[cC][tT][iI][mM][eE]|[tT][yY][pP][eE]|[iI][nN][oO][dD][eE]|[oO][wW][nN][eE][rR]|_[eE][xX][iI][sS][tT][sS]|[pP][eE][rR][mM][sS]|[aA][tT][iI][mM][eE]|[gG][rR][oO][uU][pP]|[mM][tT][iI][mM][eE])|[lL]([sS][tT][aA][tT]|[cC][hH][gG][rR][pP]))(?=\s*\())|([\s\S])/g,/(?:\b[fF][iI][lL][tT][eE][rR]_([hH][aA][sS]_[vV][aA][rR]|[iI][nN][pP][uU][tT](_[aA][rR][rR][aA][yY])?|[vV][aA][rR](_[aA][rR][rR][aA][yY])?)(?=\s*\())|([\s\S])/g,/(?:\b([sS][pP][rR][iI][nN][tT][fF]|[pP][rR][iI][nN][tT][fF]|[vV]([sS][pP][rR][iI][nN][tT][fF]|[pP][rR][iI][nN][tT][fF]|[fF][pP][rR][iI][nN][tT][fF])|[fF][pP][rR][iI][nN][tT][fF])(?=\s*\())|([\s\S])/g,/(?:\b([pP][fF][sS][oO][cC][kK][oO][pP][eE][nN]|[fF][sS][oO][cC][kK][oO][pP][eE][nN])(?=\s*\())|([\s\S])/g,/(?:\b[fF][tT][oO][kK](?=\s*\())|([\s\S])/g,/(?:\b([iI][mM][aA][gG][eE]([sS]([yY]|[tT][rR][iI][nN][gG]([uU][pP])?|[eE][tT]([sS][tT][yY][lL][eE]|[tT]([hH][iI][cC][kK][nN][eE][sS][sS]|[iI][lL][eE])|[pP][iI][xX][eE][lL]|[bB][rR][uU][sS][hH])|[aA][vV][eE][aA][lL][pP][hH][aA]|[xX])|[cC]([hH][aA][rR]([uU][pP])?|[oO]([nN][vV][oO][lL][uU][tT][iI][oO][nN]|[pP][yY]([rR][eE][sS]([iI][zZ][eE][dD]|[aA][mM][pP][lL][eE][dD])|[mM][eE][rR][gG][eE]([gG][rR][aA][yY])?)?|[lL][oO][rR]([sS]([tT][oO][tT][aA][lL]|[eE][tT]|[fF][oO][rR][iI][nN][dD][eE][xX])|[cC][lL][oO][sS][eE][sS][tT]([hH][wW][bB]|[aA][lL][pP][hH][aA])?|[tT][rR][aA][nN][sS][pP][aA][rR][eE][nN][tT]|[dD][eE][aA][lL][lL][oO][cC][aA][tT][eE]|[eE][xX][aA][cC][tT]([aA][lL][pP][hH][aA])?|[aA]([tT]|[lL][lL][oO][cC][aA][tT][eE]([aA][lL][pP][hH][aA])?)|[rR][eE][sS][oO][lL][vV][eE]([aA][lL][pP][hH][aA])?|[mM][aA][tT][cC][hH]))|[rR][eE][aA][tT][eE]([tT][rR][uU][eE][cC][oO][lL][oO][rR]|[fF][rR][oO][mM]([sS][tT][rR][iI][nN][gG]|[jJ][pP][eE][gG]|[pP][nN][gG]|[wW][bB][mM][pP]|[gG]([iI][fF]|[dD](2([pP][aA][rR][tT])?)?)|[xX]([pP][mM]|[bB][mM])))?)|2[wW][bB][mM][pP]|[tT]([yY][pP][eE][sS]|[tT][fF]([tT][eE][xX][tT]|[bB][bB][oO][xX])|[rR][uU][eE][cC][oO][lL][oO][rR][tT][oO][pP][aA][lL][eE][tT][tT][eE])|[iI]([sS][tT][rR][uU][eE][cC][oO][lL][oO][rR]|[nN][tT][eE][rR][lL][aA][cC][eE])|[dD]([eE][sS][tT][rR][oO][yY]|[aA][sS][hH][eE][dD][lL][iI][nN][eE])|[jJ][pP][eE][gG]|[eE][lL][lL][iI][pP][sS][eE]|[pP]([sS]([sS][lL][aA][nN][tT][fF][oO][nN][tT]|[cC][oO][pP][yY][fF][oO][nN][tT]|[tT][eE][xX][tT]|[eE]([nN][cC][oO][dD][eE][fF][oO][nN][tT]|[xX][tT][eE][nN][dD][fF][oO][nN][tT])|[fF][rR][eE][eE][fF][oO][nN][tT]|[lL][oO][aA][dD][fF][oO][nN][tT]|[bB][bB][oO][xX])|[nN][gG]|[oO][lL][yY][gG][oO][nN]|[aA][lL][eE][tT][tT][eE][cC][oO][pP][yY])|[fF]([tT]([tT][eE][xX][tT]|[bB][bB][oO][xX])|[iI][lL]([tT][eE][rR]|[lL]([tT][oO][bB][oO][rR][dD][eE][rR]|[eE][dD]([pP][oO][lL][yY][gG][oO][nN]|[eE][lL][lL][iI][pP][sS][eE]|[aA][rR][cC]|[rR][eE][cC][tT][aA][nN][gG][lL][eE]))?)|[oO][nN][tT]([hH][eE][iI][gG][hH][tT]|[wW][iI][dD][tT][hH]))|[wW][bB][mM][pP]|[aA]([nN][tT][iI][aA][lL][iI][aA][sS]|[lL][pP][hH][aA][bB][lL][eE][nN][dD][iI][nN][gG]|[rR][cC])|[lL]([iI][nN][eE]|[oO][aA][dD][fF][oO][nN][tT]|[aA][yY][eE][rR][eE][fF][fF][eE][cC][tT])|[rR]([oO][tT][aA][tT][eE]|[eE][cC][tT][aA][nN][gG][lL][eE])|[gG]([iI][fF]|[dD](2)?|[aA][mM][mM][aA][cC][oO][rR][rR][eE][cC][tT]|[rR][aA][bB]([sS][cC][rR][eE][eE][nN]|[wW][iI][nN][dD][oO][wW]))|[xX][bB][mM])|[jJ][pP][eE][gG]2[wW][bB][mM][pP]|[pP][nN][gG]2[wW][bB][mM][pP]|[gG][dD]_[iI][nN][fF][oO])(?=\s*\())|([\s\S])/g,/(?:\b([nN][gG][eE][tT][tT][eE][xX][tT]|[tT][eE][xX][tT][dD][oO][mM][aA][iI][nN]|[dD]([nN][gG][eE][tT][tT][eE][xX][tT]|[cC]([nN][gG][eE][tT][tT][eE][xX][tT]|[gG][eE][tT][tT][eE][xX][tT])|[gG][eE][tT][tT][eE][xX][tT])|[gG][eE][tT][tT][eE][xX][tT]|[bB][iI][nN][dD]([tT][eE][xX][tT][dD][oO][mM][aA][iI][nN]|_[tT][eE][xX][tT][dD][oO][mM][aA][iI][nN]_[cC][oO][dD][eE][sS][eE][tT]))(?=\s*\())|([\s\S])/g,/(?:\b[gG][mM][pP]_([hH][aA][mM][dD][iI][sS][tT]|[sS]([cC][aA][nN](1|0)|[iI][gG][nN]|[tT][rR][vV][aA][lL]|[uU][bB]|[eE][tT][bB][iI][tT]|[qQ][rR][tT]([rR][eE][mM])?)|[cC]([oO][mM]|[lL][rR][bB][iI][tT]|[mM][pP])|[nN][eE]([gG]|[xX][tT][pP][rR][iI][mM][eE])|[iI][nN]([tT][vV][aA][lL]|[iI][tT]|[vV][eE][rR][tT])|[oO][rR]|[dD][iI][vV](_([qQ]([rR])?|[rR])|[eE][xX][aA][cC][tT])|[jJ][aA][cC][oO][bB][iI]|[pP]([oO]([pP][cC][oO][uU][nN][tT]|[wW]([mM])?)|[eE][rR][fF][eE][cC][tT]_[sS][qQ][uU][aA][rR][eE]|[rR][oO][bB]_[pP][rR][iI][mM][eE])|[fF][aA][cC][tT]|[lL][eE][gG][eE][nN][dD][rR][eE]|[aA]([nN][dD]|[dD][dD]|[bB][sS])|[rR][aA][nN][dD][oO][mM]|[gG][cC][dD]([eE][xX][tT])?|[xX][oO][rR]|[mM]([oO][dD]|[uU][lL]))(?=\s*\())|([\s\S])/g,/(?:\b[hH][aA][sS][hH](_([hH][mM][aA][cC](_[fF][iI][lL][eE])?|[iI][nN][iI][tT]|[uU][pP][dD][aA][tT][eE](_([sS][tT][rR][eE][aA][mM]|[fF][iI][lL][eE]))?|[fF][iI]([nN][aA][lL]|[lL][eE])|[aA][lL][gG][oO][sS]))?(?=\s*\())|([\s\S])/g,/(?:\b[mM][dD]5(_[fF][iI][lL][eE])?(?=\s*\())|([\s\S])/g,/(?:\b[sS][hH][aA]1(_[fF][iI][lL][eE])?(?=\s*\())|([\s\S])/g,/(?:\b([sS][eE][tT]([cC][oO][oO][kK][iI][eE]|[rR][aA][wW][cC][oO][oO][kK][iI][eE])|[hH][eE][aA][dD][eE][rR]([sS]_([sS][eE][nN][tT]|[lL][iI][sS][tT]))?)(?=\s*\())|([\s\S])/g,/(?:\b([hH][tT][mM][lL]([sS][pP][eE][cC][iI][aA][lL][cC][hH][aA][rR][sS](_[dD][eE][cC][oO][dD][eE])?|_[eE][nN][tT][iI][tT][yY]_[dD][eE][cC][oO][dD][eE]|[eE][nN][tT][iI][tT][iI][eE][sS])|[gG][eE][tT]_[hH][tT][mM][lL]_[tT][rR][aA][nN][sS][lL][aA][tT][iI][oO][nN]_[tT][aA][bB][lL][eE])(?=\s*\())|([\s\S])/g,/(?:\b[hH][tT][tT][pP]_[bB][uU][iI][lL][dD]_[qQ][uU][eE][rR][yY](?=\s*\())|([\s\S])/g,/(?:\b[iI][bB][aA][sS][eE]_[bB][lL][oO][bB]_([cC]([aA][nN][cC][eE][lL]|[lL][oO][sS][eE]|[rR][eE][aA][tT][eE])|[iI]([nN][fF][oO]|[mM][pP][oO][rR][tT])|[oO][pP][eE][nN]|[eE][cC][hH][oO]|[aA][dD][dD]|[gG][eE][tT])(?=\s*\())|([\s\S])/g,/(?:\b[iI][bB][aA][sS][eE]_([sS][eE][tT]_[eE][vV][eE][nN][tT]_[hH][aA][nN][dD][lL][eE][rR]|[fF][rR][eE][eE]_[eE][vV][eE][nN][tT]_[hH][aA][nN][dD][lL][eE][rR]|[wW][aA][iI][tT]_[eE][vV][eE][nN][tT])(?=\s*\())|([\s\S])/g,/(?:\b[iI][bB][aA][sS][eE]_([nN]([uU][mM]_([pP][aA][rR][aA][mM][sS]|[fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[aA][mM][eE]_[rR][eE][sS][uU][lL][tT])|[eE][xX][eE][cC][uU][tT][eE]|[pP]([aA][rR][aA][mM]_[iI][nN][fF][oO]|[rR][eE][pP][aA][rR][eE])|[fF]([iI][eE][lL][dD]_[iI][nN][fF][oO]|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[aA][sS][sS][oO][cC]|[rR][oO][wW])|[rR][eE][eE]_([qQ][uU][eE][rR][yY]|[rR][eE][sS][uU][lL][tT]))|[qQ][uU][eE][rR][yY]|[aA][fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS])(?=\s*\())|([\s\S])/g,/(?:\b[iI][bB][aA][sS][eE]_([sS][eE][rR][vV]([iI][cC][eE]_([dD][eE][tT][aA][cC][hH]|[aA][tT][tT][aA][cC][hH])|[eE][rR]_[iI][nN][fF][oO])|[dD]([eE][lL][eE][tT][eE]_[uU][sS][eE][rR]|[bB]_[iI][nN][fF][oO])|[aA][dD][dD]_[uU][sS][eE][rR]|[rR][eE][sS][tT][oO][rR][eE]|[bB][aA][cC][kK][uU][pP]|[mM]([oO][dD][iI][fF][yY]_[uU][sS][eE][rR]|[aA][iI][nN][tT][aA][iI][nN]_[dD][bB]))(?=\s*\())|([\s\S])/g,/(?:\b([iI][cC][oO][nN][vV](_([sS]([tT][rR]([pP][oO][sS]|[lL][eE][nN]|[rR][pP][oO][sS])|[uU][bB][sS][tT][rR]|[eE][tT]_[eE][nN][cC][oO][dD][iI][nN][gG])|[gG][eE][tT]_[eE][nN][cC][oO][dD][iI][nN][gG]|[mM][iI][mM][eE]_([dD][eE][cC][oO][dD][eE](_[hH][eE][aA][dD][eE][rR][sS])?|[eE][nN][cC][oO][dD][eE])))?|[oO][bB]_[iI][cC][oO][nN][vV]_[hH][aA][nN][dD][lL][eE][rR])(?=\s*\())|([\s\S])/g,/(?:\b([iI][mM][aA][gG][eE]_[tT][yY][pP][eE]_[tT][oO]_([eE][xX][tT][eE][nN][sS][iI][oO][nN]|[mM][iI][mM][eE]_[tT][yY][pP][eE])|[gG][eE][tT][iI][mM][aA][gG][eE][sS][iI][zZ][eE])(?=\s*\())|([\s\S])/g,/(?:\b([zZ][eE][nN][dD]_[lL][oO][gG][oO]_[gG][uU][iI][dD]|[pP][hH][pP]([cC][rR][eE][dD][iI][tT][sS]|[iI][nN][fF][oO]|_([sS][aA][pP][iI]_[nN][aA][mM][eE]|[iI][nN][iI]_[sS][cC][aA][nN][nN][eE][dD]_[fF][iI][lL][eE][sS]|[uU][nN][aA][mM][eE]|[eE][gG][gG]_[lL][oO][gG][oO]_[gG][uU][iI][dD]|[lL][oO][gG][oO]_[gG][uU][iI][dD]|[rR][eE][aA][lL]_[lL][oO][gG][oO]_[gG][uU][iI][dD])|[vV][eE][rR][sS][iI][oO][nN]))(?=\s*\())|([\s\S])/g,/(?:\b[iI][bB][aA][sS][eE]_([cC]([oO]([nN][nN][eE][cC][tT]|[mM][mM][iI][tT](_[rR][eE][tT])?)|[lL][oO][sS][eE])|[tT][rR][aA][nN][sS]|[dD][rR][oO][pP]_[dD][bB]|[pP][cC][oO][nN][nN][eE][cC][tT]|[eE][rR][rR]([cC][oO][dD][eE]|[mM][sS][gG])|[gG][eE][nN]_[iI][dD]|[rR][oO][lL][lL][bB][aA][cC][kK](_[rR][eE][tT])?)(?=\s*\())|([\s\S])/g,/(?:\b[cC][uU][rR][lL]_([sS][eE][tT][oO][pP][tT](_[aA][rR][rR][aA][yY])?|[cC]([oO][pP][yY]_[hH][aA][nN][dD][lL][eE]|[lL][oO][sS][eE])|[iI][nN][iI][tT]|[eE]([rR][rR]([nN][oO]|[oO][rR])|[xX][eE][cC])|[vV][eE][rR][sS][iI][oO][nN]|[gG][eE][tT][iI][nN][fF][oO])(?=\s*\())|([\s\S])/g,/(?:\b[iI][pP][tT][cC]([pP][aA][rR][sS][eE]|[eE][mM][bB][eE][dD])(?=\s*\())|([\s\S])/g,/(?:\b[jJ][sS][oO][nN]_([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE])(?=\s*\())|([\s\S])/g,/(?:\b[lL][cC][gG]_[vV][aA][lL][uU][eE](?=\s*\())|([\s\S])/g,/(?:\b[lL][dD][aA][pP]_([sS]([tT][aA][rR][tT]_[tT][lL][sS]|[oO][rR][tT]|[eE]([tT]_([oO][pP][tT][iI][oO][nN]|[rR][eE][bB][iI][nN][dD]_[pP][rR][oO][cC])|[aA][rR][cC][hH])|[aA][sS][lL]_[bB][iI][nN][dD])|[nN][eE][xX][tT]_([eE][nN][tT][rR][yY]|[aA][tT][tT][rR][iI][bB][uU][tT][eE]|[rR][eE][fF][eE][rR][eE][nN][cC][eE])|[cC][oO]([nN][nN][eE][cC][tT]|[uU][nN][tT]_[eE][nN][tT][rR][iI][eE][sS]|[mM][pP][aA][rR][eE])|[tT]61_[tT][oO]_8859|8859_[tT][oO]_[tT]61|[dD]([nN]2[uU][fF][nN]|[eE][lL][eE][tT][eE])|[uU][nN][bB][iI][nN][dD]|[pP][aA][rR][sS][eE]_[rR][eE]([sS][uU][lL][tT]|[fF][eE][rR][eE][nN][cC][eE])|[eE]([rR][rR]([nN][oO]|2[sS][tT][rR]|[oO][rR])|[xX][pP][lL][oO][dD][eE]_[dD][nN])|[fF]([iI][rR][sS][tT]_([eE][nN][tT][rR][yY]|[aA][tT][tT][rR][iI][bB][uU][tT][eE]|[rR][eE][fF][eE][rR][eE][nN][cC][eE])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[aA][dD][dD]|[lL][iI][sS][tT]|[gG][eE][tT]_([oO][pP][tT][iI][oO][nN]|[dD][nN]|[eE][nN][tT][rR][iI][eE][sS]|[vV][aA][lL][uU][eE][sS]_[lL][eE][nN]|[aA][tT][tT][rR][iI][bB][uU][tT][eE][sS])|[rR][eE]([nN][aA][mM][eE]|[aA][dD])|[mM][oO][dD]_([dD][eE][lL]|[aA][dD][dD]|[rR][eE][pP][lL][aA][cC][eE])|[bB][iI][nN][dD])(?=\s*\())|([\s\S])/g,/(?:\b[lL][eE][vV][eE][nN][sS][hH][tT][eE][iI][nN](?=\s*\())|([\s\S])/g,/(?:\b[lL][iI][bB][xX][mM][lL]_([sS][eE][tT]_[sS][tT][rR][eE][aA][mM][sS]_[cC][oO][nN][tT][eE][xX][tT]|[cC][lL][eE][aA][rR]_[eE][rR][rR][oO][rR][sS]|[uU][sS][eE]_[iI][nN][tT][eE][rR][nN][aA][lL]_[eE][rR][rR][oO][rR][sS]|[gG][eE][tT]_([eE][rR][rR][oO][rR][sS]|[lL][aA][sS][tT]_[eE][rR][rR][oO][rR]))(?=\s*\())|([\s\S])/g,/(?:\b([sS][yY][mM][lL][iI][nN][kK]|[lL][iI][nN][kK]([iI][nN][fF][oO])?|[rR][eE][aA][dD][lL][iI][nN][kK])(?=\s*\())|([\s\S])/g,/(?:\b([eE][zZ][mM][lL][mM]_[hH][aA][sS][hH]|[mM][aA][iI][lL])(?=\s*\())|([\s\S])/g,/(?:\b[sS][eE][tT]_[tT][iI][mM][eE]_[lL][iI][mM][iI][tT](?=\s*\())|([\s\S])/g,/(?:\b([hH]([yY][pP][oO][tT]|[eE][xX][dD][eE][cC])|[sS]([iI][nN]([hH])?|[qQ][rR][tT])|[nN][uU][mM][bB][eE][rR]_[fF][oO][rR][mM][aA][tT]|[cC]([oO][sS]([hH])?|[eE][iI][lL])|[iI][sS]_([nN][aA][nN]|[iI][nN][fF][iI][nN][iI][tT][eE]|[fF][iI][nN][iI][tT][eE])|[tT][aA][nN]([hH])?|[oO][cC][tT][dD][eE][cC]|[dD][eE]([cC]([hH][eE][xX]|[oO][cC][tT]|[bB][iI][nN])|[gG]2[rR][aA][dD])|[eE][xX][pP]([mM]1)?|[pP]([iI]|[oO][wW])|[fF]([lL][oO][oO][rR]|[mM][oO][dD])|[lL][oO][gG](1([pP]|0))?|[aA]([sS][iI][nN]([hH])?|[cC][oO][sS]([hH])?|[tT][aA][nN]([hH]|2)?|[bB][sS])|[rR]([oO][uU][nN][dD]|[aA][dD]2[dD][eE][gG])|[bB]([iI][nN][dD][eE][cC]|[aA][sS][eE]_[cC][oO][nN][vV][eE][rR][tT]))(?=\s*\())|([\s\S])/g,/(?:\b[mM][bB]_([sS]([tT][rR]([sS][tT][rR]|[cC][uU][tT]|[tT][oO]([uU][pP][pP][eE][rR]|[lL][oO][wW][eE][rR])|[iI]([sS][tT][rR]|[pP][oO][sS]|[mM][wW][iI][dD][tT][hH])|[pP][oO][sS]|[wW][iI][dD][tT][hH]|[lL][eE][nN]|[rR]([cC][hH][rR]|[iI]([cC][hH][rR]|[pP][oO][sS])|[pP][oO][sS]))|[uU][bB][sS][tT]([iI][tT][uU][tT][eE]_[cC][hH][aA][rR][aA][cC][tT][eE][rR]|[rR](_[cC][oO][uU][nN][tT])?)|[eE][nN][dD]_[mM][aA][iI][lL])|[hH][tT][tT][pP]_([iI][nN][pP][uU][tT]|[oO][uU][tT][pP][uU][tT])|[cC]([hH][eE][cC][kK]_[eE][nN][cC][oO][dD][iI][nN][gG]|[oO][nN][vV][eE][rR][tT]_([cC][aA][sS][eE]|[eE][nN][cC][oO][dD][iI][nN][gG]|[vV][aA][rR][iI][aA][bB][lL][eE][sS]|[kK][aA][nN][aA]))|[iI][nN][tT][eE][rR][nN][aA][lL]_[eE][nN][cC][oO][dD][iI][nN][gG]|[oO][uU][tT][pP][uU][tT]_[hH][aA][nN][dD][lL][eE][rR]|[dD][eE]([cC][oO][dD][eE]_([nN][uU][mM][eE][rR][iI][cC][eE][nN][tT][iI][tT][yY]|[mM][iI][mM][eE][hH][eE][aA][dD][eE][rR])|[tT][eE][cC][tT]_([oO][rR][dD][eE][rR]|[eE][nN][cC][oO][dD][iI][nN][gG]))|[eE][nN][cC][oO][dD][eE]_([nN][uU][mM][eE][rR][iI][cC][eE][nN][tT][iI][tT][yY]|[mM][iI][mM][eE][hH][eE][aA][dD][eE][rR])|[pP]([aA][rR][sS][eE]_[sS][tT][rR]|[rR][eE][fF][eE][rR][rR][eE][dD]_[mM][iI][mM][eE]_[nN][aA][mM][eE])|[lL]([iI][sS][tT]_([eE][nN][cC][oO][dD][iI][nN][gG][sS](_[aA][lL][iI][aA][sS]_[nN][aA][mM][eE][sS])?|[mM][iI][mM][eE]_[nN][aA][mM][eE][sS])|[aA][nN][gG][uU][aA][gG][eE])|[gG][eE][tT]_[iI][nN][fF][oO])(?=\s*\())|([\s\S])/g,/(?:\b[mM]([cC][rR][yY][pP][tT]_([cC]([fF][bB]|[rR][eE][aA][tT][eE]_[iI][vV]|[bB][cC])|[oO][fF][bB]|[dD][eE][cC][rR][yY][pP][tT]|[eE]([cC][bB]|[nN][cC](_([sS][eE][lL][fF]_[tT][eE][sS][tT]|[iI][sS]_[bB][lL][oO][cC][kK]_([aA][lL][gG][oO][rR][iI][tT][hH][mM](_[mM][oO][dD][eE])?|[mM][oO][dD][eE])|[gG][eE][tT]_([sS][uU][pP][pP][oO][rR][tT][eE][dD]_[kK][eE][yY]_[sS][iI][zZ][eE][sS]|[iI][vV]_[sS][iI][zZ][eE]|[kK][eE][yY]_[sS][iI][zZ][eE]|[aA][lL][gG][oO][rR][iI][tT][hH][mM][sS]_[nN][aA][mM][eE]|[mM][oO][dD][eE][sS]_[nN][aA][mM][eE]|[bB][lL][oO][cC][kK]_[sS][iI][zZ][eE]))|[rR][yY][pP][tT]))|[lL][iI][sS][tT]_([aA][lL][gG][oO][rR][iI][tT][hH][mM][sS]|[mM][oO][dD][eE][sS])|[gG][eE]([nN][eE][rR][iI][cC](_([iI][nN][iI][tT]|[dD][eE][iI][nN][iI][tT]))?|[tT]_([cC][iI][pP][hH][eE][rR]_[nN][aA][mM][eE]|[iI][vV]_[sS][iI][zZ][eE]|[kK][eE][yY]_[sS][iI][zZ][eE]|[bB][lL][oO][cC][kK]_[sS][iI][zZ][eE]))|[mM][oO][dD][uU][lL][eE]_([sS][eE][lL][fF]_[tT][eE][sS][tT]|[cC][lL][oO][sS][eE]|[iI][sS]_[bB][lL][oO][cC][kK]_([aA][lL][gG][oO][rR][iI][tT][hH][mM](_[mM][oO][dD][eE])?|[mM][oO][dD][eE])|[oO][pP][eE][nN]|[gG][eE][tT]_([sS][uU][pP][pP][oO][rR][tT][eE][dD]_[kK][eE][yY]_[sS][iI][zZ][eE][sS]|[aA][lL][gG][oO]_([kK][eE][yY]_[sS][iI][zZ][eE]|[bB][lL][oO][cC][kK]_[sS][iI][zZ][eE]))))|[dD][eE][cC][rR][yY][pP][tT]_[gG][eE][nN][eE][rR][iI][cC])(?=\s*\())|([\s\S])/g,/(?:\b[mM][eE][tT][aA][pP][hH][oO][nN][eE](?=\s*\())|([\s\S])/g,/(?:\b[mM][hH][aA][sS][hH](_([cC][oO][uU][nN][tT]|[kK][eE][yY][gG][eE][nN]_[sS]2[kK]|[gG][eE][tT]_([hH][aA][sS][hH]_[nN][aA][mM][eE]|[bB][lL][oO][cC][kK]_[sS][iI][zZ][eE])))?(?=\s*\())|([\s\S])/g,/(?:\b([gG][eE][tT]([tT][iI][mM][eE][oO][fF][dD][aA][yY]|[rR][uU][sS][aA][gG][eE])|[mM][iI][cC][rR][oO][tT][iI][mM][eE])(?=\s*\())|([\s\S])/g,/(?:\b[mM][iI][mM][eE]_[cC][oO][nN][tT][eE][nN][tT]_[tT][yY][pP][eE](?=\s*\())|([\s\S])/g,/(?:\b([sS][wW][fF]([pP][rR][eE][bB][uU][iI][lL][tT][cC][lL][iI][pP]_[iI][nN][iI][tT]|[vV][iI][dD][eE][oO][sS][tT][rR][eE][aA][mM]_[iI][nN][iI][tT])|[mM][iI][nN][gG]_([sS][eE][tT]([sS][cC][aA][lL][eE]|[cC][uU][bB][iI][cC][tT][hH][rR][eE][sS][hH][oO][lL][dD])|[uU][sS][eE]([sS][wW][fF][vV][eE][rR][sS][iI][oO][nN]|[cC][oO][nN][sS][tT][aA][nN][tT][sS])|[kK][eE][yY][pP][rR][eE][sS][sS]))(?=\s*\())|([\s\S])/g,/(?:\b[cC][uU][rR][lL]_[mM][uU][lL][tT][iI]_([sS][eE][lL][eE][cC][tT]|[cC][lL][oO][sS][eE]|[iI][nN]([iI][tT]|[fF][oO]_[rR][eE][aA][dD])|[eE][xX][eE][cC]|[aA][dD][dD]_[hH][aA][nN][dD][lL][eE]|[gG][eE][tT][cC][oO][nN][tT][eE][nN][tT]|[rR][eE][mM][oO][vV][eE]_[hH][aA][nN][dD][lL][eE])(?=\s*\())|([\s\S])/g,/(?:\b[mM][yY][sS][qQ][lL][iI]_([sS]([sS][lL]_[sS][eE][tT]|[tT]([oO][rR][eE]_[rR][eE][sS][uU][lL][tT]|[aA][tT]|[mM][tT]_([sS]([tT][oO][rR][eE]_[rR][eE][sS][uU][lL][tT]|[eE][nN][dD]_[lL][oO][nN][gG]_[dD][aA][tT][aA]|[qQ][lL][sS][tT][aA][tT][eE])|[nN][uU][mM]_[rR][oO][wW][sS]|[cC][lL][oO][sS][eE]|[iI][nN]([sS][eE][rR][tT]_[iI][dD]|[iI][tT])|[dD][aA][tT][aA]_[sS][eE][eE][kK]|[pP]([aA][rR][aA][mM]_[cC][oO][uU][nN][tT]|[rR][eE][pP][aA][rR][eE])|[eE]([rR][rR]([nN][oO]|[oO][rR])|[xX][eE][cC][uU][tT][eE])|[fF]([iI][eE][lL][dD]_[cC][oO][uU][nN][tT]|[eE][tT][cC][hH]|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[aA]([tT][tT][rR]_([sS][eE][tT]|[gG][eE][tT])|[fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS])|[rR][eE][sS]([uU][lL][tT]_[mM][eE][tT][aA][dD][aA][tT][aA]|[eE][tT])|[bB][iI][nN][dD]_([pP][aA][rR][aA][mM]|[rR][eE][sS][uU][lL][tT])))|[eE]([tT]_[lL][oO][cC][aA][lL]_[iI][nN][fF][iI][lL][eE]_([hH][aA][nN][dD][lL][eE][rR]|[dD][eE][fF][aA][uU][lL][tT])|[lL][eE][cC][tT]_[dD][bB])|[qQ][lL][sS][tT][aA][tT][eE])|[nN]([uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[eE][xX][tT]_[rR][eE][sS][uU][lL][tT])|[cC]([hH][aA]([nN][gG][eE]_[uU][sS][eE][rR]|[rR][aA][cC][tT][eE][rR]_[sS][eE][tT]_[nN][aA][mM][eE])|[oO][mM][mM][iI][tT]|[lL][oO][sS][eE])|[tT][hH][rR][eE][aA][dD]_([sS][aA][fF][eE]|[iI][dD])|[iI][nN]([sS][eE][rR][tT]_[iI][dD]|[iI][tT]|[fF][oO])|[oO][pP][tT][iI][oO][nN][sS]|[dD]([uU][mM][pP]_[dD][eE][bB][uU][gG]_[iI][nN][fF][oO]|[eE][bB][uU][gG]|[aA][tT][aA]_[sS][eE][eE][kK])|[uU][sS][eE]_[rR][eE][sS][uU][lL][tT]|[pP]([iI][nN][gG]|[rR][eE][pP][aA][rR][eE])|[eE][rR][rR]([nN][oO]|[oO][rR])|[kK][iI][lL][lL]|[fF]([iI][eE][lL][dD]_([sS][eE][eE][kK]|[cC][oO][uU][nN][tT]|[tT][eE][lL][lL])|[eE][tT][cC][hH]_([fF][iI][eE][lL][dD]([sS]|_[dD][iI][rR][eE][cC][tT])?|[lL][eE][nN][gG][tT][hH][sS]|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[wW][aA][rR][nN][iI][nN][gG]_[cC][oO][uU][nN][tT]|[aA]([uU][tT][oO][cC][oO][mM][mM][iI][tT]|[fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS])|[rR]([oO][lL][lL][bB][aA][cC][kK]|[eE][aA][lL]_([cC][oO][nN][nN][eE][cC][tT]|[eE][sS][cC][aA][pP][eE]_[sS][tT][rR][iI][nN][gG]|[qQ][uU][eE][rR][yY]))|[gG][eE][tT]_([sS][eE][rR][vV][eE][rR]_([iI][nN][fF][oO]|[vV][eE][rR][sS][iI][oO][nN])|[hH][oO][sS][tT]_[iI][nN][fF][oO]|[cC][lL][iI][eE][nN][tT]_([iI][nN][fF][oO]|[vV][eE][rR][sS][iI][oO][nN])|[pP][rR][oO][tT][oO]_[iI][nN][fF][oO])|[mM][oO][rR][eE]_[rR][eE][sS][uU][lL][tT][sS])(?=\s*\())|([\s\S])/g,/(?:\b[mM][yY][sS][qQ][lL][iI]_[eE][mM][bB][eE][dD][dD][eE][dD]_[sS][eE][rR][vV][eE][rR]_([sS][tT][aA][rR][tT]|[eE][nN][dD])(?=\s*\())|([\s\S])/g,/(?:\b[mM][yY][sS][qQ][lL][iI]_([sS]([tT][mM][tT]_[gG][eE][tT]_[wW][aA][rR][nN][iI][nN][gG][sS]|[eE][tT]_[cC][hH][aA][rR][sS][eE][tT])|[cC][oO][nN][nN][eE][cC][tT](_[eE][rR][rR]([nN][oO]|[oO][rR]))?|[qQ][uU][eE][rR][yY]|[fF][eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[aA]([sS][sS][oO][cC]|[rR][rR][aA][yY]))|[gG][eE][tT]_([cC][hH][aA][rR][sS][eE][tT]|[wW][aA][rR][nN][iI][nN][gG][sS])|[mM][uU][lL][tT][iI]_[qQ][uU][eE][rR][yY])(?=\s*\())|([\s\S])/g,/(?:\b[mM][yY][sS][qQ][lL][iI]_([sS]([eE][nN][dD]_[qQ][uU][eE][rR][yY]|[lL][aA][vV][eE]_[qQ][uU][eE][rR][yY])|[dD][iI][sS][aA][bB][lL][eE]_[rR]([pP][lL]_[pP][aA][rR][sS][eE]|[eE][aA][dD][sS]_[fF][rR][oO][mM]_[mM][aA][sS][tT][eE][rR])|[eE][nN][aA][bB][lL][eE]_[rR]([pP][lL]_[pP][aA][rR][sS][eE]|[eE][aA][dD][sS]_[fF][rR][oO][mM]_[mM][aA][sS][tT][eE][rR])|[rR][pP][lL]_([pP]([aA][rR][sS][eE]_[eE][nN][aA][bB][lL][eE][dD]|[rR][oO][bB][eE])|[qQ][uU][eE][rR][yY]_[tT][yY][pP][eE])|[mM][aA][sS][tT][eE][rR]_[qQ][uU][eE][rR][yY])(?=\s*\())|([\s\S])/g,/(?:\b[mM][yY][sS][qQ][lL][iI]_[rR][eE][pP][oO][rR][tT](?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[nN][aA][mM][eE][dD][nN][oO][dD][eE][mM][aA][pP]_([sS][eE][tT]_[nN][aA][mM][eE][dD]_[iI][tT][eE][mM](_[nN][sS])?|[iI][tT][eE][mM]|[rR][eE][mM][oO][vV][eE]_[nN][aA][mM][eE][dD]_[iI][tT][eE][mM](_[nN][sS])?|[gG][eE][tT]_[nN][aA][mM][eE][dD]_[iI][tT][eE][mM](_[nN][sS])?)(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[nN][aA][mM][eE][lL][iI][sS][tT]_[gG][eE][tT]_[nN][aA][mM][eE]([sS][pP][aA][cC][eE]_[uU][rR][iI])?(?=\s*\())|([\s\S])/g,/(?:\b[nN][cC][uU][rR][sS][eE][sS]_([sS]([hH][oO][wW]_[pP][aA][nN][eE][lL]|[cC][rR](_([sS][eE][tT]|[iI][nN][iI][tT]|[dD][uU][mM][pP]|[rR][eE][sS][tT][oO][rR][eE])|[lL])|[tT][aA]([nN][dD]([oO][uU][tT]|[eE][nN][dD])|[rR][tT]_[cC][oO][lL][oO][rR])|[lL][kK]_([sS][eE][tT]|[nN][oO][uU][tT][rR][eE][fF][rR][eE][sS][hH]|[cC]([oO][lL][oO][rR]|[lL][eE][aA][rR])|[iI][nN][iI][tT]|[tT][oO][uU][cC][hH]|[aA][tT][tT][rR]([sS][eE][tT]|[oO]([nN]|[fF][fF]))?|[rR][eE]([sS][tT][oO][rR][eE]|[fF][rR][eE][sS][hH]))|[aA][vV][eE][tT][tT][yY])|[hH]([iI][dD][eE]_[pP][aA][nN][eE][lL]|[lL][iI][nN][eE]|[aA]([sS]_([cC][oO][lL][oO][rR][sS]|[iI]([cC]|[lL])|[kK][eE][yY])|[lL][fF][dD][eE][lL][aA][yY]))|[nN]([oO]([nN][lL]|[cC][bB][rR][eE][aA][kK]|[eE][cC][hH][oO]|[qQ][iI][fF][lL][uU][sS][hH]|[rR][aA][wW])|[eE][wW](_[pP][aA][nN][eE][lL]|[pP][aA][dD]|[wW][iI][nN])|[aA][pP][mM][sS]|[lL])|[cC]([oO][lL][oO][rR]_([sS][eE][tT]|[cC][oO][nN][tT][eE][nN][tT])|[uU][rR][sS]_[sS][eE][tT]|[lL]([eE][aA][rR]|[rR][tT][oO]([eE][oO][lL]|[bB][oO][tT]))|[aA][nN]_[cC][hH][aA][nN][gG][eE]_[cC][oO][lL][oO][rR]|[bB][rR][eE][aA][kK])|[tT]([yY][pP][eE][aA][hH][eE][aA][dD]|[iI][mM][eE][oO][uU][tT]|[oO][pP]_[pP][aA][nN][eE][lL]|[eE][rR][mM]([nN][aA][mM][eE]|[aA][tT][tT][rR][sS]))|[iI]([sS][eE][nN][dD][wW][iI][nN]|[nN]([sS]([sS][tT][rR]|[cC][hH]|[tT][rR]|[dD][eE][lL][lL][nN]|[eE][rR][tT][lL][nN])|[cC][hH]|[iI][tT](_([cC][oO][lL][oO][rR]|[pP][aA][iI][rR]))?))|[dD]([oO][uU][pP][dD][aA][tT][eE]|[eE]([fF]([iI][nN][eE]_[kK][eE][yY]|_([sS][hH][eE][lL][lL]_[mM][oO][dD][eE]|[pP][rR][oO][gG]_[mM][oO][dD][eE]))|[lL]([cC][hH]|_[pP][aA][nN][eE][lL]|[eE][tT][eE][lL][nN]|[aA][yY]_[oO][uU][tT][pP][uU][tT]|[wW][iI][nN])))|[uU]([sS][eE]_([dD][eE][fF][aA][uU][lL][tT]_[cC][oO][lL][oO][rR][sS]|[eE]([nN][vV]|[xX][tT][eE][nN][dD][eE][dD]_[nN][aA][mM][eE][sS]))|[nN][gG][eE][tT]([cC][hH]|[mM][oO][uU][sS][eE])|[pP][dD][aA][tT][eE]_[pP][aA][nN][eE][lL][sS])|[pP]([nN][oO][uU][tT][rR][eE][fF][rR][eE][sS][hH]|[uU][tT][pP]|[aA]([nN][eE][lL]_([wW][iI][nN][dD][oO][wW]|[aA][bB][oO][vV][eE]|[bB][eE][lL][oO][wW])|[iI][rR]_[cC][oO][nN][tT][eE][nN][tT])|[rR][eE][fF][rR][eE][sS][hH])|[eE]([cC][hH][oO]([cC][hH][aA][rR])?|[nN][dD]|[rR][aA][sS][eE]([cC][hH][aA][rR])?)|[vV]([iI][dD][aA][tT][tT][rR]|[lL][iI][nN][eE])|[kK]([iI][lL][lL][cC][hH][aA][rR]|[eE][yY]([oO][kK]|[pP][aA][dD]))|[qQ][iI][fF][lL][uU][sS][hH]|[fF]([iI][lL][tT][eE][rR]|[lL]([uU][sS][hH][iI][nN][pP]|[aA][sS][hH]))|[lL][oO][nN][gG][nN][aA][mM][eE]|[wW]([sS][tT][aA][nN][dD]([oO][uU][tT]|[eE][nN][dD])|[hH][lL][iI][nN][eE]|[nN][oO][uU][tT][rR][eE][fF][rR][eE][sS][hH]|[cC]([oO][lL][oO][rR]_[sS][eE][tT]|[lL][eE][aA][rR])|[eE][rR][aA][sS][eE]|[vV][lL][iI][nN][eE]|[aA]([tT][tT][rR]([sS][eE][tT]|[oO]([nN]|[fF][fF]))|[dD][dD]([sS][tT][rR]|[cC][hH]))|[gG][eE][tT][cC][hH]|[rR][eE][fF][rR][eE][sS][hH]|[mM][oO]([uU][sS][eE]_[tT][rR][aA][fF][oO]|[vV][eE])|[bB][oO][rR][dD][eE][rR])|[aA]([sS][sS][uU][mM][eE]_[dD][eE][fF][aA][uU][lL][tT]_[cC][oO][lL][oO][rR][sS]|[tT][tT][rR]([sS][eE][tT]|[oO]([nN]|[fF][fF]))|[dD][dD]([sS][tT][rR]|[nN][sS][tT][rR]|[cC][hH]([sS][tT][rR]|[nN][sS][tT][rR])?))|[rR]([eE]([sS][eE][tT]([tT][yY]|_([sS][hH][eE][lL][lL]_[mM][oO][dD][eE]|[pP][rR][oO][gG]_[mM][oO][dD][eE]))|[pP][lL][aA][cC][eE]_[pP][aA][nN][eE][lL]|[fF][rR][eE][sS][hH])|[aA][wW])|[gG][eE][tT]([yY][xX]|[cC][hH]|[mM]([oO][uU][sS][eE]|[aA][xX][yY][xX]))|[bB]([oO]([tT][tT][oO][mM]_[pP][aA][nN][eE][lL]|[rR][dD][eE][rR])|[eE][eE][pP]|[kK][gG][dD]([sS][eE][tT])?|[aA][uU][dD][rR][aA][tT][eE])|[mM]([oO]([uU][sS][eE]([iI][nN][tT][eE][rR][vV][aA][lL]|_[tT][rR][aA][fF][oO]|[mM][aA][sS][kK])|[vV][eE](_[pP][aA][nN][eE][lL])?)|[eE][tT][aA]|[vV]([hH][lL][iI][nN][eE]|[cC][uU][rR]|[iI][nN][cC][hH]|[dD][eE][lL][cC][hH]|[vV][lL][iI][nN][eE]|[wW][aA][dD][dD][sS][tT][rR]|[aA][dD][dD]([sS][tT][rR]|[nN][sS][tT][rR]|[cC][hH]([sS][tT][rR]|[nN][sS][tT][rR])?)|[gG][eE][tT][cC][hH])))(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[nN][oO][dD][eE]_([sS][eE][tT]_[uU][sS][eE][rR]_[dD][aA][tT][aA]|[hH][aA][sS]_([cC][hH][iI][lL][dD]_[nN][oO][dD][eE][sS]|[aA][tT][tT][rR][iI][bB][uU][tT][eE][sS])|[nN][oO][rR][mM][aA][lL][iI][zZ][eE]|[cC]([oO][mM][pP][aA][rR][eE]_[dD][oO][cC][uU][mM][eE][nN][tT]_[pP][oO][sS][iI][tT][iI][oO][nN]|[lL][oO][nN][eE]_[nN][oO][dD][eE])|[iI]([sS]_([sS]([uU][pP][pP][oO][rR][tT][eE][dD]|[aA][mM][eE]_[nN][oO][dD][eE])|[dD][eE][fF][aA][uU][lL][tT]_[nN][aA][mM][eE][sS][pP][aA][cC][eE]|[eE][qQ][uU][aA][lL]_[nN][oO][dD][eE])|[nN][sS][eE][rR][tT]_[bB][eE][fF][oO][rR][eE])|[lL][oO][oO][kK][uU][pP]_([nN][aA][mM][eE][sS][pP][aA][cC][eE]_[uU][rR][iI]|[pP][rR][eE][fF][iI][xX])|[aA][pP][pP][eE][nN][dD]_[cC][hH][iI][lL][dD]|[gG][eE][tT]_([uU][sS][eE][rR]_[dD][aA][tT][aA]|[fF][eE][aA][tT][uU][rR][eE])|[rR][eE]([pP][lL][aA][cC][eE]_[cC][hH][iI][lL][dD]|[mM][oO][vV][eE]_[cC][hH][iI][lL][dD]))(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[nN][oO][dD][eE][lL][iI][sS][tT]_[iI][tT][eE][mM](?=\s*\())|([\s\S])/g,/(?:\b[nN][sS][aA][pP][iI]_([vV][iI][rR][tT][uU][aA][lL]|[rR][eE]([sS][pP][oO][nN][sS][eE]_[hH][eE][aA][dD][eE][rR][sS]|[qQ][uU][eE][sS][tT]_[hH][eE][aA][dD][eE][rR][sS]))(?=\s*\())|([\s\S])/g,/(?:\b[oO][cC][iI]([sS][eE][tT][bB][uU][fF][fF][eE][rR][iI][nN][gG][lL][oO][bB]|_([sS]([tT][aA][tT][eE][mM][eE][nN][tT]_[tT][yY][pP][eE]|[eE]([tT]_[pP][rR][eE][fF][eE][tT][cC][hH]|[rR][vV][eE][rR]_[vV][eE][rR][sS][iI][oO][nN]))|[cC]([oO]([nN][nN][eE][cC][tT]|[lL][lL][eE][cC][tT][iI][oO][nN]_([sS][iI][zZ][eE]|[tT][rR][iI][mM]|[eE][lL][eE][mM][eE][nN][tT]_([aA][sS][sS][iI][gG][nN]|[gG][eE][tT])|[aA]([sS][sS][iI][gG][nN]|[pP][pP][eE][nN][dD])|[mM][aA][xX])|[mM][mM][iI][tT])|[lL][oO][sS][eE]|[aA][nN][cC][eE][lL])|[nN]([uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[eE][wW]_([cC]([oO]([nN][nN][eE][cC][tT]|[lL][lL][eE][cC][tT][iI][oO][nN])|[uU][rR][sS][oO][rR])|[dD][eE][sS][cC][rR][iI][pP][tT][oO][rR]))|[iI][nN][tT][eE][rR][nN][aA][lL]_[dD][eE][bB][uU][gG]|[dD][eE][fF][iI][nN][eE]_[bB][yY]_[nN][aA][mM][eE]|[pP]([cC][oO][nN][nN][eE][cC][tT]|[aA]([sS][sS][wW][oO][rR][dD]_[cC][hH][aA][nN][gG][eE]|[rR][sS][eE]))|[eE]([rR][rR][oO][rR]|[xX][eE][cC][uU][tT][eE])|[fF]([iI][eE][lL][dD]_([sS]([cC][aA][lL][eE]|[iI][zZ][eE])|[nN][aA][mM][eE]|[iI][sS]_[nN][uU][lL][lL]|[tT][yY][pP][eE](_[rR][aA][wW])?|[pP][rR][eE][cC][iI][sS][iI][oO][nN])|[eE][tT][cC][hH](_([oO][bB][jJ][eE][cC][tT]|[aA]([sS][sS][oO][cC]|[lL][lL]|[rR][rR][aA][yY])|[rR][oO][wW]))?|[rR][eE][eE]_([sS][tT][aA][tT][eE][mM][eE][nN][tT]|[cC][oO][lL][lL][eE][cC][tT][iI][oO][nN]|[dD][eE][sS][cC][rR][iI][pP][tT][oO][rR]))|[lL][oO][bB]_([sS]([iI][zZ][eE]|[eE][eE][kK]|[aA][vV][eE])|[cC]([oO][pP][yY]|[lL][oO][sS][eE])|[tT]([eE][lL][lL]|[rR][uU][nN][cC][aA][tT][eE])|[iI]([sS]_[eE][qQ][uU][aA][lL]|[mM][pP][oO][rR][tT])|[eE]([oO][fF]|[rR][aA][sS][eE]|[xX][pP][oO][rR][tT])|[fF][lL][uU][sS][hH]|[aA][pP][pP][eE][nN][dD]|[wW][rR][iI][tT][eE](_[tT][eE][mM][pP][oO][rR][aA][rR][yY])?|[lL][oO][aA][dD]|[rR][eE]([wW][iI][nN][dD]|[aA][dD]))|[rR]([oO][lL][lL][bB][aA][cC][kK]|[eE][sS][uU][lL][tT])|[bB][iI][nN][dD]_([aA][rR][rR][aA][yY]_[bB][yY]_[nN][aA][mM][eE]|[bB][yY]_[nN][aA][mM][eE]))|[fF][eE][tT][cC][hH][iI][nN][tT][oO]|[gG][eE][tT][bB][uU][fF][fF][eE][rR][iI][nN][gG][lL][oO][bB])(?=\s*\())|([\s\S])/g,/(?:\b[oO][pP][eE][nN][sS][sS][lL]_([sS]([iI][gG][nN]|[eE][aA][lL])|[cC][sS][rR]_([sS][iI][gG][nN]|[nN][eE][wW]|[eE][xX][pP][oO][rR][tT](_[tT][oO]_[fF][iI][lL][eE])?|[gG][eE][tT]_([sS][uU][bB][jJ][eE][cC][tT]|[pP][uU][bB][lL][iI][cC]_[kK][eE][yY]))|[oO][pP][eE][nN]|[eE][rR][rR][oO][rR]_[sS][tT][rR][iI][nN][gG]|[pP]([uU][bB][lL][iI][cC]_([dD][eE][cC][rR][yY][pP][tT]|[eE][nN][cC][rR][yY][pP][tT])|[kK]([cC][sS](12_([eE][xX][pP][oO][rR][tT](_[tT][oO]_[fF][iI][lL][eE])?|[rR][eE][aA][dD])|7_([sS][iI][gG][nN]|[dD][eE][cC][rR][yY][pP][tT]|[eE][nN][cC][rR][yY][pP][tT]|[vV][eE][rR][iI][fF][yY]))|[eE][yY]_([nN][eE][wW]|[eE][xX][pP][oO][rR][tT](_[tT][oO]_[fF][iI][lL][eE])?|[fF][rR][eE][eE]|[gG][eE][tT]_([dD][eE][tT][aA][iI][lL][sS]|[pP]([uU][bB][lL][iI][cC]|[rR][iI][vV][aA][tT][eE]))))|[rR][iI][vV][aA][tT][eE]_([dD][eE][cC][rR][yY][pP][tT]|[eE][nN][cC][rR][yY][pP][tT]))|[vV][eE][rR][iI][fF][yY]|[xX]509_([cC][hH][eE][cC][kK](_[pP][rR][iI][vV][aA][tT][eE]_[kK][eE][yY]|[pP][uU][rR][pP][oO][sS][eE])|[pP][aA][rR][sS][eE]|[eE][xX][pP][oO][rR][tT](_[tT][oO]_[fF][iI][lL][eE])?|[fF][rR][eE][eE]|[rR][eE][aA][dD]))(?=\s*\())|([\s\S])/g,/(?:\b[oO]([uU][tT][pP][uU][tT]_([aA][dD][dD]_[rR][eE][wW][rR][iI][tT][eE]_[vV][aA][rR]|[rR][eE][sS][eE][tT]_[rR][eE][wW][rR][iI][tT][eE]_[vV][aA][rR][sS])|[bB]_([sS][tT][aA][rR][tT]|[cC][lL][eE][aA][nN]|[iI][mM][pP][lL][iI][cC][iI][tT]_[fF][lL][uU][sS][hH]|[eE][nN][dD]_([cC][lL][eE][aA][nN]|[fF][lL][uU][sS][hH])|[fF][lL][uU][sS][hH]|[lL][iI][sS][tT]_[hH][aA][nN][dD][lL][eE][rR][sS]|[gG][eE][tT]_([sS][tT][aA][tT][uU][sS]|[cC]([oO][nN][tT][eE][nN][tT][sS]|[lL][eE][aA][nN])|[fF][lL][uU][sS][hH]|[lL][eE]([nN][gG][tT][hH]|[vV][eE][lL]))))(?=\s*\())|([\s\S])/g,/(?:\b([uU][nN][pP][aA][cC][kK]|[pP][aA][cC][kK])(?=\s*\())|([\s\S])/g,/(?:\b[gG][eE][tT]([lL][aA][sS][tT][mM][oO][dD]|[mM][yY]([iI][nN][oO][dD][eE]|[uU][iI][dD]|[pP][iI][dD]|[gG][iI][dD]))(?=\s*\())|([\s\S])/g,/(?:\b[pP][cC][nN][tT][lL]_([sS]([iI][gG][nN][aA][lL]|[eE][tT][pP][rR][iI][oO][rR][iI][tT][yY])|[eE][xX][eE][cC]|[fF][oO][rR][kK]|[wW]([sS][tT][oO][pP][sS][iI][gG]|[tT][eE][rR][mM][sS][iI][gG]|[iI][fF]([sS]([iI][gG][nN][aA][lL][eE][dD]|[tT][oO][pP][pP][eE][dD])|[eE][xX][iI][tT][eE][dD])|[eE][xX][iI][tT][sS][tT][aA][tT][uU][sS]|[aA][iI][tT]([pP][iI][dD])?)|[aA][lL][aA][rR][mM]|[gG][eE][tT][pP][rR][iI][oO][rR][iI][tT][yY])(?=\s*\())|([\s\S])/g,/(?:\b[pP][dD][oO]_[dD][rR][iI][vV][eE][rR][sS](?=\s*\())|([\s\S])/g,/(?:\b[pP][gG]_([sS][eE]([nN][dD]_([eE][xX][eE][cC][uU][tT][eE]|[pP][rR][eE][pP][aA][rR][eE]|[qQ][uU][eE][rR][yY](_[pP][aA][rR][aA][mM][sS])?)|[tT]_([cC][lL][iI][eE][nN][tT]_[eE][nN][cC][oO][dD][iI][nN][gG]|[eE][rR][rR][oO][rR]_[vV][eE][rR][bB][oO][sS][iI][tT][yY])|[lL][eE][cC][tT])|[hH][oO][sS][tT]|[nN][uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[cC]([oO]([nN]([nN][eE][cC][tT]([iI][oO][nN]_([sS][tT][aA][tT][uU][sS]|[rR][eE][sS][eE][tT]|[bB][uU][sS][yY]))?|[vV][eE][rR][tT])|[pP][yY]_([tT][oO]|[fF][rR][oO][mM]))|[aA][nN][cC][eE][lL]_[qQ][uU][eE][rR][yY]|[lL]([iI][eE][nN][tT]_[eE][nN][cC][oO][dD][iI][nN][gG]|[oO][sS][eE]))|[iI][nN][sS][eE][rR][tT]|[tT]([tT][yY]|[rR][aA]([nN][sS][aA][cC][tT][iI][oO][nN]_[sS][tT][aA][tT][uU][sS]|[cC][eE]))|[oO][pP][tT][iI][oO][nN][sS]|[dD]([eE][lL][eE][tT][eE]|[bB][nN][aA][mM][eE])|[uU]([nN]([tT][rR][aA][cC][eE]|[eE][sS][cC][aA][pP][eE]_[bB][yY][tT][eE][aA])|[pP][dD][aA][tT][eE])|[eE]([sS][cC][aA][pP][eE]_([sS][tT][rR][iI][nN][gG]|[bB][yY][tT][eE][aA])|[nN][dD]_[cC][oO][pP][yY]|[xX][eE][cC][uU][tT][eE])|[pP]([cC][oO][nN][nN][eE][cC][tT]|[iI][nN][gG]|[oO][rR][tT]|[uU][tT]_[lL][iI][nN][eE]|[aA][rR][aA][mM][eE][tT][eE][rR]_[sS][tT][aA][tT][uU][sS]|[rR][eE][pP][aA][rR][eE])|[vV][eE][rR][sS][iI][oO][nN]|[fF]([iI][eE][lL][dD]_([sS][iI][zZ][eE]|[nN]([uU][mM]|[aA][mM][eE])|[iI][sS]_[nN][uU][lL][lL]|[tT]([yY][pP][eE](_[oO][iI][dD])?|[aA][bB][lL][eE])|[pP][rR][tT][lL][eE][nN])|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[aA]([sS][sS][oO][cC]|[lL][lL](_[cC][oO][lL][uU][mM][nN][sS])?|[rR][rR][aA][yY])|[rR]([oO][wW]|[eE][sS][uU][lL][tT]))|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[qQ][uU][eE][rR][yY](_[pP][aA][rR][aA][mM][sS])?|[aA][fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS]|[lL]([oO]_([sS][eE][eE][kK]|[cC]([lL][oO][sS][eE]|[rR][eE][aA][tT][eE])|[tT][eE][lL][lL]|[iI][mM][pP][oO][rR][tT]|[oO][pP][eE][nN]|[uU][nN][lL][iI][nN][kK]|[eE][xX][pP][oO][rR][tT]|[wW][rR][iI][tT][eE]|[rR][eE][aA][dD](_[aA][lL][lL])?)|[aA][sS][tT]_([nN][oO][tT][iI][cC][eE]|[oO][iI][dD]|[eE][rR][rR][oO][rR]))|[gG][eE][tT]_([nN][oO][tT][iI][fF][yY]|[pP][iI][dD]|[rR][eE][sS][uU][lL][tT])|[rR][eE][sS][uU][lL][tT]_([sS]([tT][aA][tT][uU][sS]|[eE][eE][kK])|[eE][rR][rR][oO][rR](_[fF][iI][eE][lL][dD])?)|[mM][eE][tT][aA]_[dD][aA][tT][aA])(?=\s*\())|([\s\S])/g,/(?:\b([vV][iI][rR][tT][uU][aA][lL]|[aA][pP][aA][cC][hH][eE]_([sS][eE][tT][eE][nN][vV]|[nN][oO][tT][eE]|[cC][hH][iI][lL][dD]_[tT][eE][rR][mM][iI][nN][aA][tT][eE]|[lL][oO][oO][kK][uU][pP]_[uU][rR][iI]|[gG][eE][tT]_([vV][eE][rR][sS][iI][oO][nN]|[mM][oO][dD][uU][lL][eE][sS])|[rR][eE]([sS]([eE][tT]_[tT][iI][mM][eE][oO][uU][tT]|[pP][oO][nN][sS][eE]_[hH][eE][aA][dD][eE][rR][sS])|[qQ][uU][eE][sS][tT]_([sS]([oO][mM][eE]_[aA][uU][tT][hH]_[rR][eE][qQ][uU][iI][rR][eE][dD]|[uU][bB]_[rR][eE][qQ]_([lL][oO][oO][kK][uU][pP]_([uU][rR][iI]|[fF][iI][lL][eE])|[mM][eE][tT][hH][oO][dD]_[uU][rR][iI])|[eE]([tT]_([eE][tT][aA][gG]|[lL][aA][sS][tT]_[mM][oO][dD][iI][fF][iI][eE][dD])|[rR][vV][eE][rR]_[pP][oO][rR][tT])|[aA][tT][iI][sS][fF][iI][eE][sS])|[hH][eE][aA][dD][eE][rR][sS](_([iI][nN]|[oO][uU][tT]))?|[iI][sS]_[iI][nN][iI][tT][iI][aA][lL]_[rR][eE][qQ]|[dD][iI][sS][cC][aA][rR][dD]_[rR][eE][qQ][uU][eE][sS][tT]_[bB][oO][dD][yY]|[uU][pP][dD][aA][tT][eE]_[mM][tT][iI][mM][eE]|[eE][rR][rR]_[hH][eE][aA][dD][eE][rR][sS]_[oO][uU][tT]|[lL][oO][gG]_[eE][rR][rR][oO][rR]|[aA][uU][tT][hH]_([nN][aA][mM][eE]|[tT][yY][pP][eE])|[rR]([uU][nN]|[eE][mM][oO][tT][eE]_[hH][oO][sS][tT])|[mM][eE][eE][tT][sS]_[cC][oO][nN][dD][iI][tT][iI][oO][nN][sS])))|[gG][eE][tT][aA][lL][lL][hH][eE][aA][dD][eE][rR][sS])(?=\s*\())|([\s\S])/g,/(?:\b([sS][tT][rR]([tT][oO][tT][iI][mM][eE]|[fF][tT][iI][mM][eE])|[cC][hH][eE][cC][kK][dD][aA][tT][eE]|[tT][iI][mM][eE]([zZ][oO][nN][eE]_([nN][aA][mM][eE]_([fF][rR][oO][mM]_[aA][bB][bB][rR]|[gG][eE][tT])|[iI][dD][eE][nN][tT][iI][fF][iI][eE][rR][sS]_[lL][iI][sS][tT]|[tT][rR][aA][nN][sS][iI][tT][iI][oO][nN][sS]_[gG][eE][tT]|[oO]([pP][eE][nN]|[fF][fF][sS][eE][tT]_[gG][eE][tT])|[aA][bB][bB][rR][eE][vV][iI][aA][tT][iI][oO][nN][sS]_[lL][iI][sS][tT]))?|[iI][dD][aA][tT][eE]|[dD][aA][tT][eE](_([sS][uU][nN]([sS][eE][tT]|_[iI][nN][fF][oO]|[rR][iI][sS][eE])|[cC][rR][eE][aA][tT][eE]|[iI][sS][oO][dD][aA][tT][eE]_[sS][eE][tT]|[tT][iI][mM][eE]([zZ][oO][nN][eE]_([sS][eE][tT]|[gG][eE][tT])|_[sS][eE][tT])|[dD]([eE][fF][aA][uU][lL][tT]_[tT][iI][mM][eE][zZ][oO][nN][eE]_([sS][eE][tT]|[gG][eE][tT])|[aA][tT][eE]_[sS][eE][tT])|[oO][fF][fF][sS][eE][tT]_[gG][eE][tT]|[pP][aA][rR][sS][eE]|[fF][oO][rR][mM][aA][tT]|[mM][oO][dD][iI][fF][yY]))?|[lL][oO][cC][aA][lL][tT][iI][mM][eE]|[gG]([eE][tT][dD][aA][tT][eE]|[mM]([sS][tT][rR][fF][tT][iI][mM][eE]|[dD][aA][tT][eE]|[mM][kK][tT][iI][mM][eE]))|[mM][kK][tT][iI][mM][eE])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[iI][mM][pP][oO][rR][tT]_[sS][iI][mM][pP][lL][eE][xX][mM][lL](?=\s*\())|([\s\S])/g,/(?:\b[fF][bB][sS][qQ][lL]_([hH][oO][sS][tT][nN][aA][mM][eE]|[sS]([tT]([oO][pP]_[dD][bB]|[aA][rR][tT]_[dD][bB])|[eE]([tT]_([cC][hH][aA][rR][aA][cC][tT][eE][rR][sS][eE][tT]|[tT][rR][aA][nN][sS][aA][cC][tT][iI][oO][nN]|[pP][aA][sS][sS][wW][oO][rR][dD]|[lL][oO][bB]_[mM][oO][dD][eE])|[lL][eE][cC][tT]_[dD][bB]))|[nN]([uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[eE][xX][tT]_[rR][eE][sS][uU][lL][tT])|[cC]([hH][aA][nN][gG][eE]_[uU][sS][eE][rR]|[oO]([nN][nN][eE][cC][tT]|[mM][mM][iI][tT])|[lL][oO]([sS][eE]|[bB]_[sS][iI][zZ][eE])|[rR][eE][aA][tT][eE]_([cC][lL][oO][bB]|[dD][bB]|[bB][lL][oO][bB]))|[tT][aA][bB][lL][eE]_[nN][aA][mM][eE]|[iI][nN][sS][eE][rR][tT]_[iI][dD]|[dD]([aA][tT][aA](_[sS][eE][eE][kK]|[bB][aA][sS][eE](_[pP][aA][sS][sS][wW][oO][rR][dD])?)|[rR][oO][pP]_[dD][bB]|[bB]_([sS][tT][aA][tT][uU][sS]|[qQ][uU][eE][rR][yY]))|[uU][sS][eE][rR][nN][aA][mM][eE]|[eE][rR][rR]([nN][oO]|[oO][rR])|[pP]([cC][oO][nN][nN][eE][cC][tT]|[aA][sS][sS][wW][oO][rR][dD])|[fF]([iI][eE][lL][dD]_([sS][eE][eE][kK]|[nN][aA][mM][eE]|[tT]([yY][pP][eE]|[aA][bB][lL][eE])|[fF][lL][aA][gG][sS]|[lL][eE][nN])|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[fF][iI][eE][lL][dD]|[lL][eE][nN][gG][tT][hH][sS]|[aA]([sS][sS][oO][cC]|[rR][rR][aA][yY])|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[qQ][uU][eE][rR][yY]|[wW][aA][rR][nN][iI][nN][gG][sS]|[lL][iI][sS][tT]_([tT][aA][bB][lL][eE][sS]|[dD][bB][sS]|[fF][iI][eE][lL][dD][sS])|[aA]([uU][tT][oO][cC][oO][mM][mM][iI][tT]|[fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS])|[gG][eE][tT]_[aA][uU][tT][oO][sS][tT][aA][rR][tT]_[iI][nN][fF][oO]|[rR]([oO]([wW][sS]_[fF][eE][tT][cC][hH][eE][dD]|[lL][lL][bB][aA][cC][kK])|[eE]([sS][uU][lL][tT]|[aA][dD]_([cC][lL][oO][bB]|[bB][lL][oO][bB])))|[bB][lL][oO][bB]_[sS][iI][zZ][eE])(?=\s*\())|([\s\S])/g,/(?:\b[fF][tT][pP]_([sS]([sS][lL]_[cC][oO][nN][nN][eE][cC][tT]|[yY][sS][tT][yY][pP][eE]|[iI]([tT][eE]|[zZ][eE])|[eE][tT]_[oO][pP][tT][iI][oO][nN])|[nN]([lL][iI][sS][tT]|[bB]_([cC][oO][nN][tT][iI][nN][uU][eE]|[pP][uU][tT]|[fF]([pP][uU][tT]|[gG][eE][tT])|[gG][eE][tT]))|[cC]([hH]([dD][iI][rR]|[mM][oO][dD])|[dD][uU][pP]|[oO][nN][nN][eE][cC][tT]|[lL][oO][sS][eE])|[dD][eE][lL][eE][tT][eE]|[eE][xX][eE][cC]|[pP]([uU][tT]|[aA][sS][vV]|[wW][dD])|[fF]([pP][uU][tT]|[gG][eE][tT])|[aA][lL][lL][oO][cC]|[lL][oO][gG][iI][nN]|[gG][eE][tT](_[oO][pP][tT][iI][oO][nN])?|[rR]([eE][nN][aA][mM][eE]|[aA][wW]([lL][iI][sS][tT])?|[mM][dD][iI][rR])|[mM]([dD][tT][mM]|[kK][dD][iI][rR]))(?=\s*\())|([\s\S])/g,/(?:\b([vV][iI][rR][tT][uU][aA][lL]|[aA][pP][aA][cC][hH][eE]_([sS][eE][tT][eE][nN][vV]|[nN][oO][tT][eE]|[gG][eE][tT](_([vV][eE][rR][sS][iI][oO][nN]|[mM][oO][dD][uU][lL][eE][sS])|[eE][nN][vV])|[rR][eE][sS][pP][oO][nN][sS][eE]_[hH][eE][aA][dD][eE][rR][sS])|[gG][eE][tT][aA][lL][lL][hH][eE][aA][dD][eE][rR][sS])(?=\s*\())|([\s\S])/g,/(?:\b[iI][mM][aA][pP]_([hH][eE][aA][dD][eE][rR]([sS]|[iI][nN][fF][oO])|[sS]([cC][aA][nN]|[tT][aA][tT][uU][sS]|[oO][rR][tT]|[uU][bB][sS][cC][rR][iI][bB][eE]|[eE]([tT](_[qQ][uU][oO][tT][aA]|[fF][lL][aA][gG]_[fF][uU][lL][lL]|[aA][cC][lL])|[aA][rR][cC][hH])|[aA][vV][eE][bB][oO][dD][yY])|[cC]([hH][eE][cC][kK]|[lL]([oO][sS][eE]|[eE][aA][rR][fF][lL][aA][gG]_[fF][uU][lL][lL])|[rR][eE][aA][tT][eE][mM][aA][iI][lL][bB][oO][xX])|[nN][uU][mM]_([rR][eE][cC][eE][nN][tT]|[mM][sS][gG])|[tT]([hH][rR][eE][aA][dD]|[iI][mM][eE][oO][uU][tT])|8[bB][iI][tT]|[dD][eE][lL][eE][tT][eE]([mM][aA][iI][lL][bB][oO][xX])?|[oO][pP][eE][nN]|[uU]([nN]([sS][uU][bB][sS][cC][rR][iI][bB][eE]|[dD][eE][lL][eE][tT][eE])|[iI][dD]|[tT][fF](7_([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE])|8))|[eE]([rR][rR][oO][rR][sS]|[xX][pP][uU][nN][gG][eE])|[pP][iI][nN][gG]|[qQ][pP][rR][iI][nN][tT]|[fF][eE][tT][cC][hH]([hH][eE][aA][dD][eE][rR]|[sS][tT][rR][uU][cC][tT][uU][rR][eE]|_[oO][vV][eE][rR][vV][iI][eE][wW]|[bB][oO][dD][yY])|[lL]([sS][uU][bB]|[iI][sS][tT]|[aA][sS][tT]_[eE][rR][rR][oO][rR])|[aA]([pP][pP][eE][nN][dD]|[lL][eE][rR][tT][sS])|[gG][eE][tT]([sS][uU][bB][sS][cC][rR][iI][bB][eE][dD]|_[qQ][uU][oO][tT][aA]([rR][oO][oO][tT])?|[aA][cC][lL]|[mM][aA][iI][lL][bB][oO][xX][eE][sS])|[rR]([eE]([nN][aA][mM][eE][mM][aA][iI][lL][bB][oO][xX]|[oO][pP][eE][nN])|[fF][cC]822_([pP][aA][rR][sS][eE]_([hH][eE][aA][dD][eE][rR][sS]|[aA][dD][rR][lL][iI][sS][tT])|[wW][rR][iI][tT][eE]_[aA][dD][dD][rR][eE][sS][sS]))|[mM]([sS][gG][nN][oO]|[iI][mM][eE]_[hH][eE][aA][dD][eE][rR]_[dD][eE][cC][oO][dD][eE]|[aA][iI][lL](_([cC][oO]([pP][yY]|[mM][pP][oO][sS][eE])|[mM][oO][vV][eE])|[bB][oO][xX][mM][sS][gG][iI][nN][fF][oO])?)|[bB]([iI][nN][aA][rR][yY]|[oO][dD][yY]([sS][tT][rR][uU][cC][tT])?|[aA][sS][eE]64))(?=\s*\())|([\s\S])/g,/(?:\b[mM][bB]_([sS][pP][lL][iI][tT]|[eE][rR][eE][gG]([iI](_[rR][eE][pP][lL][aA][cC][eE])?|_([sS][eE][aA][rR][cC][hH](_([sS][eE][tT][pP][oO][sS]|[iI][nN][iI][tT]|[pP][oO][sS]|[gG][eE][tT]([pP][oO][sS]|[rR][eE][gG][sS])|[rR][eE][gG][sS]))?|[rR][eE][pP][lL][aA][cC][eE]|[mM][aA][tT][cC][hH]))?|[rR][eE][gG][eE][xX]_([sS][eE][tT]_[oO][pP][tT][iI][oO][nN][sS]|[eE][nN][cC][oO][dD][iI][nN][gG]))(?=\s*\())|([\s\S])/g,/(?:\b[sS][mM][fF][iI]_([sS][eE][tT]([tT][iI][mM][eE][oO][uU][tT]|[fF][lL][aA][gG][sS]|[rR][eE][pP][lL][yY])|[cC][hH][gG][hH][eE][aA][dD][eE][rR]|[dD][eE][lL][rR][cC][pP][tT]|[aA][dD][dD]([hH][eE][aA][dD][eE][rR]|[rR][cC][pP][tT])|[rR][eE][pP][lL][aA][cC][eE][bB][oO][dD][yY]|[gG][eE][tT][sS][yY][mM][vV][aA][lL])(?=\s*\())|([\s\S])/g,/(?:\b[mM][sS][qQ][lL]_([sS][eE][lL][eE][cC][tT]_[dD][bB]|[nN][uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[cC]([oO][nN][nN][eE][cC][tT]|[lL][oO][sS][eE]|[rR][eE][aA][tT][eE]_[dD][bB])|[dD]([aA][tT][aA]_[sS][eE][eE][kK]|[rR][oO][pP]_[dD][bB]|[bB]_[qQ][uU][eE][rR][yY])|[eE][rR][rR][oO][rR]|[pP][cC][oO][nN][nN][eE][cC][tT]|[fF]([iI][eE][lL][dD]_([sS][eE][eE][kK]|[nN][aA][mM][eE]|[tT]([yY][pP][eE]|[aA][bB][lL][eE])|[fF][lL][aA][gG][sS]|[lL][eE][nN])|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[fF][iI][eE][lL][dD]|[aA][rR][rR][aA][yY]|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[qQ][uU][eE][rR][yY]|[aA][fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS]|[lL][iI][sS][tT]_([tT][aA][bB][lL][eE][sS]|[dD][bB][sS]|[fF][iI][eE][lL][dD][sS])|[rR][eE][sS][uU][lL][tT])(?=\s*\())|([\s\S])/g,/(?:\b[mM][sS][sS][qQ][lL]_([sS][eE][lL][eE][cC][tT]_[dD][bB]|[nN]([uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[eE][xX][tT]_[rR][eE][sS][uU][lL][tT])|[cC]([oO][nN][nN][eE][cC][tT]|[lL][oO][sS][eE])|[iI][nN][iI][tT]|[dD][aA][tT][aA]_[sS][eE][eE][kK]|[eE][xX][eE][cC][uU][tT][eE]|[pP][cC][oO][nN][nN][eE][cC][tT]|[qQ][uU][eE][rR][yY]|[fF]([iI][eE][lL][dD]_([sS][eE][eE][kK]|[nN][aA][mM][eE]|[tT][yY][pP][eE]|[lL][eE][nN][gG][tT][hH])|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[fF][iI][eE][lL][dD]|[aA]([sS][sS][oO][cC]|[rR][rR][aA][yY])|[rR][oO][wW]|[bB][aA][tT][cC][hH])|[rR][eE][eE]_([sS][tT][aA][tT][eE][mM][eE][nN][tT]|[rR][eE][sS][uU][lL][tT]))|[gG]([uU][iI][dD]_[sS][tT][rR][iI][nN][gG]|[eE][tT]_[lL][aA][sS][tT]_[mM][eE][sS][sS][aA][gG][eE])|[rR]([oO][wW][sS]_[aA][fF][fF][eE][cC][tT][eE][dD]|[eE][sS][uU][lL][tT])|[bB][iI][nN][dD]|[mM][iI][nN]_([eE][rR][rR][oO][rR]_[sS][eE][vV][eE][rR][iI][tT][yY]|[mM][eE][sS][sS][aA][gG][eE]_[sS][eE][vV][eE][rR][iI][tT][yY]))(?=\s*\())|([\s\S])/g,/(?:\b[mM][yY][sS][qQ][lL]_([sS]([tT][aA][tT]|[eE]([tT]_[cC][hH][aA][rR][sS][eE][tT]|[lL][eE][cC][tT]_[dD][bB]))|[nN][uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[cC]([oO][nN][nN][eE][cC][tT]|[lL]([iI][eE][nN][tT]_[eE][nN][cC][oO][dD][iI][nN][gG]|[oO][sS][eE])|[rR][eE][aA][tT][eE]_[dD][bB])|[tT][hH][rR][eE][aA][dD]_[iI][dD]|[iI][nN]([sS][eE][rR][tT]_[iI][dD]|[fF][oO])|[dD]([aA][tT][aA]_[sS][eE][eE][kK]|[rR][oO][pP]_[dD][bB]|[bB]_[qQ][uU][eE][rR][yY])|[uU][nN][bB][uU][fF][fF][eE][rR][eE][dD]_[qQ][uU][eE][rR][yY]|[eE]([sS][cC][aA][pP][eE]_[sS][tT][rR][iI][nN][gG]|[rR][rR]([nN][oO]|[oO][rR]))|[pP]([cC][oO][nN][nN][eE][cC][tT]|[iI][nN][gG])|[fF]([iI][eE][lL][dD]_([sS][eE][eE][kK]|[nN][aA][mM][eE]|[tT]([yY][pP][eE]|[aA][bB][lL][eE])|[fF][lL][aA][gG][sS]|[lL][eE][nN])|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[fF][iI][eE][lL][dD]|[lL][eE][nN][gG][tT][hH][sS]|[aA]([sS][sS][oO][cC]|[rR][rR][aA][yY])|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[qQ][uU][eE][rR][yY]|[aA][fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS]|[lL][iI][sS][tT]_([tT][aA][bB][lL][eE][sS]|[dD][bB][sS]|[pP][rR][oO][cC][eE][sS][sS][eE][sS]|[fF][iI][eE][lL][dD][sS])|[rR][eE]([sS][uU][lL][tT]|[aA][lL]_[eE][sS][cC][aA][pP][eE]_[sS][tT][rR][iI][nN][gG])|[gG][eE][tT]_([sS][eE][rR][vV][eE][rR]_[iI][nN][fF][oO]|[hH][oO][sS][tT]_[iI][nN][fF][oO]|[cC][lL][iI][eE][nN][tT]_[iI][nN][fF][oO]|[pP][rR][oO][tT][oO]_[iI][nN][fF][oO]))(?=\s*\())|([\s\S])/g,/(?:\b([sS][oO][lL][iI][dD]_[fF][eE][tT][cC][hH]_[pP][rR][eE][vV]|[oO][dD][bB][cC]_([sS]([tT][aA][tT][iI][sS][tT][iI][cC][sS]|[pP][eE][cC][iI][aA][lL][cC][oO][lL][uU][mM][nN][sS]|[eE][tT][oO][pP][tT][iI][oO][nN])|[nN]([uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[eE][xX][tT]_[rR][eE][sS][uU][lL][tT])|[cC]([oO]([nN][nN][eE][cC][tT]|[lL][uU][mM][nN]([sS]|[pP][rR][iI][vV][iI][lL][eE][gG][eE][sS])|[mM][mM][iI][tT])|[uU][rR][sS][oO][rR]|[lL][oO][sS][eE](_[aA][lL][lL])?)|[tT][aA][bB][lL][eE]([sS]|[pP][rR][iI][vV][iI][lL][eE][gG][eE][sS])|[dD][aA][tT][aA]_[sS][oO][uU][rR][cC][eE]|[eE]([rR][rR][oO][rR]([mM][sS][gG])?|[xX][eE][cC]([uU][tT][eE])?)|[pP]([cC][oO][nN][nN][eE][cC][tT]|[rR]([iI][mM][aA][rR][yY][kK][eE][yY][sS]|[oO][cC][eE][dD][uU][rR][eE]([sS]|[cC][oO][lL][uU][mM][nN][sS])|[eE][pP][aA][rR][eE]))|[fF]([iI][eE][lL][dD]_([sS][cC][aA][lL][eE]|[nN]([uU][mM]|[aA][mM][eE])|[tT][yY][pP][eE]|[lL][eE][nN])|[oO][rR][eE][iI][gG][nN][kK][eE][yY][sS]|[eE][tT][cC][hH]_([iI][nN][tT][oO]|[oO][bB][jJ][eE][cC][tT]|[aA][rR][rR][aA][yY]|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[aA][uU][tT][oO][cC][oO][mM][mM][iI][tT]|[lL][oO][nN][gG][rR][eE][aA][dD][lL][eE][nN]|[gG][eE][tT][tT][yY][pP][eE][iI][nN][fF][oO]|[rR]([oO][lL][lL][bB][aA][cC][kK]|[eE][sS][uU][lL][tT](_[aA][lL][lL])?)|[bB][iI][nN][mM][oO][dD][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[pP][rR][eE][gG]_([sS][pP][lL][iI][tT]|[qQ][uU][oO][tT][eE]|[lL][aA][sS][tT]_[eE][rR][rR][oO][rR]|[gG][rR][eE][pP]|[rR][eE][pP][lL][aA][cC][eE](_[cC][aA][lL][lL][bB][aA][cC][kK])?|[mM][aA][tT][cC][hH](_[aA][lL][lL])?)(?=\s*\())|([\s\S])/g,/(?:\b([sS][pP][lL]_([cC][lL][aA][sS][sS][eE][sS]|[oO][bB][jJ][eE][cC][tT]_[hH][aA][sS][hH]|[aA][uU][tT][oO][lL][oO][aA][dD](_([cC][aA][lL][lL]|[uU][nN][rR][eE][gG][iI][sS][tT][eE][rR]|[eE][xX][tT][eE][nN][sS][iI][oO][nN][sS]|[fF][uU][nN][cC][tT][iI][oO][nN][sS]|[rR][eE][gG][iI][sS][tT][eE][rR]))?)|[cC][lL][aA][sS][sS]_([iI][mM][pP][lL][eE][mM][eE][nN][tT][sS]|[pP][aA][rR][eE][nN][tT][sS]))(?=\s*\())|([\s\S])/g,/(?:\b[sS][yY][bB][aA][sS][eE]_([sS][eE]([tT]_[mM][eE][sS][sS][aA][gG][eE]_[hH][aA][nN][dD][lL][eE][rR]|[lL][eE][cC][tT]_[dD][bB])|[nN][uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[cC]([oO][nN][nN][eE][cC][tT]|[lL][oO][sS][eE])|[dD]([eE][aA][dD][lL][oO][cC][kK]_[rR][eE][tT][rR][yY]_[cC][oO][uU][nN][tT]|[aA][tT][aA]_[sS][eE][eE][kK])|[uU][nN][bB][uU][fF][fF][eE][rR][eE][dD]_[qQ][uU][eE][rR][yY]|[pP][cC][oO][nN][nN][eE][cC][tT]|[fF]([iI][eE][lL][dD]_[sS][eE][eE][kK]|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[fF][iI][eE][lL][dD]|[aA]([sS][sS][oO][cC]|[rR][rR][aA][yY])|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[qQ][uU][eE][rR][yY]|[aA][fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS]|[rR][eE][sS][uU][lL][tT]|[gG][eE][tT]_[lL][aA][sS][tT]_[mM][eE][sS][sS][aA][gG][eE]|[mM][iI][nN]_([sS][eE][rR][vV][eE][rR]_[sS][eE][vV][eE][rR][iI][tT][yY]|[cC][lL][iI][eE][nN][tT]_[sS][eE][vV][eE][rR][iI][tT][yY]))(?=\s*\())|([\s\S])/g,/(?:\b[sS][yY][bB][aA][sS][eE]_([sS][eE][lL][eE][cC][tT]_[dD][bB]|[nN][uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[cC]([oO][nN][nN][eE][cC][tT]|[lL][oO][sS][eE])|[dD][aA][tT][aA]_[sS][eE][eE][kK]|[pP][cC][oO][nN][nN][eE][cC][tT]|[fF]([iI][eE][lL][dD]_[sS][eE][eE][kK]|[eE][tT][cC][hH]_([oO][bB][jJ][eE][cC][tT]|[fF][iI][eE][lL][dD]|[aA][rR][rR][aA][yY]|[rR][oO][wW])|[rR][eE][eE]_[rR][eE][sS][uU][lL][tT])|[qQ][uU][eE][rR][yY]|[aA][fF][fF][eE][cC][tT][eE][dD]_[rR][oO][wW][sS]|[rR][eE][sS][uU][lL][tT]|[gG][eE][tT]_[lL][aA][sS][tT]_[mM][eE][sS][sS][aA][gG][eE]|[mM][iI][nN]_([eE][rR][rR][oO][rR]_[sS][eE][vV][eE][rR][iI][tT][yY]|[mM][eE][sS][sS][aA][gG][eE]_[sS][eE][vV][eE][rR][iI][tT][yY]))(?=\s*\())|([\s\S])/g,/(?:\b[xX][mM][lL][wW][rR][iI][tT][eE][rR]_([sS]([tT][aA][rR][tT]_([cC]([oO][mM][mM][eE][nN][tT]|[dD][aA][tT][aA])|[dD]([tT][dD](_([eE]([nN][tT][iI][tT][yY]|[lL][eE][mM][eE][nN][tT])|[aA][tT][tT][lL][iI][sS][tT]))?|[oO][cC][uU][mM][eE][nN][tT])|[pP][iI]|[eE][lL][eE][mM][eE][nN][tT](_[nN][sS])?|[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN][sS])?)|[eE][tT]_[iI][nN][dD][eE][nN][tT](_[sS][tT][rR][iI][nN][gG])?)|[tT][eE][xX][tT]|[oO]([uU][tT][pP][uU][tT]_[mM][eE][mM][oO][rR][yY]|[pP][eE][nN]_([uU][rR][iI]|[mM][eE][mM][oO][rR][yY]))|[eE][nN][dD]_([cC]([oO][mM][mM][eE][nN][tT]|[dD][aA][tT][aA])|[dD]([tT][dD](_([eE]([nN][tT][iI][tT][yY]|[lL][eE][mM][eE][nN][tT])|[aA][tT][tT][lL][iI][sS][tT]))?|[oO][cC][uU][mM][eE][nN][tT])|[pP][iI]|[eE][lL][eE][mM][eE][nN][tT]|[aA][tT][tT][rR][iI][bB][uU][tT][eE])|[fF]([uU][lL][lL]_[eE][nN][dD]_[eE][lL][eE][mM][eE][nN][tT]|[lL][uU][sS][hH])|[wW][rR][iI][tT][eE]_([cC]([oO][mM][mM][eE][nN][tT]|[dD][aA][tT][aA])|[dD][tT][dD](_([eE]([nN][tT][iI][tT][yY]|[lL][eE][mM][eE][nN][tT])|[aA][tT][tT][lL][iI][sS][tT]))?|[pP][iI]|[eE][lL][eE][mM][eE][nN][tT](_[nN][sS])?|[aA][tT][tT][rR][iI][bB][uU][tT][eE](_[nN][sS])?|[rR][aA][wW]))(?=\s*\())|([\s\S])/g,/(?:\b([sS]([tT][aA][tT]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX])|[eE][tT]([cC][oO][mM][mM][eE][nN][tT]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX])|[aA][rR][cC][hH][iI][vV][eE][cC][oO][mM][mM][eE][nN][tT]))|[cC]([lL][oO][sS][eE]|[rR][eE][aA][tT][eE][eE][mM][pP][tT][yY][dD][iI][rR])|[dD][eE][lL][eE][tT][eE]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX])|[oO][pP][eE][nN]|[zZ][iI][pP]_([cC][lL][oO][sS][eE]|[oO][pP][eE][nN]|[eE][nN][tT][rR][yY]_([nN][aA][mM][eE]|[cC]([oO][mM][pP][rR][eE][sS][sS]([iI][oO][nN][mM][eE][tT][hH][oO][dD]|[eE][dD][sS][iI][zZ][eE])|[lL][oO][sS][eE])|[oO][pP][eE][nN]|[fF][iI][lL][eE][sS][iI][zZ][eE]|[rR][eE][aA][dD])|[rR][eE][aA][dD])|[uU][nN][cC][hH][aA][nN][gG][eE]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX]|[aA][lL][lL])|[lL][oO][cC][aA][tT][eE][nN][aA][mM][eE]|[aA][dD][dD][fF]([iI][lL][eE]|[rR][oO][mM][sS][tT][rR][iI][nN][gG])|[rR][eE][nN][aA][mM][eE]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX])|[gG][eE][tT]([sS][tT][rR][eE][aA][mM]|[cC][oO][mM][mM][eE][nN][tT]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX])|[nN][aA][mM][eE][iI][nN][dD][eE][xX]|[fF][rR][oO][mM]([nN][aA][mM][eE]|[iI][nN][dD][eE][xX])|[aA][rR][cC][hH][iI][vV][eE][cC][oO][mM][mM][eE][nN][tT]))(?=\s*\())|([\s\S])/g,/(?:\b[pP][oO][sS][iI][xX]_([sS]([tT][rR][eE][rR][rR][oO][rR]|[eE][tT]([sS][iI][dD]|[uU][iI][dD]|[pP][gG][iI][dD]|[eE]([uU][iI][dD]|[gG][iI][dD])|[gG][iI][dD]))|[cC][tT][eE][rR][mM][iI][dD]|[iI]([sS][aA][tT][tT][yY]|[nN][iI][tT][gG][rR][oO][uU][pP][sS])|[tT]([tT][yY][nN][aA][mM][eE]|[iI][mM][eE][sS])|[uU][nN][aA][mM][eE]|[kK][iI][lL][lL]|[aA][cC][cC][eE][sS][sS]|[gG][eE][tT]([sS][iI][dD]|[cC][wW][dD]|_[lL][aA][sS][tT]_[eE][rR][rR][oO][rR]|[uU][iI][dD]|[eE]([uU][iI][dD]|[gG][iI][dD])|[pP]([iI][dD]|[pP][iI][dD]|[wW]([nN][aA][mM]|[uU][iI][dD])|[gG]([iI][dD]|[rR][pP]))|[lL][oO][gG][iI][nN]|[rR][lL][iI][mM][iI][tT]|[gG]([iI][dD]|[rR]([nN][aA][mM]|[oO][uU][pP][sS]|[gG][iI][dD])))|[mM][kK]([nN][oO][dD]|[fF][iI][fF][oO]))(?=\s*\())|([\s\S])/g,/(?:\b[pP][rR][oO][cC]_([cC][lL][oO][sS][eE]|[tT][eE][rR][mM][iI][nN][aA][tT][eE]|[oO][pP][eE][nN]|[gG][eE][tT]_[sS][tT][aA][tT][uU][sS])(?=\s*\())|([\s\S])/g,/(?:\b[pP][sS][pP][eE][lL][lL]_([sS]([tT][oO][rR][eE]_[rR][eE][pP][lL][aA][cC][eE][mM][eE][nN][tT]|[uU][gG][gG][eE][sS][tT]|[aA][vV][eE]_[wW][oO][rR][dD][lL][iI][sS][tT])|[cC]([hH][eE][cC][kK]|[oO][nN][fF][iI][gG]_([sS][aA][vV][eE]_[rR][eE][pP][lL]|[cC][rR][eE][aA][tT][eE]|[iI][gG][nN][oO][rR][eE]|[dD]([iI][cC][tT]_[dD][iI][rR]|[aA][tT][aA]_[dD][iI][rR])|[pP][eE][rR][sS][oO][nN][aA][lL]|[rR]([uU][nN][tT][oO][gG][eE][tT][hH][eE][rR]|[eE][pP][lL])|[mM][oO][dD][eE])|[lL][eE][aA][rR]_[sS][eE][sS][sS][iI][oO][nN])|[nN][eE][wW](_([cC][oO][nN][fF][iI][gG]|[pP][eE][rR][sS][oO][nN][aA][lL]))?|[aA][dD][dD]_[tT][oO]_([sS][eE][sS][sS][iI][oO][nN]|[pP][eE][rR][sS][oO][nN][aA][lL]))(?=\s*\())|([\s\S])/g,/(?:\b[qQ][uU][oO][tT][eE][dD]_[pP][rR][iI][nN][tT][aA][bB][lL][eE]_[dD][eE][cC][oO][dD][eE](?=\s*\())|([\s\S])/g,/(?:\b([sS][rR][aA][nN][dD]|[gG][eE][tT][rR][aA][nN][dD][mM][aA][xX]|[rR][aA][nN][dD]|[mM][tT]_([sS][rR][aA][nN][dD]|[gG][eE][tT][rR][aA][nN][dD][mM][aA][xX]|[rR][aA][nN][dD]))(?=\s*\())|([\s\S])/g,/(?:\b[rR][eE][aA][dD][lL][iI][nN][eE](_([cC]([oO][mM][pP][lL][eE][tT][iI][oO][nN]_[fF][uU][nN][cC][tT][iI][oO][nN]|[aA][lL][lL][bB][aA][cC][kK]_([hH][aA][nN][dD][lL][eE][rR]_([iI][nN][sS][tT][aA][lL][lL]|[rR][eE][mM][oO][vV][eE])|[rR][eE][aA][dD]_[cC][hH][aA][rR])|[lL][eE][aA][rR]_[hH][iI][sS][tT][oO][rR][yY])|[iI][nN][fF][oO]|[oO][nN]_[nN][eE][wW]_[lL][iI][nN][eE]|[wW][rR][iI][tT][eE]_[hH][iI][sS][tT][oO][rR][yY]|[lL][iI][sS][tT]_[hH][iI][sS][tT][oO][rR][yY]|[aA][dD][dD]_[hH][iI][sS][tT][oO][rR][yY]|[rR][eE]([dD][iI][sS][pP][lL][aA][yY]|[aA][dD]_[hH][iI][sS][tT][oO][rR][yY])))?(?=\s*\())|([\s\S])/g,/(?:\b[rR][eE][cC][oO][dD][eE]_([sS][tT][rR][iI][nN][gG]|[fF][iI][lL][eE])(?=\s*\())|([\s\S])/g,/(?:\b([sS]([pP][lL][iI][tT]([iI])?|[qQ][lL]_[rR][eE][gG][cC][aA][sS][eE])|[eE][rR][eE][gG]([iI](_[rR][eE][pP][lL][aA][cC][eE])?|_[rR][eE][pP][lL][aA][cC][eE])?)(?=\s*\())|([\s\S])/g,/(?:\b[sS][eE][sS][sS][iI][oO][nN]_([sS]([tT][aA][rR][tT]|[eE][tT]_([sS][aA][vV][eE]_[hH][aA][nN][dD][lL][eE][rR]|[cC][oO][oO][kK][iI][eE]_[pP][aA][rR][aA][mM][sS])|[aA][vV][eE]_[pP][aA][tT][hH])|[cC][aA][cC][hH][eE]_([eE][xX][pP][iI][rR][eE]|[lL][iI][mM][iI][tT][eE][rR])|[nN][aA][mM][eE]|[iI]([sS]_[rR][eE][gG][iI][sS][tT][eE][rR][eE][dD]|[dD])|[dD][eE]([sS][tT][rR][oO][yY]|[cC][oO][dD][eE])|[uU][nN]([sS][eE][tT]|[rR][eE][gG][iI][sS][tT][eE][rR])|[eE][nN][cC][oO][dD][eE]|[wW][rR][iI][tT][eE]_[cC][lL][oO][sS][eE]|[rR][eE][gG]([iI][sS][tT][eE][rR]|[eE][nN][eE][rR][aA][tT][eE]_[iI][dD])|[gG][eE][tT]_[cC][oO][oO][kK][iI][eE]_[pP][aA][rR][aA][mM][sS]|[mM][oO][dD][uU][lL][eE]_[nN][aA][mM][eE])(?=\s*\())|([\s\S])/g,/(?:\b[sS][hH][mM][oO][pP]_([sS][iI][zZ][eE]|[cC][lL][oO][sS][eE]|[dD][eE][lL][eE][tT][eE]|[oO][pP][eE][nN]|[wW][rR][iI][tT][eE]|[rR][eE][aA][dD])(?=\s*\())|([\s\S])/g,/(?:\b[sS][iI][mM][pP][lL][eE][xX][mM][lL]_([iI][mM][pP][oO][rR][tT]_[dD][oO][mM]|[lL][oO][aA][dD]_([sS][tT][rR][iI][nN][gG]|[fF][iI][lL][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[cC][oO][nN][fF][iI][rR][mM]_[eE][xX][tT][nN][aA][mM][eE]_[cC][oO][mM][pP][iI][lL][eE][dD](?=\s*\())|([\s\S])/g,/(?:\b([sS][nN][mM][pP]([sS][eE][tT]|2_([sS][eE][tT]|[wW][aA][lL][kK]|[rR][eE][aA][lL]_[wW][aA][lL][kK]|[gG][eE][tT]([nN][eE][xX][tT])?)|3_([sS][eE][tT]|[wW][aA][lL][kK]|[rR][eE][aA][lL]_[wW][aA][lL][kK]|[gG][eE][tT]([nN][eE][xX][tT])?)|_([sS][eE][tT]_([oO][iI][dD]_[oO][uU][tT][pP][uU][tT]_[fF][oO][rR][mM][aA][tT]|[eE][nN][uU][mM]_[pP][rR][iI][nN][tT]|[vV][aA][lL][uU][eE][rR][eE][tT][rR][iI][eE][vV][aA][lL]|[qQ][uU][iI][cC][kK]_[pP][rR][iI][nN][tT])|[rR][eE][aA][dD]_[mM][iI][bB]|[gG][eE][tT]_([vV][aA][lL][uU][eE][rR][eE][tT][rR][iI][eE][vV][aA][lL]|[qQ][uU][iI][cC][kK]_[pP][rR][iI][nN][tT]))|[wW][aA][lL][kK]|[rR][eE][aA][lL][wW][aA][lL][kK]|[gG][eE][tT]([nN][eE][xX][tT])?)|[pP][hH][pP]_[sS][nN][mM][pP][vV]3)(?=\s*\())|([\s\S])/g,/(?:\b[sS][oO][cC][kK][eE][tT]_([sS]([hH][uU][tT][dD][oO][wW][nN]|[tT][rR][eE][rR][rR][oO][rR]|[eE]([nN][dD]([tT][oO])?|[tT]_([nN][oO][nN][bB][lL][oO][cC][kK]|[oO][pP][tT][iI][oO][nN]|[bB][lL][oO][cC][kK])|[lL][eE][cC][tT]))|[cC]([oO][nN][nN][eE][cC][tT]|[lL]([oO][sS][eE]|[eE][aA][rR]_[eE][rR][rR][oO][rR])|[rR][eE][aA][tT][eE](_([pP][aA][iI][rR]|[lL][iI][sS][tT][eE][nN]))?)|[wW][rR][iI][tT][eE]|[lL]([iI][sS][tT][eE][nN]|[aA][sS][tT]_[eE][rR][rR][oO][rR])|[aA][cC][cC][eE][pP][tT]|[gG][eE][tT]([sS][oO][cC][kK][nN][aA][mM][eE]|_[oO][pP][tT][iI][oO][nN]|[pP][eE][eE][rR][nN][aA][mM][eE])|[rR][eE]([cC][vV]([fF][rR][oO][mM])?|[aA][dD])|[bB][iI][nN][dD])(?=\s*\())|([\s\S])/g,/(?:\b[sS][oO][uU][nN][dD][eE][xX](?=\s*\())|([\s\S])/g,/(?:\b[iI][tT][eE][rR][aA][tT][oO][rR]_([cC][oO][uU][nN][tT]|[tT][oO]_[aA][rR][rR][aA][yY]|[aA][pP][pP][lL][yY])(?=\s*\())|([\s\S])/g,/(?:\b[sS][qQ][lL][iI][tT][eE]_([hH][aA][sS]_[pP][rR][eE][vV]|[sS]([iI][nN][gG][lL][eE]_[qQ][uU][eE][rR][yY]|[eE][eE][kK])|[nN]([uU][mM]_([fF][iI][eE][lL][dD][sS]|[rR][oO][wW][sS])|[eE][xX][tT])|[cC]([hH][aA][nN][gG][eE][sS]|[oO][lL][uU][mM][nN]|[uU][rR][rR][eE][nN][tT]|[lL][oO][sS][eE]|[rR][eE][aA][tT][eE]_([fF][uU][nN][cC][tT][iI][oO][nN]|[aA][gG][gG][rR][eE][gG][aA][tT][eE]))|[oO][pP][eE][nN]|[uU]([nN][bB][uU][fF][fF][eE][rR][eE][dD]_[qQ][uU][eE][rR][yY]|[dD][fF]_([dD][eE][cC][oO][dD][eE]_[bB][iI][nN][aA][rR][yY]|[eE][nN][cC][oO][dD][eE]_[bB][iI][nN][aA][rR][yY]))|[eE]([sS][cC][aA][pP][eE]_[sS][tT][rR][iI][nN][gG]|[rR][rR][oO][rR]_[sS][tT][rR][iI][nN][gG]|[xX][eE][cC])|[pP]([oO][pP][eE][nN]|[rR][eE][vV])|[kK][eE][yY]|[vV][aA][lL][iI][dD]|[qQ][uU][eE][rR][yY]|[fF]([iI][eE][lL][dD]_[nN][aA][mM][eE]|[eE][tT][cC][hH]_([sS][iI][nN][gG][lL][eE]|[cC][oO][lL][uU][mM][nN]_[tT][yY][pP][eE][sS]|[oO][bB][jJ][eE][cC][tT]|[aA]([lL][lL]|[rR][rR][aA][yY]))|[aA][cC][tT][oO][rR][yY])|[lL]([iI][bB]([eE][nN][cC][oO][dD][iI][nN][gG]|[vV][eE][rR][sS][iI][oO][nN])|[aA][sS][tT]_([iI][nN][sS][eE][rR][tT]_[rR][oO][wW][iI][dD]|[eE][rR][rR][oO][rR]))|[aA][rR][rR][aA][yY]_[qQ][uU][eE][rR][yY]|[rR][eE][wW][iI][nN][dD]|[bB][uU][sS][yY]_[tT][iI][mM][eE][oO][uU][tT])(?=\s*\())|([\s\S])/g,/(?:\b[sS][tT][rR][eE][aA][mM]_([sS]([oO][cC][kK][eE][tT]_([sS]([hH][uU][tT][dD][oO][wW][nN]|[eE]([nN][dD][tT][oO]|[rR][vV][eE][rR]))|[cC][lL][iI][eE][nN][tT]|[eE][nN][aA][bB][lL][eE]_[cC][rR][yY][pP][tT][oO]|[pP][aA][iI][rR]|[aA][cC][cC][eE][pP][tT]|[rR][eE][cC][vV][fF][rR][oO][mM]|[gG][eE][tT]_[nN][aA][mM][eE])|[eE]([tT]_([tT][iI][mM][eE][oO][uU][tT]|[wW][rR][iI][tT][eE]_[bB][uU][fF][fF][eE][rR]|[bB][lL][oO][cC][kK][iI][nN][gG])|[lL][eE][cC][tT]))|[cC][oO]([nN][tT][eE][xX][tT]_([sS][eE][tT]_([oO][pP][tT][iI][oO][nN]|[pP][aA][rR][aA][mM][sS])|[cC][rR][eE][aA][tT][eE]|[gG][eE][tT]_([dD][eE][fF][aA][uU][lL][tT]|[oO][pP][tT][iI][oO][nN][sS]))|[pP][yY]_[tT][oO]_[sS][tT][rR][eE][aA][mM])|[fF][iI][lL][tT][eE][rR]_([pP][rR][eE][pP][eE][nN][dD]|[aA][pP][pP][eE][nN][dD]|[rR][eE][mM][oO][vV][eE])|[gG][eE][tT]_([cC][oO][nN][tT][eE][nN][tT][sS]|[tT][rR][aA][nN][sS][pP][oO][rR][tT][sS]|[lL][iI][nN][eE]|[wW][rR][aA][pP][pP][eE][rR][sS]|[mM][eE][tT][aA]_[dD][aA][tT][aA]))(?=\s*\())|([\s\S])/g,/(?:\b([hH][eE][bB][rR][eE][vV]([cC])?|[sS]([sS][cC][aA][nN][fF]|[iI][mM][iI][lL][aA][rR]_[tT][eE][xX][tT]|[tT][rR]([sS]([tT][rR]|[pP][nN])|[nN][aA][tT][cC]([aA][sS][eE][cC][mM][pP]|[mM][pP])|[cC]([hH][rR]|[sS][pP][nN]|[oO][lL][lL])|[iI]([sS][tT][rR]|[pP]([sS][lL][aA][sS][hH][eE][sS]|[cC][sS][lL][aA][sS][hH][eE][sS]|[oO][sS]|_[tT][aA][gG][sS]))|[tT]([oO]([uU][pP][pP][eE][rR]|[kK]|[lL][oO][wW][eE][rR])|[rR])|_([sS]([hH][uU][fF][fF][lL][eE]|[pP][lL][iI][tT])|[iI][rR][eE][pP][lL][aA][cC][eE]|[pP][aA][dD]|[wW][oO][rR][dD]_[cC][oO][uU][nN][tT]|[rR]([oO][tT]13|[eE][pP]([eE][aA][tT]|[lL][aA][cC][eE])))|[pP]([oO][sS]|[bB][rR][kK])|[rR]([cC][hH][rR]|[iI][pP][oO][sS]|[eE][vV]|[pP][oO][sS]))|[uU][bB][sS][tT][rR](_([cC][oO]([uU][nN][tT]|[mM][pP][aA][rR][eE])|[rR][eE][pP][lL][aA][cC][eE]))?|[eE][tT][lL][oO][cC][aA][lL][eE])|[cC]([hH]([uU][nN][kK]_[sS][pP][lL][iI][tT]|[rR])|[oO][uU][nN][tT]_[cC][hH][aA][rR][sS])|[nN][lL](2[bB][rR]|_[lL][aA][nN][gG][iI][nN][fF][oO])|[iI][mM][pP][lL][oO][dD][eE]|[tT][rR][iI][mM]|[oO][rR][dD]|[dD][iI][rR][nN][aA][mM][eE]|[uU][cC]([fF][iI][rR][sS][tT]|[wW][oO][rR][dD][sS])|[jJ][oO][iI][nN]|[pP][aA]([tT][hH][iI][nN][fF][oO]|[rR][sS][eE]_[sS][tT][rR])|[eE][xX][pP][lL][oO][dD][eE]|[qQ][uU][oO][tT][eE][mM][eE][tT][aA]|[aA][dD][dD]([sS][lL][aA][sS][hH][eE][sS]|[cC][sS][lL][aA][sS][hH][eE][sS])|[wW][oO][rR][dD][wW][rR][aA][pP]|[lL]([tT][rR][iI][mM]|[oO][cC][aA][lL][eE][cC][oO][nN][vV])|[rR][tT][rR][iI][mM]|[mM][oO][nN][eE][yY]_[fF][oO][rR][mM][aA][tT]|[bB]([iI][nN]2[hH][eE][xX]|[aA][sS][eE][nN][aA][mM][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[sS][tT][rR][iI][nN][gG]_[eE][xX][tT][eE][nN][dD]_[fF][iI][nN][dD]_[oO][fF][fF][sS][eE][tT](16|32)(?=\s*\())|([\s\S])/g,/(?:\b([sS][yY][sS][lL][oO][gG]|[cC][lL][oO][sS][eE][lL][oO][gG]|[oO][pP][eE][nN][lL][oO][gG]|[dD][eE][fF][iI][nN][eE]_[sS][yY][sS][lL][oO][gG]_[vV][aA][rR][iI][aA][bB][lL][eE][sS])(?=\s*\())|([\s\S])/g,/(?:\b[mM][sS][gG]_([sS]([tT][aA][tT]_[qQ][uU][eE][uU][eE]|[eE]([nN][dD]|[tT]_[qQ][uU][eE][uU][eE]))|[rR][eE]([cC][eE][iI][vV][eE]|[mM][oO][vV][eE]_[qQ][uU][eE][uU][eE])|[gG][eE][tT]_[qQ][uU][eE][uU][eE])(?=\s*\())|([\s\S])/g,/(?:\b[sS][eE][mM]_([aA][cC][qQ][uU][iI][rR][eE]|[rR][eE]([lL][eE][aA][sS][eE]|[mM][oO][vV][eE])|[gG][eE][tT])(?=\s*\())|([\s\S])/g,/(?:\b[sS][hH][mM]_([dD][eE][tT][aA][cC][hH]|[pP][uU][tT]_[vV][aA][rR]|[aA][tT][tT][aA][cC][hH]|[gG][eE][tT]_[vV][aA][rR]|[rR][eE][mM][oO][vV][eE](_[vV][aA][rR])?)(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[tT][eE][xX][tT]_([sS][pP][lL][iI][tT]_[tT][eE][xX][tT]|[iI][sS]_[wW][hH][iI][tT][eE][sS][pP][aA][cC][eE]_[iI][nN]_[eE][lL][eE][mM][eE][nN][tT]_[cC][oO][nN][tT][eE][nN][tT]|[rR][eE][pP][lL][aA][cC][eE]_[wW][hH][oO][lL][eE]_[tT][eE][xX][tT])(?=\s*\())|([\s\S])/g,/(?:\b[tT][iI][dD][yY]_([cC]([oO][nN][fF][iI][gG]_[cC][oO][uU][nN][tT]|[lL][eE][aA][nN]_[rR][eE][pP][aA][iI][rR])|[iI][sS]_[xX]([hH][tT][mM][lL]|[mM][lL])|[dD][iI][aA][gG][nN][oO][sS][eE]|[eE][rR][rR][oO][rR]_[cC][oO][uU][nN][tT]|[pP][aA][rR][sS][eE]_([sS][tT][rR][iI][nN][gG]|[fF][iI][lL][eE])|[aA][cC][cC][eE][sS][sS]_[cC][oO][uU][nN][tT]|[wW][aA][rR][nN][iI][nN][gG]_[cC][oO][uU][nN][tT]|[rR][eE][pP][aA][iI][rR]_([sS][tT][rR][iI][nN][gG]|[fF][iI][lL][eE])|[gG][eE][tT]([oO][pP][tT]|_([hH]([tT][mM][lL](_[vV][eE][rR])?|[eE][aA][dD])|[sS][tT][aA][tT][uU][sS]|[cC][oO][nN][fF][iI][gG]|[oO]([uU][tT][pP][uU][tT]|[pP][tT]_[dD][oO][cC])|[eE][rR][rR][oO][rR]_[bB][uU][fF][fF][eE][rR]|[rR]([oO][oO][tT]|[eE][lL][eE][aA][sS][eE])|[bB][oO][dD][yY])))(?=\s*\())|([\s\S])/g,/(?:\b[tT][oO][kK][eE][nN]_([nN][aA][mM][eE]|[gG][eE][tT]_[aA][lL][lL])(?=\s*\())|([\s\S])/g,/(?:\b([sS]([tT][rR][vV][aA][lL]|[eE][tT][tT][yY][pP][eE])|[iI]([sS]_([sS]([cC][aA][lL][aA][rR]|[tT][rR][iI][nN][gG])|[cC][aA][lL][lL][aA][bB][lL][eE]|[nN][uU]([lL][lL]|[mM][eE][rR][iI][cC])|[oO][bB][jJ][eE][cC][tT]|[fF][lL][oO][aA][tT]|[aA][rR][rR][aA][yY]|[lL][oO][nN][gG]|[rR][eE][sS][oO][uU][rR][cC][eE]|[bB][oO][oO][lL])|[nN][tT][vV][aA][lL])|[fF][lL][oO][aA][tT][vV][aA][lL]|[gG][eE][tT][tT][yY][pP][eE])(?=\s*\())|([\s\S])/g,/(?:\b[uU][nN][iI][qQ][iI][dD](?=\s*\())|([\s\S])/g,/(?:\b([uU][rR][lL]([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE])|[pP][aA][rR][sS][eE]_[uU][rR][lL]|[gG][eE][tT]_[hH][eE][aA][dD][eE][rR][sS]|[rR][aA][wW][uU][rR][lL]([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[sS][tT][rR][eE][aA][mM]_([fF][iI][lL][tT][eE][rR]_[rR][eE][gG][iI][sS][tT][eE][rR]|[gG][eE][tT]_[fF][iI][lL][tT][eE][rR][sS]|[bB][uU][cC][kK][eE][tT]_([nN][eE][wW]|[pP][rR][eE][pP][eE][nN][dD]|[aA][pP][pP][eE][nN][dD]|[mM][aA][kK][eE]_[wW][rR][iI][tT][eE][aA][bB][lL][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[uU][sS][eE][rR][dD][aA][tT][aA][hH][aA][nN][dD][lL][eE][rR]_[hH][aA][nN][dD][lL][eE](?=\s*\())|([\s\S])/g,/(?:\b[sS][tT][rR][eE][aA][mM]_[wW][rR][aA][pP][pP][eE][rR]_([uU][nN][rR][eE][gG][iI][sS][tT][eE][rR]|[rR][eE]([sS][tT][oO][rR][eE]|[gG][iI][sS][tT][eE][rR]))(?=\s*\())|([\s\S])/g,/(?:\b[cC][oO][nN][vV][eE][rR][tT]_[uU][uU]([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE])(?=\s*\())|([\s\S])/g,/(?:\b([sS][eE][rR][iI][aA][lL][iI][zZ][eE]|[dD][eE][bB][uU][gG]_[zZ][vV][aA][lL]_[dD][uU][mM][pP]|[uU][nN][sS][eE][rR][iI][aA][lL][iI][zZ][eE]|[vV][aA][rR]_([dD][uU][mM][pP]|[eE][xX][pP][oO][rR][tT])|[mM][eE][mM][oO][rR][yY]_[gG][eE][tT]_([uU][sS][aA][gG][eE]|[pP][eE][aA][kK]_[uU][sS][aA][gG][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[vV][eE][rR][sS][iI][oO][nN]_[cC][oO][mM][pP][aA][rR][eE](?=\s*\())|([\s\S])/g,/(?:\b[wW][dD][dD][xX]_([sS][eE][rR][iI][aA][lL][iI][zZ][eE]_[vV][aA]([lL][uU][eE]|[rR][sS])|[dD][eE][sS][eE][rR][iI][aA][lL][iI][zZ][eE]|[pP][aA][cC][kK][eE][tT]_([sS][tT][aA][rR][tT]|[eE][nN][dD])|[aA][dD][dD]_[vV][aA][rR][sS])(?=\s*\())|([\s\S])/g,/(?:\b([uU][tT][fF]8_([dD][eE][cC][oO][dD][eE]|[eE][nN][cC][oO][dD][eE])|[xX][mM][lL]_([sS][eE][tT]_([sS][tT][aA][rR][tT]_[nN][aA][mM][eE][sS][pP][aA][cC][eE]_[dD][eE][cC][lL]_[hH][aA][nN][dD][lL][eE][rR]|[nN][oO][tT][aA][tT][iI][oO][nN]_[dD][eE][cC][lL]_[hH][aA][nN][dD][lL][eE][rR]|[cC][hH][aA][rR][aA][cC][tT][eE][rR]_[dD][aA][tT][aA]_[hH][aA][nN][dD][lL][eE][rR]|[dD][eE][fF][aA][uU][lL][tT]_[hH][aA][nN][dD][lL][eE][rR]|[oO][bB][jJ][eE][cC][tT]|[uU][nN][pP][aA][rR][sS][eE][dD]_[eE][nN][tT][iI][tT][yY]_[dD][eE][cC][lL]_[hH][aA][nN][dD][lL][eE][rR]|[pP][rR][oO][cC][eE][sS][sS][iI][nN][gG]_[iI][nN][sS][tT][rR][uU][cC][tT][iI][oO][nN]_[hH][aA][nN][dD][lL][eE][rR]|[eE]([nN][dD]_[nN][aA][mM][eE][sS][pP][aA][cC][eE]_[dD][eE][cC][lL]_[hH][aA][nN][dD][lL][eE][rR]|[lL][eE][mM][eE][nN][tT]_[hH][aA][nN][dD][lL][eE][rR]|[xX][tT][eE][rR][nN][aA][lL]_[eE][nN][tT][iI][tT][yY]_[rR][eE][fF]_[hH][aA][nN][dD][lL][eE][rR]))|[eE][rR][rR][oO][rR]_[sS][tT][rR][iI][nN][gG]|[pP][aA][rR][sS][eE](_[iI][nN][tT][oO]_[sS][tT][rR][uU][cC][tT]|[rR]_([sS][eE][tT]_[oO][pP][tT][iI][oO][nN]|[cC][rR][eE][aA][tT][eE](_[nN][sS])?|[fF][rR][eE][eE]|[gG][eE][tT]_[oO][pP][tT][iI][oO][nN]))?|[gG][eE][tT]_([cC][uU][rR][rR][eE][nN][tT]_([cC][oO][lL][uU][mM][nN]_[nN][uU][mM][bB][eE][rR]|[lL][iI][nN][eE]_[nN][uU][mM][bB][eE][rR]|[bB][yY][tT][eE]_[iI][nN][dD][eE][xX])|[eE][rR][rR][oO][rR]_[cC][oO][dD][eE])))(?=\s*\())|([\s\S])/g,/(?:\b[xX][mM][lL][rR][pP][cC]_([sS][eE]([tT]_[tT][yY][pP][eE]|[rR][vV][eE][rR]_([cC]([aA][lL][lL]_[mM][eE][tT][hH][oO][dD]|[rR][eE][aA][tT][eE])|[dD][eE][sS][tT][rR][oO][yY]|[aA][dD][dD]_[iI][nN][tT][rR][oO][sS][pP][eE][cC][tT][iI][oO][nN]_[dD][aA][tT][aA]|[rR][eE][gG][iI][sS][tT][eE][rR]_([iI][nN][tT][rR][oO][sS][pP][eE][cC][tT][iI][oO][nN]_[cC][aA][lL][lL][bB][aA][cC][kK]|[mM][eE][tT][hH][oO][dD])))|[iI][sS]_[fF][aA][uU][lL][tT]|[dD][eE][cC][oO][dD][eE](_[rR][eE][qQ][uU][eE][sS][tT])?|[pP][aA][rR][sS][eE]_[mM][eE][tT][hH][oO][dD]_[dD][eE][sS][cC][rR][iI][pP][tT][iI][oO][nN][sS]|[eE][nN][cC][oO][dD][eE](_[rR][eE][qQ][uU][eE][sS][tT])?|[gG][eE][tT]_[tT][yY][pP][eE])(?=\s*\())|([\s\S])/g,/(?:\b[dD][oO][mM]_[xX][pP][aA][tT][hH]_([eE][vV][aA][lL][uU][aA][tT][eE]|[qQ][uU][eE][rR][yY]|[rR][eE][gG][iI][sS][tT][eE][rR]_[nN][sS])(?=\s*\())|([\s\S])/g,/(?:\b[xX][sS][lL]_[xX][sS][lL][tT][pP][rR][oO][cC][eE][sS][sS][oO][rR]_([hH][aA][sS]_[eE][xX][sS][lL][tT]_[sS][uU][pP][pP][oO][rR][tT]|[sS][eE][tT]_[pP][aA][rR][aA][mM][eE][tT][eE][rR]|[tT][rR][aA][nN][sS][fF][oO][rR][mM]_[tT][oO]_([dD][oO][cC]|[uU][rR][iI]|[xX][mM][lL])|[iI][mM][pP][oO][rR][tT]_[sS][tT][yY][lL][eE][sS][hH][eE][eE][tT]|[rR][eE]([gG][iI][sS][tT][eE][rR]_[pP][hH][pP]_[fF][uU][nN][cC][tT][iI][oO][nN][sS]|[mM][oO][vV][eE]_[pP][aA][rR][aA][mM][eE][tT][eE][rR])|[gG][eE][tT]_[pP][aA][rR][aA][mM][eE][tT][eE][rR])(?=\s*\())|([\s\S])/g,/(?:\b([oO][bB]_[gG][zZ][hH][aA][nN][dD][lL][eE][rR]|[zZ][lL][iI][bB]_[gG][eE][tT]_[cC][oO][dD][iI][nN][gG]_[tT][yY][pP][eE]|[rR][eE][aA][dD][gG][zZ][fF][iI][lL][eE]|[gG][zZ]([cC][oO][mM][pP][rR][eE][sS][sS]|[iI][nN][fF][lL][aA][tT][eE]|[dD][eE][fF][lL][aA][tT][eE]|[oO][pP][eE][nN]|[uU][nN][cC][oO][mM][pP][rR][eE][sS][sS]|[eE][nN][cC][oO][dD][eE]|[fF][iI][lL][eE]))(?=\s*\())|([\s\S])/g,/(?:\b[iI][sS]_[iI][nN][tT]([eE][gG][eE][rR])?(?=\s*\())|([\s\S])/g,/(?:\b([rR][eE]([cC][uU][rR][sS][iI][vV][eE]([rR][eE][gG][eE][xX][iI][tT][eE][rR][aA][tT][oO][rR]|[cC][aA][cC][hH][iI][nN][gG][iI][tT][eE][rR][aA][tT][oO][rR]|[iI][tT][eE][rR][aA][tT][oO][rR][iI][tT][eE][rR][aA][tT][oO][rR]|[dD][iI][rR][eE][cC][tT][oO][rR][yY][iI][tT][eE][rR][aA][tT][oO][rR]|[fF][iI][lL][tT][eE][rR][iI][tT][eE][rR][aA][tT][oO][rR]|[aA][rR][rR][aA][yY][iI][tT][eE][rR][aA][tT][oO][rR])|[fF][lL][eE][cC][tT][iI][oO][nN]([mM][eE][tT][hH][oO][dD]|[cC][lL][aA][sS][sS]|[oO][bB][jJ][eE][cC][tT]|[eE][xX][tT][eE][nN][sS][iI][oO][nN]|[pP]([aA][rR][aA][mM][eE][tT][eE][rR]|[rR][oO][pP][eE][rR][tT][yY])|[fF][uU][nN][cC][tT][iI][oO][nN])?|[gG][eE][xX][iI][tT][eE][rR][aA][tT][oO][rR])|[sS]([tT][dD][cC][lL][aA][sS][sS]|[wW][fF]([sS]([hH][aA][pP][eE]|[oO][uU][nN][dD]|[pP][rR][iI][tT][eE])|[tT][eE][xX][tT]([fF][iI][eE][lL][dD])?|[dD][iI][sS][pP][lL][aA][yY][iI][tT][eE][mM]|[fF]([iI][lL][lL]|[oO][nN][tT]([cC][hH][aA]([rR])?)?)|[aA][cC][tT][iI][oO][nN]|[gG][rR][aA][dD][iI][eE][nN][tT]|[mM][oO]([vV][iI][eE]|[rR][pP][hH])|[bB]([iI][tT][mM][aA][pP]|[uU][tT][tT][oO][nN])))|[xX][mM][lL][rR][eE][aA][dD][eE][rR]|[tT][iI][dD][yY][nN][oO][dD][eE]|[sS]([iI][mM][pP][lL][eE][xX][mM][lL]([iI][tT][eE][rR][aA][tT][oO][rR]|[eE][lL][eE][mM][eE][nN][tT])|[oO][aA][pP]([sS][eE][rR][vV][eE][rR]|[hH][eE][aA][dD][eE][rR]|[cC][lL][iI][eE][nN][tT]|[pP][aA][rR][aA][mM]|[vV][aA][rR]|[fF][aA][uU][lL][tT])|[pP][lL]([tT][eE][mM][pP][fF][iI][lL][eE][oO][bB][jJ][eE][cC][tT]|[oO][bB][jJ][eE][cC][tT][sS][tT][oO][rR][aA][gG][eE]|[fF][iI][lL][eE]([iI][nN][fF][oO]|[oO][bB][jJ][eE][cC][tT])))|[nN][oO][rR][eE][wW][iI][nN][dD][iI][tT][eE][rR][aA][tT][oO][rR]|[cC]([oO][mM][pP][eE][rR][sS][iI][sS][tT][hH][eE][lL][pP][eE][rR]|[aA][cC][hH][iI][nN][gG][iI][tT][eE][rR][aA][tT][oO][rR])|[iI]([nN][fF][iI][nN][iI][tT][eE][iI][tT][eE][rR][aA][tT][oO][rR]|[tT][eE][rR][aA][tT][oO][rR][iI][tT][eE][rR][aA][tT][oO][rR])|[dD]([iI][rR][eE][cC][tT][oO][rR][yY][iI][tT][eE][rR][aA][tT][oO][rR]|[oO][mM]([xX][pP][aA][tT][hH]|[nN][oO][dD][eE]|[cC]([oO][mM][mM][eE][nN][tT]|[dD][aA][tT][aA][sS][eE][cC][tT][iI][oO][nN])|[tT][eE][xX][tT]|[dD][oO][cC][uU][mM][eE][nN][tT]([fF][rR][aA][gG][mM][eE][nN][tT])?|[pP][rR][oO][cC][eE][sS][sS][iI][nN][gG][iI][nN][sS][tT][rR][uU][cC][tT][iI][oO][nN]|[eE]([nN][tT][iI][tT][yY][rR][eE][fF][eE][rR][eE][nN][cC][eE]|[lL][eE][mM][eE][nN][tT])|[aA][tT][tT][rR]))|[pP]([dD][oO]([sS][tT][aA][tT][eE][mM][eE][nN][tT])?|[aA][rR][eE][nN][tT][iI][tT][eE][rR][aA][tT][oO][rR])|[eE]([rR][rR][oO][rR][eE][xX][cC][eE][pP][tT][iI][oO][nN]|[mM][pP][tT][yY][iI][tT][eE][rR][aA][tT][oO][rR]|[xX][cC][eE][pP][tT][iI][oO][nN])|[fF][iI][lL][tT][eE][rR][iI][tT][eE][rR][aA][tT][oO][rR]|[lL][iI][mM][iI][tT][iI][tT][eE][rR][aA][tT][oO][rR]|[aA]([pP]([pP][eE][nN][dD][iI][tT][eE][rR][aA][tT][oO][rR]|[aA][cC][hH][eE][rR][eE][qQ][uU][eE][sS][tT])|[rR][rR][aA][yY]([iI][tT][eE][rR][aA][tT][oO][rR]|[oO][bB][jJ][eE][cC][tT])))(?=\s*\())|([\s\S])/g,/(?:\b(([pP][rR][iI][nN][tT]|[eE][cC][hH][oO])\b|([iI][sS][sS][eE][tT]|[uU][nN][sS][eE][tT]|[eE]([vV][aA][lL]|[mM][pP][tT][yY])|[lL][iI][sS][tT])(?=\s*\()))|([\s\S])/g,/((\/[eimnosux]*))|([\s\S])/g,/(<\/)((?:[sS][cC][rR][iI][pP][tT]))|([\s\S])/g,/(\/\/)(.*?((?=<\/script)|(?=\n)\n?))|([\s\S])/g,/(\{(literal)(\}))|([\s\S])/g,/((\\.)|.)(\-((\\.)|[^\]]))|([\s\S])/g,/^(HTML)((;?)((?=\n)\n?))|([\s\S])/g,/\\(a|b|e|f|n|r|t|v|\\|')|([\s\S])/g,/\\[0-9]{3}|([\s\S])/g,/\\x[0-9a-fA-F]{2}|([\s\S])/g,/\\c.|([\s\S])/g,/:|\s|=|/g,/~|([\s\S])/g,/\*|\?|([\s\S])/g,/([\?\*\+@!])(\()|([\s\S])/g,/(\\x[0-9A-F]{2})|(\\[0-7]{3})|(\\\n)|(\\\\)|(\\")|(\\')|(\\a)|(\\b)|(\\f)|(\\n)|(\\r)|(\\t)|(\\v)|([\s\S])/g,/\}|(?=;|\))|([\s\S])/g,/\b(try|catch|finally|throw)\b|([\s\S])/g,/\?|:|([\s\S])/g,/\b(return|break|case|continue|default|do|while|for|switch|if|else)\b|([\s\S])/g,/\b(instanceof)\b|([\s\S])/g,/(==|!=|<=|>=|<>|<|>)|([\s\S])/g,/(=)|([\s\S])/g,/(!|&&|\|\|)|([\s\S])/g,/\S|/g,/\.(?=\S)|([\s\S])/g,/\\[bBAZzG]|\^|\$|([\s\S])/g,/\\[1-9][0-9]?|([\s\S])/g,/[\?\+\*][\?\+]?|\{(\d+,\d+|\d+,|,\d+|\d+)\}\??|([\s\S])/g,/\(\?#|([\s\S])/g,/#\s[a-zA-Z0-9,\. \t\?!-:\u0080-\uffff]*(?=\n)|([\s\S])/g,/\(\?[iLmsux]+\)|([\s\S])/g,/(\()(\?P=([a-zA-Z_][a-zA-Z_0-9]*\w*))(\))|([\s\S])/g,/(\()((\?=)|(\?!)|(\?<=)|(\?<!))|([\s\S])/g,/(\()(\?\(([1-9][0-9]?|[a-zA-Z_][a-zA-Z_0-9]*)(\)))|([\s\S])/g,/(\()(((\?P<)(([a-z]\w*)(>))|(\?:))?)|([\s\S])/g,/\$?"|([\s\S])/g,/\$'|([\s\S])/g,/\s*HTML(?=\n)|([\s\S])/g,/(?=;|\})|([\s\S])/g,/'\s*(?=(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)\b)|([\s\S])/g,/(\{\/(literal)(\}))|([\s\S])/g,/\\[wWsSdDhH]|\.|([\s\S])/g,/(\[)((\^)?)|([\s\S])/g,/|(?=(;|,|\(|\)|>|\[|\]|=))|([\s\S])/g,/(?=(;|,|\(|\)|>|\[|\]|=))|([\s\S])/g,/(?=<?xml|<(?:[hH][tT][mM][lL]\b)|!DOCTYPE (?:[hH][tT][mM][lL]\b))|([\s\S])/g,/^(TEXTILE)((?=\n))|([\s\S])/g,/\*\/.*\n|([\s\S])/g,/\/\/|([\s\S])/g,/\b(break|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while)\b|([\s\S])/g,/\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\b|([\s\S])/g,/\b(const|extern|register|restrict|static|volatile|inline)\b|([\s\S])/g,/\bk[A-Z]\w*\b|([\s\S])/g,/\bg[A-Z]\w*\b|([\s\S])/g,/\bs[A-Z]\w*\b|([\s\S])/g,/\b(NULL|true|false|TRUE|FALSE)\b|([\s\S])/g,/\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|\-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b|([\s\S])/g,/^\s*#\s*(define)(\s+(([a-zA-Z_][a-zA-Z0-9_]*))((?:(\()((\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*((,)(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*))*((?:\.\.\.)?))(\))))?))|([\s\S])/g,/^\s*#\s*(error|warning)(\b)|([\s\S])/g,/^\s*#\s*(include|import)(\b\s+)|([\s\S])/g,/^\s*#\s*(define|defined|elif|else|if|ifdef|ifndef|line|pragma|undef)(\b)|([\s\S])/g,/\b(u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t)\b|([\s\S])/g,/\b(pthread_attr_t|pthread_cond_t|pthread_condattr_t|pthread_mutex_t|pthread_mutexattr_t|pthread_once_t|pthread_rwlock_t|pthread_rwlockattr_t|pthread_t|pthread_key_t)\b|([\s\S])/g,/\b(int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_t)\b|([\s\S])/g,/\b(noErr|kNilOptions|kInvalidID|kVariableLengthArray)\b|([\s\S])/g,/\b(AbsoluteTime|Boolean|Byte|ByteCount|ByteOffset|BytePtr|CompTimeValue|ConstLogicalAddress|ConstStrFileNameParam|ConstStringPtr|Duration|Fixed|FixedPtr|Float32|Float32Point|Float64|Float80|Float96|FourCharCode|Fract|FractPtr|Handle|ItemCount|LogicalAddress|OptionBits|OSErr|OSStatus|OSType|OSTypePtr|PhysicalAddress|ProcessSerialNumber|ProcessSerialNumberPtr|ProcHandle|Ptr|ResType|ResTypePtr|ShortFixed|ShortFixedPtr|SignedByte|SInt16|SInt32|SInt64|SInt8|Size|StrFileName|StringHandle|StringPtr|TimeBase|TimeRecord|TimeScale|TimeValue|TimeValue64|UInt16|UInt32|UInt64|UInt8|UniChar|UniCharCount|UniCharCountPtr|UniCharPtr|UnicodeScalarValue|UniversalProcHandle|UniversalProcPtr|UnsignedFixed|UnsignedFixedPtr|UnsignedWide|UTF16Char|UTF32Char|UTF8Char)\b|([\s\S])/g,/new|/g,/else|/g,/\w|/g,/&&|/g,/[\*&>]|/g,/(?:^|(?:(?=\s)|(?=\s*[A-Za-z_])))(\s*)((?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()((?=((?:[A-Za-z_](?=([A-Za-z0-9_]*))\6|::)+))\5|(?:(?:operator)(?:[\-\*&<>=\+!]+|\(\)|\[\])))(\s*(?=\()))|([\s\S])/g,/(?:^|(?:(?=\s)))(\s*)((?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()((?=((?:[A-Za-z_](?=([A-Za-z0-9_]*))\6|::)+))\5|(?:(?:operator)(?:[\-\*&<>=\+!]+|\(\)|\[\])))(\s*(?=\()))|([\s\S])/g,/(?:^|(?:(?=\s*[A-Za-z_])))(\s*)((?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()((?=((?:[A-Za-z_](?=([A-Za-z0-9_]*))\6|::)+))\5|(?:(?:operator)(?:[\-\*&<>=\+!]+|\(\)|\[\])))(\s*(?=\()))|([\s\S])/g,/(?:^)(\s*)((?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()((?=((?:[A-Za-z_](?=([A-Za-z0-9_]*))\6|::)+))\5|(?:(?:operator)(?:[\-\*&<>=\+!]+|\(\)|\[\])))(\s*(?=\()))|([\s\S])/g,/[\-a-z]|/g,/(?=[\-a-z])|([\s\S])/g,/(:)(\s*)|([\s\S])/g,/^\t*(RUBY)((?=\n))|([\s\S])/g,/^(\3)((?=\n))|([\s\S])/g,/(\?)(>)|([\s\S])/g,/^\t*(PYTHON)((?=\n))|([\s\S])/g,/(?=[^\]\s])|([\s\S])/g,/\b(id)(\b\s*(=))|([\s\S])/g,/(\|)|([\s\S])/g,/[_a-zA-Z][_a-zA-Z0-9]*|([\s\S])/g,/(?=\S)|([\s\S])/g,/^\t*(APPLESCRIPT)((?=\n))|([\s\S])/g,/(\s*)(\b(hypot(f|l)?|s(scanf|ystem|nprintf|ca(nf|lb(n(f|l)?|ln(f|l)?))|i(n(h(f|l)?|f|l)?|gn(al|bit))|tr(s(tr|pn)|nc(py|at|mp)|c(spn|hr|oll|py|at|mp)|to(imax|d|u(l(l)?|max)|k|f|l(d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(jmp|vbuf|locale|buf)|qrt(f|l)?|w(scanf|printf)|rand)|n(e(arbyint(f|l)?|xt(toward(f|l)?|after(f|l)?))|an(f|l)?)|c(s(in(h(f|l)?|f|l)?|qrt(f|l)?)|cos(h(f)?|f|l)?|imag(f|l)?|t(ime|an(h(f|l)?|f|l)?)|o(s(h(f|l)?|f|l)?|nj(f|l)?|pysign(f|l)?)|p(ow(f|l)?|roj(f|l)?)|e(il(f|l)?|xp(f|l)?)|l(o(ck|g(f|l)?)|earerr)|a(sin(h(f|l)?|f|l)?|cos(h(f|l)?|f|l)?|tan(h(f|l)?|f|l)?|lloc|rg(f|l)?|bs(f|l)?)|real(f|l)?|brt(f|l)?)|t(ime|o(upper|lower)|an(h(f|l)?|f|l)?|runc(f|l)?|gamma(f|l)?|mp(nam|file))|i(s(space|n(ormal|an)|cntrl|inf|digit|u(nordered|pper)|p(unct|rint)|finite|w(space|c(ntrl|type)|digit|upper|p(unct|rint)|lower|al(num|pha)|graph|xdigit|blank)|l(ower|ess(equal|greater)?)|al(num|pha)|gr(eater(equal)?|aph)|xdigit|blank)|logb(f|l)?|max(div|abs))|di(v|fftime)|_Exit|unget(c|wc)|p(ow(f|l)?|ut(s|c(har)?|wc(har)?)|error|rintf)|e(rf(c(f|l)?|f|l)?|x(it|p(2(f|l)?|f|l|m1(f|l)?)?))|v(s(scanf|nprintf|canf|printf|w(scanf|printf))|printf|f(scanf|printf|w(scanf|printf))|w(scanf|printf)|a_(start|copy|end|arg))|qsort|f(s(canf|e(tpos|ek))|close|tell|open|dim(f|l)?|p(classify|ut(s|c|w(s|c))|rintf)|e(holdexcept|set(e(nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(aiseexcept|ror)|get(e(nv|xceptflag)|round))|flush|w(scanf|ide|printf|rite)|loor(f|l)?|abs(f|l)?|get(s|c|pos|w(s|c))|re(open|e|ad|xp(f|l)?)|m(in(f|l)?|od(f|l)?|a(f|l|x(f|l)?)?))|l(d(iv|exp(f|l)?)|o(ngjmp|cal(time|econv)|g(1(p(f|l)?|0(f|l)?)|2(f|l)?|f|l|b(f|l)?)?)|abs|l(div|abs|r(int(f|l)?|ound(f|l)?))|r(int(f|l)?|ound(f|l)?)|gamma(f|l)?)|w(scanf|c(s(s(tr|pn)|nc(py|at|mp)|c(spn|hr|oll|py|at|mp)|to(imax|d|u(l(l)?|max)|k|f|l(d|l)?|mbs)|pbrk|ftime|len|r(chr|tombs)|xfrm)|to(b|mb)|rtomb)|printf|mem(set|c(hr|py|mp)|move))|a(s(sert|ctime|in(h(f|l)?|f|l)?)|cos(h(f|l)?|f|l)?|t(o(i|f|l(l)?)|exit|an(h(f|l)?|2(f|l)?|f|l)?)|b(s|ort))|g(et(s|c(har)?|env|wc(har)?)|mtime)|r(int(f|l)?|ound(f|l)?|e(name|alloc|wind|m(ove|quo(f|l)?|ainder(f|l)?))|a(nd|ise))|b(search|towc)|m(odf(f|l)?|em(set|c(hr|py|mp)|move)|ktime|alloc|b(s(init|towcs|rtowcs)|towc|len|r(towc|len))))(\b))|([\s\S])/g,/(?:(?=\s)(?:|)(\s+))?((\b(?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()(?=((?:(?!NS)[A-Za-z_](?=([A-Za-z0-9_]*))\6\b|::)+))\5)(\s*(\()))|([\s\S])/g,/(?:(?=\s)(?:)(\s+))?((\b(?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()(?=((?:(?!NS)[A-Za-z_](?=([A-Za-z0-9_]*))\6\b|::)+))\5)(\s*(\()))|([\s\S])/g,/((\b(?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\s*\()(?=((?:(?!NS)[A-Za-z_](?=([A-Za-z0-9_]*))\6\b|::)+))\5)(\s*(\()))|([\s\S])/g,/(?:(?:(?=\s)\s+))((?=((?:[A-Za-z_](?=([A-Za-z0-9_]*))\3|::)+))\2|(?:(?:operator)(?:[\-\*&<>=\+!]+|\(\)|\[\]))?)(\s*(\())|([\s\S])/g,/\/\*\*\/|([\s\S])/g,/^(\3)((;?)((?=\n)))|([\s\S])/g,/^\s*(#\s*(if(n?def)?)(\b.*?(?:(?=(?:\/\/|\/\*))|(?=\n))))|([\s\S])/g,/\b(?:[a-z]\w*(\.))*([A-Z]+\w*)|([\s\S])/g,/(?=:)|([\s\S])/g,/\b([a-zA-Z_][a-zA-Z_0-9]*)(\s*(?:(,)|(?=[\n\):])))|([\s\S])/g,/(#)(.*(?=\n)\n?)|([\s\S])/g,/\b(?:(0[xX][0-9a-fA-F]*)[lL])|([\s\S])/g,/\b(?:(0[xX][0-9a-fA-F]*))|([\s\S])/g,/\b(?:(0[0-7]+)[lL])|([\s\S])/g,/\b(0[0-7]+)|([\s\S])/g,/[^a-zA-Z0-9_]|/g,/\b(?:(((\d+(\.(?=[^a-zA-Z_])\d*)?|\.\d+)([eE][\-\+]?\d+)?))[jJ])|([\s\S])/g,/\b(?:(((\d+(\.(?=[^a-zA-Z_])\d*)?)([eE][\-\+]?\d+)?))[jJ])|([\s\S])/g,/\b(?:(\d+\.\d*([eE][\-\+]?\d+)?))(?=[^a-zA-Z_])|([\s\S])/g,/[^0-9a-zA-Z_]|/g,/(?:(\.\d+([eE][\-\+]?\d+)?))|([\s\S])/g,/\b(?:(\d+[eE][\-\+]?\d+))|([\s\S])/g,/\b(?:([1-9]+[0-9]*|0)[lL])|([\s\S])/g,/\b([1-9]+[0-9]*|0)|([\s\S])/g,/\b(global)(\b)|([\s\S])/g,/\b(?:(import)|(from))(\b)|([\s\S])/g,/\b(elif|else|except|finally|for|if|try|while|with)\b|([\s\S])/g,/\b(break|continue|pass|raise|return|yield)\b|([\s\S])/g,/\b(and|in|is|not|or)\b|([\s\S])/g,/\b(as|assert|del|exec|print)(\b)|([\s\S])/g,/<=|>=|==|<|>|<>|([\s\S])/g,/\+=|\-=|\*=|\/=|\/\/=|%=|&=|\|=|\^=|>>=|<<=|\*\*=|([\s\S])/g,/\+|\-|\*|\*\*|\/|\/\/|%|<<|>>|&|\||\^|~|([\s\S])/g,/^\s*(class)(\s+(?=[a-zA-Z_][a-zA-Z_0-9]*\s*:))|([\s\S])/g,/^\s*(class)(\s+(?=[a-zA-Z_][a-zA-Z_0-9]*\s*\())|([\s\S])/g,/^\s*(class)(\s+(?=[a-zA-Z_][a-zA-Z_0-9]))|([\s\S])/g,/^\s*(def)(\s+(?=[A-Za-z_][A-Za-z0-9_]*\s*\())|([\s\S])/g,/^\s*(def)(\s+(?=[A-Za-z_][A-Za-z0-9_]*))|([\s\S])/g,/(lambda)((?=\s+))|([\s\S])/g,/^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\()|([\s\S])/g,/^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*)|([\s\S])/g,/\s*(\()|([\s\S])/g,/(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\()|([\s\S])/g,/(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)|([\s\S])/g,/\s*(\[)|([\s\S])/g,/\b(def|lambda)(\b)|([\s\S])/g,/\b(class)(\b)|([\s\S])/g,/\b(None|True|False|Ellipsis|NotImplemented)\b|([\s\S])/g,/(\[)((\s*(\]))(\b))|([\s\S])/g,/(\()(\s*(\)))|([\s\S])/g,/(\{)(\s*(\}))|([\s\S])/g,/page|include|taglib|([\s\S])/g,/\b(artwork|application|encoder|EQ preset|item|source|visual|(EQ |browser )?window|((audio CD|device|shared|URL|file) )?track|playlist window|((audio CD|device|radio tuner|library|folder|user) )?playlist)s?\b|([\s\S])/g,/\b(add|back track|convert|fast forward|(next|previous) track|pause|play(pause)?|refresh|resume|rewind|search|stop|update|eject|subscribe|update(Podcast|AllPodcasts)|download)\b|([\s\S])/g,/\b(current (playlist|stream (title|URL)|track)|player state)\b|([\s\S])/g,/\b(current (encoder|EQ preset|visual)|EQ enabled|fixed indexing|full screen|mute|player position|sound volume|visuals enabled|visual size)\b|([\s\S])/g,/\s*(?:(?=\})|(:))|([\s\S])/g,/\]\]>|([\s\S])/g,/[><]\(|([\s\S])/g,/&>|\d*>&\d*|\d*(>>|>|<)|\d*<&|\d*<>|([\s\S])/g,/(?=\w?[^=;]*(?:class|(?:@)?interface|enum)\s+\w+)|([\s\S])/g,/^(SQL)((;?)((?=\n)\n?))|([\s\S])/g,/^\s*#\s*if(n?def)?\b.*(?=\n)|([\s\S])/g,/|(?=\w)|([\s\S])/g,/(?=\w)|([\s\S])/g,/\s*((\/\/)(.*(?=\n)\n?))|([\s\S])/g,/\b(time)\b|([\s\S])/g,/[\|!]|([\s\S])/g,/\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|\-)?[0-9]+)?)\b|([\s\S])/g,/(\/)([imsxeADSUXu]*)(")|([\s\S])/g,/\\\}|\\\\|([\s\S])/g,/\b(?:void|boolean|byte|char|short|int|float|long|double)\b|([\s\S])/g,/\b(assert)(\s)|([\s\S])/g,/\s*\1(?=\n)|([\s\S])/g,/(?:^\s*)<\?python(?!.*\?>)|([\s\S])/g,/(\[{2})|([\s\S])/g,/(\({2})|([\s\S])/g,/(\{)((?=\s|(?=\n)))|([\s\S])/g,/[A-Za-z_][A-Za-z_0-9]*(?=\s*\()|([\s\S])/g,/(?!new)(?=\w)(?![^\{]*;)(?!.*\/\/)(?!.*=)(?=.*\()|([\s\S])/g,/'\/(?=(?=((\\.|[^'\/])+))\1\/[imsxeADSUXu]*')|([\s\S])/g,/\b([a-zA-Z\-:]+)|([\s\S])/g,/!|:[\-=\?]?|\*|@|#{1,2}|%{1,2}|\/|([\s\S])/g,/(\[)(([^\]]+)(\]))|([\s\S])/g,/(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()|([\s\S])/g,/(?=\{|;)|([\s\S])/g,/\b((alert|dialog) reply)\b|([\s\S])/g,/\b(file information)\b|([\s\S])/g,/\b(POSIX files?|system information|volume settings)\b|([\s\S])/g,/\b(URLs?|internet address(es)?|web pages?|FTP items?)\b|([\s\S])/g,/\b(info for|list (disks|folder)|mount volume|path to( resource)?)\b|([\s\S])/g,/\b(beep|choose (application|color|file( name)?|folder|from list|remote application|URL)|delay|display (alert|dialog)|say)\b|([\s\S])/g,/\b(ASCII (character|number)|localized string|offset|summarize)\b|([\s\S])/g,/\b(set the clipboard to|the clipboard|clipboard info)\b|([\s\S])/g,/\b(open for access|close access|read|write|get eof|set eof)\b|([\s\S])/g,/\b((load|store|run) script|scripting components)\b|([\s\S])/g,/\b(current date|do shell script|get volume settings|random number|round|set volume|system attribute|system info|time to GMT)\b|([\s\S])/g,/\b(opening folder|(closing|moving) folder window for|adding folder items to|removing folder items from)\b|([\s\S])/g,/\b(open location|handle CGI request)\b|([\s\S])/g,/\s*(?:(,)|(?=\]))|([\s\S])/g,/\b(and|as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|raise|return|try|while|with|yield)\b|([\s\S])/g,/(?=\])|([\s\S])/g,/(\b0*((1?[0-9]{1,2})|(2([0-4][0-9]|5[0-5])))\s*,\s*)(0*((1?[0-9]{1,2})|(2([0-4][0-9]|5[0-5])))\s*,\s*)(0*((1?[0-9]{1,2})|(2([0-4][0-9]|5[0-5])))\b)|([\s\S])/g,/\b([0-9]{1,2}|100)\s*%,\s*([0-9]{1,2}|100)\s*%,\s*([0-9]{1,2}|100)\s*%|([\s\S])/g,/[^'"\) \t]+|([\s\S])/g,/\\[`\\\$]|([\s\S])/g,/(>(<))(\/(?:([\-_a-zA-Z0-9]+)((:)))?(([\-_a-zA-Z0-9:]+)(>)))|([\s\S])/g,/(?=<\/(?:[sS][tT][yY][lL][eE]))|([\s\S])/g,/'|/g,/(')((('))((?!')))|([\s\S])/g,/([uU]r)(''')|([\s\S])/g,/([uU]R)(''')|([\s\S])/g,/(r)(''')|([\s\S])/g,/(R)(''')|([\s\S])/g,/([uU])(''')|([\s\S])/g,/([uU]r)(')|([\s\S])/g,/([uU]R)(')|([\s\S])/g,/(r)(')|([\s\S])/g,/(R)(')|([\s\S])/g,/([uU])(')|([\s\S])/g,/(''')((?=\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)))|([\s\S])/g,/(')((?=\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)))|([\s\S])/g,/(')|([\s\S])/g,/\s*(\))(\s*)|([\s\S])/g,/\bnew\b|([\s\S])/g,/\$\({2}|([\s\S])/g,/\$\(|([\s\S])/g,/\b(friend|explicit|virtual)\b|([\s\S])/g,/\b(private:|protected:|public:)|([\s\S])/g,/\b(catch|operator|try|throw|using)\b|([\s\S])/g,/\bdelete\b(\s*\[\])?|\bnew\b(?!\])|([\s\S])/g,/\b(f|m)[A-Z]\w*\b|([\s\S])/g,/\b(this)\b|([\s\S])/g,/\btemplate\b\s*|([\s\S])/g,/\b(const_cast|dynamic_cast|reinterpret_cast|static_cast)\b\s*|([\s\S])/g,/\b(and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq)\b|([\s\S])/g,/\b(class|wchar_t)\b|([\s\S])/g,/\b(export|mutable|typename)\b|([\s\S])/g,/=|/g,/(?:^|(?:))((?=((?:[A-Za-z_][A-Za-z0-9_]*::)*))\2~[A-Za-z_][A-Za-z0-9_]*)(\s*(\())|([\s\S])/g,/(?:^)((?=((?:[A-Za-z_][A-Za-z0-9_]*::)*))\2~[A-Za-z_][A-Za-z0-9_]*)(\s*(\())|([\s\S])/g,/(?=\n)|'|([\s\S])/g,/\\(x[0-9a-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)|([\s\S])/g,/;|&&|&|\|\||([\s\S])/g,/\\(\\|[abefnprtv'"\?]|[0-3]\d{0,2}|[4-7]\d?|x[a-fA-F0-9]{0,2})|([\s\S])/g,/(<!)((ENTITY)(\s([\-_a-zA-Z0-9]+)))|([\s\S])/g,/(<<<)((')([^']*(')))|([\s\S])/g,/(<<<)((")((\\("|\\)|[^"])*(")))|([\s\S])/g,/(<<<)(([^\s\\]|\\.)+)|([\s\S])/g,/^\s*(class)(\s+(([\.a-zA-Z0-9_:]+(\s*(<)(\s*[\.a-zA-Z0-9_:]+))?)|((<<)(\s*[\.a-zA-Z0-9_:]+))))|([\s\S])/g,/^\s*(module)(\s+(([A-Z]\w*(::))?(([A-Z]\w*(::))?(([A-Z]\w*(::))*([A-Z]\w*)))))|([\s\S])/g,/\belse(\s)+if\b|([\s\S])/g,/\b(BEGIN|begin|case|class|else|elsif|END|end|ensure|for|if|in|module|rescue|then|unless|until|when|while)\b(?![\?!])|([\s\S])/g,/\bdo\b\s*|([\s\S])/g,/\{|/g,/(\s+)|([\s\S])/g,/\b(and|not|or)\b|([\s\S])/g,/\b(alias|alias_method|break|next|redo|retry|return|super|undef|yield)\b(?![\?!])|\bdefined\?|\bblock_given\?|([\s\S])/g,/\bdefined\?|\bblock_given\?|([\s\S])/g,/\b(nil|true|false)\b(?![\?!])|([\s\S])/g,/\b(__(FILE|LINE)__|self)\b(?![\?!])|([\s\S])/g,/\b(initialize|new|loop|include|extend|raise|attr_reader|attr_writer|attr_accessor|attr|catch|throw|private|module_function|public|protected)\b(?![\?!])|([\s\S])/g,/\b(require|gem)(\b)|([\s\S])/g,/(@)([a-zA-Z_]\w*)|([\s\S])/g,/(@@)([a-zA-Z_]\w*)|([\s\S])/g,/(\$)([a-zA-Z_]\w*)|([\s\S])/g,/(\$)(!|@|&|`|'|\+|\d+|~|=|\/|\\|,|;|\.|<|>|_|\*|\$|\?|:|"|\-[0adFiIlpv])|([\s\S])/g,/\b(ENV)(\[)|([\s\S])/g,/\b[A-Z]\w*(?=((\.|::)[A-Za-z]|\[))|([\s\S])/g,/\b[A-Z]\w*\b|([\s\S])/g,/(?=def\b)(def)(\s+((?=([a-zA-Z_]\w*(?=(\.|::))\5))\4?(?=([a-zA-Z_]\w*(?=([\?!]|=(?!>)))\7?|===?|>[>=]?|<=>|<[<=]?|[%&`\/\|]|\*\*?|=?~|[\-\+]@?|\[\]=?))\6)(\s*(\()))|([\s\S])/g,/(?=def\b)(def)(\s+((?=([a-zA-Z_]\w*(?=(\.|::))\5))\4?(?=([a-zA-Z_]\w*(?=([\?!]|=(?!>)))\7?|===?|>[>=]?|<=>|<[<=]?|[%&`\/\|]|\*\*?|=?~|[\-\+]@?|\[\]=?))\6)([ \t](?=[ \t]*[^\s#])))|([\s\S])/g,/(?=def\b)(def)(\b(\s+((?=([a-zA-Z_]\w*(?=(\.|::))\6))\5?(?=([a-zA-Z_]\w*(?=([\?!]|=(?!>)))\8?|===?|>[>=]?|<=>|<[<=]?|[%&`\/\|]|\*\*?|=?~|[\-\+]@?|\[\]=?))\7))?)|([\s\S])/g,/\b(0[xX][0-9a-fA-F](?=(_?[0-9a-fA-F]))\2*|\d(?=(_?\d))\3*(\.(?![^[:space:][:digit:]])(?=(_?\d))\5*)?([eE][\-\+]?\d(?=(_?\d))\7*)?|0[bB][01]+)\b|([\s\S])/g,/:'|([\s\S])/g,/:"|([\s\S])/g,/\/=|([\s\S])/g,/%x\{|([\s\S])/g,/%x\[|([\s\S])/g,/%x<|([\s\S])/g,/%x\(|([\s\S])/g,/%x([^\w])|([\s\S])/g,/[=>~\(\?:\[,\|&;]|/g,/[\s;]if\s|[\s;]or\s|/g,/[\s\.]sub\s|[\s;]and\s|[\s;]not\s|/g,/[\s\.]scan\s|[\s\.]sub!\s|[\s\.]gsub\s|[\s;]when\s|/g,/[\s;]while\s|[\s\.]index\s|[\s;]elsif\s|[\s\.]gsub!\s|[\s\.]match\s|/g,/[\s;]unless\s|/g,/[\s;]assert_match\s|/g,/^if\s|/g,/^when\s|/g,/^while\s|^elsif\s|/g,/^unless\s|/g,/(?:^||)\s*((\/))((?![\*\+\{\}\?]))|([\s\S])/g,/(?:^|)\s*((\/))((?![\*\+\{\}\?]))|([\s\S])/g,/(?:^)\s*((\/))((?![\*\+\{\}\?]))|([\s\S])/g,/%r\[|([\s\S])/g,/%r\(|([\s\S])/g,/%r<|([\s\S])/g,/%r([^\w])|([\s\S])/g,/%[QWSR]?\(|([\s\S])/g,/%[QWSR]?\[|([\s\S])/g,/%[QWSR]?<|([\s\S])/g,/%[QWSR]?\{|([\s\S])/g,/%[QWSR]([^\w])|([\s\S])/g,/%([^\w\s=])|([\s\S])/g,/%[qws]\(|([\s\S])/g,/%[qws]<|([\s\S])/g,/%[qws]\[|([\s\S])/g,/%[qws]\{|([\s\S])/g,/%[qws]([^\w])|([\s\S])/g,/(:)((?=([a-zA-Z_]\w*(?=([\?!]|=(?![>=])))\4?|===?|>[>=]?|<[<=]?|<=>|[%&`\/\|]|\*\*?|=?~|[\-\+]@?|\[\]=?|@@?[a-zA-Z_]\w*))\3)|([\s\S])/g,/(?=([a-zA-Z_]\w*(?=([\?!]|=(?![>=])))\2?|===?|>[>=]?|<[<=]?|<=>|[%`\/\|]|\*\*?|=?~|[\-\+]@?|\[\]=?|@@?[a-zA-Z_]\w*))\1(:)((?!:))|([\s\S])/g,/^=begin|([\s\S])/g,/(?:^[ \t]+)?(#)(.*(?=\n)\n?)|([\s\S])/g,/\?(\\(x[0-9a-fA-F]{1,2}(?![0-9a-fA-F])\b|0[0-7]{0,2}(?![0-7])\b|[^x0MC])|(\\[MC]\-)+\w|[^\s\\])|([\s\S])/g,/^__END__\n|([\s\S])/g,/(?=(=\s*<<(\w+)))\1(?!\s+#\s*([Cc]|sh|[Jj]ava))|([\s\S])/g,/(?=(<<\-HTML\b))\1|([\s\S])/g,/(?=(<<\-SQL\b))\1|([\s\S])/g,/(?=(<<\-(["\\']?)(\w+_(?:[eE][vV][aA][lL]))\2))\1|([\s\S])/g,/(?=(<<\-(\w+)))\1|([\s\S])/g,/(?=(=\s*<<(\w+)))\1(?=\s+#\s*[Cc](?!(\+\+|[Ss][Ss])))|([\s\S])/g,/(?=(=\s*<<(\w+)))\1(?=\s+#\s*[Cc]\+\+)|([\s\S])/g,/(?=(=\s*<<(\w+)))\1(?=\s+#\s*[Cc][Ss][Ss])|([\s\S])/g,/(?=(=\s*<<(\w+)))\1(?=\s+#\s*[Jj]ava[Ss]cript)|([\s\S])/g,/(?=(=\s*<<(\w+)))\1(?=\s+#\s*sh)|([\s\S])/g,/do|\{\s|/g,/do\s|/g,/<<=|%=|&=|\*=|\*\*=|\+=|\-=|\^=|\|{1,2}=|<<|([\s\S])/g,/[ \t]|/g,/<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|\?|([\s\S])/g,/<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|([\s\S])/g,/!+|\bnot\b|&&|\band\b|\|\||\bor\b|\^|([\s\S])/g,/\bnot\b|&&|\band\b|\|\||\bor\b|\^|([\s\S])/g,/(%|&|\*\*|\*|\+|\-|\/)|([\s\S])/g,/\||~|>>|([\s\S])/g,/\.|::|([\s\S])/g];
+var B=[[A[0],3,[1],[[2]]],[A[1],2,[1],[[]]],[A[2],3,[1],[[2]]],[A[3],1,[],[]],[A[4],1,[],[]],[A[5],4,[1,3],[[2],[]]],[A[6],3,[1,2],[[2],[]]],[A[7],1,[0],[[]]],[A[8],10,[1,4,5,6,7],[[2],[5,7,8],[7,8],[7,8],[8]]],[A[9],7,[1,3,4,5,6],[[2],[4,6],[6],[6],[]]],[A[10],5,[1,4],[[2],[]]],[A[11],1,[],[]],[A[12],1,[0],[[]]],[A[13],1,[0],[[]]],[A[14],1,[0],[[]]],[A[15],1,[0],[[]]],[A[16],1,[0],[[]]],[A[17],2,[],[]],[A[18],2,[],[]],[A[19],1,[],[]],[A[20],1,[],[]],[A[21],3,[],[]],[A[22],1,[0],[[]]],[A[23],1,[],[]],[A[24],1,[],[]],[A[3],1,[],[]],[A[25],3,[0,1],[[],[2]]],[A[26],1,[],[]],[A[27],4,[1,2],[[],[3]]],[A[28],4,[1,2],[[],[3]]],[A[29],1,[],[]],[A[29],1,[],[]],[A[31],1,[0],[[]]],[A[32],2,[1],[[]]],[A[27],4,[1,2],[[],[3]]],[A[28],4,[1,2],[[],[3]]],[A[29],1,[],[]],[A[33],10,[1,3,8],[[2,6],[5,6],[9]]],[A[34],4,[1,3],[[2],[]]],[A[35],9,[1,3,5,7],[[2],[4],[6],[8]]],[A[36],5,[1,3],[[2],[4]]],[A[37],34,[1,3,5,7,9,12,14,16,19,21,24,26,28,30,32],[[2],[4],[6],[8],[10,11],[13],[15,18],[17,18],[20],[22,23],[25],[27],[29,33],[31,33],[33]]],[A[38],3,[],[]],[A[39],1,[],[]],[A[40],11,[],[]],[A[41],4,[],[]],[A[42],1,[],[]],[A[43],5,[],[]],[A[44],3,[],[]],[A[45],1,[],[]],[A[46],4,[],[]],[A[47],1,[],[]],[A[48],2,[],[]],[A[49],1,[],[]],[A[50],1,[],[]],[A[51],1,[],[]],[A[52],1,[],[]],[A[53],5,[],[]],[A[54],2,[],[]],[A[55],2,[],[]],[A[56],4,[1,3],[[2],[]]],[A[57],3,[1],[[2]]],[A[58],5,[1,3],[[2],[4]]],[A[59],3,[1],[[2]]],[A[60],5,[1,3],[[2],[4]]],[A[61],3,[1],[[2]]],[A[62],3,[1],[[2]]],[A[63],1,[0],[[]]],[A[64],3,[1],[[2]]],[A[65],1,[],[]],[A[66],1,[0],[[]]],[A[67],1,[],[]],[A[68],5,[1,4],[[2],[]]],[A[11],1,[],[]],[A[69],1,[],[]],[A[70],1,[],[]],[A[24],1,[0],[[]]],[A[71],4,[1,3],[[2],[]]],[A[72],4,[1],[[2]]],[A[15],1,[0],[[]]],[A[32],2,[1],[[]]],[A[24],1,[0],[[]]],[A[3],1,[],[]],[A[73],1,[],[]],[A[74],1,[],[]],[A[1],2,[1],[[]]],[A[75],1,[0],[[]]],[A[3],1,[],[]],[A[4],1,[],[]],[A[76],5,[1,3],[[2],[4]]],[A[77],1,[0],[[]]],[A[78],1,[],[]],[A[65],1,[0],[[]]],[A[79],5,[1,2],[[4],[3,4]]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[82],1,[],[]],[A[83],6,[1,5],[[4],[]]],[A[84],1,[0],[[]]],[A[31],1,[0],[[]]],[A[84],1,[0],[[]]],[A[85],1,[],[]],[A[70],1,[],[]],[A[86],1,[],[]],[A[65],1,[0],[[]]],[A[82],1,[0],[[]]],[A[65],1,[0],[[]]],[A[87],3,[0,1],[[],[2]]],[A[88],6,[],[]],[A[32],2,[1],[[]]],[A[24],1,[0],[[]]],[A[89],1,[],[]],[A[90],2,[],[]],[A[91],2,[1],[[]]],[A[27],4,[1,2],[[],[3]]],[A[92],5,[1,2],[[4],[3,4]]],[A[29],1,[],[]],[A[82],1,[0],[[]]],[A[93],1,[],[]],[A[94],2,[],[]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[95],1,[],[]],[A[96],1,[],[]],[A[97],3,[1,2],[[],[]]],[A[98],3,[1],[[2]]],[A[82],1,[],[]],[A[99],1,[0],[[]]],[A[15],1,[0],[[]]],[A[66],1,[],[]],[A[100],1,[],[]],[A[101],4,[1],[[2]]],[A[102],5,[],[]],[A[103],3,[],[]],[A[104],4,[],[]],[A[105],3,[],[]],[A[106],2,[],[]],[A[107],2,[],[]],[A[108],1,[],[]],[A[109],7,[1,4,5],[[2],[6],[6]]],[A[110],4,[],[]],[A[111],5,[1,3],[[2],[4]]],[A[112],9,[],[]],[A[113],4,[1],[[3]]],[A[114],2,[1],[[]]],[A[115],8,[1,2,3,5,7],[[6],[6],[4,6],[6],[]]],[A[116],1,[],[]],[A[117],1,[],[]],[A[118],3,[0,1],[[],[2]]],[A[119],3,[1,2],[[2],[]]],[A[120],1,[],[]],[A[121],1,[],[]],[A[122],1,[],[]],[A[123],2,[],[]],[A[124],5,[1,3],[[2],[4]]],[A[16],1,[0],[[]]],[A[126],2,[],[]],[A[127],2,[],[]],[A[128],1,[],[]],[A[65],1,[0],[[]]],[A[24],1,[0],[[]]],[A[65],1,[0],[[]]],[A[129],1,[],[]],[A[90],2,[],[]],[A[16],1,[0],[[]]],[A[15],1,[0],[[]]],[A[130],3,[1],[[2]]],[A[131],1,[0],[[]]],[A[132],3,[1],[[2]]],[A[133],1,[],[]],[A[66],1,[0],[[]]],[A[97],3,[1,2],[[],[]]],[A[134],4,[1,3],[[2],[]]],[A[135],9,[1,3,5,7,8],[[2],[4],[6],[8],[]]],[A[136],6,[1,3],[[2],[4]]],[A[95],1,[],[]],[A[137],5,[1,3],[[2],[4]]],[A[138],5,[1,3],[[2],[4]]],[A[82],1,[0],[[]]],[A[139],1,[0],[[]]],[A[140],7,[1,2,5,6],[[4],[3,4],[6],[]]],[A[141],1,[],[]],[A[142],4,[1],[[2]]],[A[24],1,[0],[[]]],[A[143],4,[1],[[2]]],[A[23],1,[0],[[]]],[A[144],4,[1],[[2]]],[A[16],1,[0],[[]]],[A[145],1,[0],[[]]],[A[77],1,[0],[[]]],[A[67],1,[],[]],[A[146],2,[1],[[]]],[A[32],2,[1],[[]]],[A[147],2,[1],[[]]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[16],1,[0],[[]]],[A[24],1,[0],[[]]],[A[151],2,[],[]],[A[152],5,[0,1,3],[[],[2],[4]]],[A[153],5,[0,1,3],[[],[2],[4]]],[A[154],5,[0,1,3],[[],[2],[4]]],[A[155],5,[0,1,3],[[],[2],[4]]],[A[16],1,[0],[[]]],[A[156],1,[],[]],[A[16],1,[0],[[]]],[A[66],1,[0],[[]]],[A[157],1,[0],[[]]],[A[1],2,[1],[[]]],[A[158],2,[1],[[]]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[159],5,[0,1,3],[[],[2],[4]]],[A[160],1,[0],[[]]],[A[161],2,[1],[[]]],[A[29],1,[],[]],[A[163],1,[],[]],[A[164],1,[0],[[]]],[A[165],1,[],[]],[A[166],1,[],[]],[A[167],1,[],[]],[A[168],6,[1,2,5],[[],[3],[]]],[A[169],20,[1,2,5,7,9,11,13,14,15,17,18,19],[[4],[3,4],[6],[],[],[12],[19],[19],[16,19],[19],[19],[]]],[A[170],11,[0],[[]]],[A[65],1,[0],[[]]],[A[171],1,[],[]],[A[172],1,[0],[[]]],[A[173],1,[],[]],[A[174],1,[0],[[]]],[A[175],6,[2],[[3]]],[A[16],1,[0],[[]]],[A[176],2,[],[]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[177],1,[0],[[]]],[A[85],1,[],[]],[A[70],1,[],[]],[A[178],1,[],[]],[A[180],1,[],[]],[A[146],2,[1],[[]]],[A[181],3,[1],[[2]]],[A[182],2,[1],[[]]],[A[183],2,[],[]],[A[184],2,[],[]],[A[185],3,[1],[[2]]],[A[186],4,[1],[[2]]],[A[187],4,[1],[[2]]],[A[188],4,[1],[[2]]],[A[189],4,[1],[[2]]],[A[190],4,[1],[[2]]],[A[191],4,[1],[[2]]],[A[192],5,[1,3],[[2],[4]]],[A[193],3,[1],[[2]]],[A[194],1,[],[]],[A[195],2,[1],[[]]],[A[196],3,[0,1],[[],[2]]],[A[65],1,[0],[[]]],[A[197],5,[1,4],[[2],[]]],[A[198],5,[1,4],[[2],[]]],[A[199],3,[1],[[2]]],[A[200],3,[1,2],[[],[]]],[A[201],1,[],[]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[82],1,[],[]],[A[202],2,[1],[[]]],[A[67],1,[],[]],[A[203],1,[0],[[]]],[A[204],12,[1,3,4,6,7,8,10],[[2],[10],[5,10],[7,10],[10],[9,10],[]]],[A[205],1,[0],[[]]],[A[207],4,[0,2],[[],[3]]],[A[208],3,[0,-1],[[],[]]],[A[209],2,[],[]],[A[84],1,[0],[[]]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[16],1,[0],[[]]],[A[65],1,[],[]],[A[210],2,[1],[[]]],[A[211],1,[],[]],[A[24],1,[0],[[]]],[A[65],1,[],[]],[A[212],14,[1,3,5,6,9,11,13],[[2],[4],[8],[7,8],[10],[12],[]]],[A[213],14,[1,3,5,6,9,11,12],[[2],[4],[8],[7,8],[10,13],[13],[13]]],[A[214],14,[1,3,5,6,9,11,12],[[2],[4],[8],[7,8],[10,13],[13],[13]]],[A[215],7,[1,3,4],[[2],[6],[5,6]]],[A[216],10,[1,3,4,7],[[2],[6],[5,6],[8,9]]],[A[217],1,[0],[[]]],[A[218],1,[],[]],[A[219],1,[0],[[]]],[A[220],2,[],[]],[A[97],3,[1,2],[[],[]]],[A[221],2,[1],[[]]],[A[222],5,[1,3,4],[[2],[],[]]],[A[201],1,[],[]],[A[182],2,[1],[[]]],[A[82],1,[0],[[]]],[A[223],4,[1,3],[[2],[]]],[A[224],1,[0],[[]]],[A[225],3,[1],[[2]]],[A[226],1,[],[]],[A[146],2,[1],[[]]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[227],1,[0],[[]]],[A[228],1,[0],[[]]],[A[229],4,[1,3],[[2],[]]],[A[230],2,[0],[[]]],[A[231],1,[0],[[]]],[A[232],1,[],[]],[A[15],1,[],[]],[A[29],1,[],[]],[A[16],1,[0],[[]]],[A[24],1,[0],[[]]],[A[234],3,[1],[[2]]],[A[235],3,[1],[[2]]],[A[236],3,[1],[[2]]],[A[237],1,[0],[[]]],[A[146],2,[1],[[]]],[A[240],1,[],[]],[A[241],1,[],[]],[A[242],1,[],[]],[A[243],3,[],[]],[A[16],1,[0],[[]]],[A[244],2,[],[]],[A[245],1,[],[]],[A[246],3,[0,1],[[],[2]]],[A[247],1,[],[]],[A[226],1,[],[]],[A[226],1,[0],[[]]],[A[97],3,[1,2],[[],[]]],[A[226],1,[],[]],[A[248],2,[],[]],[A[249],1,[0],[[]]],[A[217],1,[0],[[]]],[A[250],4,[1],[[2]]],[A[251],4,[1],[[2]]],[A[252],7,[1,3,5],[[2],[4],[6]]],[A[253],7,[1,3,5],[[2],[4],[6]]],[A[254],10,[],[]],[A[255],3,[1],[[2]]],[A[256],9,[1,3,5,6],[[2],[4],[8],[7,8]]],[A[257],2,[],[]],[A[258],11,[1,3,5,7,8,10],[[2],[4],[6],[9],[9],[]]],[A[259],4,[],[]],[A[260],4,[],[]],[A[261],9,[1,3,5,6,8],[[2],[4],[],[7],[]]],[A[262],4,[1,3],[[2],[]]],[A[263],1,[],[]],[A[264],2,[],[]],[A[265],1,[],[]],[A[266],2,[],[]],[A[267],2,[],[]],[A[268],2,[],[]],[A[269],3,[],[]],[A[270],1,[],[]],[A[271],2,[],[]],[A[272],2,[],[]],[A[273],1,[],[]],[A[274],4,[1,3],[[2],[]]],[A[276],5,[1,3],[[2],[4]]],[A[129],1,[],[]],[A[90],2,[],[]],[A[277],3,[0,1],[[],[2]]],[A[278],3,[],[]],[A[279],6,[],[]],[A[280],2,[],[]],[A[281],2,[],[]],[A[282],2,[],[]],[A[283],2,[],[]],[A[284],2,[],[]],[A[285],14,[],[]],[A[286],2,[],[]],[A[287],3,[],[]],[A[288],3,[],[]],[A[289],3,[],[]],[A[290],3,[],[]],[A[291],2,[],[]],[A[97],3,[1,2],[[],[]]],[A[16],1,[0],[[]]],[A[16],1,[0],[[]]],[A[292],1,[0],[[]]],[A[293],2,[],[]],[A[294],2,[],[]],[A[295],2,[],[]],[A[296],2,[],[]],[A[297],2,[],[]],[A[298],2,[1],[[]]],[A[299],1,[0],[[]]],[A[300],1,[0],[[]]],[A[301],1,[0],[[]]],[A[302],6,[1,3,5],[[2],[4],[]]],[A[303],4,[1,3],[[2],[]]],[A[84],1,[0],[[]]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[308],3,[1],[[2]]],[A[1],2,[1],[[]]],[A[292],1,[0],[[]]],[A[65],1,[0],[[]]],[A[31],1,[0],[[]]],[A[3],1,[],[]],[A[309],1,[0],[[]]],[A[310],3,[0],[[]]],[A[16],1,[0],[[]]],[A[3],1,[],[]],[A[226],1,[0],[[]]],[A[16],1,[0],[[]]],[A[311],3,[0,1],[[],[2]]],[A[312],2,[],[]],[A[313],2,[],[]],[A[314],11,[],[]],[A[315],4,[1],[[2]]],[A[316],3,[1,2],[[2],[]]],[A[317],3,[1,2],[[2],[]]],[A[318],3,[1,2],[[2],[]]],[A[319],3,[1,2],[[2],[]]],[A[320],3,[1,2],[[2],[]]],[A[321],3,[1,2],[[2],[]]],[A[322],3,[1,2],[[2],[]]],[A[323],3,[1,2],[[2],[]]],[A[324],3,[1,2],[[2],[]]],[A[325],3,[1,2],[[2],[]]],[A[326],4,[1],[[2]]],[A[327],4,[1],[[2]]],[A[81],2,[1],[[]]],[A[328],2,[1],[[]]],[A[24],1,[0],[[]]],[A[329],1,[],[]],[A[24],1,[0],[[]]],[A[3],1,[],[]],[A[331],2,[1],[[]]],[A[292],1,[0],[[]]],[A[332],1,[],[]],[A[333],1,[],[]],[A[334],3,[],[]],[A[335],3,[1],[[2]]],[A[336],3,[1],[[2]]],[A[49],1,[],[]],[A[337],4,[1],[[2]]],[A[338],4,[1],[[2]]],[A[339],15,[1,3,5,7,8,10,12],[[2],[4],[6,13],[13],[13],[11,13],[13]]],[A[340],1,[],[]],[A[341],1,[],[]],[A[65],1,[0],[[]]],[A[226],1,[0],[[]]],[A[342],1,[],[]],[A[69],1,[],[]],[A[70],1,[],[]],[A[343],2,[0,1],[[],[]]],[A[344],1,[0],[[]]],[A[345],3,[1],[[2]]],[A[346],3,[1],[[2]]],[A[347],3,[1],[[2]]],[A[84],1,[0],[[]]],[A[79],5,[1,2],[[4],[3,4]]],[A[348],2,[1],[[]]],[A[349],2,[],[]],[A[350],2,[],[]],[A[351],2,[],[]],[A[352],2,[],[]],[A[353],3,[],[]],[A[355],2,[],[]],[A[356],1,[],[]],[A[357],4,[1],[[2]]],[A[358],4,[1,3],[[2],[]]],[A[359],1,[],[]],[A[360],1,[0],[[]]],[A[361],2,[1],[[]]],[A[363],1,[],[]],[A[24],1,[0],[[]]],[A[226],1,[0],[[]]],[A[16],1,[0],[[]]],[A[146],2,[],[]],[A[364],2,[],[]],[A[23],1,[0],[[]]],[A[3],1,[],[]],[A[23],1,[],[]],[A[365],6,[0,1,4],[[],[2],[5]]],[A[366],6,[0,1,4],[[],[2],[5]]],[A[367],6,[0,1,4],[[],[2],[5]]],[A[368],6,[0,1,4],[[],[2],[5]]],[A[369],6,[0,1,4],[[],[2],[5]]],[A[370],6,[0,1,4],[[],[2],[5]]],[A[371],6,[0,1,4],[[],[2],[5]]],[A[372],6,[0,1,4],[[],[2],[5]]],[A[373],6,[0,1,4],[[],[2],[5]]],[A[374],6,[0,1,4],[[],[2],[5]]],[A[375],6,[0,1,4],[[],[2],[5]]],[A[376],6,[0,1,4],[[],[2],[5]]],[A[377],6,[0,1,4],[[],[2],[5]]],[A[378],6,[0,1,4],[[],[2],[5]]],[A[84],1,[0],[[]]],[A[379],1,[0],[[]]],[A[380],2,[1],[[]]],[A[381],5,[1,3],[[2],[4]]],[A[361],2,[1],[[]]],[A[382],1,[],[]],[A[383],2,[1],[[]]],[A[384],1,[0],[[]]],[A[385],10,[],[]],[A[356],1,[],[]],[A[386],4,[1,2,3],[[],[],[]]],[A[387],7,[1,3,5],[[2],[4],[6]]],[A[1],2,[1],[[]]],[A[388],4,[0],[[]]],[A[389],5,[1,4],[[2],[]]],[A[390],2,[],[]],[A[391],1,[],[]],[A[392],1,[0],[[]]],[A[393],1,[],[]],[A[394],1,[],[]],[A[395],1,[],[]],[A[396],1,[],[]],[A[203],1,[0],[[]]],[A[397],7,[1,3,4,5],[[2],[],[],[6]]],[A[98],3,[1],[[2]]],[A[24],1,[0],[[]]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[398],2,[],[]],[A[203],1,[0],[[]]],[A[27],4,[1,2],[[],[3]]],[A[92],5,[1,2],[[4],[3,4]]],[A[29],1,[],[]],[A[75],1,[],[]],[A[399],1,[0],[[]]],[A[75],1,[0],[[]]],[A[400],1,[0],[[]]],[A[401],5,[1,2,4],[[],[3],[]]],[A[4],1,[],[]],[A[232],1,[],[]],[A[203],1,[0],[[]]],[A[402],1,[],[]],[A[114],2,[1],[[]]],[A[97],3,[1,2],[[],[]]],[A[95],1,[],[]],[A[116],1,[],[]],[A[403],1,[],[]],[A[404],3,[1],[[2]]],[A[405],1,[],[]],[A[226],1,[],[]],[A[24],1,[0],[[]]],[A[406],2,[],[]],[A[407],2,[],[]],[A[408],3,[],[]],[A[409],1,[],[]],[A[410],1,[],[]],[A[411],1,[0],[[]]],[A[70],1,[],[]],[A[412],3,[],[]],[A[413],12,[],[]],[A[414],58,[],[]],[A[415],1,[],[]],[A[416],6,[1,2,4],[[],[3],[5]]],[A[98],3,[1],[[2]]],[A[32],2,[1],[[]]],[A[417],2,[],[]],[A[31],1,[0],[[]]],[A[16],1,[0],[[]]],[A[24],1,[0],[[]]],[A[418],5,[],[]],[A[420],1,[],[]],[A[421],1,[],[]],[A[422],1,[],[]],[A[423],1,[],[]],[A[424],3,[1],[[2]]],[A[425],1,[],[]],[A[226],1,[],[]],[A[426],2,[],[]],[A[427],2,[],[]],[A[29],1,[],[]],[A[66],1,[],[]],[A[416],6,[1,2,4],[[],[3],[5]]],[A[389],5,[1,4],[[2],[]]],[A[392],1,[0],[[]]],[A[66],1,[0],[[]]],[A[428],3,[1],[[2]]],[A[429],1,[],[]],[A[430],1,[],[]],[A[431],1,[],[]],[A[432],1,[],[]],[A[433],1,[],[]],[A[434],1,[0],[[]]],[A[435],3,[1],[[2]]],[A[436],2,[1],[[]]],[A[437],2,[],[]],[A[77],1,[0],[[]]],[A[438],2,[1],[[]]],[A[439],1,[],[]],[A[440],3,[],[]],[A[29],1,[],[]],[A[441],7,[1,2,4],[[6],[3,6],[5,6]]],[A[114],2,[1],[[]]],[A[443],1,[],[]],[A[180],1,[],[]],[A[445],2,[],[]],[A[446],2,[],[]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[98],3,[1],[[2]]],[A[77],1,[0],[[]]],[A[447],1,[],[]],[A[448],4,[1,2],[[],[3]]],[A[449],9,[1,2,5],[[4],[3,4],[8]]],[A[226],1,[0],[[]]],[A[82],1,[0],[[]]],[A[441],7,[1,2,4],[[6],[3,6],[5,6]]],[A[75],1,[0],[[]]],[A[450],6,[1,3,5],[[2],[4],[]]],[A[451],6,[1,3,5],[[2],[4],[]]],[A[452],1,[],[]],[A[453],2,[],[]],[A[201],1,[],[]],[A[455],1,[],[]],[A[436],2,[1],[[]]],[A[456],2,[0],[[]]],[A[446],2,[],[]],[A[457],1,[],[]],[A[458],3,[0,1],[[],[2]]],[A[459],3,[1],[[2]]],[A[32],2,[1],[[]]],[A[460],7,[1,3,5],[[2],[4],[6]]],[A[461],15,[1,3,5,7,9,11,13,14],[[2],[4],[6],[8],[10],[12],[14],[]]],[A[462],9,[1,3,5,7],[[2],[4],[6],[8]]],[A[463],13,[1,3,5,7,9,11,12],[[2],[4],[6],[8],[10],[12],[]]],[A[464],11,[1,3,5,7,9,10],[[2],[4],[6],[8],[10],[]]],[A[465],9,[1,3,5,7,8],[[2],[4],[6],[8],[]]],[A[466],9,[1,3,5,7,8],[[2],[4],[6],[8],[]]],[A[467],18,[1,2,4,5,6,7,9,10,12,14,16,17],[[11],[3,11],[5,11],[11],[11],[8,11],[10,11],[11],[13],[15],[17],[]]],[A[468],4,[1,3],[[2],[]]],[A[469],2,[],[]],[A[470],2,[],[]],[A[471],6,[],[]],[A[24],1,[0],[[]]],[A[16],1,[0],[[]]],[A[472],1,[0],[[]]],[A[217],1,[0],[[]]],[A[473],3,[1],[[2]]],[A[474],2,[1],[[]]],[A[475],2,[],[]],[A[476],2,[],[]],[A[477],2,[],[]],[A[478],2,[],[]],[A[479],1,[],[]],[A[480],1,[],[]],[A[481],1,[],[]],[A[482],2,[],[]],[A[483],2,[],[]],[A[484],2,[],[]],[A[485],90,[],[]],[A[486],31,[],[]],[A[487],101,[],[]],[A[488],65,[],[]],[A[489],2,[],[]],[A[490],32,[],[]],[A[492],2,[],[]],[A[493],2,[],[]],[A[494],2,[],[]],[A[497],3,[1],[[2]]],[A[265],1,[],[]],[A[498],1,[],[]],[A[499],1,[],[]],[A[500],1,[],[]],[A[501],1,[],[]],[A[502],1,[],[]],[A[65],1,[0],[[]]],[A[65],1,[0],[[]]],[A[503],1,[],[]],[A[226],1,[],[]],[A[504],1,[],[]],[A[505],1,[0],[[]]],[A[226],1,[],[]],[A[146],2,[1],[[]]],[A[506],1,[],[]],[A[507],18,[],[]],[A[510],4,[1],[[3]]],[A[116],1,[],[]],[A[511],1,[],[]],[A[512],5,[],[]],[A[513],5,[],[]],[A[514],4,[],[]],[A[515],1,[],[]],[A[516],2,[],[]],[A[517],13,[],[]],[A[520],2,[],[]],[A[521],2,[],[]],[A[522],2,[],[]],[A[523],2,[],[]],[A[524],3,[],[]],[A[525],22,[],[]],[A[526],4,[],[]],[A[528],3,[1],[[2]]],[A[75],1,[0],[[]]],[A[529],1,[],[]],[A[530],5,[1],[[2]]],[A[263],1,[],[]],[A[273],1,[],[]],[A[531],1,[],[]],[A[532],4,[1,3],[[2],[]]],[A[15],1,[],[]],[A[533],2,[1],[[]]],[A[534],2,[],[]],[A[535],5,[1,3],[[2],[4]]],[A[536],5,[1,3],[[2],[4]]],[A[75],1,[0],[[]]],[A[16],1,[0],[[]]],[A[3],1,[],[]],[A[67],1,[],[]],[A[85],1,[],[]],[A[70],1,[],[]],[A[84],1,[0],[[]]],[A[380],2,[1],[[]]],[A[537],1,[],[]],[A[538],1,[0],[[]]],[A[539],1,[],[]],[A[540],2,[1],[[]]],[A[543],2,[1],[[]]],[A[328],2,[1],[[]]],[A[328],2,[1],[[]]],[A[328],2,[1],[[]]],[A[544],4,[1,3],[[2],[]]],[A[545],14,[1,3,5,7,9,11,13],[[2],[4],[6],[8],[10],[12],[]]],[A[546],8,[1,3,5,6],[[2],[4],[],[7]]],[A[24],1,[0],[[]]],[A[70],1,[],[]],[A[328],2,[1],[[]]],[A[3],1,[],[]],[A[547],2,[],[]],[A[548],1,[0],[[]]],[A[222],5,[1,3,4],[[2],[],[]]],[A[201],1,[],[]],[A[182],2,[1],[[]]],[A[23],1,[0],[[]]],[A[549],1,[],[]],[A[550],7,[1,2,3,5],[[2,4],[4],[4],[6]]],[A[551],3,[0,1],[[],[2]]],[A[552],6,[1,3],[[2],[5]]],[A[553],3,[1,2],[[2],[]]],[A[554],1,[0],[[]]],[A[555],1,[0],[[]]],[A[556],5,[1,3],[[2],[4]]],[A[557],5,[1,3],[[2],[4]]],[A[558],3,[1,2],[[2],[]]],[A[559],3,[1,2],[[2],[]]],[A[560],3,[1,2],[[2],[]]],[A[561],3,[1,2],[[2],[]]],[A[562],1,[],[]],[A[15],1,[],[]],[A[65],1,[0],[[]]],[A[65],1,[],[]],[A[24],1,[0],[[]]],[A[563],1,[],[]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[564],1,[],[]],[A[75],1,[0],[[]]],[A[565],1,[],[]],[A[75],1,[],[]],[A[566],1,[],[]],[A[97],3,[1,2],[[],[]]],[A[567],2,[],[]],[A[568],3,[1],[[2]]],[A[569],1,[],[]],[A[570],4,[1,3],[[2],[]]],[A[457],1,[],[]],[A[571],1,[],[]],[A[75],1,[0],[[]]],[A[446],2,[],[]],[A[232],1,[],[]],[A[65],1,[0],[[]]],[A[333],1,[],[]],[A[80],4,[1,2],[[],[3]]],[A[81],2,[1,-1],[[],[]]],[A[572],5,[0,1,3],[[],[2],[4]]],[A[573],5,[1],[[2]]],[A[65],1,[],[]],[A[575],3,[1],[[2]]],[A[576],2,[1],[[]]],[A[577],1,[],[]],[A[578],1,[],[]],[A[579],3,[1],[[2]]],[A[580],1,[0],[[]]],[A[146],2,[1],[[]]],[A[581],4,[1,3],[[2],[]]],[A[117],1,[],[]],[A[582],1,[0],[[]]],[A[95],1,[],[]],[A[90],2,[],[]],[A[583],3,[1,2],[[2],[]]],[A[584],41,[],[]],[A[585],2,[],[]],[A[586],1,[],[]],[A[587],2,[],[]],[A[588],28,[],[]],[A[589],5,[],[]],[A[590],7,[],[]],[A[591],1,[],[]],[A[592],24,[],[]],[A[593],3,[],[]],[A[594],2,[],[]],[A[595],7,[],[]],[A[596],2,[],[]],[A[597],2,[],[]],[A[598],12,[],[]],[A[599],1,[],[]],[A[600],1,[],[]],[A[601],4,[],[]],[A[602],1,[],[]],[A[603],1,[],[]],[A[604],4,[],[]],[A[605],6,[],[]],[A[606],6,[],[]],[A[607],1,[],[]],[A[608],6,[],[]],[A[609],17,[],[]],[A[610],2,[],[]],[A[611],1,[],[]],[A[612],3,[],[]],[A[613],1,[],[]],[A[614],2,[],[]],[A[615],1,[],[]],[A[616],2,[],[]],[A[617],16,[],[]],[A[618],6,[],[]],[A[619],3,[],[]],[A[620],18,[],[]],[A[621],17,[],[]],[A[622],8,[],[]],[A[623],4,[],[]],[A[624],3,[],[]],[A[625],2,[],[]],[A[626],1,[],[]],[A[627],45,[],[]],[A[628],5,[],[]],[A[629],17,[],[]],[A[630],7,[],[]],[A[631],2,[],[]],[A[632],2,[],[]],[A[633],5,[],[]],[A[634],4,[],[]],[A[635],1,[],[]],[A[636],4,[],[]],[A[637],2,[],[]],[A[638],8,[],[]],[A[639],6,[],[]],[A[640],8,[],[]],[A[641],3,[],[]],[A[642],4,[],[]],[A[643],7,[],[]],[A[644],6,[],[]],[A[645],2,[],[]],[A[646],2,[],[]],[A[647],1,[],[]],[A[648],16,[],[]],[A[649],1,[],[]],[A[650],3,[],[]],[A[651],3,[],[]],[A[652],2,[],[]],[A[653],1,[],[]],[A[654],22,[],[]],[A[655],21,[],[]],[A[656],20,[],[]],[A[631],2,[],[]],[A[657],1,[],[]],[A[658],4,[],[]],[A[659],3,[],[]],[A[660],1,[],[]],[A[661],6,[],[]],[A[662],3,[],[]],[A[663],36,[],[]],[A[664],2,[],[]],[A[665],8,[],[]],[A[666],7,[],[]],[A[667],1,[],[]],[A[668],5,[],[]],[A[669],2,[],[]],[A[670],79,[],[]],[A[671],10,[],[]],[A[672],1,[],[]],[A[673],3,[],[]],[A[674],36,[],[]],[A[675],21,[],[]],[A[676],8,[],[]],[A[677],2,[],[]],[A[678],3,[],[]],[A[679],7,[],[]],[A[680],1,[],[]],[A[680],1,[],[]],[A[681],41,[],[]],[A[682],16,[],[]],[A[683],16,[],[]],[A[684],1,[],[]],[A[685],29,[],[]],[A[686],15,[],[]],[A[687],5,[],[]],[A[688],31,[],[]],[A[689],9,[],[]],[A[690],4,[],[]],[A[691],10,[],[]],[A[692],13,[],[]],[A[693],20,[],[]],[A[694],23,[],[]],[A[695],4,[],[]],[A[696],6,[],[]],[A[697],10,[],[]],[A[698],7,[],[]],[A[699],28,[],[]],[A[700],18,[],[]],[A[701],15,[],[]],[A[702],2,[],[]],[A[703],10,[],[]],[A[704],1,[],[]],[A[705],3,[],[]],[A[706],7,[],[]],[A[707],2,[],[]],[A[708],6,[],[]],[A[709],9,[],[]],[A[632],2,[],[]],[A[710],2,[],[]],[A[711],3,[],[]],[A[712],1,[],[]],[A[713],11,[],[]],[A[714],14,[],[]],[A[715],1,[],[]],[A[716],2,[],[]],[A[717],17,[],[]],[A[718],14,[],[]],[A[719],29,[],[]],[A[720],2,[],[]],[A[721],2,[],[]],[A[722],5,[],[]],[A[723],3,[],[]],[A[724],3,[],[]],[A[725],2,[],[]],[A[726],12,[],[]],[A[727],2,[],[]],[A[728],7,[],[]],[A[729],1,[],[]],[A[730],4,[],[]],[A[731],3,[],[]],[A[732],1,[],[]],[A[733],3,[],[]],[A[734],2,[],[]],[A[735],4,[],[]],[A[736],1,[],[]],[A[737],4,[],[]],[A[738],11,[],[]],[A[739],8,[],[]],[A[740],2,[],[]],[A[741],4,[],[]],[A[742],3,[],[]],[A[743],2,[],[]],[A[744],33,[],[]],[A[745],5,[],[]],[A[146],2,[],[]],[A[746],3,[1,2],[[],[]]],[A[84],1,[0],[[]]],[A[65],1,[0],[[]]],[A[77],1,[0],[[]]],[A[747],3,[1,2],[[2],[]]],[A[748],4,[1],[[2]]],[A[217],1,[0],[[]]],[A[23],1,[0],[[]]],[A[32],2,[1],[[]]],[A[100],1,[],[]],[A[749],4,[1,2],[[],[3]]],[A[361],2,[1],[[]]],[A[750],6,[2,5],[[3],[]]],[A[751],5,[0,1,3],[[],[2],[4]]],[A[24],1,[0],[[]]],[A[752],2,[],[]],[A[753],1,[],[]],[A[754],1,[],[]],[A[755],1,[],[]],[A[757],1,[],[]],[A[758],1,[],[]],[A[759],3,[1,2],[[2],[]]],[A[760],14,[1,2,3,4,5,6,7,8,9,10,11,12,13],[[],[],[],[],[],[],[],[],[],[],[],[],[]]],[A[32],2,[1],[[]]],[A[761],1,[],[]],[A[292],1,[],[]],[A[226],1,[],[]],[A[65],1,[0],[[]]],[A[762],2,[],[]],[A[763],1,[],[]],[A[764],2,[],[]],[A[765],2,[],[]],[A[766],2,[],[]],[A[767],2,[],[]],[A[267],2,[],[]],[A[268],2,[],[]],[A[768],2,[],[]],[A[770],1,[],[]],[A[265],1,[],[]],[A[411],1,[0],[[]]],[A[75],1,[0],[[]]],[A[771],1,[],[]],[A[772],1,[],[]],[A[773],2,[],[]],[A[171],1,[],[]],[A[774],1,[],[]],[A[775],1,[],[]],[A[776],1,[],[]],[A[777],5,[],[]],[A[778],7,[1,2,3,4,5,6],[[2],[],[],[],[],[]]],[A[779],5,[1,2,3],[[2],[],[4]]],[A[780],9,[1,4,6,7,8],[[2],[5],[7],[],[]]],[A[3],1,[],[]],[A[24],1,[0],[[]]],[A[781],1,[0],[[]]],[A[782],1,[0],[[]]],[A[200],3,[1,2],[[],[]]],[A[201],1,[],[]],[A[783],1,[0],[[]]],[A[784],1,[],[]],[A[122],1,[0],[[]]],[A[785],2,[0],[[]]],[A[786],4,[1,2],[[],[3]]],[A[787],1,[],[]],[A[3],1,[],[]],[A[788],4,[1,3],[[2],[]]],[A[95],1,[],[]],[A[217],1,[0],[[]]],[A[789],2,[],[]],[A[790],2,[],[]],[A[540],2,[1],[[]]],[A[245],1,[0],[[]]],[A[791],1,[],[]],[A[792],3,[0,1],[[],[2]]],[A[217],1,[0],[[]]],[A[793],1,[],[]],[A[794],1,[0],[[]]],[A[795],2,[],[]],[A[796],2,[],[]],[A[797],2,[],[]],[A[798],1,[],[]],[A[799],1,[],[]],[A[800],1,[],[]],[A[801],2,[],[]],[A[802],11,[],[]],[A[16],1,[0],[[]]],[A[24],1,[0],[[]]],[A[803],16,[1,3,6,8,11,15],[[2],[5],[7],[15],[12,14,15],[]]],[A[804],3,[1],[[2]]],[A[805],3,[1],[[2]]],[A[806],3,[1],[[2]]],[A[807],2,[],[]],[A[808],2,[],[]],[A[809],2,[],[]],[A[810],2,[],[]],[A[811],2,[],[]],[A[817],8,[1,4],[[2],[7]]],[A[818],8,[1,4],[[2],[7]]],[A[818],8,[1,4],[[2],[7]]],[A[819],8,[1,4],[[2],[7]]],[A[820],8,[1,4],[[2],[7]]],[A[820],8,[1,4],[[2],[7]]],[A[819],8,[1,4],[[2],[7]]],[A[820],8,[1,4],[[2],[7]]],[A[820],8,[1,4],[[2],[7]]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[75],1,[],[]],[A[82],1,[0],[[]]],[A[822],1,[],[]],[A[823],3,[1],[[2]]],[A[824],3,[0,1],[[],[2]]],[A[825],3,[0,1],[[],[2]]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[16],1,[0],[[]]],[A[141],1,[],[]],[A[826],3,[0,1],[[],[2]]],[A[82],1,[0],[[]]],[A[827],3,[0,1],[[],[2]]],[A[828],1,[],[]],[A[292],1,[],[]],[A[829],4,[1,3],[[2],[]]],[A[129],1,[],[]],[A[90],2,[],[]],[A[830],2,[1],[[]]],[A[831],1,[],[]],[A[117],1,[],[]],[A[832],1,[],[]],[A[833],3,[0,1],[[],[2]]],[A[24],1,[0],[[]]],[A[834],204,[1,3],[[2],[203]]],[A[835],9,[1,3,8],[[2],[7],[]]],[A[836],9,[1,3,8],[[2],[7],[]]],[A[836],9,[1,3,8],[[2],[7],[]]],[A[837],8,[-1,2,7],[[],[6],[]]],[A[838],6,[1,5],[[4],[]]],[A[1],2,[1],[[]]],[A[839],1,[0],[[]]],[A[84],1,[0],[[]]],[A[82],1,[0],[[]]],[A[292],1,[],[]],[A[75],1,[],[]],[A[840],5,[1,3],[[2],[4]]],[A[841],5,[1,2],[[],[4]]],[A[183],2,[],[]],[A[842],3,[1],[[2]]],[A[82],1,[],[]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[843],1,[],[]],[A[844],4,[1,3],[[2],[]]],[A[149],4,[1,2,3],[[],[],[]]],[A[150],3,[1,-1,2],[[],[],[]]],[A[845],3,[1],[[2]]],[A[846],2,[],[]],[A[847],2,[],[]],[A[848],2,[],[]],[A[849],2,[],[]],[A[851],6,[],[]],[A[852],6,[],[]],[A[853],3,[],[]],[A[855],3,[],[]],[A[856],2,[],[]],[A[857],2,[],[]],[A[858],2,[],[]],[A[859],3,[1],[[2]]],[A[860],4,[1,2],[[3],[3]]],[A[861],2,[],[]],[A[862],2,[],[]],[A[863],2,[],[]],[A[864],3,[1],[[2]]],[A[865],1,[],[]],[A[866],1,[],[]],[A[867],1,[],[]],[A[273],1,[],[]],[A[868],3,[1],[[2]]],[A[869],3,[1],[[2]]],[A[870],3,[1],[[2]]],[A[871],3,[1],[[2]]],[A[872],3,[1],[[2]]],[A[873],3,[1],[[2]]],[A[874],1,[],[]],[A[875],1,[],[]],[A[876],2,[1],[[]]],[A[877],1,[],[]],[A[878],1,[],[]],[A[879],2,[1],[[]]],[A[880],3,[1],[[2]]],[A[881],3,[1],[[2]]],[A[882],2,[],[]],[A[182],2,[],[]],[A[883],6,[1,3,4],[[2],[5],[5]]],[A[383],2,[1],[[]]],[A[884],4,[1,2,3],[[2],[],[]]],[A[885],4,[1,2,3],[[2],[],[]]],[A[540],2,[1],[[]]],[A[360],1,[0],[[]]],[A[886],1,[],[]],[A[379],1,[0],[[]]],[A[65],1,[0],[[]]],[A[65],1,[0],[[]]],[A[82],1,[0],[[]]],[A[887],7,[],[]],[A[888],5,[],[]],[A[889],4,[],[]],[A[890],3,[],[]],[A[891],2,[1],[[]]],[A[146],2,[1],[[]]],[A[23],1,[0],[[]]],[A[892],1,[0],[[]]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[893],1,[0],[[]]],[A[894],2,[],[]],[A[895],1,[],[]],[A[67],1,[],[]],[A[67],1,[],[]],[A[896],5,[0,1,3],[[],[2],[4]]],[A[579],3,[1],[[2]]],[A[845],3,[1],[[2]]],[A[217],1,[0],[[]]],[A[897],2,[],[]],[A[898],1,[],[]],[A[899],1,[],[]],[A[226],1,[],[]],[A[217],1,[0],[[]]],[A[900],4,[1,2],[[],[3]]],[A[901],2,[],[]],[A[902],1,[],[]],[A[903],10,[],[]],[A[904],4,[0],[[]]],[A[390],2,[],[]],[A[389],5,[1,4],[[2],[]]],[A[392],1,[0],[[]]],[A[393],1,[],[]],[A[82],1,[0],[[]]],[A[905],1,[],[]],[A[906],1,[],[]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[141],1,[],[]],[A[907],3,[1],[[2]]],[A[77],1,[],[]],[A[908],1,[0],[[]]],[A[909],1,[],[]],[A[69],1,[],[]],[A[70],1,[],[]],[A[910],2,[1],[[]]],[A[911],2,[1],[[]]],[A[182],2,[1],[[]]],[A[912],3,[1],[[2]]],[A[24],1,[0],[[]]],[A[203],1,[0],[[]]],[A[913],1,[],[]],[A[914],1,[],[]],[A[328],2,[1],[[]]],[A[3],1,[],[]],[A[915],3,[0],[[]]],[A[535],5,[1,3],[[2],[4]]],[A[82],1,[0],[[]]],[A[841],5,[1,2],[[],[4]]],[A[916],2,[],[]],[A[826],3,[0,1],[[],[2]]],[A[82],1,[0],[[]]],[A[82],1,[0],[[]]],[A[917],1,[],[]],[A[918],5,[1,4],[[2],[]]],[A[146],2,[1],[[]]],[A[919],1,[],[]],[A[182],2,[1],[[]]],[A[920],1,[],[]],[A[921],3,[],[]],[A[922],2,[],[]],[A[923],2,[],[]],[A[924],3,[],[]],[A[925],4,[],[]],[A[926],5,[],[]],[A[927],3,[],[]],[A[928],2,[],[]],[A[929],2,[],[]],[A[930],3,[],[]],[A[931],2,[],[]],[A[932],3,[],[]],[A[933],2,[],[]],[A[82],1,[],[]],[A[934],2,[1],[[]]],[A[935],2,[],[]],[A[75],1,[0],[[]]],[A[446],2,[],[]],[A[22],1,[0],[[]]],[A[936],1,[],[]],[A[146],2,[1],[[]]],[A[937],16,[],[]],[A[938],4,[],[]],[A[939],1,[],[]],[A[16],1,[0],[[]]],[A[361],2,[1],[[]]],[A[77],1,[0],[[]]],[A[16],1,[0],[[]]],[A[23],1,[0],[[]]],[A[940],1,[],[]],[A[95],1,[],[]],[A[82],1,[0],[[]]],[A[941],10,[1,2,4,5,6,8,9],[[3],[3],[5,7],[7],[7],[9],[]]],[A[24],1,[0],[[]]],[A[942],1,[],[]],[A[944],6,[1,3,4],[[2],[5],[5]]],[A[945],3,[1,2],[[2],[]]],[A[946],3,[1,2],[[2],[]]],[A[947],3,[1,2],[[2],[]]],[A[948],3,[1,2],[[2],[]]],[A[949],3,[1,2],[[2],[]]],[A[950],3,[1,2],[[2],[]]],[A[951],3,[1,2],[[2],[]]],[A[952],3,[1,2],[[2],[]]],[A[953],3,[1,2],[[2],[]]],[A[954],3,[1,2],[[2],[]]],[A[955],4,[1],[[2]]],[A[956],4,[1],[[2]]],[A[306],2,[1],[[]]],[A[957],2,[1],[[]]],[A[305],4,[1,2],[[],[3]]],[A[306],2,[1,-1],[[],[]]],[A[789],2,[],[]],[A[790],2,[],[]],[A[540],2,[1],[[]]],[A[958],3,[1],[[2]]],[A[939],1,[],[]],[A[959],1,[0],[[]]],[A[960],1,[0],[[]]],[A[23],1,[0],[[]]],[A[961],1,[0],[[]]],[A[962],2,[],[]],[A[963],2,[],[]],[A[964],2,[],[]],[A[965],2,[],[]],[A[966],2,[],[]],[A[967],2,[],[]],[A[968],1,[],[]],[A[969],2,[],[]],[A[970],2,[],[]],[A[971],2,[],[]],[A[972],2,[],[]],[A[974],5,[1,4],[[3],[]]],[A[975],5,[1,4],[[3],[]]],[A[974],5,[1,4],[[3],[]]],[A[975],5,[1,4],[[3],[]]],[A[4],1,[],[]],[A[976],1,[0],[[]]],[A[977],2,[],[]],[A[978],1,[],[]],[A[203],1,[0],[[]]],[A[66],1,[],[]],[A[82],1,[],[]],[A[24],1,[],[]],[A[232],1,[],[]],[A[15],1,[],[]],[A[77],1,[0],[[]]],[A[979],2,[],[]],[A[3],1,[],[]],[A[65],1,[],[]],[A[86],1,[],[]],[A[1],2,[1],[[]]],[A[980],6,[1,3,5],[[2],[4],[]]],[A[981],6,[1,2,3,5],[[2],[],[4],[]]],[A[982],8,[1,2,3,7],[[2],[],[4],[]]],[A[983],4,[1,2],[[2],[]]],[A[77],1,[0],[[]]],[A[984],11,[1,3,5,6,8,9],[[2],[],[],[7],[],[10]]],[A[985],13,[1,3,4,5,7,8,10,11],[[2],[],[6],[6],[9],[9],[12],[12]]],[A[986],2,[],[]],[A[987],2,[],[]],[A[988],1,[],[]],[A[990],2,[],[]],[A[991],2,[],[]],[A[992],2,[],[]],[A[993],1,[],[]],[A[994],2,[],[]],[A[995],3,[],[]],[A[996],2,[],[]],[A[997],3,[1],[[2]]],[A[998],3,[1],[[2]]],[A[999],3,[1],[[2]]],[A[1000],3,[1],[[2]]],[A[1001],3,[1],[[2]]],[A[1002],3,[1],[[2]]],[A[1003],3,[],[]],[A[1004],1,[],[]],[A[1005],10,[1,3,9],[[2],[8],[]]],[A[1006],9,[1,3],[[2],[8]]],[A[1007],9,[1,4],[[2],[]]],[A[1008],8,[],[]],[A[1009],1,[0],[[]]],[A[1010],1,[0],[[]]],[A[1011],1,[],[]],[A[24],1,[0],[[]]],[A[16],1,[0],[[]]],[A[23],1,[0],[[]]],[A[1012],1,[0],[[]]],[A[1013],1,[0],[[]]],[A[1014],1,[0],[[]]],[A[1015],1,[0],[[]]],[A[1016],2,[0],[[]]],[A[1028],4,[1,2],[[3],[3]]],[A[1029],4,[1,2],[[3],[3]]],[A[1029],4,[1,2],[[3],[3]]],[A[1030],4,[1,2],[[3],[3]]],[A[228],1,[0],[[]]],[A[1031],1,[0],[[]]],[A[1032],1,[0],[[]]],[A[1033],1,[0],[[]]],[A[1034],2,[0],[[]]],[A[1035],1,[0],[[]]],[A[1036],1,[0],[[]]],[A[1037],1,[0],[[]]],[A[1038],1,[0],[[]]],[A[1039],2,[0],[[]]],[A[1040],2,[0],[[]]],[A[1041],1,[0],[[]]],[A[1042],1,[0],[[]]],[A[1043],1,[0],[[]]],[A[1044],1,[0],[[]]],[A[1045],2,[0],[[]]],[A[1046],5,[1],[[2]]],[A[1047],5,[3],[[4]]],[A[1048],1,[0],[[]]],[A[1049],3,[1],[[2]]],[A[1050],4,[],[]],[A[1051],1,[0],[[]]],[A[1052],4,[0],[[]]],[A[1053],2,[0],[[]]],[A[1054],2,[0],[[]]],[A[1055],4,[0],[[]]],[A[1056],3,[0],[[]]],[A[1057],4,[0],[[]]],[A[1058],3,[0],[[]]],[A[1059],3,[0],[[]]],[A[1060],3,[0],[[]]],[A[1061],3,[0],[[]]],[A[830],2,[1],[[]]],[A[263],1,[],[]],[A[1064],1,[],[]],[A[1066],1,[],[]],[A[1067],1,[],[]],[A[1068],1,[],[]],[A[1069],1,[],[]],[A[1070],2,[],[]],[A[273],1,[],[]],[A[1071],1,[],[]],[A[116],1,[],[]],[A[265],1,[],[]],[A[117],1,[],[]],[A[1072],1,[],[]],[A[500],1,[],[]],[A[502],1,[],[]],[A[501],1,[],[]]];
+var H={487:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[0],["a.b.c"],[0,0],N,"",L))){break ifs;}}return J;}}),509:({scopes:"d.e.f.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1],["h.i.e.j.g"],[0,0],N,"d.e.f.g",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),21:({scopes:"k.l.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[2],["h.i.k.j.m"],[0,0],N,"k.l.m",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[3],[],[],N,"n.o.p.m",L))){break ifs;}}return J;}}),356:({scopes:"q.r.s.t",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[4],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[344].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[347].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),423:({scopes:"u.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[5],["h.i.e.v","w.x.e.v"],[0,0,1,1],N,"d.e.s.v",L))){M.push(424);O.push(" d.e.s.v");
+break ifs;}if((J=E(Q,P,B[6],["h.i.e.v","w.x.e.z.v"],[0,0,1,1],N,"d.e.y.z.v",L))){M.push(426);O.push(" d.e.y.z.v");
+break ifs;}if((J=E(Q,P,B[7],["h.i.q.v"],[0,0],N,"q.r.v",L))){M.push(427);O.push(" q.r.v");break ifs;}if((J=E(Q,P,B[8],["h.i.e.v","w.x.e.bb.v","w.x.e.v","h.bc.bb.v","w.x.e.bd.v"],[0,0,1,1,2,3,3,2,4,4],N,"d.e.ba.v",L))){M.push(428);
+O.push(" d.e.ba.v");break ifs;}if((J=E(Q,P,B[9],["h.i.e.v","w.x.e.bb.v","w.x.e.v","h.bc.bb.v","w.x.e.bd.v"],[0,0,1,1,2,3,3,2,4,4],N,"d.e.v",L))){M.push(429);
+O.push(" d.e.v");break ifs;}if((J=E(Q,P,B[10],["h.i.n.v","h.i.n.v"],[0,0,1,1],N,"n.o.w.v",L))){break ifs;
+}if((J=E(Q,P,B[11],[],[],N,"be.bf.bg.v",L))){break ifs;}if((J=E(Q,P,B[12],["h.bk.bj.bl.v"],[0,0],N,"bh.bi.bj.v",L))){M.push(430);
+O.push(" bh.bi.bj.v");break ifs;}if((J=E(Q,P,B[13],["h.bk.bj.bl.v"],[0,0],N,"bh.c.bj.v",L))){M.push(431);
+O.push(" bh.c.bj.v");break ifs;}if((J=E(Q,P,B[14],["h.i.k.bl.v"],[0,0],N,"k.bm.bn.v",L))){M.push(432);
+O.push(" k.bm.bn.v");break ifs;}}return J;}}),244:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[15],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(243);O.push("");break ifs;
+}}return J;}}),65:({scopes:"k.bq.br.bs.bt bh.bs.bj.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[16],["h.i.k.j.bt"],[0,0],N,"k.bq.br.bs.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[17],[],[],N,"q.bu.bv.bs",L))){break ifs;}if((J=E(Q,P,B[18],[],[],N,"q.bu.bw.bs",L))){break ifs;
+}if((J=E(Q,P,B[19],[],[],N,"k.bq.bx.by.bs",L))){M.push(59);O.push(" k.bq.bx.by.bs");break ifs;}if((J=E(Q,P,B[20],[],[],N,"k.bq.f.bz.by.bs",L))){M.push(60);
+O.push(" k.bq.f.bz.by.bs");break ifs;}if((J=E(Q,P,B[21],[],[],N,"k.bq.br.by.bs",L))){M.push(61);O.push(" k.bq.br.by.bs");
+break ifs;}if((J=E(Q,P,B[22],["n.o.p.bt"],[0,0],N,"k.bq.br.bs",L))){M.push(62);O.push(" k.bq.br.bs");
+break ifs;}if((J=E(Q,P,B[23],[],[],N,"k.bq.f.bz.bs",L))){M.push(63);O.push(" k.bq.f.bz.bs");break ifs;
+}if((J=E(Q,P,B[24],[],[],N,"k.bq.bx.bs",L))){M.push(64);O.push(" k.bq.bx.bs");break ifs;}if((J=E(Q,P,B[25],[],[],N,"n.o.p.bt",L))){break ifs;
+}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),293:({scopes:"k.bm.ca.cb.cc.cd u.g.cc.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[26],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.cc.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if(false){break ifs;}}return J;}}),130:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[27],[],[],N,"",L))){M.push(129);O.push("");break ifs;}}return J;}}),350:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[28],["d.s.ch","ce.cf.ci.cj.ch"],[0,1,1,0],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[29],["d.s.ch","ce.cf.ci.ck.ch"],[0,1,1,0],N,"",L))){M.push(348);
+O.push("");break ifs;}if((J=E(Q,P,B[30],[],[],N,"q.r.s.cl",L))){M.push(349);O.push(" q.r.s.cl");break ifs;
+}}return J;}}),124:({scopes:"q.r.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[31]:null),[],[],N,"q.r.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[159].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),190:({scopes:"k.cn.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[32],["h.i.k.j.bp"],[0,0],N,"k.cn.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),417:({scopes:"d.co.cp.cq.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[33],["ce.cf.cr"],[0,0],N,"d.co.cp.cq.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[410].go(Q,P,K,M,O,L))){break ifs;}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),354:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[34],["d.s.ch","ce.cf.ci.cj.ch"],[0,1,1,0],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[35],["d.s.ch","ce.cf.ci.ck.ch"],[0,1,1,0],N,"",L))){M.push(352);
+O.push("");break ifs;}if((J=E(Q,P,B[36],[],[],N,"q.r.s.cl.cs",L))){M.push(353);O.push(" q.r.s.cl.cs");
+break ifs;}}return J;}}),256:({scopes:"bh.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[258].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[37],["ce.f.ct.bs","ce.f.bs","w.x.cu.bs"],[0,0,1,1,2,2],N,"d.ct.bs",L))){break ifs;
+}if((J=E(Q,P,B[38],["ce.f.ct.bs","ce.f.bs"],[0,0,1,1],N,"d.cv.bs",L))){break ifs;}if((J=E(Q,P,B[39],["ce.f.ct.bs","ce.f.cw.bs","w.x.cu.bs","ce.f.cx.bs"],[0,0,1,1,2,2,3,3],N,"d.cv.bs",L))){break ifs;
+}if((J=E(Q,P,B[40],["ce.f.ct.bs","ce.f.cw.bs"],[0,0,1,1],N,"d.cy.bs",L))){break ifs;}if((J=E(Q,P,B[41],["a.cz.bs","a.cz.bs","n.da.bs","a.cz.bs","n.da.bs","a.cz.bs","n.da.bs","n.da.bs","a.cz.bs","n.da.bs","a.cz.bs","a.cz.bs","a.cz.bs","n.da.bs","a.cz.bs"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14],N,"",L))){break ifs;
+}if((J=E(Q,P,B[42],[],[],N,"a.b.bs",L))){break ifs;}if((J=E(Q,P,B[43],[],[],N,"n.da.bs",L))){break ifs;
+}if((J=E(Q,P,B[44],[],[],N,"ce.f.db.bs",L))){break ifs;}if((J=E(Q,P,B[45],[],[],N,"ce.f.dc.ct.dd.bs",L))){break ifs;
+}if((J=E(Q,P,B[46],[],[],N,"ce.f.db.dd.bs",L))){break ifs;}if((J=E(Q,P,B[47],[],[],N,"ce.f.de.bs",L))){break ifs;
+}if((J=E(Q,P,B[48],[],[],N,"ce.f.df.bs",L))){break ifs;}if((J=E(Q,P,B[49],[],[],N,"ce.f.dg.bs",L))){break ifs;
+}if((J=E(Q,P,B[50],[],[],N,"ce.f.dh.bs",L))){break ifs;}if((J=E(Q,P,B[51],[],[],N,"ce.f.di.bs",L))){break ifs;
+}if((J=E(Q,P,B[52],[],[],N,"ce.f.dj.bs",L))){break ifs;}if((J=E(Q,P,B[53],[],[],N,"ce.dk.dl.bs",L))){break ifs;
+}if((J=E(Q,P,B[54],[],[],N,"ce.dk.dm.bs",L))){break ifs;}if((J=E(Q,P,B[55],[],[],N,"ce.dk.dn.bs",L))){break ifs;
+}if((J=E(Q,P,B[56],[],[],N,"ce.dk.do.bs",L))){break ifs;}if((J=E(Q,P,B[57],[],[],N,"dp.cu.dq.bs",L))){break ifs;
+}if((J=E(Q,P,B[58],[],[],N,"dp.cu.dr.bs",L))){break ifs;}if((J=E(Q,P,B[59],[],[],N,"dp.cu.k.bs",L))){break ifs;
+}if((J=E(Q,P,B[60],["n.f.ds.bs","n.f.dt.bs"],[0,0,1,1],N,"",L))){break ifs;}if((J=H[268].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[261].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),313:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[61],["ce.cf.cd"],[0,0],N,"d.bo.du.cd",L))){M.push(306);O.push(" d.bo.du.cd");
+break ifs;}if((J=E(Q,P,B[62],["ce.cf.cd","dw.f.dx.cd"],[0,0,1,1],N,"d.bo.dv.cd",L))){M.push(307);O.push(" d.bo.dv.cd");
+break ifs;}if((J=E(Q,P,B[63],["ce.cf.cd"],[0,0],N,"d.bo.dy.cd",L))){M.push(308);O.push(" d.bo.dy.cd");
+break ifs;}if((J=E(Q,P,B[64],["ce.cf.cd","dw.f.dx.cd"],[0,0,1,1],N,"d.bo.dz.cd",L))){M.push(309);O.push(" d.bo.dz.cd");
+break ifs;}if((J=E(Q,P,B[65],["ce.cf.cd"],[0,0],N,"d.bo.ea.cd",L))){M.push(311);O.push(" d.bo.ea.cd");
+break ifs;}if((J=E(Q,P,B[66],["ce.cf.cd"],[0,0],N,"d.bo.eb.cd",L))){M.push(312);O.push(" d.bo.eb.cd");
+break ifs;}}return J;}}),518:({scopes:"bh.bp.ec.bj.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[67],["h.bk.bj.bp.ec"],[0,0],N,"bh.bp.ec.bj.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[68],["h.i.q.bp.ec"],[0,0],N,"q.bu.bv.bp.ec",L))){break ifs;}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),389:({scopes:"q.r.l",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[69],[],[],N,"q.r.l",(function(){(L&&L());M.pop();O.pop();})))){}}return J;
+}}),250:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[70],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(249);O.push("");break ifs;
+}}return J;}}),128:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[71],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[121].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[122].go(Q,P,K,M,O,L))){break ifs;}if((J=H[120].go(Q,P,K,M,O,L))){break ifs;}if((J=H[137].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[142].go(Q,P,K,M,O,L))){break ifs;}if((J=H[143].go(Q,P,K,M,O,L))){break ifs;}if((J=H[140].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[136].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),511:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[72],["h.i.w.g","h.i.w.g"],[0,0,1,1],N,"n.o.w.g",L))){break ifs;}if((J=E(Q,P,B[73],[],[],N,"be.bf.bg.g",L))){break ifs;
+}}return J;}}),61:({scopes:"k.bq.br.by.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[74],[],[],N,"k.bq.br.by.bs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[75],[],[],N,"n.o.p.bt",L))){break ifs;
+}}return J;}}),264:({scopes:"k.bq.bx.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[76],["h.i.k.j.bs"],[0,0],N,"k.bq.bx.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[262].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),380:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[77],["w.x.cu.ee","h.i.ef.ch"],[0,0,1,1],N,"d.cu.ed.ee",L))){M.push(378);
+O.push(" d.cu.ed.ee");break ifs;}if((J=E(Q,P,B[78],["h.i.ef.ch"],[0,0],N,"d.cu.ed.eg.ee",L))){M.push(379);
+O.push(" d.cu.ed.eg.ee");break ifs;}}return J;}}),242:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[79],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(241);O.push("");break ifs;
+}}return J;}}),413:({scopes:"d.co.cp.eh.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[80],["ce.cf.cr"],[0,0],N,"d.co.cp.eh.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[422].go(Q,P,K,M,O,L))){break ifs;}if((J=H[410].go(Q,P,K,M,O,L))){break ifs;}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),489:({scopes:"k.bq.bx.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[81],["h.i.k.j.c"],[0,0],N,"k.bq.bx.c",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[82],[],[],N,"n.o.p.c",L))){break ifs;}}return J;}}),126:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[83],[],[],N,"q.r.cm",L))){M.push(124);O.push(" q.r.cm");break ifs;}if((J=E(Q,P,B[84],[],[],N,"q.r.cm",L))){M.push(125);
+O.push(" q.r.cm");break ifs;}}return J;}}),425:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[85],["h.i.e.v"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[434].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[436].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),198:({scopes:"k.bq.f.ei.ej.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[86],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.ej.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[230].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),262:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[87],[],[],N,"n.o.p.bs",L))){break ifs;}}return J;}}),352:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[88],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[342].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),132:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[142].go(Q,P,K,M,O,L))){break ifs;}if((J=H[137].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[136].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),141:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[89],["h.bc.ek.bu.cm","be.bf.el.cm"],[0,0,1,1],N,"",L))){break ifs;}}return J;
+}}),204:({scopes:"k.bq.f.ei.em.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[90],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.em.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[91],[],[],N,"n.o.p.bp",L))){break ifs;}if((J=H[242].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),254:({scopes:"k.l.en.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[92],["h.i.en.bp"],[0,0],N,"k.l.en.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),364:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[93],["d.s.ch","ce.cf.ci.ch"],[0,1,1,0],N,"",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),147:({scopes:"k.bq.br.r.eo.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[94]:B[95]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.eo.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),376:({scopes:"d.r.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[96],[],[],N,"d.r.ee",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[97],["dp.cu.er.ch","h.i.ef.ch"],[0,0,1,1],N,"d.eq.ch",L))){break ifs;
+}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),461:({scopes:"q.r.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[98],["h.i.q.c"],[0,0],N,"q.r.c",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),202:({scopes:"k.bq.f.ei.f.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[99],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.f.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),44:({scopes:"q.r.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[100],["h.i.q.bt"],[0,0],N,"q.r.bt",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),67:({scopes:"k.bq.bx.by.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[101],[],[],N,"k.bq.bx.by.bs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[102],[],[],N,"n.o.p.bt",L))){break ifs;
+}}return J;}}),107:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[103],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[130].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),301:({scopes:"k.cn.es.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[104],["h.i.k.j.cd"],[0,0],N,"k.cn.es.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),200:({scopes:"k.bq.br.bp.et",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[105],["h.i.k.j.bp"],[0,0],N,"k.bq.br.bp.et",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[238].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),42:({scopes:"d.cu.eu.ev.bt d.ev.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[106],["h.i.ev.j.bt"],[0,0],N,"d.cu.eu.ev.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[79].go(Q,P,K,M,O,L))){break ifs;}if((J=H[48].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),291:({scopes:"k.bm.ca.cb.ew.cd u.g.ew.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[107],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.ew.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if(false){break ifs;}}return J;}}),120:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[108],[],[],N,"dp.cz.ex.cm",L))){break ifs;}}return J;}}),419:({scopes:"d.co.cq.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[109],["ce.cf.cr"],[0,0],N,"d.co.cq.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),15:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[110],["h.i.k.bl.ey"],[0,0],N,"k.bq.bx.ey",L))){M.push(14);O.push(" k.bq.bx.ey");
+break ifs;}}return J;}}),329:({scopes:"q.bu.ez.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[111],[],[],N,"q.bu.ez.ee",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[112],[],[],N,"h.bc.ek.ee",L))){break ifs;
+}}return J;}}),118:({scopes:"d.fa.fb.fc.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[113],["h.bc.fb.cm"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),362:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[114],["d.s.ch","ce.cf.ci.cj.ch"],[0,1,1,0],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[115],["d.s.ch","ce.cf.ci.ck.ch"],[0,1,1,0],N,"",L))){M.push(360);
+O.push(" q.r.s.t.cs");break ifs;}if((J=E(Q,P,B[116],[],[],N,"",L))){M.push(361);O.push("");break ifs;
+}}return J;}}),260:({scopes:"k.l.fd.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[117],["h.i.k.j.bs"],[0,0],N,"k.l.fd.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[263].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),305:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[118],[],[],N,"ce.dk.fe.cd",L))){break ifs;}if((J=E(Q,P,B[119],[],[],N,"ce.dk.fe.cd",L))){break ifs;
+}}return J;}}),149:({scopes:"k.bq.br.r.ff.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[120]:B[121]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.ff.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),38:({scopes:"d.fg.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[122],[],[],N,"d.fg.bt",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[123],[],[],N,"w.f.fh.bt",L))){break ifs;
+}}return J;}}),166:({scopes:"k.bq.bx.fi.fj.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[124],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.fj.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),309:({scopes:"d.bo.dz.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[125],["ce.cf.cd"],[0,0],N,"d.bo.dz.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),340:({scopes:"d.r.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[126],[],[],N,"d.r.ch",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[342].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),196:({scopes:"k.l.fl.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[127],["h.i.k.j.bp"],[0,0],N,"k.l.fl.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),246:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[128],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(245);O.push("");break ifs;
+}}return J;}}),484:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[129],[],[],N,"",L))){M.push(483);O.push("");break ifs;}}return J;}}),105:({scopes:"d.cu.fm.cm w.x.cu.fm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[130],[],[],N,"d.cu.fm.cm",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[131],["h.i.fm.cm"],[0,0],N,"",L))){M.push(104);
+O.push("");break ifs;}}return J;}}),407:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[132],[],[],N,"dp.fn.fo.fp.cr",L))){break ifs;}if((J=E(Q,P,B[133],[],[],N,"dp.fn.fo.fq.cr",L))){break ifs;
+}if((J=E(Q,P,B[134],[],[],N,"dp.fn.fo.fr.cr",L))){break ifs;}if((J=E(Q,P,B[135],[],[],N,"dp.cu.fo.fp.cr",L))){break ifs;
+}if((J=E(Q,P,B[136],[],[],N,"dp.n.fo.cr",L))){break ifs;}if((J=E(Q,P,B[137],[],[],N,"dp.dw.fo.cr",L))){break ifs;
+}}return J;}}),52:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[138],[],[],N,"be.bf.fs.ft.bt",L))){break ifs;}if((J=E(Q,P,B[139],["ce.f.ft.bt","a.b.bt","be.bf.fu.ft.bt"],[0,0,1,1,2,2],N,"",L))){break ifs;
+}if((J=E(Q,P,B[140],[],[],N,"fv.fw.fx.bt",L))){break ifs;}if((J=E(Q,P,B[141],["ce.f.ft.bt","fv.fw.fx.bt"],[0,0,1,1],N,"",L))){break ifs;
+}if((J=E(Q,P,B[142],[],[],N,"ce.f.ft.bt",L))){break ifs;}if((J=E(Q,P,B[143],["ce.f.ft.bt"],[0,0],N,"d.e.fy.ft.bt",L))){break ifs;
+}}return J;}}),403:({scopes:"d.fz.ev.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[144],["h.bk.ev.cr"],[0,0],N,"d.fz.ev.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[145],["n.f.ga.cr","d.gb.cr","h.i.gb.cr","h.i.gb.cr","h.bc.gc.cr"],[0,1,2,2,3,3,1,0,4,4],N,"",L))){break ifs;
+}if((J=E(Q,P,B[146],[],[],N,"h.bc.gc.cr",L))){break ifs;}if((J=E(Q,P,B[147],[],[],N,"h.bc.ev.cr",L))){break ifs;
+}if((J=H[408].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),289:({scopes:"k.bm.ca.cb.g.cd u.g.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[148],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.g.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[494].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),441:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[149],["a.cz.ge.c","h.i.gf.bl.c"],[0,0,1,1],N,"d.gd.ge.c",L))){M.push(440);
+O.push(" d.gd.ge.c");break ifs;}if((J=E(Q,P,B[150],[],[],N,"a.cz.ge.c",L))){break ifs;}}return J;}}),493:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[490].go(Q,P,K,M,O,L))){break ifs;}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[463].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),482:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[151],[],[],N,"a.b.c",L))){break ifs;}if((J=H[485].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[486].go(Q,P,K,M,O,L))){break ifs;}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[152],[],[],N,"dw.gg.c",L))){break ifs;
+}}return J;}}),513:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[153],[],[],N,"",L))){M.push(512);O.push("");break ifs;}}return J;}}),139:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[154],["dw.gg.cu.cm","ce.dk.gh.cm"],[0,0,1,1],N,"",L))){M.push(138);O.push("");
+break ifs;}}return J;}}),266:({scopes:"k.bq.br.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[155],["h.i.k.j.bs"],[0,0],N,"k.bq.br.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[263].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),338:({scopes:"d.cu.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[125],(P-1))?B[156]:B[157]),[],[],N,"d.cu.ch",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[346].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[158],[],[],N,"a.b.ch",L))){break ifs;
+}if((J=H[341].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),439:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[485].go(Q,P,K,M,O,L))){break ifs;}if((J=H[486].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),378:({scopes:"d.cu.ed.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[159],["h.i.ef.ch"],[0,0],N,"d.cu.ed.ee",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),524:({scopes:"k.bq.bx.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[160],["h.i.k.j.g"],[0,0],N,"k.bq.bx.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;}if((J=H[511].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),50:({scopes:"d.ev.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[161],["h.i.ev.j.bt"],[0,0],N,"d.ev.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[51].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),336:({scopes:"d.s.ch.gi",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[162],[],[],N,"d.s.ch.gi",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[163],[],[],N,"h.bc.ek.ch",L))){break ifs;
+}if((J=E(Q,P,B[164],["h.i.k.bl.ch"],[0,0],N,"k.bq.br.gi.ch",L))){M.push(334);O.push(" k.bq.br.gi.ch");
+break ifs;}if((J=E(Q,P,B[165],["h.i.k.bl.ch"],[0,0],N,"k.bq.f.gj.gi.ch",L))){M.push(335);O.push(" k.bq.f.gj.gi.ch");
+break ifs;}}return J;}}),82:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[166],["h.i.dw.bt"],[0,0],N,"dw.f.bt",L))){break ifs;}}return J;}}),208:({scopes:"q.r.gk.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[167],["h.i.q.bp"],[0,0],N,"q.r.gk.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),311:({scopes:"d.bo.ea.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[168],["ce.cf.cd"],[0,0],N,"d.bo.ea.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[169],[],[],N,"d.bo.gl.cd",L))){M.push(310);O.push(" d.bo.gl.cd");break ifs;
+}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),252:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[170],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(251);O.push("");break ifs;
+}}return J;}}),168:({scopes:"k.bq.bx.fi.gm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[171],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.gm.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),399:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[172],["ce.cf.gn.cr","w.x.cz.go.cr"],[0,0,1,1],N,"d.gn.cr",L))){M.push(396);
+O.push(" d.gn.cr");break ifs;}if((J=E(Q,P,B[173],["ce.cf.gq.cr","w.x.cu.gr.cr","h.i.ef.cr","dw.gg.gr.cr","h.i.ef.cr"],[0,0,1,1,2,2,3,3,4,4],N,"d.cu.gp.cr",L))){M.push(397);
+O.push(" d.cu.gp.cr");break ifs;}if((J=E(Q,P,B[174],["ce.cf.gq.cr","w.x.cu.gr.cr"],[0,0,1,1],N,"d.cu.gs.cr",L))){M.push(398);
+O.push(" d.cu.gs.cr");break ifs;}if((J=H[421].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),40:({scopes:"d.fn.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[175],[],[],N,"d.fn.bt",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[176],["a.b.gt.bt","w.f.fh.bt"],[0,0,1,1],N,"",L))){break ifs;
+}if((J=E(Q,P,B[177],["a.b.gu.bt","dp.fn.gu.bt"],[0,0,1,1],N,"",L))){M.push(39);O.push("");break ifs;}}return J;
+}}),186:({scopes:"k.cn.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[178],["h.i.k.j.bp"],[0,0],N,"k.cn.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[238].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),401:({scopes:"q.r.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[179],["h.i.q.cr"],[0,0],N,"q.r.cr",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),495:({scopes:"d.e.gv.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[180],["h.i.e.g","d.bo.gw.g","w.x.e.g","h.i.e.g"],[0,1,1,0,2,2,3,3],N,"d.e.gv.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),443:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[181],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),268:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[182],["h.i.k.bl.bs"],[0,0],N,"k.bq.bx.bs",L))){break ifs;}if((J=E(Q,P,B[183],["h.i.k.bl.bs"],[0,0],N,"k.bq.bx.bs",L))){M.push(264);
+O.push(" k.bq.bx.bs");break ifs;}if((J=E(Q,P,B[184],["h.i.k.bl.bs"],[0,0],N,"k.bq.f.bz.bs",L))){break ifs;
+}if((J=E(Q,P,B[185],["h.i.k.bl.bs"],[0,0],N,"k.bq.f.bz.bs",L))){M.push(265);O.push(" k.bq.f.bz.bs");break ifs;
+}if((J=E(Q,P,B[186],["h.i.k.bl.bs"],[0,0],N,"k.bq.br.bs",L))){break ifs;}if((J=E(Q,P,B[187],["h.i.k.bl.bs"],[0,0],N,"k.bq.br.bs",L))){M.push(266);
+O.push(" k.bq.br.bs");break ifs;}if((J=E(Q,P,B[188],["h.i.k.bl.bs"],[0,0],N,"k.f.bq.gx.bs",L))){M.push(267);
+O.push(" k.f.bq.gx.bs");break ifs;}}return J;}}),188:({scopes:"k.cn.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[189],["h.i.k.j.bp"],[0,0],N,"k.cn.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[244].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),92:({scopes:"w.x.cz.fn.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[190],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[132].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),315:({scopes:"d.fa.gy.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[191],["h.i.gy.cd"],[0,0],N,"d.fa.gy.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),415:({scopes:"d.co.cp.gz.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[192],["ce.cf.cr"],[0,0],N,"d.co.cp.gz.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[412].go(Q,P,K,M,O,L))){break ifs;}if((J=H[410].go(Q,P,K,M,O,L))){break ifs;}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),396:({scopes:"d.gn.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[193],["ce.cf.gn.cr"],[0,0],N,"d.gn.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),156:({scopes:"k.bq.br.fi.bs.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[194]:B[195]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.bs.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),522:({scopes:"k.bq.br.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[196],["h.i.k.j.g"],[0,0],N,"k.bq.br.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;}if((J=H[511].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),78:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[197],["h.i.k.bl.bt"],[0,0],N,"k.bq.bx.bt",L))){M.push(77);O.push(" k.bq.bx.bt d.ha.bq.bx.bt");
+break ifs;}}return J;}}),35:({scopes:"k.bm.ca.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[198],[],[],N,"k.bm.ca.bt",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[199],["h.bk.bj.bl.bt","h.i.k.bt","ce.dk.ca.bt"],[0,1,1,2,2,0],N,"d.bj.g",L))){M.push(31);
+O.push(" d.bj.g u.g");break ifs;}if((J=E(Q,P,B[200],["h.bk.bj.bl.bt","h.i.k.bt","ce.dk.ca.bt"],[0,1,1,2,2,0],N,"d.bj.v",L))){M.push(32);
+O.push(" d.bj.v u.v");break ifs;}if((J=E(Q,P,B[201],["h.bk.bj.bl.bt","h.i.k.bt","ce.dk.ca.bt"],[0,1,1,2,2,0],N,"d.bj.bs",L))){M.push(33);
+O.push(" d.bj.bs bh.bs");break ifs;}if((J=E(Q,P,B[202],["h.bk.bj.bl.bt","h.i.k.bt","ce.dk.ca.bt"],[0,1,1,2,2,0],N,"d.bj.m",L))){M.push(34);
+O.push(" d.bj.m bh.m");break ifs;}}return J;}}),321:({scopes:"k.bq.br.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[203],["h.i.k.j.cd"],[0,0],N,"k.bq.br.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[204],[],[],N,"n.o.p.cd",L))){break ifs;}if((J=H[326].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[302].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),184:({scopes:"k.bq.br.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[205],["h.i.k.j.bp"],[0,0],N,"k.bq.br.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),248:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[206],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(247);O.push("");break ifs;
+}}return J;}}),213:({scopes:"k.bm.bj.bs.bp u.bs.bj.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[207],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.bs.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),507:({scopes:"d.e.r.gv.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[208],["h.i.e.j.g"],[0,0],N,"d.e.r.gv.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),429:({scopes:"d.e.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[209],["h.i.e.v"],[0,0],N,"d.e.v",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[437].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),145:({scopes:"k.bq.br.r.hb.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[210]:B[211]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.hb.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),32:({scopes:"d.bj.v u.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[212],["h.bk.bj.j.bt","ce.dk.ca.bt","h.i.k.bt"],[0,1,1,2,2,0],N,"d.bj.v",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[423].go(Q,P,K,M,O,L))){break ifs;}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),272:({scopes:"d.bo.hc.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[213],["h.hd.hc.cd"],[0,0],N,"d.bo.hc.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[214],["h.i.he.cd"],[0,0],N,"d.bo.he.cd",L))){M.push(270);O.push(" d.bo.he.cd");
+break ifs;}if((J=E(Q,P,(G(Q,A[162],(P-1))?B[215]:null),[],[],N,"d.bo.hf.cd",L))){M.push(271);O.push(" d.bo.hf.cd");
+break ifs;}}return J;}}),499:({scopes:"n.f.hg.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[216],[],[],N,"n.f.hg.g",(function(){(L&&L());M.pop();O.pop();})))){}}return J;
+}}),192:({scopes:"k.l.fl.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[217],["h.i.k.j.bp"],[0,0],N,"k.l.fl.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[240].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),30:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[218],[],[],N,"n.da.hh.bt",L))){break ifs;}if((J=E(Q,P,B[219],[],[],N,"n.da.hi.bt",L))){break ifs;
+}if((J=E(Q,P,B[220],[],[],N,"n.o.p.bt",L))){break ifs;}if((J=E(Q,P,B[221],["dw.f.bt","h.i.dw.bt","h.i.dw.bt"],[0,1,1,2,2,0],N,"",L))){break ifs;
+}if((J=E(Q,P,B[222],["dw.f.bt","h.i.dw.bt","ce.dk.fn.bt","dw.f.hj.bt","be.bf.bt","ce.dk.hk.bt","n.da.hl.bt","dw.f.hl.bt","h.i.dw.bt","k.bm.hl.bt","be.bf.hm.bt","ce.dk.hn.bt"],[0,1,1,0,2,2,3,3,4,4,5,5,6,6,7,8,8,7,9,9,10,10,11,11],N,"",L))){break ifs;
+}if((J=E(Q,P,B[223],["h.i.dw.bt"],[0,0],N,"",L))){M.push(29);O.push("");break ifs;}}return J;}}),270:({scopes:"d.bo.he.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[224],["h.i.he.cd"],[0,0],N,"d.bo.he.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[225],[],[],N,"h.bc.ho.cd",L))){break ifs;}if((J=H[323].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[326].go(Q,P,K,M,O,L))){break ifs;}if((J=H[302].go(Q,P,K,M,O,L))){break ifs;}if((J=H[316].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),497:({scopes:"q.r.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[226],["h.i.q.g"],[0,0],N,"q.r.g",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[227],[],[],N,"be.bf.hp.g",L))){break ifs;}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),194:({scopes:"k.l.fl.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[228],["h.i.k.j.bp"],[0,0],N,"k.l.fl.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[252].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),84:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[229],["h.i.dw.bt"],[0,0],N,"dw.f.hq.hr.bt",L))){break ifs;}}return J;
+}}),334:({scopes:"k.bq.br.gi.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[230],["h.i.k.j.ch"],[0,0],N,"k.bq.br.gi.ch",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),143:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[231],[],[],N,"dp.dw.hs.cm",L))){break ifs;}}return J;}}),154:({scopes:"k.bq.br.fi.ff.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[232]:B[233]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.ff.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),503:({scopes:"q.r.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[234],["h.i.q.m"],[0,0],N,"q.r.m",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),69:({scopes:"k.bq.br.by.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[235],[],[],N,"k.bq.br.by.bs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[236],[],[],N,"n.o.p.bt",L))){break ifs;
+}}return J;}}),90:({scopes:"d.fn.ht.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[237],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,(G(Q,A[179],(P-1))?B[238]:null),[],[],N,"",L))){M.push(89);
+O.push(" w.f.fh.cm");break ifs;}}return J;}}),103:({scopes:"d.cu.fm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[239],["h.i.hu.j.cm"],[0,0],N,"d.cu.fm.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[240],["h.i.fm.cm"],[0,0],N,"",L))){M.push(101);O.push(" w.x.cu.fm.cm");break ifs;
+}if((J=E(Q,P,B[241],["h.i.hu.bl.cm"],[0,0],N,"",L))){M.push(102);O.push(" d.cu.fm.hu.cm");break ifs;}}return J;
+}}),478:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[242],[],[],N,"a.cz.cq.c",L))){M.push(475);O.push(" a.cz.cq.c");break ifs;
+}if((J=E(Q,P,B[243],[],[],N,"a.cz.hv.ev.c",L))){M.push(477);O.push(" a.cz.hv.ev.c");break ifs;}if((J=E(Q,P,B[244],["ce.dk.hw.c"],[0,0],N,"a.cz.c",L))){break ifs;
+}}return J;}}),531:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[530].go(Q,P,K,M,O,L))){break ifs;}if((J=H[526].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[523].go(Q,P,K,M,O,L))){break ifs;}if((J=H[525].go(Q,P,K,M,O,L))){break ifs;}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),421:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[245],["ce.cf.cr"],[0,0],N,"d.co.cp.eh.cr",L))){M.push(413);O.push(" d.co.cp.eh.cr");
+break ifs;}if((J=E(Q,P,B[246],["ce.cf.cr"],[0,0],N,"d.co.cp.fo.cr",L))){M.push(414);O.push(" d.co.cp.fo.cr");
+break ifs;}if((J=E(Q,P,B[247],["ce.cf.cr"],[0,0],N,"d.co.cp.gz.cr",L))){M.push(415);O.push(" d.co.cp.gz.cr");
+break ifs;}if((J=E(Q,P,B[248],["ce.cf.cr"],[0,0],N,"d.co.cp.hx.cr",L))){M.push(416);O.push(" d.co.cp.hx.cr");
+break ifs;}if((J=E(Q,P,B[249],["ce.cf.cr"],[0,0],N,"d.co.cp.cq.cr",L))){M.push(417);O.push(" d.co.cp.cq.cr");
+break ifs;}if((J=E(Q,P,B[250],["ce.cf.cr"],[0,0],N,"d.co.cp.cq.cr",L))){M.push(418);O.push(" d.co.cp.cq.cr");
+break ifs;}if((J=E(Q,P,B[251],["ce.cf.cr","ce.cf.cr"],[0,0,1,1],N,"d.co.cq.cr",L))){M.push(419);O.push(" d.co.cq.cr");
+break ifs;}if((J=E(Q,P,B[252],["ce.cf.cr"],[0,0],N,"d.co.cq.cr",L))){M.push(420);O.push(" d.co.cq.cr");
+break ifs;}}return J;}}),177:({scopes:"d.hy.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[253],[],[],N,"d.hy.bp",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),276:({scopes:"k.f.dn.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[254],["h.i.k.j.cd"],[0,0],N,"k.f.dn.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[314].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),295:({scopes:"k.bm.ca.cb.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[255],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}}return J;}}),318:({scopes:"k.cn.hz.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[256],["h.i.k.j.cd"],[0,0],N,"k.cn.hz.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),387:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[257],["a.cz.ee","w.x.cz.ee"],[0,0,1,1],N,"d.ia.ee",L))){M.push(382);
+O.push(" d.ia.ee");break ifs;}if((J=E(Q,P,B[258],["a.cz.ee","w.x.cz.ee"],[0,0,1,1],N,"d.ib.ee",L))){M.push(384);
+O.push(" d.ib.ee");break ifs;}if((J=E(Q,P,B[259],["a.b.ee"],[0,0],N,"d.ic.ee",L))){M.push(386);O.push(" d.ic.ee");
+break ifs;}}return J;}}),98:({scopes:"d.cu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[260],["h.i.ef.bl.cm","be.bf.id.cm"],[0,0,1,1],N,"d.cu.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[261],[],[],N,"",L))){M.push(97);O.push(" w.x.cu.cm");break ifs;}}return J;
+}}),155:({scopes:"k.bq.br.r.bs.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[262]:B[263]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.bs.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),385:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[264],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[387].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),275:({scopes:"d.bo.ie.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[265],["h.i.ie.cd"],[0,0],N,"d.bo.ie.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[305].go(Q,P,K,M,O,L))){break ifs;}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),94:({scopes:"w.x.cu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[266],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[132].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),211:({scopes:"k.bm.ca.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[267],["h.i.k.j.bp"],[0,0],N,"k.bm.ca.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),22:({scopes:"bh.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[268],["h.if.bj.ig.bt","bh.bt.bj.bu.ih.g","h.bk.bj.bl.bt","bh.bt","h.bk.bj.j.bt","bh.bt","h.if.bj.ii.bt"],[0,0,1,2,2,3,3,4,5,5,4,1,6,6],N,"",L))){break ifs;
+}if((J=E(Q,P,B[269],["h.if.bj.ig.bt"],[0,0],N,"",L))){M.push(24);O.push("");break ifs;}if((J=E(Q,P,(G(Q,A[206],(P-2))?B[270]:B[271]),["h.bk.bj.bl.bt","d.ij.bt"],[0,1,1,0],N,"bh.bt.bj.bu.g",L))){M.push(25);
+O.push(" bh.bt.bj.bu.g");break ifs;}}return J;}}),467:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[272],[],[],N,"",L))){M.push(466);O.push("");break ifs;}}return J;}}),36:({scopes:"q.r.gk.ft.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[273],["h.i.q.bt"],[0,0],N,"q.r.gk.ft.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[52].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),150:({scopes:"k.bq.br.fi.hb.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[274]:B[275]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.hb.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),75:({scopes:"k.bq.br.bt d.ha.bq.br.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[276],["h.i.k.j.bt"],[0,0],N,"k.bq.br.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),345:({scopes:"d.ik.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[277],[],[],N,"d.ik.ch",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),100:({scopes:"d.cu.fy.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[278],["h.i.ef.j.cm"],[0,0],N,"d.cu.fy.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[279],[],[],N,"",L))){M.push(99);O.push(" d.cu.fy.ef.cm");break ifs;}}return J;
+}}),320:({scopes:"k.bq.bx.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[280],["h.i.k.j.cd"],[0,0],N,"k.bq.bx.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),45:({scopes:"d.cu.bt d.cu.hu.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[281],[],[],N,"d.cu.bt",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[282],["a.cz.bt","a.b.bt","dw.f.bt","h.i.dw.bt","ce.dk.gh.bt","dp.cu.il.bt","h.i.ev.bl.bt"],[0,0,1,1,2,3,3,2,4,4,5,5,6,6],N,"d.cu.eu.ev.bt",L))){M.push(42);
+O.push(" d.cu.eu.ev.bt d.ev.bt");break ifs;}if((J=E(Q,P,B[283],["a.cz.bt","a.b.bt","dw.f.bt","h.i.dw.bt","ce.dk.gh.bt","n.im.bt","be.bf.in.bt"],[0,0,1,1,2,3,3,2,4,4,5,5,6,6],N,"d.cu.eu.ev.bt",L))){break ifs;
+}if((J=E(Q,P,B[284],["dp.fn.bt","a.b.bt","dw.f.bt","h.i.dw.bt","ce.dk.gh.bt","n.im.bt","be.bf.in.bt"],[0,0,1,1,2,3,3,2,4,4,5,5,6,6],N,"d.cu.eu.io.bt",L))){break ifs;
+}if((J=E(Q,P,B[285],["a.b.bt","dw.f.bt","h.i.dw.bt"],[0,0,1,2,2,1],N,"d.cu.eu.ip.bt",L))){break ifs;}if((J=E(Q,P,B[286],["a.b.bt","dw.f.bt","h.i.dw.bt","ce.dk.gh.bt"],[0,0,1,2,2,1,3,3],N,"d.cu.eu.iq.bt",L))){M.push(43);
+O.push(" d.cu.eu.iq.bt");break ifs;}if((J=E(Q,P,B[287],["h.i.q.bt"],[0,0],N,"q.r.bt",L))){M.push(44);
+O.push(" q.r.bt");break ifs;}}return J;}}),224:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[288],[],[],N,"",L))){M.push(223);O.push("");break ifs;}}return J;}}),18:({scopes:"k.bq.br.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[289],["h.i.k.j.m"],[0,0],N,"k.bq.br.m",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[290],[],[],N,"n.o.p.m",L))){break ifs;}}return J;}}),173:({scopes:"k.bq.bx.fi.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[291],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),89:({scopes:"w.f.fh.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[292],["h.bc.ht.cm"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),96:({scopes:"d.cu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[293],["h.i.ef.j.cm","h.bk.cu.bl.cm","be.bf.ir.cm"],[0,0,1,1,2,2],N,"d.cu.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[294],[],[],N,"",L))){M.push(94);O.push(" w.x.cu.cm");break ifs;}if((J=E(Q,P,B[295],["h.i.ef.bl.cm"],[0,0],N,"",L))){M.push(95);
+O.push(" d.cu.ef.cm");break ifs;}}return J;}}),455:({scopes:"d.fn.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[296],["h.bk.fn.j.c"],[0,0],N,"d.fn.c",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[487].go(Q,P,K,M,O,L))){break ifs;}if((J=H[460].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[297],["a.b.c","w.x.cz.fn.c"],[0,0,1,1],N,"d.fn.gb.c",L))){break ifs;
+}if((J=E(Q,P,B[298],["a.b.gt.c"],[0,0],N,"d.i.fn.is.it.c",L))){M.push(452);O.push(" d.i.fn.is.it.c");
+break ifs;}if((J=E(Q,P,B[299],["a.b.gu.c"],[0,0],N,"d.i.fn.iu.iv.c",L))){M.push(453);O.push(" d.i.fn.iu.iv.c");
+break ifs;}if((J=E(Q,P,B[300],[],[],N,"d.fn.iw.c",L))){M.push(454);O.push(" d.fn.iw.c");break ifs;}}return J;
+}}),392:({scopes:"d.en.l",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[301],["h.i.en.l"],[0,0],N,"d.en.l",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[388].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),79:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[55].go(Q,P,K,M,O,L))){break ifs;}if((J=H[66].go(Q,P,K,M,O,L))){break ifs;}if((J=H[76].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[58].go(Q,P,K,M,O,L))){break ifs;}if((J=H[72].go(Q,P,K,M,O,L))){break ifs;}if((J=H[78].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),152:({scopes:"k.bq.br.fi.eo.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[302]:B[303]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.eo.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),261:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[304],["h.i.k.bl.bs"],[0,0],N,"k.l.bs",L))){M.push(259);O.push(" k.l.bs");
+break ifs;}if((J=E(Q,P,B[305],["h.i.k.bl.bs"],[0,0],N,"k.l.fd.bs",L))){M.push(260);O.push(" k.l.fd.bs");
+break ifs;}}return J;}}),383:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[306],["h.i.be.ee","be.bf.ix.ee"],[0,0,1,1],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[387].go(Q,P,K,M,O,L))){break ifs;}if((J=H[380].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),24:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[206],(P-2))?B[307]:null),["h.if.bj.ii.bt"],[0,0],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[308],["h.bk.bj.bl.bt"],[0,0],N,"bh.bt.bj.r.g",L))){M.push(23);O.push(" bh.bt.bj.r.g");
+break ifs;}}return J;}}),480:({scopes:"w.f.fh.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[309],[],[],N,"w.f.fh.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[310],[],[],N,"a.cz.cq.c",L))){M.push(479);O.push(" a.cz.cq.c");break ifs;}}return J;}}),529:({scopes:"d.iy.iz.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[233],(P-1))?B[311]:null),[],[],N,"d.iy.iz.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[312],["h.i.k.bl.g"],[0,0],N,"k.bq.br.g",L))){M.push(527);O.push(" k.bq.br.g d.ja.iz.g");
+break ifs;}if((J=E(Q,P,B[313],["h.i.k.bl.g"],[0,0],N,"k.bq.bx.g",L))){M.push(528);O.push(" k.bq.bx.g d.ja.iz.g");
+break ifs;}}return J;}}),326:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[314],["h.i.dw.cd"],[0,0],N,"dw.f.jb.cd",L))){break ifs;}if((J=E(Q,P,B[315],["h.i.dw.cd"],[0,0],N,"dw.f.jc.cd",L))){break ifs;
+}if((J=E(Q,P,B[316],["h.i.dw.cd"],[0,0],N,"dw.f.jd.cd",L))){break ifs;}if((J=E(Q,P,B[317],["h.i.dw.cd"],[0,0],N,"dw.f.je.cd",L))){M.push(325);
+O.push(" dw.f.je.cd");break ifs;}}return J;}}),390:({scopes:"d.en.jf.l",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[318],["h.i.en.l"],[0,0],N,"d.en.jf.l",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[388].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),324:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[319]:null),[],[],N,"dp.cu.jg.cd",L))){break ifs;
+}if((J=E(Q,P,B[320],[],[],N,"dp.cu.jg.cd",L))){break ifs;}}return J;}}),6:({scopes:"d.jh.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[321],[],[],N,"d.jh.ey",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[322],[],[],N,"dp.cz.jh.ey",L))){break ifs;
+}}return J;}}),395:({scopes:"bh.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[399].go(Q,P,K,M,O,L))){break ifs;}if((J=H[408].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),523:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[323],["h.i.k.bl.g"],[0,0],N,"k.bq.br.g",L))){M.push(522);O.push(" k.bq.br.g");
+break ifs;}}return J;}}),485:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[324],[],[],N,"a.cz.ji.ev.c",L))){break ifs;}}return J;}}),209:({scopes:"u.g.bj.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[325],[],[],N,"u.g.bj.bp",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[494].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),286:({scopes:"k.bm.ca.cm.cd bh.cm.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[326],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cm.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),465:({scopes:"d.jj.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[327],[],[],N,"d.jj.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[484].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[328],[],[],N,"",L))){M.push(464);O.push("");break ifs;}}return J;}}),236:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[329],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(235);O.push("");break ifs;
+}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),169:({scopes:"k.bq.bx.fi.ff.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[330],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.ff.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),459:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[460].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[331],[],[],N,"",L))){M.push(458);
+O.push("");break ifs;}if((J=H[451].go(Q,P,K,M,O,L))){break ifs;}if((J=H[484].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[463].go(Q,P,K,M,O,L))){break ifs;}if((J=H[449].go(Q,P,K,M,O,L))){break ifs;}if((J=H[468].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[487].go(Q,P,K,M,O,L))){break ifs;}if((J=H[490].go(Q,P,K,M,O,L))){break ifs;}if((J=H[439].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),47:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[332],[],[],N,"k.bm.ca.bt",L))){M.push(35);O.push(" k.bm.ca.bt");break ifs;
+}if((J=E(Q,P,B[333],["h.i.q.bt"],[0,0],N,"q.r.gk.ft.bt",L))){M.push(36);O.push(" q.r.gk.ft.bt");break ifs;
+}if((J=E(Q,P,B[334],["h.i.q.bt"],[0,0],N,"q.r.bt",L))){M.push(37);O.push(" q.r.bt");break ifs;}if((J=E(Q,P,B[335],["h.i.q.bt"],[0,0],N,"q.bu.ez.bt",L))){break ifs;
+}if((J=E(Q,P,B[336],["h.i.q.bt"],[0,0],N,"q.bu.bv.bt",L))){break ifs;}if((J=E(Q,P,B[337],["a.cz.fg.bt","w.x.cz.fg.bt","a.b.gt.bt"],[0,0,1,1,2,2],N,"d.fg.bt",L))){M.push(38);
+O.push(" d.fg.bt");break ifs;}if((J=E(Q,P,B[338],["a.b.jk.bt","a.cz.fn.bt","w.x.cz.fn.bt"],[0,0,1,1,2,2],N,"d.fn.bt",L))){M.push(40);
+O.push(" d.fn.bt");break ifs;}if((J=E(Q,P,B[339],[],[],N,"ce.cf.bt",L))){break ifs;}if((J=E(Q,P,B[340],["ce.cf.ci.gi.bt"],[0,0],N,"d.gi.bt",L))){M.push(41);
+O.push(" d.gi.bt");break ifs;}if((J=E(Q,P,B[341],["ce.cf.ex.bt","dp.fn.bt","dw.f.bt","h.i.dw.bt"],[0,0,1,1,2,3,3,2],N,"d.jl.bt",L))){break ifs;
+}if((J=E(Q,P,B[342],[],[],N,"ce.cf.ex.bt",L))){break ifs;}if((J=E(Q,P,B[343],["a.b.bt","a.cz.cu.bt","a.b.jm.bt","dp.cu.hs.bt","w.x.cu.bt","h.i.ef.bl.bt"],[0,0,1,1,2,2,3,3,4,4,5,5],N,"d.cu.bt",L))){M.push(45);
+O.push(" d.cu.bt d.cu.hu.bt");break ifs;}if((J=E(Q,P,B[344],[],[],N,"a.cz.bt",L))){break ifs;}if((J=E(Q,P,B[345],[],[],N,"a.b.bt",L))){break ifs;
+}if((J=H[49].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[346],["ce.dk.fn.bt","d.eq.jn.bt","dw.f.fn.bt","h.i.dw.bt","n.f.fn.bt"],[0,0,1,1,2,3,3,2,4,4],N,"",L))){break ifs;
+}if((J=H[81].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[347],["h.i.k.bt","ce.dk.ca.bt"],[0,0,1,1],N,"k.bm.ca.bt",L))){M.push(46);
+O.push(" k.bm.ca.bt");break ifs;}if((J=E(Q,P,B[348],[],[],N,"ce.dk.ga.bt",L))){break ifs;}if((J=E(Q,P,B[349],[],[],N,"a.b.jm.bt",L))){break ifs;
+}if((J=E(Q,P,B[350],[],[],N,"h.hd.jo.bt",L))){break ifs;}if((J=E(Q,P,B[351],[],[],N,"ce.dk.jp.bt",L))){break ifs;
+}if((J=E(Q,P,B[352],[],[],N,"ce.dk.jq.bt",L))){break ifs;}if((J=E(Q,P,B[353],[],[],N,"ce.dk.jr.bt",L))){break ifs;
+}if((J=E(Q,P,B[354],[],[],N,"ce.dk.fe.bt",L))){break ifs;}if((J=E(Q,P,B[355],[],[],N,"ce.dk.js.bt",L))){break ifs;
+}if((J=E(Q,P,B[356],[],[],N,"ce.dk.dm.bt",L))){break ifs;}if((J=E(Q,P,B[357],[],[],N,"ce.dk.k.bt",L))){break ifs;
+}if((J=E(Q,P,B[358],[],[],N,"ce.dk.gh.bt",L))){break ifs;}if((J=E(Q,P,B[359],["ce.dk.cz.bt","dp.fn.bt"],[0,0,1,1],N,"",L))){break ifs;
+}if((J=H[48].go(Q,P,K,M,O,L))){break ifs;}if((J=H[79].go(Q,P,K,M,O,L))){break ifs;}if((J=H[74].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[27].go(Q,P,K,M,O,L))){break ifs;}if((J=H[85].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,(G(Q,A[275],(P-1))?B[360]:null),["ce.dk.bt","dw.f.hj.bt"],[0,0,1,1],N,"",L))){break ifs;
+}if((J=H[28].go(Q,P,K,M,O,L))){break ifs;}if((J=H[26].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),332:({scopes:"d.s.jt.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[361],[],[],N,"d.s.jt.ch",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[362],[],[],N,"h.bc.ek.ch",L))){break ifs;
+}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),284:({scopes:"k.bm.ca.bp.cd bh.bp.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[363],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.bp.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),412:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[364],[],[],N,"dp.fn.gz.ju.cr",L))){break ifs;}if((J=E(Q,P,B[365],[],[],N,"dp.fn.gz.jv.cr",L))){break ifs;
+}if((J=E(Q,P,B[366],[],[],N,"dp.cu.gz.jv.cr",L))){break ifs;}if((J=E(Q,P,B[367],[],[],N,"dp.fn.gz.jw.cr",L))){break ifs;
+}if((J=E(Q,P,B[368],[],[],N,"dp.cu.gz.jw.cr",L))){break ifs;}if((J=E(Q,P,B[369],[],[],N,"dp.fn.gz.jx.cr",L))){break ifs;
+}if((J=E(Q,P,B[370],[],[],N,"dp.cu.gz.jy.cr",L))){break ifs;}if((J=E(Q,P,B[371],[],[],N,"dp.fn.gz.jz.cr",L))){break ifs;
+}if((J=E(Q,P,B[372],[],[],N,"dp.cu.gz.jz.cr",L))){break ifs;}if((J=E(Q,P,B[373],[],[],N,"dp.fn.gz.ka.cr",L))){break ifs;
+}if((J=E(Q,P,B[374],[],[],N,"dp.fn.gz.kb.cr",L))){break ifs;}if((J=E(Q,P,B[375],[],[],N,"dp.cu.gz.gz.cr",L))){break ifs;
+}if((J=E(Q,P,B[376],[],[],N,"dp.fn.gz.v.cr",L))){break ifs;}if((J=E(Q,P,B[377],[],[],N,"dp.fn.kc.f.cr",L))){break ifs;
+}}return J;}}),171:({scopes:"k.bq.bx.fi.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[378],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),330:({scopes:"k.bq.br.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[379],["h.i.k.j.ch"],[0,0],N,"k.bq.br.ch",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[369].go(Q,P,K,M,O,L))){break ifs;}if((J=H[370].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),182:({scopes:"n.f.kd.ke.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[380],["h.i.n.bp"],[0,0],N,"n.f.kd.ke.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),230:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[381],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(229);O.push("");break ifs;
+}}return J;}}),410:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[382],[],[],N,"dp.fn.kf.cr",L))){break ifs;}if((J=E(Q,P,B[383],[],[],N,"dp.cu.kf.cr",L))){break ifs;
+}if((J=E(Q,P,B[384],[],[],N,"dp.n.kf.cr",L))){break ifs;}if((J=E(Q,P,B[385],[],[],N,"dp.dw.kf.cr",L))){break ifs;
+}if((J=E(Q,P,B[386],[],[],N,"dp.fn.kg.cr",L))){break ifs;}}return J;}}),138:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[387],["h.bc.ef.cm"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),519:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[388],["h.i.q.kh"],[0,0],N,"q.r.kh",L))){M.push(516);O.push(" q.r.kh");
+break ifs;}if((J=E(Q,P,B[389],["h.bk.bj.bp"],[0,0],N,"bh.bp.bj.g",L))){M.push(517);O.push(" bh.bp.bj.g");
+break ifs;}if((J=E(Q,P,B[390],["h.bk.bj.bp.ec"],[0,0],N,"bh.bp.ec.bj.g",L))){M.push(518);O.push(" bh.bp.ec.bj.g");
+break ifs;}}return J;}}),282:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[391],["a.cz.cu.cd","w.x.cu.cd","h.i.hu.cd"],[0,0,1,1,2,2],N,"d.cu.cd",L))){M.push(280);
+O.push(" d.cu.cd");break ifs;}if((J=E(Q,P,B[392],["w.x.cu.cd","h.i.hu.cd"],[0,0,1,1],N,"d.cu.cd",L))){M.push(281);
+O.push(" d.cu.cd");break ifs;}}return J;}}),10:({scopes:"q.r.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[393],["h.i.q.ey"],[0,0],N,"q.r.ey",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),161:({scopes:"k.bq.bx.r.fj.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[394]:B[395]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.fj.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),505:({scopes:"bh.m.bj.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[307],(P-8))?B[396]:null),["h.i.e.g"],[0,0],N,"bh.m.bj.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,((!G(Q,A[307],(P-8)))?B[397]:null),["h.i.e.g"],[0,0],N,"",L))){M.push(504);
+O.push("");break ifs;}}return J;}}),232:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[398],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(231);O.push("");break ifs;
+}}return J;}}),179:({scopes:"d.cu.ki.kj.bp dw.gg.cu.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[399],["h.i.ef.bp"],[0,0],N,"d.cu.ki.kj.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),207:({scopes:"k.bq.f.ei.em.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[400],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.em.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[401],[],[],N,"",L))){break ifs;}}return J;}}),431:({scopes:"bh.c.bj.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[402],["h.bk.bj.j.v"],[0,0],N,"bh.c.bj.v",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[438].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),55:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[403],["h.i.k.bl.bt"],[0,0],N,"k.l.ke.bt",L))){M.push(54);O.push(" k.l.ke.bt");
+break ifs;}}return J;}}),12:({scopes:"k.bq.br.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[404],["h.i.k.j.ey"],[0,0],N,"k.bq.br.ey",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[405],[],[],N,"n.o.p.ey",L))){break ifs;}}return J;}}),234:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[406],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(233);O.push("");break ifs;
+}}return J;}}),433:({scopes:"k.bq.br.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[407],["h.i.k.j.v"],[0,0],N,"k.bq.br.v",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),288:({scopes:"k.bm.ca.cr.cd bh.cr.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[408],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cr.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),463:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[409],[],[],N,"n.im.c",L))){break ifs;}if((J=E(Q,P,B[410],[],[],N,"dw.im.c",L))){break ifs;
+}if((J=E(Q,P,B[411],[],[],N,"n.da.c",L))){break ifs;}if((J=E(Q,P,B[412],["ce.dk.hw.c"],[0,0],N,"n.f.c",L))){break ifs;
+}}return J;}}),159:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[413],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.r.hb.cm",L))){M.push(145);
+O.push(" k.bq.br.r.hb.cm");break ifs;}if((J=E(Q,P,B[414],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.r.fj.cm",L))){M.push(146);
+O.push(" k.bq.br.r.fj.cm");break ifs;}if((J=E(Q,P,B[415],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.r.eo.cm",L))){M.push(147);
+O.push(" k.bq.br.r.eo.cm");break ifs;}if((J=E(Q,P,B[416],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.r.gm.cm",L))){M.push(148);
+O.push(" k.bq.br.r.gm.cm");break ifs;}if((J=E(Q,P,B[417],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.r.ff.cm",L))){M.push(149);
+O.push(" k.bq.br.r.ff.cm");break ifs;}if((J=E(Q,P,B[418],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.fi.hb.cm",L))){M.push(150);
+O.push(" k.bq.br.fi.hb.cm");break ifs;}if((J=E(Q,P,B[419],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.fi.fj.cm",L))){M.push(151);
+O.push(" k.bq.br.fi.fj.cm");break ifs;}if((J=E(Q,P,B[420],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.fi.eo.cm",L))){M.push(152);
+O.push(" k.bq.br.fi.eo.cm");break ifs;}if((J=E(Q,P,B[421],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.fi.gm.cm",L))){M.push(153);
+O.push(" k.bq.br.fi.gm.cm");break ifs;}if((J=E(Q,P,B[422],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.br.fi.ff.cm",L))){M.push(154);
+O.push(" k.bq.br.fi.ff.cm");break ifs;}if((J=E(Q,P,B[423],["h.i.k.bl.cm"],[0,0],N,"k.bq.br.r.bs.cm",L))){M.push(155);
+O.push(" k.bq.br.r.bs.cm");break ifs;}if((J=E(Q,P,B[424],["h.i.k.bl.cm"],[0,0],N,"k.bq.br.fi.bs.cm",L))){M.push(156);
+O.push(" k.bq.br.fi.bs.cm");break ifs;}if((J=E(Q,P,B[425],["h.i.k.bl.cm"],[0,0],N,"k.bq.br.r.cm",L))){M.push(157);
+O.push(" k.bq.br.r.cm");break ifs;}if((J=E(Q,P,B[426],["h.i.k.bl.cm"],[0,0],N,"k.bq.br.fi.cm",L))){M.push(158);
+O.push(" k.bq.br.fi.cm");break ifs;}}return J;}}),457:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[460].go(Q,P,K,M,O,L))){break ifs;}if((J=H[456].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[467].go(Q,P,K,M,O,L))){break ifs;}if((J=H[473].go(Q,P,K,M,O,L))){break ifs;}if((J=H[441].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[487].go(Q,P,K,M,O,L))){break ifs;}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),181:({scopes:"n.f.kd.kk.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[427],["h.i.n.bp"],[0,0],N,"n.f.kd.kk.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[428],[],[],N,"n.o.p.bp",L))){break ifs;}}return J;}}),14:({scopes:"k.bq.bx.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[429],["h.i.k.j.ey"],[0,0],N,"k.bq.bx.ey",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[430],[],[],N,"n.o.p.ey",L))){break ifs;}}return J;}}),278:({scopes:"d.bo.en.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[330],(P-1)))?B[431]:null),["h.i.en.cd"],[0,0],N,"d.bo.en.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),228:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[432],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(227);O.push("");break ifs;
+}}return J;}}),452:({scopes:"d.i.fn.is.it.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[433],[],[],N,"d.i.fn.is.it.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[481].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[460].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),2:({scopes:"d.kl.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[434],[],[],N,"d.kl.ey",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[11].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[435],[],[],N,"w.x.e.ey",L))){break ifs;}if((J=E(Q,P,B[436],["h.i.w.ey"],[0,0],N,"w.f.km.fn.ey",L))){break ifs;
+}if((J=E(Q,P,B[437],["h.i.w.ey"],[0,0],N,"w.f.km.iz.ey",L))){break ifs;}if((J=E(Q,P,B[438],[],[],N,"w.x.e.kn.ey",L))){break ifs;
+}if((J=E(Q,P,B[439],["h.i.w.ey"],[0,0],N,"w.f.km.ko.ey",L))){break ifs;}if((J=E(Q,P,B[440],["h.i.w.ey"],[0,0],N,"w.f.km.kp.ey",L))){break ifs;
+}if((J=E(Q,P,B[441],["h.i.w.ey","w.f.km.kr.ey","h.bc.dk.ey","k.bm.ks.ey","k.bq.br.ks.ey","h.i.k.bl.ey","h.i.k.j.ey"],[0,0,1,1,2,2,3,3,4,5,5,6,6,4],N,"d.kq.ey",L))){break ifs;
+}}return J;}}),343:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[442],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[344].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[347].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),110:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[443],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[130].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),372:({scopes:"d.cu.kt.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[444],["h.i.ef.ch"],[0,0],N,"d.cu.kt.ee",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),238:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[445],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(237);O.push("");break ifs;
+}}return J;}}),136:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[446],[],[],N,"",L))){break ifs;}}return J;}}),59:({scopes:"k.bq.bx.by.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[447],[],[],N,"k.bq.bx.by.bs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[448],[],[],N,"n.o.p.bt",L))){break ifs;
+}}return J;}}),226:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[449],["h.bk.bj.bp","bh.bp.bj.bh.ih"],[0,1,1,0],N,"bh.bp.bj.bh",L))){break ifs;
+}if((J=E(Q,P,B[450],["h.bk.bj.bp"],[0,0],N,"bh.bp.bj.bh",L))){M.push(225);O.push(" bh.bp.bj.bh");break ifs;
+}if((J=E(Q,P,B[451],["h.i.dw.bp"],[0,0],N,"dw.f.ku.kv.bp",L))){break ifs;}if((J=E(Q,P,B[452],["h.i.dw.bp"],[0,0],N,"dw.f.ku.fn.bp",L))){break ifs;
+}if((J=E(Q,P,B[453],["h.i.dw.bp"],[0,0],N,"dw.f.ku.hq.bp",L))){break ifs;}}return J;}}),257:({scopes:"q.r.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[454],["h.i.q.bs"],[0,0],N,"q.r.ch",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),366:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[455],["d.s.ch","ce.cf.ci.ch"],[0,1,1,0],N,"",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[342].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),8:({scopes:"d.kw.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[456],["h.hd.kx.ey"],[0,0],N,"d.kw.ey",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[457],[],[],N,"dp.n.kw.ey",L))){break ifs;}if((J=E(Q,P,B[458],[],[],N,"dp.n.ky.ey",L))){break ifs;
+}if((J=E(Q,P,B[459],[],[],N,"dp.n.kz.la.ey",L))){break ifs;}if((J=E(Q,P,B[460],[],[],N,"be.lb.kz.lc.ey",L))){break ifs;
+}if((J=E(Q,P,B[461],[],[],N,"n.da.ey",L))){break ifs;}if((J=E(Q,P,(G(Q,A[354],(P-1))?B[462]:B[463]),[],[],N,"ce.f.ld.ey",L))){break ifs;
+}if((J=E(Q,P,B[464],["h.i.n.ey"],[0,0],N,"n.f.kz.le.ey",L))){break ifs;}if((J=H[13].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[15].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[465],["dp.cu.lf.ey","h.bk.cu.ey"],[0,0,1,1],N,"",L))){M.push(7);
+O.push("");break ifs;}if((J=E(Q,P,B[466],[],[],N,"ce.f.lg.ey",L))){break ifs;}}return J;}}),516:({scopes:"q.r.kh",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[467],["h.i.q.kh"],[0,0],N,"q.r.kh",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),116:({scopes:"d.fa.lh.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[468],["h.i.lh.j.cm"],[0,0],N,"d.fa.lh.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,(G(Q,A[362],(P-1))?B[469]:null),[],[],N,"",L))){M.push(115);O.push(" d.fa.lh.li.cm");
+break ifs;}}return J;}}),525:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[470],["h.i.k.bl.g"],[0,0],N,"k.bq.bx.g",L))){M.push(524);O.push(" k.bq.bx.g");
+break ifs;}}return J;}}),240:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[471],["h.bk.bo.bp"],[0,0],N,"",L))){M.push(239);O.push("");break ifs;
+}}return J;}}),527:({scopes:"k.bq.br.g d.ja.iz.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[472],["h.i.k.j.g"],[0,0],N,"k.bq.br.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;}if((J=H[511].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),114:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[473],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),368:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[474],[],[],N,"ce.dk.lj.ch",L))){break ifs;}}return J;}}),73:({scopes:"k.cn.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[475],["h.i.k.j.bt"],[0,0],N,"k.cn.bt",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[476],[],[],N,"n.o.p.bt",L))){break ifs;}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),63:({scopes:"k.bq.f.bz.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[477],[],[],N,"k.bq.f.bz.bs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),297:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[478],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.bp.cd",L))){M.push(283);
+O.push(" k.bm.ca.cb.bp.cd bh.bp.bj.cd");break ifs;}if((J=E(Q,P,B[479],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.bp.cd",L))){M.push(284);
+O.push(" k.bm.ca.bp.cd bh.bp.bj.cd");break ifs;}if((J=E(Q,P,B[480],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.cm.cd",L))){M.push(285);
+O.push(" k.bm.ca.cb.cm.cd bh.cm.bj.cd");break ifs;}if((J=E(Q,P,B[481],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cm.cd",L))){M.push(286);
+O.push(" k.bm.ca.cm.cd bh.cm.bj.cd");break ifs;}if((J=E(Q,P,B[482],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.cr.cd",L))){M.push(287);
+O.push(" k.bm.ca.cb.cr.cd bh.cr.bj.cd");break ifs;}if((J=E(Q,P,B[483],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cr.cd",L))){M.push(288);
+O.push(" k.bm.ca.cr.cd bh.cr.bj.cd");break ifs;}if((J=E(Q,P,B[484],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.g.cd",L))){M.push(289);
+O.push(" k.bm.ca.cb.g.cd u.g.bj.cd");break ifs;}if((J=E(Q,P,B[485],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.g.cd",L))){M.push(290);
+O.push(" k.bm.ca.g.cd u.g.bj.cd");break ifs;}if((J=E(Q,P,B[486],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.ew.cd",L))){M.push(291);
+O.push(" k.bm.ca.cb.ew.cd u.g.ew.bj.cd");break ifs;}if((J=E(Q,P,B[487],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.ew.cd",L))){M.push(292);
+O.push(" k.bm.ca.ew.cd u.g.ew.bj.cd");break ifs;}if((J=E(Q,P,B[488],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.cc.cd",L))){M.push(293);
+O.push(" k.bm.ca.cb.cc.cd u.g.cc.bj.cd");break ifs;}if((J=E(Q,P,B[489],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cc.cd",L))){M.push(294);
+O.push(" k.bm.ca.cc.cd u.g.cc.bj.cd");break ifs;}if((J=E(Q,P,B[490],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cb.cd",L))){M.push(295);
+O.push(" k.bm.ca.cb.cd");break ifs;}if((J=E(Q,P,B[491],["h.i.k.cd","ce.dk.ca.cd","ce.cf.cg.cd"],[0,1,1,2,2,0],N,"k.bm.ca.cd",L))){M.push(296);
+O.push(" k.bm.ca.cd");break ifs;}}return J;}}),20:({scopes:"q.r.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[492],["h.i.q.m"],[0,0],N,"q.r.m",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),280:({scopes:"d.cu.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[493],["h.i.cu.cd"],[0,0],N,"d.cu.cd",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),4:({scopes:"d.lk.ci.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[494],["ce.cf.lk.ci.ey"],[0,0],N,"d.lk.ci.ey",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[13].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[495],["dp.cu.ll.ey","h.bk.cu.ey"],[0,0,1,1],N,"",L))){M.push(3);
+O.push("");break ifs;}}return J;}}),112:({scopes:"d.lm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[496],["h.i.hu.j.cm"],[0,0],N,"d.lm.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[497],[],[],N,"",L))){M.push(110);O.push("");break ifs;}if((J=E(Q,P,B[498],["h.i.hu.bl.cm"],[0,0],N,"",L))){M.push(111);
+O.push(" d.lm.hu.cm");break ifs;}}return J;}}),214:({scopes:"k.bm.bj.bp.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[499],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.bp.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),370:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[500],[],[],N,"n.f.ln.ch",L))){break ifs;}if((J=E(Q,P,B[501],[],[],N,"be.bf.ln.ch",L))){break ifs;
+}}return J;}}),134:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[502],["n.o.p.ff.lo.cm","n.o.p.ff.lp.cm","n.o.p.ff.x.cm"],[0,0,1,1,2,2],N,"",L))){break ifs;
+}}return J;}}),502:({scopes:"bh.ey.bj.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[503],["h.i.e.g","w.x.e.lq.g","h.i.e.g"],[0,0,1,1,2,2],N,"bh.ey.bj.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[504],["h.i.e.g"],[0,0],N,"",L))){M.push(501);
+O.push("");break ifs;}}return J;}}),57:({scopes:"k.l.kk.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[505],["h.i.k.j.bt"],[0,0],N,"k.l.kk.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[506],["h.i.lr.bt","h.i.lr.bt"],[0,0,1,1],N,"k.l.lr.bt",L))){break ifs;}if((J=E(Q,P,B[507],[],[],N,"n.o.p.ls.bt",L))){break ifs;
+}if((J=E(Q,P,B[508],[],[],N,"n.o.p.bt",L))){break ifs;}if((J=E(Q,P,B[509],["h.i.lt.bt"],[0,0],N,"k.l.lt.bt",L))){M.push(56);
+O.push(" k.l.lt.bt");break ifs;}if((J=E(Q,P,B[510],[],[],N,"ce.dk.l.bt",L))){break ifs;}}return J;}}),303:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[511],[],[],N,"ce.cf.cd",L))){break ifs;}if((J=E(Q,P,B[512],[],[],N,"a.b.cd",L))){break ifs;
+}}return J;}}),470:({scopes:"d.ki.lu.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[513],[],[],N,"d.ki.lu.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[439].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),220:({scopes:"k.bm.bj.cd.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[514],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.cd.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),28:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[515],["ce.f.lv.bt","dw.f.bt","dp.fn.bt","dp.fn.bt"],[0,0,1,1,2,2,3,3],N,"",L))){break ifs;
+}}return J;}}),307:({scopes:"d.bo.dv.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[516],["ce.cf.cd"],[0,0],N,"d.bo.dv.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),435:({scopes:"k.bq.bx.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[517],["h.i.k.j.v"],[0,0],N,"k.bq.bx.v",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),163:({scopes:"k.bq.bx.r.gm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[518]:B[519]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.gm.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),122:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[520],[],[],N,"dp.cz.cm",L))){break ifs;}}return J;}}),218:({scopes:"k.bm.bj.ey.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[521],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.ey.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[1].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),358:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[522],["d.s.ch","ce.cf.ci.cj.ch"],[0,1,1,0],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[523],["d.s.ch","ce.cf.ci.ck.ch"],[0,1,1,0],N,"",L))){M.push(356);
+O.push(" q.r.s.t");break ifs;}if((J=E(Q,P,B[524],[],[],N,"",L))){M.push(357);O.push("");break ifs;}}return J;
+}}),476:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[525],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),427:({scopes:"q.r.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[526],["h.i.q.v"],[0,0],N,"q.r.v",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),53:({scopes:"k.l.lt.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[527],["h.i.lt.bt"],[0,0],N,"k.l.lt.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),299:({scopes:"k.f.dn.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[528],["h.i.k.j.cd"],[0,0],N,"k.f.dn.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[314].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),347:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[529],["d.s.ch","ce.cf.ci.lw.ch","d.ja.lx.ch"],[0,1,1,2,2,0],N,"d.bk",L))){break ifs;
+}}return J;}}),360:({scopes:"q.r.s.t.cs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[530],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[344].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[347].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),474:({scopes:"a.cz.cq.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[531],[],[],N,"a.cz.cq.c",(function(){(L&&L());M.pop();O.pop();})))){}}return J;
+}}),216:({scopes:"k.bm.bj.ch.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[532],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.ch.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[327].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),222:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[533],[],[],N,"n.o.p.bp",L))){break ifs;}}return J;}}),175:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[159].go(Q,P,K,M,O,L))){break ifs;}if((J=H[174].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),381:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[534],["h.i.be.ee"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[387].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[380].go(Q,P,K,M,O,L))){break ifs;}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),165:({scopes:"k.bq.bx.fi.hb.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[535],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.hb.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),450:({scopes:"d.gd.jf.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[536],[],[],N,"d.gd.jf.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[537],[],[],N,"ce.dk.ly.lz.c",L))){break ifs;
+}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),472:({scopes:"d.ki.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[538],[],[],N,"d.ki.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[487].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[539],["w.x.cu.c"],[0,0],N,"d.ki.gb.c",L))){M.push(469);O.push(" d.ki.gb.c");break ifs;
+}if((J=E(Q,P,B[540],[],[],N,"d.ki.lu.c",L))){M.push(470);O.push(" d.ki.lu.c");break ifs;}if((J=H[492].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[541],[],[],N,"d.ki.iw.c",L))){M.push(471);O.push(" d.ki.iw.c");break ifs;}}return J;}}),71:({scopes:"k.bq.bx.bs.bt bh.bs.bj.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[542],["h.i.k.j.bt"],[0,0],N,"k.bq.bx.bs.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[543],[],[],N,"q.bu.bv.bs",L))){break ifs;}if((J=E(Q,P,B[544],[],[],N,"q.bu.bw.bs",L))){break ifs;
+}if((J=E(Q,P,B[545],[],[],N,"k.bq.bx.by.bs",L))){M.push(67);O.push(" k.bq.bx.by.bs");break ifs;}if((J=E(Q,P,B[546],[],[],N,"k.bq.f.bz.by.bs",L))){M.push(68);
+O.push(" k.bq.f.bz.by.bs");break ifs;}if((J=E(Q,P,B[547],[],[],N,"k.bq.br.by.bs",L))){M.push(69);O.push(" k.bq.br.by.bs");
+break ifs;}if((J=E(Q,P,B[548],["n.o.p.bt"],[0,0],N,"k.bq.bx.bs",L))){M.push(70);O.push(" k.bq.bx.bs");
+break ifs;}if((J=E(Q,P,B[549],[],[],N,"n.o.p.bt",L))){break ifs;}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),26:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[550],[],[],N,"n.im.bt",L))){break ifs;}if((J=E(Q,P,B[551],[],[],N,"dp.n.ma.bt",L))){break ifs;
+}if((J=E(Q,P,B[552],[],[],N,"dp.n.mb.bt",L))){break ifs;}if((J=E(Q,P,B[553],[],[],N,"n.f.bt",L))){break ifs;
+}}return J;}}),359:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[554],["d.s.ch","ce.cf.ci.cj.ch","n.da.s.ch"],[0,1,1,2,2,0],N,"",L))){M.push(358);
+O.push("");break ifs;}}return J;}}),308:({scopes:"d.bo.dy.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[555],["ce.cf.cd"],[0,0],N,"d.bo.dy.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),420:({scopes:"d.co.cq.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[556],["ce.cf.cr"],[0,0],N,"d.co.cq.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),121:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[557],[],[],N,"dp.cu.jg.cm",L))){break ifs;}}return J;}}),201:({scopes:"k.bq.f.ei.ej.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[558],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.ej.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),490:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[559],["h.i.k.bl.c"],[0,0],N,"k.bq.br.c",L))){M.push(488);O.push(" k.bq.br.c");
+break ifs;}if((J=E(Q,P,B[560],["h.i.k.bl.c"],[0,0],N,"k.bq.bx.c",L))){M.push(489);O.push(" k.bq.bx.c");
+break ifs;}}return J;}}),123:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[561],[],[],N,"n.f.ln.cm",L))){break ifs;}}return J;}}),448:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[419],(P-1))?(G(Q,A[125],(P-1))?B[562]:B[563]):(G(Q,A[125],(P-1))?B[564]:B[565])),[],[],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[566],["a.cz.c"],[0,0],N,"",L))){M.push(444);O.push("");break ifs;
+}if((J=E(Q,P,B[567],[],[],N,"",L))){M.push(446);O.push("");break ifs;}if((J=E(Q,P,B[568],[],[],N,"d.mc.c",L))){M.push(447);
+O.push(" d.mc.c");break ifs;}}return J;}}),422:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[569],[],[],N,"dp.fn.eh.cr",L))){break ifs;}if((J=E(Q,P,B[570],[],[],N,"dp.cu.eh.cr",L))){break ifs;
+}}return J;}}),446:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[162],(P-1))?B[571]:null),[],[],N,"",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[572],[],[],N,"",L))){M.push(445);
+O.push("");break ifs;}}return J;}}),363:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[573],["d.s.ch","ce.cf.ci.cj.ch","n.da.s.ch"],[0,1,1,2,2,0],N,"",L))){M.push(362);
+O.push("");break ifs;}}return J;}}),255:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[574],["h.i.lr.bp","h.i.lr.bp"],[0,0,1,1],N,"k.l.lr.bp",L))){break ifs;}if((J=E(Q,P,B[575],["h.i.lt.bp"],[0,0],N,"k.l.lt.bp",L))){M.push(253);
+O.push(" k.l.lt.bp");break ifs;}if((J=E(Q,P,B[576],["h.i.en.bp"],[0,0],N,"k.l.en.bp",L))){M.push(254);
+O.push(" k.l.en.bp");break ifs;}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[577]:null),["h.i.q.bp"],[0,0],N,"q.bu.bv.bp",L))){break ifs;
+}}return J;}}),314:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[326].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[578],[],[],N,"ce.dk.jr.cd",L))){break ifs;
+}if((J=E(Q,P,B[579],[],[],N,"n.da.hi.cd",L))){break ifs;}if((J=E(Q,P,B[580],[],[],N,"n.da.hh.cd",L))){break ifs;
+}if((J=E(Q,P,B[581],[],[],N,"n.da.f.cd",L))){break ifs;}if((J=E(Q,P,B[582],[],[],N,"n.da.md.cd",L))){break ifs;
+}}return J;}}),517:({scopes:"bh.bp.bj.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[583],["h.bk.bj.bp"],[0,0],N,"bh.bp.bj.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[584],["h.i.q.bp"],[0,0],N,"q.bu.bv.bp",L))){break ifs;}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),424:({scopes:"d.e.s.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[585],["h.i.e.v"],[0,0],N,"d.e.s.v",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[586],[],[],N,"w.f.km.v",L))){break ifs;}if((J=H[434].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[436].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),500:({scopes:"d.e.y.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[587],["h.i.e.g"],[0,0],N,"d.e.y.g",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[588],["w.x.e.z.g"],[0,0],N,"d.e.y.z.g",L))){M.push(498);O.push(" d.e.y.z.g");break ifs;
+}if((J=E(Q,P,B[589],[],[],N,"n.f.hg.g",L))){M.push(499);O.push(" n.f.hg.g");break ifs;}if((J=E(Q,P,B[590],[],[],N,"be.bf.hp.g",L))){break ifs;
+}}return J;}}),125:({scopes:"q.r.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[591]:null),[],[],N,"q.r.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[174].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),355:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[592],["d.s.ch","ce.cf.ci.cj.ch","n.da.s.ch"],[0,1,1,2,2,0],N,"",L))){M.push(354);
+O.push("");break ifs;}}return J;}}),119:({scopes:"d.fa.fb.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[593],["h.i.fb.j.cm"],[0,0],N,"d.fa.fb.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[442],(P-1)))?B[594]:null),[],[],N,"",L))){M.push(117);
+O.push(" d.fa.fb.ga.cm");break ifs;}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[444],(P-1)))?B[595]:null),[],[],N,"",L))){M.push(118);
+O.push(" d.fa.fb.fc.cm");break ifs;}}return J;}}),512:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[596],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[22].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),349:({scopes:"q.r.s.cl",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[597],[],[],N,"q.r.s.cl",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[344].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[347].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),148:({scopes:"k.bq.br.r.gm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[598]:B[599]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.gm.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),306:({scopes:"d.bo.du.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[600],["ce.cf.cd"],[0,0],N,"d.bo.du.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),199:({scopes:"k.bq.f.ei.ej.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[601],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.ej.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[244].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),1:({scopes:"bh.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[602],[],[],N,"d.kl.ey",L))){M.push(2);O.push(" d.kl.ey");break ifs;}if((J=H[11].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[603],["ce.cf.lk.ci.ey","h.i.ce.ey"],[0,1,1,0],N,"d.lk.ci.ey",L))){M.push(4);O.push(" d.lk.ci.ey");
+break ifs;}if((J=E(Q,P,B[604],["ce.cf.lk.me.ey","h.i.ce.ey","dp.n.me.ey"],[0,1,1,0,2,2],N,"d.lk.me.ey",L))){M.push(5);
+O.push(" d.lk.me.ey");break ifs;}if((J=E(Q,P,B[605],["h.bk.ka.ey"],[0,0],N,"d.ka.ey",L))){M.push(9);O.push(" d.ka.ey");
+break ifs;}}return J;}}),85:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[83].go(Q,P,K,M,O,L))){break ifs;}if((J=H[84].go(Q,P,K,M,O,L))){break ifs;}if((J=H[82].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),267:({scopes:"k.f.bq.gx.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[606],["h.i.k.j.bs"],[0,0],N,"k.f.bq.gx.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[263].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),351:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[607],["d.s.ch","ce.cf.ci.cj.ch","n.da.s.ch"],[0,1,1,2,2,0],N,"",L))){M.push(350);
+O.push("");break ifs;}}return J;}}),229:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[608],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[230].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),438:({scopes:"bh.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[609],["ce.f.mf.c","a.b.mf.c","h.hd.c"],[0,0,1,1,2,2],N,"d.mf.c",L))){break ifs;
+}if((J=E(Q,P,B[610],["ce.f.ci.c","a.b.ci.c","h.hd.c"],[0,0,1,1,2,2],N,"d.ci.c",L))){break ifs;}if((J=H[460].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[441].go(Q,P,K,M,O,L))){break ifs;}if((J=H[456].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),129:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[611],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[612],[],[],N,"",L))){M.push(127);
+O.push("");break ifs;}if((J=E(Q,P,((!G(Q,A[454],(P-1)))?B[613]:null),[],[],N,"",L))){M.push(128);O.push("");
+break ifs;}}return J;}}),41:({scopes:"d.gi.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[614],[],[],N,"d.gi.bt",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[47].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),496:({scopes:"d.e.s.v.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[615],["h.i.e.g"],[0,0],N,"d.e.s.v.g",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[526].go(Q,P,K,M,O,L))){break ifs;}if((J=H[523].go(Q,P,K,M,O,L))){break ifs;}if((J=H[525].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),66:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[616],["h.i.k.bl.bt"],[0,0],N,"k.bq.br.bs.bt",L))){M.push(65);O.push(" k.bq.br.bs.bt bh.bs.bj.bt");
+break ifs;}}return J;}}),353:({scopes:"q.r.s.cl.cs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[617],[],[],N,"q.r.s.cl.cs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[344].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[347].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),108:({scopes:"d.eq.hu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[618],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[139].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),290:({scopes:"k.bm.ca.g.cd u.g.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[619],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.g.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[494].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),312:({scopes:"d.bo.eb.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[620],["ce.cf.cd"],[0,0],N,"d.bo.eb.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),418:({scopes:"d.co.cp.cq.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[621],["ce.cf.cr"],[0,0],N,"d.co.cp.cq.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[410].go(Q,P,K,M,O,L))){break ifs;}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),16:({scopes:"bh.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[622],["dp.fn.m","dp.n.m","ce.dk.m"],[0,0,1,1,2,2],N,"d.fn.m",L))){break ifs;
+}if((J=E(Q,P,B[623],["dp.fn.m","dp.n.m","w.x.cu.m","ce.dk.m","a.cz.cu.m","h.i.ef.bl.m","dw.gg.cu.m","h.i.ef.j.m"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7],N,"d.cu.mg.m",L))){break ifs;
+}if((J=E(Q,P,B[624],["dp.fn.m","dp.n.m","w.x.cu.m","ce.dk.m"],[0,0,1,1,2,2,3,3],N,"d.cu.m",L))){break ifs;
+}if((J=E(Q,P,B[625],["dp.fn.m","w.x.cu.m","ce.dk.m","a.cz.cu.m","h.i.ef.bl.m","dw.gg.cu.m","h.i.ef.j.m"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6],N,"d.cu.m",L))){break ifs;
+}if((J=E(Q,P,B[626],["w.x.cu.m","ce.dk.m","a.cz.cu.m","h.i.ef.bl.m","dw.gg.cu.m","h.i.ef.j.m"],[0,0,1,1,2,2,3,3,4,4,5,5],N,"d.cu.m",L))){break ifs;
+}if((J=E(Q,P,B[627],["a.cz.cu.m","w.x.cu.m","h.i.ef.bl.m","dw.gg.cu.m","h.i.ef.j.m"],[0,0,1,1,2,2,3,3,4,4],N,"d.cu.m",L))){break ifs;
+}if((J=E(Q,P,B[628],["w.x.cu.m","a.cz.cu.m","h.i.ef.bl.m","dw.gg.cu.m","h.i.ef.j.m"],[0,0,1,1,2,2,3,3,4,4],N,"d.cu.mh.m",L))){break ifs;
+}if((J=E(Q,P,B[629],["k.bq.bx.m","h.i.k.bl.m","w.x.cu.m","h.i.k.j.m","k.bq.br.m","h.i.k.bl.m","w.x.cu.m","h.i.k.j.m","w.x.cu.m","h.i.ef.bl.m","dw.gg.cu.m","h.i.ef.j.m"],[0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,8,8,9,9,10,10,11,11],N,"d.cu.mh.m",L))){break ifs;
+}if((J=E(Q,P,B[630],["ce.dk.lv.m","w.x.cz.kv.m"],[0,0,1,1],N,"d.fn.kv.ed",L))){break ifs;}if((J=E(Q,P,B[631],[],[],N,"w.x.cz.hv.m.mi",L))){break ifs;
+}if((J=E(Q,P,B[632],[],[],N,"dp.cu.m.mi",L))){break ifs;}if((J=E(Q,P,B[633],[],[],N,"n.da.m",L))){break ifs;
+}if((J=E(Q,P,B[634],["h.i.k.bl.m"],[0,0],N,"k.bq.bx.m",L))){M.push(17);O.push(" k.bq.bx.m");break ifs;
+}if((J=E(Q,P,B[635],["h.i.k.bl.m"],[0,0],N,"k.bq.br.m",L))){M.push(18);O.push(" k.bq.br.m");break ifs;
+}if((J=E(Q,P,B[636],["h.i.q.m"],[0,0],N,"q.r.gk.m",L))){M.push(19);O.push(" q.r.gk.m");break ifs;}if((J=E(Q,P,B[637],["h.i.q.m"],[0,0],N,"q.r.m",L))){M.push(20);
+O.push(" q.r.m");break ifs;}if((J=E(Q,P,B[638],["h.i.q.m"],[0,0],N,"q.bu.ez.m",L))){break ifs;}if((J=E(Q,P,B[639],["h.i.q.g.m"],[0,0],N,"q.r.g.m",L))){break ifs;
+}if((J=E(Q,P,B[640],[],[],N,"a.cz.m",L))){break ifs;}if((J=E(Q,P,B[641],[],[],N,"a.b.m",L))){break ifs;
+}if((J=E(Q,P,B[642],[],[],N,"ce.cf.m",L))){break ifs;}if((J=E(Q,P,B[643],[],[],N,"ce.dk.m",L))){break ifs;
+}if((J=E(Q,P,B[644],[],[],N,"n.im.mj.mk.m",L))){break ifs;}if((J=E(Q,P,B[645],[],[],N,"n.im.mj.ml.m",L))){break ifs;
+}if((J=E(Q,P,B[646],[],[],N,"n.im.mm.m",L))){break ifs;}if((J=E(Q,P,B[647],[],[],N,"dw.im.m",L))){break ifs;
+}if((J=E(Q,P,B[648],[],[],N,"ce.f.m",L))){break ifs;}if((J=E(Q,P,B[649],[],[],N,"dp.fn.m",L))){break ifs;
+}if((J=E(Q,P,B[650],[],[],N,"dp.cu.m",L))){break ifs;}if((J=E(Q,P,B[651],[],[],N,"dp.cu.mn.m",L))){break ifs;
+}if((J=E(Q,P,(G(Q,A[454],(P-1))?B[652]:null),[],[],N,"dp.n.m",L))){break ifs;}if((J=E(Q,P,(G(Q,A[454],(P-1))?B[653]:null),[],[],N,"dp.n.mn.m",L))){break ifs;
+}if((J=E(Q,P,B[654],[],[],N,"dp.n.mn.m",L))){break ifs;}if((J=E(Q,P,B[655],[],[],N,"dp.cu.mo.m",L))){break ifs;
+}if((J=E(Q,P,((!G(Q,A[491],(P-1)))?B[656]:B[657]),[],[],N,"ce.dk.m",L))){break ifs;}if((J=E(Q,P,B[658],[],[],N,"n.im.m",L))){break ifs;
+}if((J=E(Q,P,(((G(Q,A[238],(P-0))||G(Q,A[495],(P-1)))||G(Q,A[496],(P-6)))?B[659]:null),["h.i.k.bl.m"],[0,0],N,"k.l.m",L))){M.push(21);
+O.push(" k.l.m");break ifs;}if((J=E(Q,P,B[660],[],[],N,"h.hd.mp.m",L))){break ifs;}if((J=E(Q,P,B[661],[],[],N,"d.mq.hv.mr.m",L))){break ifs;
+}if((J=E(Q,P,B[662],[],[],N,"d.mq.ki.ms.m",L))){break ifs;}if((J=E(Q,P,B[663],[],[],N,"d.mt.mu.m",L))){break ifs;
+}if((J=E(Q,P,B[664],[],[],N,"d.mt.mv.m",L))){break ifs;}if((J=E(Q,P,B[665],[],[],N,"d.mt.mw.m",L))){break ifs;
+}}return J;}}),249:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[666],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[250].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),203:({scopes:"k.bq.f.ei.em.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[667],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.em.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[668],[],[],N,"n.o.p.bp",L))){break ifs;}if((J=H[248].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),341:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[669],[],[],N,"d.r.ch",L))){M.push(340);O.push(" d.r.ch");break ifs;}}return J;
+}}),43:({scopes:"d.cu.eu.iq.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[670],[],[],N,"d.cu.eu.iq.bt",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[51].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),492:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[671],["a.b.c"],[0,0],N,"d.mx.c",L))){M.push(491);O.push(" d.mx.c");break ifs;
+}}return J;}}),377:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[672],[],[],N,"d.r.ee",L))){M.push(376);O.push(" d.r.ee");break ifs;}}return J;
+}}),106:({scopes:"d.eq.cm d.eq.hu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[673],["h.i.hu.j.cm"],[0,0],N,"d.eq.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[139].go(Q,P,K,M,O,L))){break ifs;}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),400:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[674],[],[],N,"h.bc.ek.bu.cr",L))){break ifs;}if((J=E(Q,P,B[675],[],[],N,"ce.dk.cr",L))){break ifs;
+}if((J=E(Q,P,(((G(Q,A[238],(P-0))||G(Q,A[508],(P-2)))||G(Q,A[509],(P-4)))?B[676]:null),["ce.cf.cr"],[0,0],N,"",L))){break ifs;
+}if((J=E(Q,P,B[677],[],[],N,"h.bc.gc.hj.cr",L))){break ifs;}if((J=E(Q,P,B[678],[],[],N,"h.bk.en.cr",L))){break ifs;
+}if((J=E(Q,P,B[679],[],[],N,"ce.cf.cr",L))){break ifs;}if((J=E(Q,P,B[680],[],[],N,"ce.cf.jm.cr",L))){break ifs;
+}if((J=E(Q,P,B[681],[],[],N,"n.f.my.cr",L))){break ifs;}if((J=E(Q,P,B[682],[],[],N,"n.im.mj.cr",L))){break ifs;
+}if((J=E(Q,P,B[683],[],[],N,"n.im.mm.cr",L))){break ifs;}if((J=E(Q,P,B[684],[],[],N,"n.f.mz.cr",L))){break ifs;
+}if((J=E(Q,P,((G(Q,A[518],(P-8))||G(Q,A[519],(P-11)))?B[685]:null),[],[],N,"n.f.na.cr",L))){break ifs;
+}if((J=E(Q,P,B[686],[],[],N,"n.f.nb.cr",L))){break ifs;}if((J=E(Q,P,B[687],[],[],N,"n.f.nc.cr",L))){break ifs;
+}if((J=E(Q,P,B[688],[],[],N,"dw.im.cr",L))){break ifs;}if((J=E(Q,P,B[689],[],[],N,"dp.cu.nd.cr",L))){break ifs;
+}if((J=E(Q,P,B[690],[],[],N,"dp.fn.nd.cr",L))){break ifs;}if((J=E(Q,P,B[691],[],[],N,"n.da.cr",L))){break ifs;
+}if((J=E(Q,P,(G(Q,A[527],(P-4))?B[692]:null),["dw.f.cr"],[0,0],N,"",L))){break ifs;}}return J;}}),205:({scopes:"k.bq.f.ei.em.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[693],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.em.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[694],[],[],N,"n.o.p.bp",L))){break ifs;}if((J=H[228].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),263:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[695],["h.i.k.j.bs"],[0,0],N,"k.cn.bs",L))){break ifs;}}return J;}}),51:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[79].go(Q,P,K,M,O,L))){break ifs;}if((J=H[48].go(Q,P,K,M,O,L))){break ifs;}if((J=H[74].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[85].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[696],[],[],N,"ce.dk.ga.bt",L))){break ifs;}if((J=E(Q,P,B[697],[],[],N,"ce.dk.gh.bt",L))){break ifs;
+}if((J=E(Q,P,B[698],[],[],N,"a.b.jm.bt",L))){break ifs;}if((J=E(Q,P,B[699],["dp.cu.il.bt","h.i.ev.bl.bt"],[0,0,1,1],N,"d.ev.bt",L))){M.push(50);
+O.push(" d.ev.bt");break ifs;}if((J=H[28].go(Q,P,K,M,O,L))){break ifs;}if((J=H[26].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),375:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[700],[],[],N,"d.ne.ee",L))){M.push(374);O.push(" d.ne.ee");break ifs;
+}}return J;}}),510:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[519].go(Q,P,K,M,O,L))){break ifs;}if((J=H[513].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[521].go(Q,P,K,M,O,L))){break ifs;}if((J=H[515].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),87:({scopes:"d.fn.nf.cm w.x.cz.fn.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[701],["h.bk.fn.bl.cm"],[0,0],N,"d.fn.nf.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[131].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),140:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[702],[],[],N,"dw.im.cm",L))){break ifs;}}return J;}}),398:({scopes:"d.cu.gs.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[703],["ce.cf.gq.cr","w.x.cu.gr.cr"],[0,0,1,1],N,"d.cu.gs.cr",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[704],["ce.cf.ng.cr","dw.gg.gr.cr"],[0,0,1,1],N,"",L))){break ifs;
+}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),253:({scopes:"k.l.lt.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[705],["h.i.lt.bp"],[0,0],N,"k.l.lt.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),488:({scopes:"k.bq.br.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[706],["h.i.k.j.c"],[0,0],N,"k.bq.br.c",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[707],[],[],N,"n.o.p.c",L))){break ifs;}}return J;}}),127:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[708],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[142].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[143].go(Q,P,K,M,O,L))){break ifs;}if((J=H[137].go(Q,P,K,M,O,L))){break ifs;}if((J=H[136].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),68:({scopes:"k.bq.f.bz.by.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[709],[],[],N,"k.bq.f.bz.by.bs",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[710],[],[],N,"n.o.p.bt",L))){break ifs;}}return J;}}),37:({scopes:"q.r.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[711],["h.i.q.bt"],[0,0],N,"q.r.bt",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),5:({scopes:"d.lk.me.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[712],["ce.cf.lk.me.ey"],[0,0],N,"d.lk.me.ey",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[1].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),514:({scopes:"bh.cm.bj.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[713],[],[],N,"bh.cm.bj.g",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),259:({scopes:"k.l.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[714],["h.i.k.j.bs"],[0,0],N,"k.l.bs",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[263].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[715],[],[],N,"n.o.p.nh.bs",L))){break ifs;
+}}return J;}}),406:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[716],["h.bk.ev.cr"],[0,0],N,"d.fz.ev.cr",L))){M.push(403);O.push(" d.fz.ev.cr");
+break ifs;}if((J=E(Q,P,(G(Q,A[541],(P-12))?(G(Q,A[542],(P-4))?B[717]:B[718]):(G(Q,A[542],(P-4))?B[719]:null)),["h.i.k.cr"],[0,0],N,"k.bq.br.ni.cr",L))){M.push(404);
+O.push(" k.bq.br.ni.cr");break ifs;}if((J=E(Q,P,B[720],["h.i.k.cr"],[0,0],N,"k.bq.br.cr",L))){M.push(405);
+O.push(" k.bq.br.cr");break ifs;}if((J=E(Q,P,B[721],["h.i.gb.cr","h.i.gb.cr"],[0,0,1,1],N,"d.gb.cr",L))){break ifs;
+}if((J=E(Q,P,B[722],["h.i.fz.cr","dp.fn.nd.cr","a.cz.nj.cr","k.bm.fz.cr","h.i.fz.cr","ce.dk.cr","dp.fn.nd.cr"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6],N,"d.fz.cr",L))){break ifs;
+}}return J;}}),49:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[723],["ce.dk.fn.bt","d.eq.hv.bt","dw.f.hj.bt","h.i.dw.bt"],[0,0,1,1,2,3,3,2],N,"",L))){break ifs;
+}}return J;}}),77:({scopes:"k.bq.bx.bt d.ha.bq.bx.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[724],["h.i.k.j.bt"],[0,0],N,"k.bq.bx.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[725],[],[],N,"n.o.p.bt",L))){break ifs;}}return J;}}),404:({scopes:"k.bq.br.ni.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[726],["h.i.k.cr"],[0,0],N,"k.bq.br.ni.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[727],[],[],N,"n.o.p.cr",L))){break ifs;}}return J;}}),142:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[728],[],[],N,"dp.cu.hs.cm",L))){break ifs;}}return J;}}),195:({scopes:"k.l.fl.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[729],["h.i.k.j.bp"],[0,0],N,"k.l.fl.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[246].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),91:({scopes:"d.fn.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[730],["h.i.ht.j.cm","h.bk.fn.bl.cm","be.bf.ir.cm"],[0,0,1,1,2,2],N,"d.fn.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[731],[],[],N,"",L))){M.push(88);O.push(" w.x.cz.fn.cm");break ifs;
+}if((J=E(Q,P,B[732],["h.i.ht.bl.cm"],[0,0],N,"",L))){M.push(90);O.push(" d.fn.ht.cm");break ifs;}}return J;
+}}),185:({scopes:"k.cn.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[733],["h.i.k.j.bp"],[0,0],N,"k.cn.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),339:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[734],[],[],N,"dw.f.nk.ch",L))){break ifs;}}return J;}}),437:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[735],["w.f.km.bb.v","w.f.km.v","h.bc.bb.v","w.f.km.bd.v"],[0,0,1,2,2,1,3,3],N,"",L))){break ifs;
+}if((J=H[434].go(Q,P,K,M,O,L))){break ifs;}if((J=H[436].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),292:({scopes:"k.bm.ca.ew.cd u.g.ew.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[736],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.ew.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if(false){break ifs;}}return J;}}),269:({scopes:"bh.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[274].go(Q,P,K,M,O,L))){break ifs;}if((J=H[317].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[304].go(Q,P,K,M,O,L))){break ifs;}if((J=H[279].go(Q,P,K,M,O,L))){break ifs;}if((J=H[313].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[282].go(Q,P,K,M,O,L))){break ifs;}if((J=H[323].go(Q,P,K,M,O,L))){break ifs;}if((J=H[326].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[302].go(Q,P,K,M,O,L))){break ifs;}if((J=H[297].go(Q,P,K,M,O,L))){break ifs;}if((J=H[298].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[319].go(Q,P,K,M,O,L))){break ifs;}if((J=H[316].go(Q,P,K,M,O,L))){break ifs;}if((J=H[303].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[324].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),494:({scopes:"u.g.nl",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[737],["h.i.e.g","w.x.e.g"],[0,0,1,1],N,"d.e.gv.g",L))){M.push(495);O.push(" d.e.gv.g");
+break ifs;}if((J=E(Q,P,B[738],["h.i.e.g","w.x.e.v.g"],[0,0,1,1],N,"d.e.s.v.g",L))){M.push(496);O.push(" d.e.s.v.g");
+break ifs;}if((J=E(Q,P,B[739],["h.i.q.g"],[0,0],N,"q.r.g",L))){M.push(497);O.push(" q.r.g");break ifs;
+}if((J=E(Q,P,B[740],["h.i.e.g"],[0,0],N,"d.e.y.g",L))){M.push(500);O.push(" d.e.y.g");break ifs;}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[741],["h.i.e.g","w.x.e.lq.g"],[0,0,1,1],N,"bh.ey.bj.g",L))){M.push(502);O.push(" bh.ey.bj.g");
+break ifs;}if((J=E(Q,P,B[742],["h.i.e.g","w.x.e.gn.g"],[0,0,1,1],N,"bh.m.bj.g",L))){M.push(505);O.push(" bh.m.bj.g");
+break ifs;}if((J=E(Q,P,B[743],["h.i.e.g","w.x.e.fa.gv.g"],[0,0,1,1],N,"d.e.fa.gv.g",L))){M.push(506);
+O.push(" d.e.fa.gv.g");break ifs;}if((J=E(Q,P,B[744],["h.i.e.bl.g","w.x.e.r.gv.g"],[0,0,1,1],N,"d.e.r.gv.g",L))){M.push(507);
+O.push(" d.e.r.gv.g");break ifs;}if((J=E(Q,P,B[745],["h.i.e.bl.g","w.x.e.fy.gv.g"],[0,0,1,1],N,"d.e.fy.gv.g",L))){M.push(508);
+O.push(" d.e.fy.gv.g");break ifs;}if((J=E(Q,P,B[746],["h.i.e.bl.g","w.x.e.f.g"],[0,0,1,1],N,"d.e.f.g",L))){M.push(509);
+O.push(" d.e.f.g");break ifs;}if((J=H[511].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[747],[],[],N,"be.bf.nm.g",L))){break ifs;
+}if((J=E(Q,P,B[748],[],[],N,"be.bf.nn.g",L))){break ifs;}}return J;}}),197:({scopes:"k.bq.f.ei.ej.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[749],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.ej.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[250].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),483:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[750],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),183:({scopes:"k.bq.bx.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[751],["h.i.k.j.bp"],[0,0],N,"k.bq.bx.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[752],[],[],N,"n.o.p.bp",L))){break ifs;}}return J;}}),146:({scopes:"k.bq.br.r.fj.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[753]:B[754]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.fj.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),271:({scopes:"d.bo.hf.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[755],[],[],N,"d.bo.hf.cd",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),56:({scopes:"k.l.lt.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[756],["h.i.lt.bt"],[0,0],N,"k.l.lt.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[757],[],[],N,"n.o.p.bt",L))){break ifs;}}return J;}}),442:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[758],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),453:({scopes:"d.i.fn.iu.iv.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[759],[],[],N,"d.i.fn.iu.iv.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[481].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[460].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),408:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[402].go(Q,P,K,M,O,L))){break ifs;}if((J=H[406].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[400].go(Q,P,K,M,O,L))){break ifs;}if((J=H[411].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),167:({scopes:"k.bq.bx.fi.eo.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[760],["h.i.k.j.cm","be.bf.fk.cm"],[0,0,1,1],N,"k.bq.bx.fi.eo.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),39:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[761],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[762],["dp.fn.gu.bt"],[0,0],N,"",L))){break ifs;
+}}return J;}}),95:({scopes:"d.cu.ef.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[763],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[139].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[764],["dw.gg.cu.cm","h.bc.ef.cm"],[0,0,1,1],N,"",L))){break ifs;}}return J;}}),102:({scopes:"d.cu.fm.hu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[765],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[139].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),310:({scopes:"d.bo.gl.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[766],[],[],N,"d.bo.gl.cd",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[273].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),187:({scopes:"k.cn.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[767],["h.i.k.j.bp"],[0,0],N,"k.cn.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[230].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),357:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[768],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),479:({scopes:"a.cz.cq.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[769],[],[],N,"a.cz.cq.c",(function(){(L&&L());M.pop();O.pop();})))){}}return J;
+}}),251:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[770],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[252].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),379:({scopes:"d.cu.ed.eg.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[771],[],[],N,"d.cu.ed.eg.ee",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),157:({scopes:"k.bq.br.r.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[30],(P-3))?B[772]:B[773]),["h.i.k.j.cm","d.ep.br.cm"],[0,1,1,0],N,"k.bq.br.r.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),34:({scopes:"d.bj.m bh.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[774],["h.bk.bj.j.bt","ce.dk.ca.bt","h.i.k.bt"],[0,1,1,2,2,0],N,"d.bj.m",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[16].go(Q,P,K,M,O,L))){break ifs;}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),83:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[775],["h.i.dw.bt"],[0,0],N,"dw.f.hq.bt",L))){break ifs;}}return J;}}),469:({scopes:"d.ki.gb.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[776],[],[],N,"d.ki.gb.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[482].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),131:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[137].go(Q,P,K,M,O,L))){break ifs;}if((J=H[136].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),274:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,((!G(Q,A[574],(P-1)))?B[777]:null),["h.i.q.cd"],[0,0],N,"q.bu.bv.cd",L))){break ifs;
+}}return J;}}),508:({scopes:"d.e.fy.gv.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[778],["h.i.e.j.g"],[0,0],N,"d.e.fy.gv.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),498:({scopes:"d.e.y.z.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[779],[],[],N,"d.e.y.z.g",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[780],[],[],N,"k.bq.br.z.no.g",L))){break ifs;
+}}return J;}}),402:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[781],["h.i.q.cr"],[0,0],N,"q.bu.bw.cr",L))){break ifs;}if((J=E(Q,P,B[782],["h.i.q.cr"],[0,0],N,"q.r.cr",L))){M.push(401);
+O.push(" q.r.cr");break ifs;}}return J;}}),440:({scopes:"d.gd.ge.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[783],["h.i.gf.j.c"],[0,0],N,"d.gd.ge.c",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[784],["n.f.ga.c","ce.dk.gh.c"],[0,0,1,1],N,"",L))){break ifs;}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[785],[],[],N,"h.np.hj.c",L))){break ifs;}}return J;}}),193:({scopes:"k.l.fl.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[786],["h.i.k.j.bp"],[0,0],N,"k.l.fl.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[232].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),144:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[388].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),333:({scopes:"d.s.nq.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[787],[],[],N,"d.s.nq.ch",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[788],[],[],N,"h.bc.ek.ch",L))){break ifs;
+}}return J;}}),81:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[789],["dp.cu.il.bt","h.i.ev.bl.bt"],[0,0,1,1],N,"d.ev.bt",L))){M.push(80);
+O.push(" d.ev.bt");break ifs;}if((J=E(Q,P,B[790],[],[],N,"dp.cu.ev.bt",L))){break ifs;}if((J=E(Q,P,B[791],[],[],N,"dp.cu.ly.bt",L))){break ifs;
+}if((J=E(Q,P,B[792],[],[],N,"dp.cu.nr.bt",L))){break ifs;}if((J=E(Q,P,B[793],[],[],N,"dp.cu.ns.bt",L))){break ifs;
+}if((J=E(Q,P,B[794],[],[],N,"dp.cu.nt.bt",L))){break ifs;}if((J=E(Q,P,B[795],[],[],N,"dp.cu.nu.bt",L))){break ifs;
+}if((J=E(Q,P,B[796],[],[],N,"dp.cu.nv.bt",L))){break ifs;}if((J=E(Q,P,B[797],[],[],N,"dp.cu.nw.bt",L))){break ifs;
+}if((J=E(Q,P,B[798],[],[],N,"dp.cu.nx.bt",L))){break ifs;}if((J=E(Q,P,B[799],[],[],N,"dp.cu.ny.bt",L))){break ifs;
+}if((J=E(Q,P,B[800],[],[],N,"dp.cu.nz.bt",L))){break ifs;}if((J=E(Q,P,B[801],[],[],N,"dp.cu.oa.bt",L))){break ifs;
+}if((J=E(Q,P,B[802],[],[],N,"dp.cu.ob.bt",L))){break ifs;}if((J=E(Q,P,B[803],[],[],N,"dp.cu.oc.bt",L))){break ifs;
+}if((J=E(Q,P,B[804],[],[],N,"dp.cu.od.bt",L))){break ifs;}if((J=E(Q,P,B[805],[],[],N,"dp.cu.oe.bt",L))){break ifs;
+}if((J=E(Q,P,B[806],[],[],N,"dp.cu.of.bt",L))){break ifs;}if((J=E(Q,P,B[807],[],[],N,"dp.cu.og.bt",L))){break ifs;
+}if((J=E(Q,P,B[808],[],[],N,"dp.cu.oh.bt",L))){break ifs;}if((J=E(Q,P,B[809],[],[],N,"dp.cu.oi.bt",L))){break ifs;
+}if((J=E(Q,P,B[810],[],[],N,"dp.cu.oj.bt",L))){break ifs;}if((J=E(Q,P,B[811],[],[],N,"dp.cu.ok.bt",L))){break ifs;
+}if((J=E(Q,P,B[812],[],[],N,"dp.cu.ol.bt",L))){break ifs;}if((J=E(Q,P,B[813],[],[],N,"dp.cu.om.bt",L))){break ifs;
+}if((J=E(Q,P,B[814],[],[],N,"dp.cu.on.bt",L))){break ifs;}if((J=E(Q,P,B[815],[],[],N,"dp.cu.oo.bt",L))){break ifs;
+}if((J=E(Q,P,B[816],[],[],N,"dp.cu.op.bt",L))){break ifs;}if((J=E(Q,P,B[817],[],[],N,"dp.cu.oq.bt",L))){break ifs;
+}if((J=E(Q,P,B[818],[],[],N,"dp.cu.or.bt",L))){break ifs;}if((J=E(Q,P,B[819],[],[],N,"dp.cu.os.bt",L))){break ifs;
+}if((J=E(Q,P,B[820],[],[],N,"dp.cu.ot.bt",L))){break ifs;}if((J=E(Q,P,B[821],[],[],N,"dp.cu.ou.bt",L))){break ifs;
+}if((J=E(Q,P,B[822],[],[],N,"dp.cu.ov.bt",L))){break ifs;}if((J=E(Q,P,B[823],[],[],N,"dp.cu.ow.bt",L))){break ifs;
+}if((J=E(Q,P,B[824],[],[],N,"dp.cu.ox.bt",L))){break ifs;}if((J=E(Q,P,B[825],[],[],N,"dp.cu.oy.bt",L))){break ifs;
+}if((J=E(Q,P,B[826],[],[],N,"dp.cu.oz.bt",L))){break ifs;}if((J=E(Q,P,B[827],[],[],N,"dp.cu.pa.bt",L))){break ifs;
+}if((J=E(Q,P,B[828],[],[],N,"dp.cu.pb.bt",L))){break ifs;}if((J=E(Q,P,B[829],[],[],N,"dp.cu.pc.bt",L))){break ifs;
+}if((J=E(Q,P,B[830],[],[],N,"dp.cu.pd.bt",L))){break ifs;}if((J=E(Q,P,B[831],[],[],N,"dp.cu.pe.bt",L))){break ifs;
+}if((J=E(Q,P,B[832],[],[],N,"dp.cu.pf.bt",L))){break ifs;}if((J=E(Q,P,B[833],[],[],N,"dp.cu.pg.bt",L))){break ifs;
+}if((J=E(Q,P,B[834],[],[],N,"dp.cu.ph.bt",L))){break ifs;}if((J=E(Q,P,B[835],[],[],N,"dp.cu.pi.bt",L))){break ifs;
+}if((J=E(Q,P,B[836],[],[],N,"dp.cu.pj.bt",L))){break ifs;}if((J=E(Q,P,B[837],[],[],N,"dp.cu.pk.bt",L))){break ifs;
+}if((J=E(Q,P,B[838],[],[],N,"dp.cu.pl.bt",L))){break ifs;}if((J=E(Q,P,B[839],[],[],N,"dp.cu.pm.bt",L))){break ifs;
+}if((J=E(Q,P,B[840],[],[],N,"dp.cu.g.bt",L))){break ifs;}if((J=E(Q,P,B[841],[],[],N,"dp.cu.pn.bt",L))){break ifs;
+}if((J=E(Q,P,B[842],[],[],N,"dp.cu.po.bt",L))){break ifs;}if((J=E(Q,P,B[843],[],[],N,"dp.cu.pp.bt",L))){break ifs;
+}if((J=E(Q,P,B[844],[],[],N,"dp.cu.pq.bt",L))){break ifs;}if((J=E(Q,P,B[845],[],[],N,"dp.cu.pr.bt",L))){break ifs;
+}if((J=E(Q,P,B[846],[],[],N,"dp.cu.ps.bt",L))){break ifs;}if((J=E(Q,P,B[847],[],[],N,"dp.cu.pt.bt",L))){break ifs;
+}if((J=E(Q,P,B[848],[],[],N,"dp.cu.pu.bt",L))){break ifs;}if((J=E(Q,P,B[849],[],[],N,"dp.cu.pv.bt",L))){break ifs;
+}if((J=E(Q,P,B[850],[],[],N,"dp.cu.fg.bt",L))){break ifs;}if((J=E(Q,P,B[851],[],[],N,"dp.cu.pw.bt",L))){break ifs;
+}if((J=E(Q,P,B[852],[],[],N,"dp.cu.mh.bt",L))){break ifs;}if((J=E(Q,P,B[853],[],[],N,"dp.cu.px.bt",L))){break ifs;
+}if((J=E(Q,P,B[854],[],[],N,"dp.cu.py.bt",L))){break ifs;}if((J=E(Q,P,B[855],[],[],N,"dp.cu.pz.bt",L))){break ifs;
+}if((J=E(Q,P,B[856],[],[],N,"dp.cu.qa.bt",L))){break ifs;}if((J=E(Q,P,B[857],[],[],N,"dp.cu.fx.bt",L))){break ifs;
+}if((J=E(Q,P,B[858],[],[],N,"dp.cu.qb.bt",L))){break ifs;}if((J=E(Q,P,B[859],[],[],N,"dp.cu.qc.bt",L))){break ifs;
+}if((J=E(Q,P,B[860],[],[],N,"dp.cu.dn.bt",L))){break ifs;}if((J=E(Q,P,B[861],[],[],N,"dp.cu.qd.bt",L))){break ifs;
+}if((J=E(Q,P,B[862],[],[],N,"dp.cu.qe.bt",L))){break ifs;}if((J=E(Q,P,B[863],[],[],N,"dp.cu.qf.bt",L))){break ifs;
+}if((J=E(Q,P,B[864],[],[],N,"dp.cu.qg.bt",L))){break ifs;}if((J=E(Q,P,B[865],[],[],N,"dp.cu.qh.bt",L))){break ifs;
+}if((J=E(Q,P,B[866],[],[],N,"dp.cu.qi.bt",L))){break ifs;}if((J=E(Q,P,B[867],[],[],N,"dp.cu.qj.bt",L))){break ifs;
+}if((J=E(Q,P,B[868],[],[],N,"dp.cu.qk.bt",L))){break ifs;}if((J=E(Q,P,B[869],[],[],N,"dp.cu.ql.bt",L))){break ifs;
+}if((J=E(Q,P,B[870],[],[],N,"dp.cu.qm.bt",L))){break ifs;}if((J=E(Q,P,B[871],[],[],N,"dp.cu.qn.bt",L))){break ifs;
+}if((J=E(Q,P,B[872],[],[],N,"dp.cu.qo.bt",L))){break ifs;}if((J=E(Q,P,B[873],[],[],N,"dp.cu.qp.bt",L))){break ifs;
+}if((J=E(Q,P,B[874],[],[],N,"dp.cu.qq.bt",L))){break ifs;}if((J=E(Q,P,B[875],[],[],N,"dp.cu.qr.bt",L))){break ifs;
+}if((J=E(Q,P,B[876],[],[],N,"dp.cu.qs.bt",L))){break ifs;}if((J=E(Q,P,B[877],[],[],N,"dp.cu.qt.bt",L))){break ifs;
+}if((J=E(Q,P,B[878],[],[],N,"dp.cu.qu.bt",L))){break ifs;}if((J=E(Q,P,B[879],[],[],N,"dp.cu.qv.bt",L))){break ifs;
+}if((J=E(Q,P,B[880],[],[],N,"dp.cu.qw.bt",L))){break ifs;}if((J=E(Q,P,B[881],[],[],N,"dp.cu.qx.bt",L))){break ifs;
+}if((J=E(Q,P,B[882],[],[],N,"dp.cu.qy.bt",L))){break ifs;}if((J=E(Q,P,B[883],[],[],N,"dp.cu.qz.bt",L))){break ifs;
+}if((J=E(Q,P,B[884],[],[],N,"dp.cu.ra.bt",L))){break ifs;}if((J=E(Q,P,B[885],[],[],N,"dp.cu.rb.bt",L))){break ifs;
+}if((J=E(Q,P,B[886],[],[],N,"dp.cu.rc.bt",L))){break ifs;}if((J=E(Q,P,B[887],[],[],N,"dp.cu.rd.bt",L))){break ifs;
+}if((J=E(Q,P,B[888],[],[],N,"dp.cu.re.bt",L))){break ifs;}if((J=E(Q,P,B[889],[],[],N,"dp.cu.rf.bt",L))){break ifs;
+}if((J=E(Q,P,B[890],[],[],N,"dp.cu.rg.bt",L))){break ifs;}if((J=E(Q,P,B[891],[],[],N,"dp.cu.rh.bt",L))){break ifs;
+}if((J=E(Q,P,B[892],[],[],N,"dp.cu.ri.bt",L))){break ifs;}if((J=E(Q,P,B[893],[],[],N,"dp.cu.rj.bt",L))){break ifs;
+}if((J=E(Q,P,B[894],[],[],N,"dp.cu.rk.bt",L))){break ifs;}if((J=E(Q,P,B[895],[],[],N,"dp.cu.rl.bt",L))){break ifs;
+}if((J=E(Q,P,B[896],[],[],N,"dp.cu.rm.bt",L))){break ifs;}if((J=E(Q,P,B[897],[],[],N,"dp.cu.rn.bt",L))){break ifs;
+}if((J=E(Q,P,B[898],[],[],N,"dp.cu.ro.bt",L))){break ifs;}if((J=E(Q,P,B[899],[],[],N,"dp.cu.rp.bt",L))){break ifs;
+}if((J=E(Q,P,B[900],[],[],N,"dp.cu.rq.bt",L))){break ifs;}if((J=E(Q,P,B[901],[],[],N,"dp.cu.rr.bt",L))){break ifs;
+}if((J=E(Q,P,B[902],[],[],N,"dp.cu.rs.bt",L))){break ifs;}if((J=E(Q,P,B[903],[],[],N,"dp.cu.rt.bt",L))){break ifs;
+}if((J=E(Q,P,B[904],[],[],N,"dp.cu.ru.bt",L))){break ifs;}if((J=E(Q,P,B[905],[],[],N,"dp.cu.rv.bt",L))){break ifs;
+}if((J=E(Q,P,B[906],[],[],N,"dp.cu.rw.bt",L))){break ifs;}if((J=E(Q,P,B[907],[],[],N,"dp.cu.rx.bt",L))){break ifs;
+}if((J=E(Q,P,B[908],[],[],N,"dp.cu.ry.bt",L))){break ifs;}if((J=E(Q,P,B[909],[],[],N,"dp.cu.rz.bt",L))){break ifs;
+}if((J=E(Q,P,B[910],[],[],N,"dp.cu.sa.bt",L))){break ifs;}if((J=E(Q,P,B[911],[],[],N,"dp.cu.sb.bt",L))){break ifs;
+}if((J=E(Q,P,B[912],[],[],N,"dp.cu.sc.bt",L))){break ifs;}if((J=E(Q,P,B[913],[],[],N,"dp.cu.sd.bt",L))){break ifs;
+}if((J=E(Q,P,B[914],[],[],N,"dp.cu.se.bt",L))){break ifs;}if((J=E(Q,P,B[915],[],[],N,"dp.cu.sf.bt",L))){break ifs;
+}if((J=E(Q,P,B[916],[],[],N,"dp.cu.sg.bt",L))){break ifs;}if((J=E(Q,P,B[917],[],[],N,"dp.cu.sh.bt",L))){break ifs;
+}if((J=E(Q,P,B[918],[],[],N,"dp.cu.si.bt",L))){break ifs;}if((J=E(Q,P,B[919],[],[],N,"dp.cu.sj.bt",L))){break ifs;
+}if((J=E(Q,P,B[920],[],[],N,"dp.cu.sk.bt",L))){break ifs;}if((J=E(Q,P,B[921],[],[],N,"dp.cu.sl.bt",L))){break ifs;
+}if((J=E(Q,P,B[922],[],[],N,"dp.cu.sm.bt",L))){break ifs;}if((J=E(Q,P,B[923],[],[],N,"dp.cu.sn.bt",L))){break ifs;
+}if((J=E(Q,P,B[924],[],[],N,"dp.cu.so.bt",L))){break ifs;}if((J=E(Q,P,B[925],[],[],N,"dp.cu.sp.bt",L))){break ifs;
+}if((J=E(Q,P,B[926],[],[],N,"dp.cu.sq.bt",L))){break ifs;}if((J=E(Q,P,B[927],[],[],N,"dp.cu.sr.bt",L))){break ifs;
+}if((J=E(Q,P,B[928],[],[],N,"dp.cu.k.bt",L))){break ifs;}if((J=E(Q,P,B[929],[],[],N,"dp.cu.ss.bt",L))){break ifs;
+}if((J=E(Q,P,B[930],[],[],N,"dp.cu.st.bt",L))){break ifs;}if((J=E(Q,P,B[931],[],[],N,"dp.cu.su.bt",L))){break ifs;
+}if((J=E(Q,P,B[932],[],[],N,"dp.cu.sv.bt",L))){break ifs;}if((J=E(Q,P,B[933],[],[],N,"dp.cu.sw.bt",L))){break ifs;
+}if((J=E(Q,P,B[934],[],[],N,"dp.cu.u.bt",L))){break ifs;}if((J=E(Q,P,B[935],[],[],N,"dp.cu.sx.bt",L))){break ifs;
+}if((J=E(Q,P,B[936],[],[],N,"dp.cu.sy.bt",L))){break ifs;}if((J=E(Q,P,B[937],[],[],N,"dp.cu.cz.bt",L))){break ifs;
+}if((J=E(Q,P,B[938],[],[],N,"dp.cu.sz.bt",L))){break ifs;}if((J=E(Q,P,B[939],[],[],N,"dp.cu.ll.bt",L))){break ifs;
+}if((J=E(Q,P,B[940],[],[],N,"dp.cu.ta.bt",L))){break ifs;}if((J=E(Q,P,B[941],[],[],N,"dp.cu.tb.bt",L))){break ifs;
+}if((J=E(Q,P,B[942],[],[],N,"dp.cu.tc.bt",L))){break ifs;}if((J=E(Q,P,B[943],[],[],N,"dp.cu.td.bt",L))){break ifs;
+}if((J=E(Q,P,B[944],[],[],N,"dp.cu.te.bt",L))){break ifs;}if((J=E(Q,P,B[945],[],[],N,"dp.cu.tf.bt",L))){break ifs;
+}if((J=E(Q,P,B[946],[],[],N,"dp.cu.tg.bt",L))){break ifs;}if((J=E(Q,P,B[947],[],[],N,"dp.cu.v.bt",L))){break ifs;
+}if((J=E(Q,P,B[948],[],[],N,"dp.cu.th.bt",L))){break ifs;}if((J=E(Q,P,B[949],[],[],N,"dp.cu.ti.bt",L))){break ifs;
+}if((J=E(Q,P,B[950],[],[],N,"dp.cu.tj.bt",L))){break ifs;}if((J=E(Q,P,B[951],[],[],N,"dp.cu.tk.bt",L))){break ifs;
+}if((J=E(Q,P,B[952],[],[],N,"dp.cu.di.bt",L))){break ifs;}if((J=E(Q,P,B[953],[],[],N,"dp.fn.jg.bt",L))){break ifs;
+}if((J=E(Q,P,B[954],[],[],N,"dp.cu.il.bt",L))){break ifs;}}return J;}}),391:({scopes:"d.en.jf.tl.l",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[955],[],[],N,"d.en.jf.tl.l",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[388].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),191:({scopes:"k.l.tm.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[956],["k.l.tm.bp","h.i.k.bp"],[0,1,1,0],N,"",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),328:({scopes:"q.r.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[957],["h.i.q.ch"],[0,0],N,"q.r.ch",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),247:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[958],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[248].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),335:({scopes:"k.bq.f.gj.gi.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[959],["h.i.k.j.ch"],[0,0],N,"k.bq.f.gj.gi.ch",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),504:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[960],["h.i.e.g","w.x.e.gn.g"],[0,0,1,1],N,"",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[961],["h.i.q.m"],[0,0],N,"q.bu.ez.m",L))){break ifs;}if((J=E(Q,P,B[962],["h.i.q.m"],[0,0],N,"q.r.m",L))){M.push(503);
+O.push(" q.r.m");break ifs;}if((J=H[513].go(Q,P,K,M,O,L))){break ifs;}if((J=H[16].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),265:({scopes:"k.bq.f.bz.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[963],["h.i.k.j.bs"],[0,0],N,"k.bq.f.bz.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[262].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),414:({scopes:"d.co.cp.fo.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[964],["ce.cf.cr"],[0,0],N,"d.co.cp.fo.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[407].go(Q,P,K,M,O,L))){break ifs;}if((J=H[410].go(Q,P,K,M,O,L))){break ifs;}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),104:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[965],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[130].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),521:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[966],["bh.tn.bj.g","dp.cu.nd.tn"],[0,1,1,0],N,"",L))){M.push(520);O.push("");
+break ifs;}}return J;}}),393:({scopes:"n.f.lt.to.l",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[967],["h.i.lt.l"],[0,0],N,"n.f.lt.to.l",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[394].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[968],["n.o.p.tq.l","n.o.p.tq.l"],[0,0,1,1],N,"n.f.lt.tp.l",L))){break ifs;
+}}return J;}}),31:({scopes:"d.bj.g u.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[969],["h.bk.bj.j.bt","ce.dk.ca.bt","h.i.k.bt"],[0,1,1,2,2,0],N,"d.bj.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[494].go(Q,P,K,M,O,L))){break ifs;}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),322:({scopes:"k.bq.bx.es.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[970],["h.i.k.j.cd"],[0,0],N,"k.bq.bx.es.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[971],[],[],N,"n.o.p.tr.cd",L))){break ifs;}if((J=E(Q,P,B[972],[],[],N,"n.o.p.hh.cd",L))){break ifs;
+}if((J=E(Q,P,B[973],[],[],N,"n.o.p.hi.cd",L))){break ifs;}if((J=E(Q,P,B[974],[],[],N,"n.o.p.ts.cd",L))){break ifs;
+}}return J;}}),316:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[756],(P-1)))?B[975]:null),[],[],N,"ce.dk.tt.cd",L))){break ifs;
+}if((J=E(Q,P,B[976],[],[],N,"ce.dk.tu.cd",L))){break ifs;}if((J=E(Q,P,B[977],["ce.dk.gy.cd","h.i.gy.cd"],[0,0,1,1],N,"d.fa.gy.cd",L))){M.push(315);
+O.push(" d.fa.gy.cd");break ifs;}}return J;}}),133:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[978],["n.o.p.hi.cm","n.o.p.hh.cm","n.o.p.tv.cm","n.o.p.tw.cm","n.o.p.tx.cm","n.o.p.ty.cm","n.o.p.tz.cm","n.o.p.ua.cm","n.o.p.ub.cm","n.o.p.uc.cm","n.o.p.ud.cm","n.o.p.ue.cm","n.o.p.uf.cm"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12],N,"",L))){break ifs;
+}}return J;}}),416:({scopes:"d.co.cp.hx.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[979],["ce.cf.cr"],[0,0],N,"d.co.cp.hx.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[409].go(Q,P,K,M,O,L))){break ifs;}if((J=H[410].go(Q,P,K,M,O,L))){break ifs;}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),444:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[980],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[981],[],[],N,"",L))){M.push(442);
+O.push("");break ifs;}if((J=E(Q,P,B[982],[],[],N,"",L))){M.push(443);O.push("");break ifs;}}return J;
+}}),189:({scopes:"k.cn.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[983],["h.i.k.j.bp"],[0,0],N,"k.cn.bp",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[250].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),468:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[984],[],[],N,"ce.cf.ug.c",L))){break ifs;}if((J=E(Q,P,B[985],[],[],N,"ce.cf.c",L))){break ifs;
+}if((J=E(Q,P,B[986],[],[],N,"ce.cf.c",L))){break ifs;}if((J=E(Q,P,B[987],[],[],N,"ce.dk.c",L))){break ifs;
+}if((J=E(Q,P,B[988],[],[],N,"ce.dk.dm.c",L))){break ifs;}if((J=E(Q,P,B[989],[],[],N,"ce.dk.gh.c",L))){break ifs;
+}if((J=E(Q,P,B[990],[],[],N,"ce.dk.jq.c",L))){break ifs;}if((J=E(Q,P,B[991],[],[],N,"ce.dk.jr.c",L))){break ifs;
+}if((J=E(Q,P,B[992],[],[],N,"ce.dk.fe.c",L))){break ifs;}if((J=E(Q,P,(G(Q,A[769],(P-1))?B[993]:null),[],[],N,"ce.dk.hw.c",L))){break ifs;
+}if((J=E(Q,P,B[994],[],[],N,"h.hd.c",L))){break ifs;}}return J;}}),70:({scopes:"k.bq.bx.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[995],["n.o.p.bt"],[0,0],N,"k.bq.bx.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),231:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[996],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[232].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),388:({scopes:"bh.l.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[997],[],[],N,"ce.cf.uh.l",L))){break ifs;}if((J=E(Q,P,B[998],[],[],N,"ce.f.ui.l",L))){break ifs;
+}if((J=E(Q,P,B[999],[],[],N,"ce.dk.uj.l",L))){break ifs;}if((J=E(Q,P,B[1000],[],[],N,"ce.dk.uk.l",L))){break ifs;
+}if((J=E(Q,P,B[1001],[],[],N,"q.r.l",L))){M.push(389);O.push(" q.r.l");break ifs;}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[1002]:null),[],[],N,"q.bu.bv.l",L))){break ifs;
+}if((J=E(Q,P,B[1003],[],[],N,"ce.f.ul.l",L))){break ifs;}if((J=E(Q,P,B[1004],[],[],N,"ce.f.ui.um.l",L))){break ifs;
+}if((J=E(Q,P,B[1005],["h.i.en.l","h.i.en.jf.l","d.jf.un.l","d.jf.uo.l","d.jf.up.l","d.jf.uq.l"],[0,0,1,2,2,3,3,4,4,5,5,1],N,"d.en.jf.l",L))){M.push(390);
+O.push(" d.en.jf.l");break ifs;}if((J=E(Q,P,B[1006],["h.i.en.l","h.i.en.jf.tl.l","w.x.bk.ui.l"],[0,0,1,2,2,1],N,"d.en.jf.tl.l",L))){M.push(391);
+O.push(" d.en.jf.tl.l");break ifs;}if((J=E(Q,P,B[1007],["h.i.en.l","h.i.en.ur.l","w.x.bk.en.l","h.i.en.ur.l","h.i.en.us.l"],[0,0,1,1,2,2,3,3,4,4],N,"d.en.l",L))){M.push(392);
+O.push(" d.en.l");break ifs;}if((J=H[394].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),323:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1008],[],[],N,"n.o.p.cd",L))){break ifs;}if((J=E(Q,P,B[1009],["h.i.k.bl.cd"],[0,0],N,"k.bq.bx.cd",L))){M.push(320);
+O.push(" k.bq.bx.cd");break ifs;}if((J=E(Q,P,B[1010],["h.i.k.bl.cd"],[0,0],N,"k.bq.br.cd",L))){M.push(321);
+O.push(" k.bq.br.cd");break ifs;}if((J=E(Q,P,B[1011],["h.i.k.bl.cd"],[0,0],N,"k.bq.bx.es.cd",L))){M.push(322);
+O.push(" k.bq.bx.es.cd");break ifs;}}return J;}}),93:({scopes:"d.fn.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1012],["h.i.ht.bl.cm","be.bf.ut.cm"],[0,0,1,1],N,"d.fn.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[1013],[],[],N,"",L))){M.push(92);O.push(" w.x.cz.fn.cm");break ifs;
+}}return J;}}),212:({scopes:"k.bm.bj.g.bp u.g.bj.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1014],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.g.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[494].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),466:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1015],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[1016],["n.f.jj.c"],[0,0],N,"d.jj.c",L))){M.push(465);
+O.push(" d.jj.c");break ifs;}}return J;}}),72:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1017],["h.i.k.bl.bt"],[0,0],N,"k.bq.bx.bs.bt",L))){M.push(71);O.push(" k.bq.bx.bs.bt bh.bs.bj.bt");
+break ifs;}}return J;}}),520:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1018],["bh.tn.bj.g","dp.cu.nd.tn"],[0,1,1,0],N,"",(function(){(L&&L());
+M.pop();O.pop();})))){}}return J;}}),394:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1019],[],[],N,"n.o.lt.l",L))){break ifs;}if((J=E(Q,P,B[1020],[],[],N,"n.o.p.tq.l",L))){break ifs;
+}if((J=E(Q,P,B[1021],["h.i.lt.l","ce.dk.uu.l"],[0,0,1,1],N,"n.f.lt.to.l",L))){M.push(393);O.push(" n.f.lt.to.l");
+break ifs;}}return J;}}),180:({scopes:"d.cu.ki.kj.bp dw.gg.cu.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1022],[],[],N,"d.cu.ki.kj.bp",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),11:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1023],["h.i.q.ey"],[0,0],N,"q.r.ey",L))){M.push(10);O.push(" q.r.ey");
+break ifs;}}return J;}}),384:({scopes:"d.ib.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[125],(P-1))?B[1024]:B[1025]),[],[],N,"d.ib.ee",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[375].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1026],["h.i.bo.ee"],[0,0],N,"",L))){M.push(383);
+O.push("");break ifs;}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),210:({scopes:"u.uv",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1027],["k.bm.uw.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[1028],[],[],N,"u.g.bj.bp",L))){M.push(209);O.push(" u.g.bj.bp");break ifs;}}return J;
+}}),294:({scopes:"k.bm.ca.cc.cd u.g.cc.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1029],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cc.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if(false){break ifs;}}return J;}}),327:({scopes:"bh.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[359].go(Q,P,K,M,O,L))){break ifs;}if((J=H[351].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[365].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1030],["h.i.q.ch"],[0,0],N,"q.r.ch",L))){M.push(328);
+O.push(" q.r.ch");break ifs;}if((J=E(Q,P,B[1031],[],[],N,"be.bf.ux.ch",L))){break ifs;}if((J=E(Q,P,B[1032],["h.i.q.ch"],[0,0],N,"q.bu.ez.ee",L))){M.push(329);
+O.push(" q.bu.ez.ee");break ifs;}if((J=E(Q,P,B[1033],[],[],N,"ce.cf.ch",L))){break ifs;}if((J=E(Q,P,B[1034],[],[],N,"a.cz.ch",L))){break ifs;
+}if((J=E(Q,P,B[1035],[],[],N,"a.b.ch",L))){break ifs;}if((J=E(Q,P,B[1036],[],[],N,"n.f.dw.uy.ch",L))){break ifs;
+}if((J=E(Q,P,B[1037],[],[],N,"dw.f.ku.hq.uy.ch",L))){break ifs;}if((J=E(Q,P,B[1038],[],[],N,"dw.f.ku.jn.uy.ch",L))){break ifs;
+}if((J=E(Q,P,B[1039],[],[],N,"n.im.ch",L))){break ifs;}if((J=H[368].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1040],[],[],N,"n.da.ch",L))){break ifs;
+}if((J=E(Q,P,B[1041],["h.i.k.bl.ch"],[0,0],N,"k.bq.br.ch",L))){M.push(330);O.push(" k.bq.br.ch");break ifs;
+}if((J=E(Q,P,B[1042],["h.i.k.bl.ch"],[0,0],N,"k.bq.bx.ch",L))){M.push(331);O.push(" k.bq.bx.ch");break ifs;
+}if((J=E(Q,P,B[1043],["ce.cf.ci.uz.ch","w.x.cu.s.ch","h.i.ef.ch","dw.gg.s.ch","h.bc.ef.ch","h.i.ef.ch"],[0,0,1,1,2,2,3,4,4,3,5,5],N,"d.s.jt.ch",L))){M.push(332);
+O.push(" d.s.jt.ch");break ifs;}if((J=E(Q,P,B[1044],["ce.cf.ci.va.ch"],[0,0],N,"d.s.nq.ch",L))){M.push(333);
+O.push(" d.s.nq.ch");break ifs;}if((J=E(Q,P,B[1045],["ce.cf.ci.gi.ch"],[0,0],N,"d.s.ch.gi",L))){M.push(336);
+O.push(" d.s.ch.gi");break ifs;}if((J=H[347].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1046],["ce.cf.ci.ch"],[0,0],N,"d.s.ch",L))){M.push(337);
+O.push(" d.s.ch");break ifs;}if((J=E(Q,P,B[1047],[],[],N,"dp.cz.vb.ch",L))){break ifs;}if((J=E(Q,P,B[1048],[],[],N,"dp.cz.vc.ch",L))){break ifs;
+}if((J=E(Q,P,B[1049],[],[],N,"dp.cz.vd.ch",L))){break ifs;}if((J=E(Q,P,B[1050],[],[],N,"dp.n.uy.ch",L))){break ifs;
+}if((J=E(Q,P,B[1051],[],[],N,"dp.cz.uy.ch",L))){break ifs;}if((J=H[341].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,((!((G(Q,A[812],(P-3))||G(Q,A[813],(P-4)))||G(Q,A[496],(P-6))))?(G(Q,A[814],(P-1))?((!G(Q,A[815],(P-2)))?(G(Q,A[816],(P-1))?B[1052]:B[1053]):B[1054]):((!G(Q,A[815],(P-2)))?(G(Q,A[816],(P-1))?B[1055]:B[1056]):B[1057])):((!G(Q,A[815],(P-2)))?(G(Q,A[816],(P-1))?B[1058]:B[1059]):B[1060])),["h.if.cu.ig.ch","w.x.cu.ch"],[0,0,1,1],N,"d.cu.ch",L))){M.push(338);
+O.push(" d.cu.ch");break ifs;}}return J;}}),153:({scopes:"k.bq.br.fi.gm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[1061]:B[1062]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.gm.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),178:({scopes:"d.ve.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1063],[],[],N,"d.ve.bp",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),9:({scopes:"d.ka.ey",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1064],["h.bk.ka.ey"],[0,0],N,"d.ka.ey",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[11].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,((!G(Q,A[821],(P-1)))?B[1065]:null),[],[],N,"d.jh.ey",L))){M.push(6);
+O.push(" d.jh.ey");break ifs;}if((J=E(Q,P,B[1066],["h.bc.gc.ey"],[0,0],N,"d.kw.ey",L))){M.push(8);O.push(" d.kw.ey");
+break ifs;}}return J;}}),283:({scopes:"k.bm.ca.cb.bp.cd bh.bp.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1067],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.bp.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),296:({scopes:"k.bm.ca.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1068],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}}return J;}}),151:({scopes:"k.bq.br.fi.fj.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[1069]:B[1070]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.fj.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),76:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1071],["h.i.k.bl.bt"],[0,0],N,"k.bq.br.bt",L))){M.push(75);O.push(" k.bq.br.bt d.ha.bq.br.bt");
+break ifs;}}return J;}}),454:({scopes:"d.fn.iw.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1072],[],[],N,"d.fn.iw.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[457].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),23:({scopes:"bh.bt.bj.r.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1073],["h.bk.bj.j.bt","bh.bt"],[0,1,1,0],N,"bh.bt.bj.r.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[47].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),233:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1074],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[234].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),285:({scopes:"k.bm.ca.cb.cm.cd bh.cm.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1075],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.cm.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),477:({scopes:"a.cz.hv.ev.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1076],[],[],N,"a.cz.hv.ev.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[1077],[],[],N,"",L))){M.push(476);
+O.push("");break ifs;}}return J;}}),530:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1078],["w.f.km.iz.g","h.bc.gc.g"],[0,0,1,1],N,"d.iy.iz.g",L))){M.push(529);
+O.push(" d.iy.iz.g");break ifs;}}return J;}}),337:({scopes:"d.s.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1079],[],[],N,"d.s.ch",(function(){(L&&L());M.pop();O.pop();})))){}if((J=E(Q,P,B[1080],[],[],N,"h.bc.ek.ch",L))){break ifs;
+}}return J;}}),221:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1081],["h.bc.dw.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[1082],[],[],N,"dw.f.r.bp",L))){break ifs;}if((J=E(Q,P,B[1083],[],[],N,"h.bc.dw.bp",L))){break ifs;
+}}return J;}}),273:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1084],[],[],N,"d.bo.hc.cd",L))){M.push(272);O.push(" d.bo.hc.cd");break ifs;
+}}return J;}}),287:({scopes:"k.bm.ca.cb.cr.cd bh.cr.bj.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1085],["h.i.k.cd","ce.cf.cg.cd"],[0,1,1,0],N,"k.bm.ca.cb.cr.cd",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),331:({scopes:"k.bq.bx.ch",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1086],["h.i.k.j.ch"],[0,0],N,"k.bq.bx.ch",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[369].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),342:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[363].go(Q,P,K,M,O,L))){break ifs;}if((J=H[355].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[367].go(Q,P,K,M,O,L))){break ifs;}if((J=H[368].go(Q,P,K,M,O,L))){break ifs;}if((J=H[339].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[1087],["h.if.dp.cu.ig.ch","dp.cu.vf.ch"],[0,0,1,1],N,"",L))){break ifs;}if((J=E(Q,P,(((G(Q,A[812],(P-3))||G(Q,A[813],(P-4)))||G(Q,A[496],(P-6)))?((!G(Q,A[814],(P-1)))?B[1088]:B[1089]):((!G(Q,A[814],(P-1)))?B[1090]:B[1091])),["h.if.eq.ig.ch","dp.cu.er.ch","h.i.ef.ch"],[0,0,1,1,2,2],N,"d.eq.ch",L))){break ifs;
+}if((J=E(Q,P,((!((G(Q,A[812],(P-3))||G(Q,A[813],(P-4)))||G(Q,A[496],(P-6))))?(G(Q,A[814],(P-1))?B[1092]:null):null),["dw.f.ch","h.i.ef.ch"],[0,0,1,1],N,"d.vg.ch",L))){break ifs;
+}if((J=H[341].go(Q,P,K,M,O,L))){break ifs;}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),506:({scopes:"d.e.fa.gv.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1093],["h.i.e.g"],[0,0],N,"d.e.fa.gv.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[531].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),460:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1094],["h.i.q.c"],[0,0],N,"q.r.ih.c",L))){break ifs;}if(false){break ifs;
+}if((J=H[462].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),19:({scopes:"q.r.gk.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1095],["h.i.q.m"],[0,0],N,"q.r.gk.m",(function(){(L&&L());M.pop();O.pop();
+})))){}}return J;}}),29:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1096],["h.i.dw.bt"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[27].go(Q,P,K,M,O,L))){break ifs;}if((J=H[82].go(Q,P,K,M,O,L))){break ifs;}if((J=H[49].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[48].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1097],[],[],N,"ce.dk.hk.bt",L))){break ifs;}if((J=E(Q,P,B[1098],[],[],N,"ce.dk.hn.bt",L))){break ifs;
+}}return J;}}),46:({scopes:"k.bm.ca.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1099],["ce.dk.ca.bt","h.i.k.bt"],[0,0,1,1],N,"k.bm.ca.bt",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),367:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1100],["d.s.ch","ce.cf.ci.ch"],[0,1,1,0],N,"",L))){M.push(366);O.push("");
+break ifs;}}return J;}}),481:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1101],[],[],N,"w.f.fh.c",L))){M.push(480);O.push(" w.f.fh.c");break ifs;
+}if((J=E(Q,P,B[1102],["ce.dk.hw.c"],[0,0],N,"w.f.fh.c",L))){break ifs;}}return J;}}),458:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1103],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),172:({scopes:"k.bq.bx.r.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[1104]:B[1105]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),99:({scopes:"d.cu.fy.ef.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1106],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[139].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[1107],["dw.gg.cu.cm","h.bc.ef.cm"],[0,0,1,1],N,"",L))){break ifs;}}return J;}}),158:({scopes:"k.bq.br.fi.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[148],(P-1))?B[1108]:B[1109]),["h.i.k.j.cm","d.ep.br.cm","be.bf.fk.cm"],[0,1,1,0,2,2],N,"k.bq.br.fi.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),86:({scopes:"bh.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1110],["h.i.q.cm"],[0,0],N,"q.bu.bv.cm",L))){break ifs;}if((J=E(Q,P,B[1111],[],[],N,"n.da.md.vh.vi.cm",L))){break ifs;
+}if((J=E(Q,P,B[1112],[],[],N,"n.da.md.vi.cm",L))){break ifs;}if((J=E(Q,P,B[1113],[],[],N,"n.da.md.vh.hh.cm",L))){break ifs;
+}if((J=E(Q,P,B[1114],[],[],N,"n.da.md.hh.cm",L))){break ifs;}if((J=E(Q,P,(G(Q,A[850],(P-1))?B[1115]:B[1116]),[],[],N,"n.da.vj.cm",L))){break ifs;
+}if((J=E(Q,P,B[1117],[],[],N,"n.da.vk.cm",L))){break ifs;}if((J=E(Q,P,(G(Q,A[854],(P-1))?B[1118]:null),[],[],N,"n.da.vk.cm",L))){break ifs;
+}if((J=E(Q,P,B[1119],[],[],N,"n.da.vk.cm",L))){break ifs;}if((J=E(Q,P,B[1120],[],[],N,"n.da.md.vh.vl.cm",L))){break ifs;
+}if((J=E(Q,P,B[1121],[],[],N,"n.da.md.vl.cm",L))){break ifs;}if((J=E(Q,P,B[1122],["a.b.hq.cm"],[0,0],N,"",L))){break ifs;
+}if((J=E(Q,P,B[1123],["ce.cf.ci.cm","ce.cf.ci.vm.cm"],[0,0,1,1],N,"",L))){break ifs;}if((J=E(Q,P,B[1124],[],[],N,"ce.cf.vn.cm",L))){break ifs;
+}if((J=E(Q,P,B[1125],[],[],N,"ce.cf.vn.cm",L))){break ifs;}if((J=E(Q,P,B[1126],[],[],N,"ce.dk.fe.cm",L))){break ifs;
+}if((J=E(Q,P,B[1127],["ce.f.cm"],[0,0],N,"",L))){break ifs;}if((J=E(Q,P,B[1128],[],[],N,"ce.dk.dm.cm",L))){break ifs;
+}if((J=E(Q,P,B[1129],[],[],N,"ce.dk.gh.vo.cm",L))){break ifs;}if((J=E(Q,P,B[1130],[],[],N,"ce.dk.jr.cm",L))){break ifs;
+}if((J=E(Q,P,B[1131],[],[],N,"ce.dk.gh.cm",L))){break ifs;}if((J=E(Q,P,B[1132],["a.cz.fn.cm"],[0,0],N,"d.fn.nf.cm",L))){M.push(87);
+O.push(" d.fn.nf.cm w.x.cz.fn.cm");break ifs;}if((J=E(Q,P,B[1133],["a.cz.fn.cm"],[0,0],N,"d.fn.cm",L))){M.push(91);
+O.push(" d.fn.cm");break ifs;}if((J=E(Q,P,B[1134],["a.cz.fn.cm"],[0,0],N,"d.fn.cm",L))){M.push(93);O.push(" d.fn.cm");
+break ifs;}if((J=E(Q,P,B[1135],["a.cz.cu.cm"],[0,0],N,"d.cu.cm",L))){M.push(96);O.push(" d.cu.cm");break ifs;
+}if((J=E(Q,P,B[1136],["a.cz.cu.cm"],[0,0],N,"d.cu.cm",L))){M.push(98);O.push(" d.cu.cm");break ifs;}if((J=E(Q,P,B[1137],["a.cz.cu.fy.cm"],[0,0],N,"d.cu.fy.cm",L))){M.push(100);
+O.push(" d.cu.fy.cm");break ifs;}if((J=E(Q,P,B[1138],[],[],N,"d.cu.fm.cm",L))){M.push(103);O.push(" d.cu.fm.cm");
+break ifs;}if((J=E(Q,P,B[1139],[],[],N,"d.cu.fm.cm",L))){M.push(105);O.push(" d.cu.fm.cm w.x.cu.fm.cm");
+break ifs;}if((J=E(Q,P,(G(Q,A[419],(P-1))?B[1140]:null),["h.i.hu.bl.cm"],[0,0],N,"d.eq.cm",L))){M.push(106);
+O.push(" d.eq.cm d.eq.hu.cm");break ifs;}if((J=E(Q,P,B[1141],[],[],N,"d.eq.cm",L))){M.push(109);O.push(" d.eq.cm");
+break ifs;}if((J=E(Q,P,B[1142],[],[],N,"d.lm.cm",L))){M.push(112);O.push(" d.lm.cm");break ifs;}if((J=E(Q,P,(G(Q,A[419],(P-1))?B[1143]:null),["h.i.hu.bl.cm"],[0,0],N,"d.lm.cm",L))){M.push(113);
+O.push(" d.lm.cm d.lm.hu.cm");break ifs;}if((J=E(Q,P,B[1144],["a.cz.cu.cm"],[0,0],N,"",L))){break ifs;
+}if((J=E(Q,P,B[1145],["a.cz.fn.cm"],[0,0],N,"",L))){break ifs;}if((J=H[141].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[140].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1146],[],[],N,"n.im.cm",L))){break ifs;}if((J=H[174].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[159].go(Q,P,K,M,O,L))){break ifs;}if((J=H[130].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1147],[],[],N,"",L))){M.push(114);
+O.push("");break ifs;}if((J=E(Q,P,B[1148],["h.i.lh.bl.cm","d.vp.cm","h.i.lh.j.cm"],[0,0,1,2,2,1],N,"",L))){break ifs;
+}if((J=E(Q,P,B[1149],["h.i.lh.bl.cm"],[0,0],N,"d.fa.lh.cm",L))){M.push(116);O.push(" d.fa.lh.cm");break ifs;
+}if((J=E(Q,P,B[1150],["h.i.vq.bl.cm","d.vr.cm","h.i.vq.j.cm"],[0,0,1,2,2,1],N,"d.fa.vq.cm",L))){break ifs;
+}if((J=E(Q,P,B[1151],["h.i.fb.bl.cm","d.vs.cm","h.i.fb.j.cm"],[0,0,1,2,2,1],N,"d.fa.fb.cm",L))){break ifs;
+}if((J=E(Q,P,B[1152],["h.i.fb.bl.cm"],[0,0],N,"d.fa.fb.cm",L))){M.push(119);O.push(" d.fa.fb.cm");break ifs;
+}}return J;}}),430:({scopes:"bh.bi.bj.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1153],["h.bk.bj.j.v"],[0,0],N,"bh.bi.bj.v",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1154],[],[],N,"ce.f.vt.v",L))){break ifs;}}return J;}}),281:({scopes:"d.cu.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1155],["h.i.cu.cd"],[0,0],N,"d.cu.cd",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),373:({scopes:"d.cu.kt.mg.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1156],["h.i.ef.ch"],[0,0],N,"d.cu.kt.mg.ee",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),80:({scopes:"d.ev.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1157],["h.i.ev.j.bt"],[0,0],N,"d.ev.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[47].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),225:({scopes:"bh.bp.bj.bh",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1158],["h.bk.bj.bp"],[0,0],N,"bh.bp.bj.bh",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[236].go(Q,P,K,M,O,L))){break ifs;}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),409:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1159],[],[],N,"dp.fn.hx.cr",L))){break ifs;}if((J=E(Q,P,B[1160],[],[],N,"dp.cu.hx.cr",L))){break ifs;
+}if((J=E(Q,P,B[1161],[],[],N,"dp.n.hx.cr",L))){break ifs;}if((J=E(Q,P,B[1162],[],[],N,"dp.dw.hx.cr",L))){break ifs;
+}}return J;}}),117:({scopes:"d.fa.fb.ga.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1163],["h.bc.vu.fb.cm"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),277:({scopes:"d.bo.vv.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1164],["h.i.vv.cd"],[0,0],N,"d.bo.vv.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),74:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1165],["h.i.k.bl.bt"],[0,0],N,"k.cn.bt",L))){M.push(73);O.push(" k.cn.bt");
+break ifs;}}return J;}}),432:({scopes:"k.bm.bn.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1166],["h.i.k.j.v"],[0,0],N,"k.bm.bn.v",(function(){(L&&L());M.pop();
+O.pop();})))){}}return J;}}),170:({scopes:"k.bq.bx.r.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[1167]:B[1168]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),160:({scopes:"k.bq.bx.r.hb.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[1169]:B[1170]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.hb.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),319:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1171],["h.i.k.bl.cd"],[0,0],N,"k.cn.hz.cd",L))){M.push(318);O.push(" k.cn.hz.cd");
+break ifs;}if((J=E(Q,P,B[1172],[],[],N,"ce.dk.vw.cd",L))){break ifs;}}return J;}}),456:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1173],[],[],N,"d.fn.c",L))){M.push(455);O.push(" d.fn.c");break ifs;
+}}return J;}}),97:({scopes:"w.x.cu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1174],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[132].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),88:({scopes:"w.x.cz.fn.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1175],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[131].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),33:({scopes:"d.bj.bs bh.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1176],["h.bk.bj.j.bt","ce.dk.ca.bt","h.i.k.bt"],[0,1,1,2,2,0],N,"d.bj.bs",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[256].go(Q,P,K,M,O,L))){break ifs;}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),258:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1177],["h.i.q.bs"],[0,0],N,"q.bu.bw.bs",L))){break ifs;}if((J=E(Q,P,B[1178],["h.i.q.bs"],[0,0],N,"q.bu.bv.bs",L))){break ifs;
+}if((J=E(Q,P,B[1179],["h.i.q.bs"],[0,0],N,"q.r.ch",L))){M.push(257);O.push(" q.r.ch");break ifs;}}return J;
+}}),344:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1180],[],[],N,"",L))){M.push(343);O.push("");break ifs;}}return J;}}),386:({scopes:"d.ic.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[125],(P-1))?B[1181]:B[1182]),[],[],N,"d.ic.ee",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[1183],[],[],N,"",L))){M.push(385);O.push("");break ifs;}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),462:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1184],["h.i.q.c"],[0,0],N,"q.r.c",L))){M.push(461);O.push(" q.r.c");
+break ifs;}if((J=E(Q,P,B[1185],["q.bu.ez.c","h.i.q.c"],[0,1,1,0],N,"",L))){break ifs;}}return J;}}),317:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1186],[],[],N,"ce.f.cd",L))){break ifs;}if((J=E(Q,P,B[1187],[],[],N,"ce.dk.vx.cd",L))){break ifs;
+}}return J;}}),48:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1188],[],[],N,"n.da.bt",L))){break ifs;}}return J;}}),54:({scopes:"k.l.ke.bt",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1189],["h.i.k.j.bt"],[0,0],N,"k.l.ke.bt",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1190],[],[],N,"n.o.p.ls.bt",L))){break ifs;}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[1191],["h.i.lr.bt","h.i.lr.bt"],[0,0,1,1],N,"k.l.lr.bt",L))){break ifs;}if((J=E(Q,P,B[1192],["h.i.lt.bt"],[0,0],N,"k.l.lt.bt",L))){M.push(53);
+O.push(" k.l.lt.bt");break ifs;}if((J=E(Q,P,B[1193],[],[],N,"ce.dk.l.bt",L))){break ifs;}}return J;}}),206:({scopes:"k.bq.f.ei.em.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1194],["h.i.k.j.bp"],[0,0],N,"k.bq.f.ei.em.bp",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[1195],[],[],N,"n.o.p.bp",L))){break ifs;}if((J=H[234].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),486:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1196],[],[],N,"a.cz.ji.c",L))){break ifs;}}return J;}}),164:({scopes:"k.bq.bx.r.ff.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[1197]:B[1198]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.ff.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[134].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),471:({scopes:"d.ki.iw.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1199],[],[],N,"d.ki.iw.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),451:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1200],["ce.cf.ly.c"],[0,0],N,"d.gd.jf.c",L))){M.push(450);O.push(" d.gd.jf.c");
+break ifs;}}return J;}}),374:({scopes:"d.ne.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1201],[],[],N,"d.ne.ee",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[375].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),215:({scopes:"k.bm.ca.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1202],["h.i.k.j.bp"],[0,0],N,"k.bm.ca.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),515:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1203],[],[],N,"bh.cm.bj.g",L))){M.push(514);O.push(" bh.cm.bj.g");break ifs;
+}}return J;}}),60:({scopes:"k.bq.f.bz.by.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1204],[],[],N,"k.bq.f.bz.by.bs",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[1205],[],[],N,"n.o.p.bt",L))){break ifs;}}return J;}}),279:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1206],["h.i.ie.cd"],[0,0],N,"d.bo.ie.cd",L))){M.push(275);O.push(" d.bo.ie.cd");
+break ifs;}if((J=E(Q,P,B[1207],["h.i.k.bl.cd"],[0,0],N,"k.f.dn.cd",L))){M.push(276);O.push(" k.f.dn.cd");
+break ifs;}if((J=E(Q,P,B[1208],["h.i.vv.cd"],[0,0],N,"d.bo.vv.cd",L))){M.push(277);O.push(" d.bo.vv.cd");
+break ifs;}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[1209]:null),["h.i.en.cd"],[0,0],N,"d.bo.en.cd",L))){M.push(278);
+O.push(" d.bo.en.cd");break ifs;}}return J;}}),436:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1210],["h.i.k.bl.v"],[0,0],N,"k.bq.bx.v",L))){M.push(435);O.push(" k.bq.bx.v");
+break ifs;}}return J;}}),217:({scopes:"k.bm.bj.vy.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1211],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.vy.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[371].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),27:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1212],[],[],N,"d.eq.bt",L))){break ifs;}}return J;}}),473:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1213],[],[],N,"d.ki.c",L))){M.push(472);O.push(" d.ki.c");break ifs;
+}}return J;}}),405:({scopes:"k.bq.br.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1214],["h.i.k.cr"],[0,0],N,"k.bq.br.cr",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1215],[],[],N,"n.o.p.cr",L))){break ifs;}}return J;}}),58:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1216],["h.i.k.bl.bt"],[0,0],N,"k.l.kk.bt",L))){M.push(57);O.push(" k.l.kk.bt");
+break ifs;}}return J;}}),397:({scopes:"d.cu.gp.cr",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1217],["ce.cf.gq.cr","w.x.cu.gr.cr"],[0,0,1,1],N,"d.cu.gp.cr",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[395].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),237:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1218],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[238].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),365:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1219],["d.s.ch","ce.cf.ci.ch"],[0,1,1,0],N,"",L))){M.push(364);O.push("");
+break ifs;}}return J;}}),526:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1220],[],[],N,"w.f.km.g",L))){break ifs;}}return J;}}),25:({scopes:"bh.bt.bj.bu.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1221],["h.bk.bj.j.bt","bh.bt"],[0,1,1,0],N,"bh.bt.bj.bu.g",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[47].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),235:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1222],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[236].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),325:({scopes:"dw.f.je.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1223],["h.i.dw.cd"],[0,0],N,"dw.f.je.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1224],[],[],N,"ce.dk.vz.cd",L))){break ifs;}if((J=E(Q,P,B[1225],["h.bk.ev.cd","h.bk.ev.cd"],[0,0,1,1],N,"",L))){break ifs;
+}}return J;}}),109:({scopes:"d.eq.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1226],["h.i.hu.j.cm"],[0,0],N,"d.eq.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1227],[],[],N,"",L))){M.push(107);O.push("");break ifs;}if((J=E(Q,P,B[1228],["h.i.hu.bl.cm"],[0,0],N,"",L))){M.push(108);
+O.push(" d.eq.hu.cm");break ifs;}}return J;}}),491:({scopes:"d.mx.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1229],[],[],N,"d.mx.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),411:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1230],[],[],N,"dp.fn.wa.wb.cr",L))){break ifs;}if((J=E(Q,P,B[1231],[],[],N,"dp.fn.wa.pa.cr",L))){break ifs;
+}if((J=E(Q,P,B[1232],[],[],N,"dp.fn.wa.nc.cr",L))){break ifs;}if((J=E(Q,P,B[1233],[],[],N,"dp.fn.wa.wc.cr",L))){break ifs;
+}if((J=E(Q,P,B[1234],[],[],N,"dp.cu.wa.pa.cr",L))){break ifs;}if((J=E(Q,P,B[1235],[],[],N,"dp.cu.wa.wb.cr",L))){break ifs;
+}if((J=E(Q,P,B[1236],[],[],N,"dp.cu.wa.k.cr",L))){break ifs;}if((J=E(Q,P,B[1237],[],[],N,"dp.cu.wa.wd.cr",L))){break ifs;
+}if((J=E(Q,P,B[1238],[],[],N,"dp.cu.wa.we.cr",L))){break ifs;}if((J=E(Q,P,B[1239],[],[],N,"dp.cu.wa.wf.cr",L))){break ifs;
+}if((J=E(Q,P,B[1240],[],[],N,"dp.cu.wa.nc.cr",L))){break ifs;}if((J=E(Q,P,B[1241],[],[],N,"dp.cu.wa.jw.cr",L))){break ifs;
+}if((J=E(Q,P,B[1242],[],[],N,"dp.cu.wa.wc.cr",L))){break ifs;}}return J;}}),464:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1243],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[457].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),115:({scopes:"d.fa.lh.li.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1244],["h.bc.lh.cm"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),137:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1245],[],[],N,"be.bf.x.cm",L))){break ifs;}}return J;}}),227:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1246],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[228].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),361:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1247],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[342].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),62:({scopes:"k.bq.br.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1248],["n.o.p.bt"],[0,0],N,"k.bq.br.bs",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),111:({scopes:"d.lm.hu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1249],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),135:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[142].go(Q,P,K,M,O,L))){break ifs;}if((J=H[143].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[120].go(Q,P,K,M,O,L))){break ifs;}if((J=H[121].go(Q,P,K,M,O,L))){break ifs;}if((J=H[122].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[136].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),7:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1250],["h.bk.cu.ey"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[15].go(Q,P,K,M,O,L))){break ifs;}if((J=H[13].go(Q,P,K,M,O,L))){break ifs;}if((J=E(Q,P,B[1251],[],[],N,"n.f.kz.le.ey",L))){break ifs;
+}if((J=E(Q,P,B[1252],[],[],N,"n.f.kz.wg.ey",L))){break ifs;}if((J=E(Q,P,B[1253],[],[],N,"dw.gg.lf.ey",L))){break ifs;
+}}return J;}}),434:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1254],["h.i.k.bl.v"],[0,0],N,"k.bq.br.v",L))){M.push(433);O.push(" k.bq.br.v");
+break ifs;}}return J;}}),113:({scopes:"d.lm.cm d.lm.hu.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1255],["h.i.hu.j.cm"],[0,0],N,"d.lm.cm",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[86].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),245:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1256],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[246].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),13:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1257],["h.i.k.bl.ey"],[0,0],N,"k.bq.br.ey",L))){M.push(12);O.push(" k.bq.br.ey");
+break ifs;}}return J;}}),300:({scopes:"k.cn.bz.cd",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1258],["h.i.k.j.cd"],[0,0],N,"k.cn.bz.cd",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1259],[],[],N,"n.o.p.cd",L))){break ifs;}if((J=H[269].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),223:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1260],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[176].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),239:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1261],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[255].go(Q,P,K,M,O,L))){break ifs;}if((J=H[240].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),428:({scopes:"d.e.ba.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1262],["h.i.e.v","d.bo.gw.v","w.x.e.bb.v","w.x.e.v","h.bc.bb.v","w.x.e.bd.v","h.i.e.v"],[0,1,1,0,2,2,3,4,4,3,5,5,6,6],N,"d.e.ba.v",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[437].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),528:({scopes:"k.bq.bx.g d.ja.iz.g",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1263],["h.i.k.j.g"],[0,0],N,"k.bq.bx.g",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;}if((J=H[511].go(Q,P,K,M,O,L))){break ifs;}}return J;
+}}),501:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1264],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[510].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[1].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),174:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,((!G(Q,A[943],(P-1)))?B[1265]:null),["h.i.k.bl.cm","h.i.k.j.cm","d.ep.bx.cm"],[0,0,1,2,2,1],N,"k.bq.bx.fi.cm",L))){break ifs;
+}if((J=E(Q,P,B[1266],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.r.hb.cm",L))){M.push(160);O.push(" k.bq.bx.r.hb.cm");
+break ifs;}if((J=E(Q,P,B[1267],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.r.fj.cm",L))){M.push(161);
+O.push(" k.bq.bx.r.fj.cm");break ifs;}if((J=E(Q,P,B[1268],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.r.eo.cm",L))){M.push(162);
+O.push(" k.bq.bx.r.eo.cm");break ifs;}if((J=E(Q,P,B[1269],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.r.gm.cm",L))){M.push(163);
+O.push(" k.bq.bx.r.gm.cm");break ifs;}if((J=E(Q,P,B[1270],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.r.ff.cm",L))){M.push(164);
+O.push(" k.bq.bx.r.ff.cm");break ifs;}if((J=E(Q,P,B[1271],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.fi.hb.cm",L))){M.push(165);
+O.push(" k.bq.bx.fi.hb.cm");break ifs;}if((J=E(Q,P,B[1272],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.fi.fj.cm",L))){M.push(166);
+O.push(" k.bq.bx.fi.fj.cm");break ifs;}if((J=E(Q,P,B[1273],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.fi.eo.cm",L))){M.push(167);
+O.push(" k.bq.bx.fi.eo.cm");break ifs;}if((J=E(Q,P,B[1274],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.fi.gm.cm",L))){M.push(168);
+O.push(" k.bq.bx.fi.gm.cm");break ifs;}if((J=E(Q,P,B[1275],["a.cz.k.cm","h.i.k.bl.cm"],[0,0,1,1],N,"k.bq.bx.fi.ff.cm",L))){M.push(169);
+O.push(" k.bq.bx.fi.ff.cm");break ifs;}if((J=E(Q,P,B[1276],["h.i.k.bl.cm"],[0,0],N,"k.bq.bx.r.cm",L))){M.push(170);
+O.push(" k.bq.bx.r.cm");break ifs;}if((J=E(Q,P,B[1277],["h.i.k.bl.cm"],[0,0],N,"k.bq.bx.fi.cm",L))){M.push(171);
+O.push(" k.bq.bx.fi.cm");break ifs;}if((J=E(Q,P,B[1278],["h.i.k.bl.cm"],[0,0],N,"k.bq.bx.r.cm",L))){M.push(172);
+O.push(" k.bq.bx.r.cm");break ifs;}if((J=E(Q,P,B[1279],["h.i.k.bl.cm"],[0,0],N,"k.bq.bx.fi.cm",L))){M.push(173);
+O.push(" k.bq.bx.fi.cm");break ifs;}}return J;}}),162:({scopes:"k.bq.bx.r.eo.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[304],(P-3))?B[1280]:B[1281]),["h.i.k.j.cm","d.ep.bx.cm"],[0,1,1,0],N,"k.bq.bx.r.eo.cm",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=H[123].go(Q,P,K,M,O,L))){break ifs;}if((J=H[133].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[144].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),382:({scopes:"d.ia.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,(G(Q,A[125],(P-1))?B[1282]:B[1283]),[],[],N,"d.ia.ee",(function(){(L&&L());
+M.pop();O.pop();})))){}if((J=E(Q,P,B[1284],["h.i.bo.ee"],[0,0],N,"",L))){M.push(381);O.push("");break ifs;
+}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),3:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1285],["h.bk.cu.ey"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[1286],[],[],N,"dw.gg.ll.ey",L))){break ifs;}if((J=H[15].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[13].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),449:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1287],["ce.cf.lv.c"],[0,0],N,"",L))){M.push(448);O.push("");break ifs;
+}}return J;}}),302:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1288],["h.i.k.bl.cd"],[0,0],N,"k.f.dn.cd",L))){M.push(299);O.push(" k.f.dn.cd");
+break ifs;}if((J=E(Q,P,B[1289],["h.i.k.bl.cd"],[0,0],N,"k.cn.bz.cd",L))){M.push(300);O.push(" k.cn.bz.cd");
+break ifs;}if((J=E(Q,P,B[1290],["h.i.k.bl.cd"],[0,0],N,"k.cn.es.cd",L))){M.push(301);O.push(" k.cn.es.cd");
+break ifs;}}return J;}}),371:({scopes:"bh.ee",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=H[387].go(Q,P,K,M,O,L))){break ifs;}if((J=H[327].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[1291],[],[],N,"a.b.ee",L))){break ifs;}if((J=E(Q,P,B[1292],[],[],N,"a.b.ee",L))){break ifs;
+}if((J=E(Q,P,B[1293],[],[],N,"ce.cf.ee",L))){break ifs;}if((J=E(Q,P,B[1294],[],[],N,"ce.cf.ee",L))){break ifs;
+}if((J=E(Q,P,B[1295],[],[],N,"dw.f.ku.wh.ee",L))){break ifs;}if((J=E(Q,P,B[1296],[],[],N,"dw.im.ee",L))){break ifs;
+}if((J=E(Q,P,B[1297],[],[],N,"a.cz.wi.ee",L))){break ifs;}if((J=E(Q,P,B[1298],[],[],N,"ce.dk.wj.ee",L))){break ifs;
+}if((J=E(Q,P,B[1299],[],[],N,"ce.dk.ee",L))){break ifs;}if((J=E(Q,P,B[1300],[],[],N,"a.cz.ee",L))){break ifs;
+}if((J=E(Q,P,B[1301],[],[],N,"a.b.ee",L))){break ifs;}if((J=E(Q,P,((!((G(Q,A[973],(P-1))||G(Q,A[812],(P-3)))||G(Q,A[813],(P-4))))?B[1302]:B[1303]),["w.x.cu.ee","h.i.ef.ch"],[0,0,1,1],N,"d.cu.kt.ee",L))){M.push(372);
+O.push(" d.cu.kt.ee");break ifs;}if((J=E(Q,P,((!((G(Q,A[973],(P-1))||G(Q,A[812],(P-3)))||G(Q,A[813],(P-4))))?B[1304]:B[1305]),["w.x.cu.ee","h.i.ef.ch"],[0,0,1,1],N,"d.cu.kt.mg.ee",L))){M.push(373);
+O.push(" d.cu.kt.mg.ee");break ifs;}}return J;}}),348:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1306],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[M[0]].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),17:({scopes:"k.bq.bx.m",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1307],["h.i.k.j.m"],[0,0],N,"k.bq.bx.m",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=E(Q,P,B[1308],[],[],N,"n.o.p.m",L))){break ifs;}}return J;}}),304:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1309],[],[],N,"ce.dk.lh.cd",L))){break ifs;}}return J;}}),219:({scopes:"k.bm.bj.m.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1310],["h.i.k.j.bp"],[0,0],N,"k.bm.bj.m.bp",(function(){(L&&L());M.pop();
+O.pop();})))){}if((J=H[224].go(Q,P,K,M,O,L))){break ifs;}if((J=H[16].go(Q,P,K,M,O,L))){break ifs;}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;
+}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),346:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1311],[],[],N,"d.ik.ch",L))){M.push(345);O.push(" d.ik.ch");break ifs;
+}}return J;}}),447:({scopes:"d.mc.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1312],[],[],N,"d.mc.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[457].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),64:({scopes:"k.bq.bx.bs",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1313],[],[],N,"k.bq.bx.bs",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[30].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),475:({scopes:"a.cz.cq.c",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1314],[],[],N,"a.cz.cq.c",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[478].go(Q,P,K,M,O,L))){break ifs;
+}if((J=E(Q,P,B[1315],[],[],N,"a.cz.cq.c",L))){M.push(474);O.push(" a.cz.cq.c");break ifs;}}return J;}}),243:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1316],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[226].go(Q,P,K,M,O,L))){break ifs;}if((J=H[222].go(Q,P,K,M,O,L))){break ifs;}if((J=H[244].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),369:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1317],[],[],N,"n.o.p.ch",L))){break ifs;}if((J=E(Q,P,B[1318],[],[],N,"be.bf.wk.ch",L))){break ifs;
+}}return J;}}),445:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1319],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[459].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),101:({scopes:"w.x.cu.fm.cm",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1320],[],[],N,"",(function(){(L&&L());M.pop();O.pop();})))){}if((J=H[130].go(Q,P,K,M,O,L))){break ifs;
+}}return J;}}),426:({scopes:"d.e.y.z.v",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1321],["h.i.e.v"],[0,0],N,"d.e.y.z.v",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=E(Q,P,B[1322],["h.i.e.v","w.x.e.w.v","d.w.v"],[0,0,1,1,2,2],N,"",L))){M.push(425);O.push("");
+break ifs;}}return J;}}),298:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1323],["ce.dk.wl.cd","k.bq.bx.wl.cd","h.i.k.bl.cd","h.i.k.j.cd"],[0,0,1,2,2,3,3,1],N,"d.wl.cd",L))){break ifs;
+}if((J=E(Q,P,B[1324],["ce.dk.wl.cd","k.bq.br.wl.cd","h.i.k.bl.cd","h.i.k.j.cd"],[0,0,1,2,2,3,3,1],N,"d.wl.cd",L))){break ifs;
+}if((J=E(Q,P,B[1325],["ce.dk.wl.cd","k.bm.wl.cd"],[0,0,1,1],N,"d.wl.cd",L))){break ifs;}}return J;}}),241:({scopes:"",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1326],["h.bk.bo.bp"],[0,0],N,"",(function(){(L&&L());M.pop();O.pop();
+})))){}if((J=H[242].go(Q,P,K,M,O,L))){break ifs;}}return J;}}),176:({scopes:"bh.bp",go:function(Q,P,K,M,O,L){var N=function(R,S){K(R,(O.join("")+(S&&" "+S)).substring(1));
+};var J=false;ifs:{if((J=E(Q,P,B[1327],["ce.cf.fn.bp","w.x.cz.fn.bp","w.f.fh.bp","h.bc.ht.bp","dw.f.hv.bp","h.i.dw.bp"],[0,0,1,2,3,3,2,4,5,5,4,1],N,"d.fn.bp",L))){break ifs;
+}if((J=E(Q,P,B[1328],["ce.cf.wm.bp","w.x.cz.wm.bp","w.f.fh.wm.wn.bp","h.bc.ht.bp","w.f.fh.wm.wo.bp","h.bc.ht.bp","w.f.fh.wm.wp.bp","h.bc.ht.bp"],[0,0,1,2,3,3,2,4,5,5,4,6,7,7,6,1],N,"d.wm.bp",L))){break ifs;
+}if((J=E(Q,P,((!G(Q,A[454],(P-1)))?B[1329]:null),[],[],N,"be.lb.bp",L))){break ifs;}if((J=E(Q,P,((!G(Q,A[454],(P-1)))?B[1330]:null),[],[],N,"ce.cf.bp",L))){break ifs;
+}if((J=E(Q,P,((!G(Q,A[454],(P-1)))?B[1331]:null),[],[],N,"ce.cf.wq.bp",L))){break ifs;}if((J=E(Q,P,(G(Q,A[989],(P-1))?B[1332]:null),[],[],N,"d.wr.bp.wq",L))){break ifs;
+}if((J=E(Q,P,((!G(Q,A[454],(P-1)))?B[1333]:null),[],[],N,"ce.dk.fe.bp",L))){break ifs;}if((J=E(Q,P,((!G(Q,A[454],(P-1)))?B[1334]:B[1335]),[],[],N,"ce.cf.ws.bp",L))){break ifs;
+}if((J=E(Q,P,B[1336],[],[],N,"n.im.bp",L))){break ifs;}if((J=E(Q,P,B[1337],[],[],N,"dw.im.bp",L))){break ifs;
+}if((J=E(Q,P,B[1338],[],[],N,"ce.f.wt.bp",L))){break ifs;}if((J=E(Q,P,B[1339],["ce.f.wt.bp"],[0,0],N,"d.hy.bp",L))){M.push(177);
+O.push(" d.hy.bp");break ifs;}if((J=E(Q,P,B[1340],["h.i.dw.bp"],[0,0],N,"dw.f.ku.kv.bp",L))){break ifs;
+}if((J=E(Q,P,B[1341],["h.i.dw.bp"],[0,0],N,"dw.f.ku.fn.bp",L))){break ifs;}if((J=E(Q,P,B[1342],["h.i.dw.bp"],[0,0],N,"dw.f.ku.hq.bp",L))){break ifs;
+}if((J=E(Q,P,B[1343],["h.i.dw.bp"],[0,0],N,"dw.f.ku.hq.wu.bp",L))){break ifs;}if((J=E(Q,P,B[1344],["dw.f.n.bp"],[0,0],N,"d.ve.bp",L))){M.push(178);
+O.push(" d.ve.bp");break ifs;}if((J=E(Q,P,B[1345],[],[],N,"dp.fn.bp",L))){break ifs;}if((J=E(Q,P,B[1346],[],[],N,"dw.f.n.bp",L))){break ifs;
+}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[1347]:null),["ce.cf.wv.bp","w.x.cu.bp","h.i.ef.bp"],[0,0,1,1,2,2],N,"d.cu.ki.kj.bp",L))){M.push(179);
+O.push(" d.cu.ki.kj.bp dw.gg.cu.bp");break ifs;}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[1348]:null),["ce.cf.wv.bp","w.x.cu.bp"],[0,0,1,1],N,"d.cu.ki.kj.bp",L))){M.push(180);
+O.push(" d.cu.ki.kj.bp dw.gg.cu.bp");break ifs;}if((J=E(Q,P,((G(Q,A[238],(P-0))||G(Q,A[239],(P-1)))?B[1349]:null),["ce.cf.wv.bp","w.x.cu.bp"],[0,0,1,1],N,"d.cu.ki.ww.bp",L))){break ifs;
+}if((J=E(Q,P,B[1350],[],[],N,"n.da.bp",L))){break ifs;}if((J=E(Q,P,B[1351],["h.i.n.bp"],[0,0],N,"n.f.kd.kk.bp",L))){M.push(181);
+O.push(" n.f.kd.kk.bp");break ifs;}if((J=E(Q,P,B[1352],["h.i.n.bp"],[0,0],N,"n.f.kd.ke.bp",L))){M.push(182);
+O.push(" n.f.kd.ke.bp");break ifs;}if((J=E(Q,P,B[1353],[],[],N,"ce.dk.gh.vo.bp",L))){break ifs;}if((J=E(Q,P,B[1354],["h.i.k.bl.bp"],[0,0],N,"k.bq.bx.bp",L))){M.push(183);
+O.push(" k.bq.bx.bp");break ifs;}if((J=E(Q,P,B[1355],["h.i.k.bl.bp"],[0,0],N,"k.bq.br.bp",L))){M.push(184);
+O.push(" k.bq.br.bp");break ifs;}if((J=E(Q,P,B[1356],["h.i.k.bl.bp"],[0,0],N,"k.cn.bp",L))){M.push(185);
+O.push(" k.cn.bp");break ifs;}if((J=E(Q,P,B[1357],["h.i.k.bl.bp"],[0,0],N,"k.cn.bp",L))){M.push(186);
+O.push(" k.cn.bp");break ifs;}if((J=E(Q,P,B[1358],["h.i.k.bl.bp"],[0,0],N,"k.cn.bp",L))){M.push(187);
+O.push(" k.cn.bp");break ifs;}if((J=E(Q,P,B[1359],["h.i.k.bl.bp"],[0,0],N,"k.cn.bp",L))){M.push(188);
+O.push(" k.cn.bp");break ifs;}if((J=E(Q,P,B[1360],["h.i.k.bl.bp"],[0,0],N,"k.cn.bp",L))){M.push(189);
+O.push(" k.cn.bp");break ifs;}if((J=E(Q,P,B[1361],["h.i.k.bl.bp"],[0,0],N,"k.cn.bp",L))){M.push(190);
+O.push(" k.cn.bp");break ifs;}if((J=E(Q,P,(((((((G(Q,A[1017],(P-1))||G(Q,A[1018],(P-4)))||G(Q,A[1019],(P-5)))||G(Q,A[1020],(P-6)))||G(Q,A[1021],(P-7)))||G(Q,A[1022],(P-8)))||G(Q,A[1023],(P-14)))?((((G(Q,A[1024],(P-3))||G(Q,A[1025],(P-5)))||G(Q,A[1026],(P-6)))||G(Q,A[1027],(P-7)))?B[1362]:B[1363]):((((G(Q,A[1024],(P-3))||G(Q,A[1025],(P-5)))||G(Q,A[1026],(P-6)))||G(Q,A[1027],(P-7)))?B[1364]:B[1365])),["k.l.tm.bp","h.i.k.bp"],[0,1,1,0],N,"",L))){M.push(191);
+O.push(" k.l.tm.bp");break ifs;}if((J=E(Q,P,B[1366],["h.i.k.bl.bp"],[0,0],N,"k.l.fl.bp",L))){M.push(192);
+O.push(" k.l.fl.bp");break ifs;}if((J=E(Q,P,B[1367],["h.i.k.bl.bp"],[0,0],N,"k.l.fl.bp",L))){M.push(193);
+O.push(" k.l.fl.bp");break ifs;}if((J=E(Q,P,B[1368],["h.i.k.bl.bp"],[0,0],N,"k.l.fl.bp",L))){M.push(194);
+O.push(" k.l.fl.bp");break ifs;}if((J=E(Q,P,B[1369],["h.i.k.bl.bp"],[0,0],N,"k.l.fl.bp",L))){M.push(195);
+O.push(" k.l.fl.bp");break ifs;}if((J=E(Q,P,B[1370],["h.i.k.bl.bp"],[0,0],N,"k.l.fl.bp",L))){M.push(196);
+O.push(" k.l.fl.bp");break ifs;}if((J=E(Q,P,B[1371],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.ej.bp",L))){M.push(197);
+O.push(" k.bq.f.ei.ej.bp");break ifs;}if((J=E(Q,P,B[1372],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.ej.bp",L))){M.push(198);
+O.push(" k.bq.f.ei.ej.bp");break ifs;}if((J=E(Q,P,B[1373],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.ej.bp",L))){M.push(199);
+O.push(" k.bq.f.ei.ej.bp");break ifs;}if((J=E(Q,P,B[1374],["h.i.k.bl.bp"],[0,0],N,"k.bq.br.bp.et",L))){M.push(200);
+O.push(" k.bq.br.bp.et");break ifs;}if((J=E(Q,P,B[1375],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.ej.bp",L))){M.push(201);
+O.push(" k.bq.f.ei.ej.bp");break ifs;}if((J=E(Q,P,B[1376],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.f.bp",L))){M.push(202);
+O.push(" k.bq.f.ei.f.bp");break ifs;}if((J=E(Q,P,B[1377],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.em.bp",L))){M.push(203);
+O.push(" k.bq.f.ei.em.bp");break ifs;}if((J=E(Q,P,B[1378],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.em.bp",L))){M.push(204);
+O.push(" k.bq.f.ei.em.bp");break ifs;}if((J=E(Q,P,B[1379],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.em.bp",L))){M.push(205);
+O.push(" k.bq.f.ei.em.bp");break ifs;}if((J=E(Q,P,B[1380],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.em.bp",L))){M.push(206);
+O.push(" k.bq.f.ei.em.bp");break ifs;}if((J=E(Q,P,B[1381],["h.i.k.bl.bp"],[0,0],N,"k.bq.f.ei.em.bp",L))){M.push(207);
+O.push(" k.bq.f.ei.em.bp");break ifs;}if((J=E(Q,P,((!G(Q,A[444],(P-1)))?B[1382]:null),["h.i.n.bp"],[0,0],N,"n.f.kd.bp",L))){break ifs;
+}if((J=E(Q,P,B[1383],["h.i.n.bp"],[0,0],N,"n.f.kd.bp.wx",L))){break ifs;}if((J=E(Q,P,B[1384],["h.i.q.bp"],[0,0],N,"q.r.gk.bp",L))){M.push(208);
+O.push(" q.r.gk.bp");break ifs;}if((J=E(Q,P,B[1385],["h.i.q.bp"],[0,0],N,"q.bu.bv.bp",L))){break ifs;
+}if((J=E(Q,P,((!G(Q,A[814],(P-1)))?B[1386]:null),[],[],N,"n.da.bp",L))){break ifs;}if((J=E(Q,P,B[1387],["k.bm.uw.bp"],[0,0],N,"",L))){M.push(210);
+O.push(" u.uv");break ifs;}if((J=E(Q,P,B[1388],["h.i.k.bl.bp"],[0,0],N,"k.bm.ca.bp",L))){M.push(211);
+O.push(" k.bm.ca.bp");break ifs;}if((J=E(Q,P,B[1389],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.g.bp",L))){M.push(212);
+O.push(" k.bm.bj.g.bp u.g.bj.bp");break ifs;}if((J=E(Q,P,B[1390],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.bs.bp",L))){M.push(213);
+O.push(" k.bm.bj.bs.bp u.bs.bj.bp");break ifs;}if((J=E(Q,P,B[1391],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.bp.bp",L))){M.push(214);
+O.push(" k.bm.bj.bp.bp");break ifs;}if((J=E(Q,P,B[1392],["h.i.k.bl.bp"],[0,0],N,"k.bm.ca.bp",L))){M.push(215);
+O.push(" k.bm.ca.bp");break ifs;}if((J=E(Q,P,B[1393],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.ch.bp",L))){M.push(216);
+O.push(" k.bm.bj.ch.bp");break ifs;}if((J=E(Q,P,B[1394],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.vy.bp",L))){M.push(217);
+O.push(" k.bm.bj.vy.bp");break ifs;}if((J=E(Q,P,B[1395],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.ey.bp",L))){M.push(218);
+O.push(" k.bm.bj.ey.bp");break ifs;}if((J=E(Q,P,B[1396],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.m.bp",L))){M.push(219);
+O.push(" k.bm.bj.m.bp");break ifs;}if((J=E(Q,P,B[1397],["h.i.k.bl.bp"],[0,0],N,"k.bm.bj.cd.bp",L))){M.push(220);
+O.push(" k.bm.bj.cd.bp");break ifs;}if((J=E(Q,P,(((G(Q,A[989],(P-1))||G(Q,A[1062],(P-2)))||G(Q,A[1063],(P-3)))?B[1398]:null),["h.bc.dw.bp"],[0,0],N,"",L))){M.push(221);
+O.push("");break ifs;}if((J=E(Q,P,B[1399],[],[],N,"h.bc.gc",L))){break ifs;}if((J=E(Q,P,B[1400],[],[],N,"ce.dk.gh.vo.bp",L))){break ifs;
+}if((J=E(Q,P,(G(Q,A[1065],(P-1))?B[1401]:B[1402]),[],[],N,"ce.dk.dm.bp",L))){break ifs;}if((J=E(Q,P,(G(Q,A[1065],(P-1))?B[1403]:B[1404]),[],[],N,"ce.dk.fe.bp",L))){break ifs;
+}if((J=E(Q,P,B[1405],[],[],N,"ce.dk.jr.bp",L))){break ifs;}if((J=E(Q,P,B[1406],[],[],N,"ce.dk.gh.bp",L))){break ifs;
+}if((J=E(Q,P,B[1407],[],[],N,"ce.dk.f.bp",L))){break ifs;}if((J=E(Q,P,B[1408],[],[],N,"h.bc.f.bp",L))){break ifs;
+}if((J=E(Q,P,B[1409],[],[],N,"h.bc.mp.bp",L))){break ifs;}if((J=E(Q,P,B[1410],[],[],N,"h.bc.hv.bp",L))){break ifs;
+}if((J=E(Q,P,B[1411],[],[],N,"h.bc.ki.bp",L))){break ifs;}if((J=E(Q,P,B[1412],[],[],N,"h.bk.bo.bp",L))){break ifs;
+}if((J=E(Q,P,B[1413],[],[],N,"h.bk.ev.bp",L))){break ifs;}if((J=E(Q,P,B[1414],[],[],N,"h.bk.cu.bp",L))){break ifs;
+}}return J;}})};var I=function(U,K,O){var M=K.split("/");var L=[];for(var P=0;P<M.length;P++){var Q=H[M[P]].scopes;
+L.push(Q&&" "+Q);}var S=0;var R=U.length;var T=0;var J=function(){if(S>T){O(U.substring(T,S),L.join("").substring(1));
+T=S;}};while(S<R){var N=H[M[M.length-1]].go(U,S,O,M,L,J);if(N){S+=N[0];T+=N[0];}else{S++;}}J();return M.join("/");
+};var D=(function(J){return(((/(?:^| )q(?=\.| |$)|(?:^| )wy\.wz\.xa\.bs(?=\.| |$)/.test(J)&&" t1")||"")+((/(?:^| )wz\.xa\.bs(?=\.| |$)/.test(J)&&" t2")||"")+((/(?:^| )ce(?=\.| |$)|(?:^| )a(?=\.| |$)/.test(J)&&" t3")||"")+((/(?:^| )n\.da(?=\.| |$)/.test(J)&&" t4")||"")+((/(?:^| )n(?=\.| |$)/.test(J)&&" t5")||"")+((/(?:^| )n\.im(?=\.| |$)/.test(J)&&" t6")||"")+((/(?:^| )dw\.im(?=\.| |$)|(?:^| )dw\.f(?=\.| |$)/.test(J)&&" t7")||"")+((/(?:^| )n\.o\.p(?=\.| |$)|(?:^| )k(?=\.| |$).*?(?:^| )bh(?=\.| |$)/.test(J)&&" t8")||"")+((/(?:^| )d\.s(?=\.| |$)/.test(J)&&" t9")||"")+((/(?:^| )ce\.cf\.ci(?=\.| |$)/.test(J)&&" t10")||"")+((/(?:^| )w\.x\.cu(?=\.| |$)|(?:^| )dp\.cu\.gv(?=\.| |$)/.test(J)&&" t11")||"")+((/(?:^| )w\.x\.cz(?=\.| |$)/.test(J)&&" t12")||"")+((/(?:^| )w\.f\.is(?=\.| |$)/.test(J)&&" t13")||"")+((/(?:^| )dw\.gg(?=\.| |$)/.test(J)&&" t14")||"")+((/(?:^| )a\.cz\.ki(?=\.| |$)/.test(J)&&" t15")||"")+((/(?:^| )d\.bk(?=\.| |$).*?(?:^| )w\.x\.bk(?=\.| |$)|(?:^| )gd\.bk(?=\.| |$).*?(?:^| )w\.x\.bk(?=\.| |$)/.test(J)&&" t16")||"")+((/(?:^| )dp\.cu(?=\.| |$)/.test(J)&&" t17")||"")+((/(?:^| )dp\.fn(?=\.| |$)|(?:^| )dp\.cz(?=\.| |$)/.test(J)&&" t18")||"")+((/(?:^| )dp\.n(?=\.| |$)/.test(J)&&" t19")||"")+((/(?:^| )dp\.dw(?=\.| |$)/.test(J)&&" t20")||"")+((/(?:^| )ce\.dk\.m(?=\.| |$)/.test(J)&&" t21")||"")+((/(?:^| )be(?=\.| |$)/.test(J)&&" t22")||"")+((/(?:^| )be\.lb\.ii(?=\.| |$)/.test(J)&&" t23")||"")+((/(?:^| )u(?=\.| |$).*?(?:^| )bh(?=\.| |$)|(?:^| )k\.bm(?=\.| |$)/.test(J)&&" t24")||"")+((/(?:^| )u(?=\.| |$).*?(?:^| )bh(?=\.| |$).*?(?:^| )k\.bm(?=\.| |$)|(?:^| )u(?=\.| |$).*?(?:^| )bh(?=\.| |$).*?(?:^| )u(?=\.| |$).*?(?:^| )bh(?=\.| |$)/.test(J)&&" t25")||"")+((/(?:^| )d\.e\.s\.v(?=\.| |$)/.test(J)&&" t26")||"")+((/(?:^| )d\.e\.y\.z(?=\.| |$)|(?:^| )d\.e\.y\.z(?=\.| |$).*?(?:^| )w(?=\.| |$)|(?:^| )d\.e\.y\.z(?=\.| |$).*?(?:^| )k(?=\.| |$)|(?:^| )d\.e\.s\.v(?=\.| |$)|(?:^| )d\.e\.s\.v(?=\.| |$).*?(?:^| )w(?=\.| |$)|(?:^| )d\.e\.s\.v(?=\.| |$).*?(?:^| )k(?=\.| |$)/.test(J)&&" t27")||"")+((/(?:^| )k\.bq\.xb\.z\.xc(?=\.| |$)/.test(J)&&" t28")||"")+((/(?:^| )d\.e(?=\.| |$)|(?:^| )gd\.e(?=\.| |$)/.test(J)&&" t29")||"")+((/(?:^| )w\.x\.e(?=\.| |$)/.test(J)&&" t30")||"")+((/(?:^| )w\.f\.kr(?=\.| |$)/.test(J)&&" t31")||"")+((/(?:^| )fv\.xd(?=\.| |$)/.test(J)&&" t32")||"")+((/(?:^| )fv\.xe(?=\.| |$)/.test(J)&&" t33")||"")+((/(?:^| )fv\.lh(?=\.| |$)/.test(J)&&" t34")||"")+((/(?:^| )k(?=\.| |$)/.test(J)&&" t35")||"")).substring(1);
+});return{parseLine:I,initialState:"494",getClassesForScope:D};}());
diff --git a/trunk/infrastructure/ace/www/lang_js.js b/trunk/infrastructure/ace/www/lang_js.js
new file mode 100644
index 0000000..4bbc5b4
--- /dev/null
+++ b/trunk/infrastructure/ace/www/lang_js.js
@@ -0,0 +1,102 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+grammars = (window.grammars || {}); grammars["source.js"] = (function() {
+ var rxTest = function(str, rx, startIndex) {
+ rx.lastIndex = startIndex; var rslt = rx.exec(str); return !!(rslt && rslt[0]);
+ };
+ var tokenizeMatch = function(str, startIndex, rxResult, captureNames, captureGroups, captureLocators, captureStructure, tokenFunc, extraScopes) {
+ extraScopes = (extraScopes && " "+extraScopes);
+ // each entry of scopeState is undefined or a scope starting with a " ", so that
+ // that when the array is joined on '' it is either an empty string or series of
+ // space-separated scopes starting with an extra space
+ var scopeState = new Array(captureNames.length+1);
+ var idx = startIndex;
+ var fullLen = rxResult[0].length;
+ for(var k=0;k<captureStructure.length;k++) {
+ var c = captureStructure[k];
+ var g = captureGroups[c];
+ if (g < 0) continue;
+ var isOpen = (scopeState[c] === undefined);
+ var newIndex = startIndex + fullLen;
+ var locators = captureLocators[c];
+ for(var j=0;j<locators.length;j++) newIndex -= (rxResult[locators[j]]||'').length;
+ if (isOpen) {
+ newIndex -= (rxResult[g]||'').length;
+ }
+ if (newIndex > idx) {
+ tokenFunc(str.substring(idx, newIndex), (extraScopes+scopeState.join('')).substring(1));
+ }
+ idx = newIndex;
+ if (isOpen) {
+ scopeState[c] = " "+captureNames[c];
+ }
+ else {
+ delete scopeState[c];
+ }
+ }
+ if (idx < startIndex + fullLen) {
+ tokenFunc(str.substring(idx, startIndex+fullLen), (extraScopes+scopeState.join('')).substring(1));
+ }
+ };
+ var tryMatch = function(str, startIndex, rx, fgn, captureNames, captureGroups, captureLocators, captureStructure, tokenFunc, extraScopes, optOnBeforeTokenize) {
+ rx.lastIndex = startIndex;
+ var rxResult = rx.exec(str);
+ if (! rxResult) return false; // shouldn't happen
+ if (rxResult[fgn]) return false; // failure group
+ optOnBeforeTokenize && optOnBeforeTokenize();
+ tokenizeMatch(str, startIndex, rxResult, captureNames, captureGroups, captureLocators, captureStructure, tokenFunc, extraScopes);
+ return [rxResult[0].length];
+ };
+ var tryMatch2 = function(str, startIndex, postlob, captureNames, captureStructure, tokenFunc, extraScopes, optOnBeforeTokenize) {
+ return(postlob ? tryMatch(str,startIndex,postlob[0],postlob[1],captureNames,postlob[2],postlob[3],captureStructure,tokenFunc,extraScopes,optOnBeforeTokenize) : false);
+ }
+ var rxs = [/(?=\n)|"|([\s\S])/g,/\\(x[0-9a-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.(prototype)(\s*(=)(\s*)))|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.(prototype)(\.([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*(=)(\s*(function)?(\s*(\()((.*?)(\))))))))|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.(prototype)(\.([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*(=)(\s*))))|([\s\S])/g,/([a-zA-Z_\?\.\$][\w\?\.\$]*)(\.([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*(=)(\s*(function)(\s*(\()((.*?)(\)))))))|([\s\S])/g,/([a-zA-Z_\?\$][\w\?\$]*)(\s*(=)(\s*(function)(\s*(\()((.*?)(\))))))|([\s\S])/g,/\b(function)(\s+([a-zA-Z_\$]\w*)?(\s*(\()((.*?)(\)))))|([\s\S])/g,/\b([a-zA-Z_\?\.\$][\w\?\.\$]*)(\s*:\s*\b(function)?(\s*(\()((.*?)(\)))))|([\s\S])/g,/(?:((')((.*?)(')))|((")((.*?)("))))(\s*:\s*\b(function)?(\s*(\()((.*?)(\)))))|([\s\S])/g,/(new)(\s+(\w+(?:\.\w*)?))|([\s\S])/g,/\b(console)\b|([\s\S])/g,/\.(warn|info|log|error|time|timeEnd|assert)\b|([\s\S])/g,/\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?))\b|([\s\S])/g,/'|([\s\S])/g,/"|([\s\S])/g,/\/\*\*(?!\/)|([\s\S])/g,/\/\*|([\s\S])/g,/(\/\/)(.*(?=\n)\n?)|([\s\S])/g,/(<!\-\-|\-\->)|([\s\S])/g,/\b(boolean|byte|char|class|double|enum|float|function|int|interface|long|short|var|void)\b|([\s\S])/g,/\b(const|export|extends|final|implements|native|private|protected|public|static|synchronized|throws|transient|volatile)\b|([\s\S])/g,/\b(break|case|catch|continue|default|do|else|finally|for|goto|if|import|package|return|switch|throw|try|while)\b|([\s\S])/g,/\b(delete|in|instanceof|new|typeof|with)\b|([\s\S])/g,/\btrue\b|([\s\S])/g,/\bfalse\b|([\s\S])/g,/\bnull\b|([\s\S])/g,/\b(super|this)\b|([\s\S])/g,/\b(debugger)\b|([\s\S])/g,/\b(Anchor|Applet|Area|Array|Boolean|Button|Checkbox|Date|document|event|FileUpload|Form|Frame|Function|Hidden|History|Image|JavaArray|JavaClass|JavaObject|JavaPackage|java|Layer|Link|Location|Math|MimeType|Number|navigator|netscape|Object|Option|Packages|Password|Plugin|Radio|RegExp|Reset|Select|String|Style|Submit|screen|sun|Text|Textarea|window|XMLHttpRequest)\b|([\s\S])/g,/\b(s(h(ift|ow(Mod(elessDialog|alDialog)|Help))|croll(X|By(Pages|Lines)?|Y|To)?|t(op|rike)|i(n|zeToContent|debar|gnText)|ort|u(p|b(str(ing)?)?)|pli(ce|t)|e(nd|t(Re(sizable|questHeader)|M(i(nutes|lliseconds)|onth)|Seconds|Ho(tKeys|urs)|Year|Cursor|Time(out)?|Interval|ZOptions|Date|UTC(M(i(nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(ome|andleEvent)|navigate|c(har(CodeAt|At)|o(s|n(cat|textual|firm)|mpile)|eil|lear(Timeout|Interval)?|a(ptureEvents|ll)|reate(StyleSheet|Popup|EventObject))|t(o(GMTString|S(tring|ource)|U(TCString|pperCase)|Lo(caleString|werCase))|est|a(n|int(Enabled)?))|i(s(NaN|Finite)|ndexOf|talics)|d(isableExternalCapture|ump|etachEvent)|u(n(shift|taint|escape|watch)|pdateCommands)|j(oin|avaEnabled)|p(o(p|w)|ush|lugins.refresh|a(ddings|rse(Int|Float)?)|r(int|ompt|eference))|e(scape|nableExternalCapture|val|lementFromPoint|x(p|ec(Script|Command)?))|valueOf|UTC|queryCommand(State|Indeterm|Enabled|Value)|f(i(nd|le(ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(nt(size|color)|rward)|loor|romCharCode)|watch|l(ink|o(ad|g)|astIndexOf)|a(sin|nchor|cos|t(tachEvent|ob|an(2)?)|pply|lert|b(s|ort))|r(ou(nd|teEvents)|e(size(By|To)|calc|turnValue|place|verse|l(oad|ease(Capture|Events)))|andom)|g(o|et(ResponseHeader|M(i(nutes|lliseconds)|onth)|Se(conds|lection)|Hours|Year|Time(zoneOffset)?|Da(y|te)|UTC(M(i(nutes|lliseconds)|onth)|Seconds|Hours|Da(y|te)|FullYear)|FullYear|A(ttention|llResponseHeaders)))|m(in|ove(B(y|elow)|To(Absolute)?|Above)|ergeAttributes|a(tch|rgins|x))|b(toa|ig|o(ld|rderWidths)|link|ack))\b(?=\()|([\s\S])/g,/\b(s(ub(stringData|mit)|plitText|e(t(NamedItem|Attribute(Node)?)|lect))|has(ChildNodes|Feature)|namedItem|c(l(ick|o(se|neNode))|reate(C(omment|DATASection|aption)|T(Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(ntityReference|lement)|Attribute))|tabIndex|i(nsert(Row|Before|Cell|Data)|tem)|open|delete(Row|C(ell|aption)|T(Head|Foot)|Data)|focus|write(ln)?|a(dd|ppend(Child|Data))|re(set|place(Child|Data)|move(NamedItem|Child|Attribute(Node)?)?)|get(NamedItem|Element(sBy(Name|TagName)|ById)|Attribute(Node)?)|blur)\b(?=\()|([\s\S])/g,/\.|/g,/(s(ystemLanguage|cr(ipts|ollbars|een(X|Y|Top|Left))|t(yle(Sheets)?|atus(Text|bar)?)|ibling(Below|Above)|ource|uffixes|e(curity(Policy)?|l(ection|f)))|h(istory|ost(name)?|as(h|Focus))|y|X(MLDocument|SLDocument)|n(ext|ame(space(s|URI)|Prop))|M(IN_VALUE|AX_VALUE)|c(haracterSet|o(n(structor|trollers)|okieEnabled|lorDepth|mp(onents|lete))|urrent|puClass|l(i(p(boardData)?|entInformation)|osed|asses)|alle(e|r)|rypto)|t(o(olbar|p)|ext(Transform|Indent|Decoration|Align)|ags)|SQRT(1_2|2)|i(n(ner(Height|Width)|put)|ds|gnoreCase)|zIndex|o(scpu|n(readystatechange|Line)|uter(Height|Width)|p(sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(i(splay|alog(Height|Top|Width|Left|Arguments)|rectories)|e(scription|fault(Status|Ch(ecked|arset)|View)))|u(ser(Profile|Language|Agent)|n(iqueID|defined)|pdateInterval)|_content|p(ixelDepth|ort|ersonalbar|kcs11|l(ugins|atform)|a(thname|dding(Right|Bottom|Top|Left)|rent(Window|Layer)?|ge(X(Offset)?|Y(Offset)?))|r(o(to(col|type)|duct(Sub)?|mpter)|e(vious|fix)))|e(n(coding|abledPlugin)|x(ternal|pando)|mbeds)|v(isibility|endor(Sub)?|Linkcolor)|URLUnencoded|P(I|OSITIVE_INFINITY)|f(ilename|o(nt(Size|Family|Weight)|rmName)|rame(s|Element)|gColor)|E|whiteSpace|l(i(stStyleType|n(eHeight|kColor))|o(ca(tion(bar)?|lName)|wsrc)|e(ngth|ft(Context)?)|a(st(M(odified|atch)|Index|Paren)|yer(s|X)|nguage))|a(pp(MinorVersion|Name|Co(deName|re)|Version)|vail(Height|Top|Width|Left)|ll|r(ity|guments)|Linkcolor|bove)|r(ight(Context)?|e(sponse(XML|Text)|adyState))|global|x|m(imeTypes|ultiline|enubar|argin(Right|Bottom|Top|Left))|L(N(10|2)|OG(10E|2E))|b(o(ttom|rder(RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(Color|Image)))\b|([\s\S])/g,/(s(hape|ystemId|c(heme|ope|rolling)|ta(ndby|rt)|ize|ummary|pecified|e(ctionRowIndex|lected(Index)?)|rc)|h(space|t(tpEquiv|mlFor)|e(ight|aders)|ref(lang)?)|n(o(Resize|tation(s|Name)|Shade|Href|de(Name|Type|Value)|Wrap)|extSibling|ame)|c(h(ildNodes|Off|ecked|arset)?|ite|o(ntent|o(kie|rds)|de(Base|Type)?|l(s|Span|or)|mpact)|ell(s|Spacing|Padding)|l(ear|assName)|aption)|t(ype|Bodies|itle|Head|ext|a(rget|gName)|Foot)|i(sMap|ndex|d|m(plementation|ages))|o(ptions|wnerDocument|bject)|d(i(sabled|r)|o(c(type|umentElement)|main)|e(clare|f(er|ault(Selected|Checked|Value)))|at(eTime|a))|useMap|p(ublicId|arentNode|r(o(file|mpt)|eviousSibling))|e(n(ctype|tities)|vent|lements)|v(space|ersion|alue(Type)?|Link|Align)|URL|f(irstChild|orm(s)?|ace|rame(Border)?)|width|l(ink(s)?|o(ngDesc|wSrc)|a(stChild|ng|bel))|a(nchors|c(ce(ssKey|pt(Charset)?)|tion)|ttributes|pplets|l(t|ign)|r(chive|eas)|xis|Link|bbr)|r(ow(s|Span|Index)|ules|e(v|ferrer|l|adOnly))|m(ultiple|e(thod|dia)|a(rgin(Height|Width)|xLength))|b(o(dy|rder)|ackground|gColor))\b|([\s\S])/g,/\b(ELEMENT_NODE|ATTRIBUTE_NODE|TEXT_NODE|CDATA_SECTION_NODE|ENTITY_REFERENCE_NODE|ENTITY_NODE|PROCESSING_INSTRUCTION_NODE|COMMENT_NODE|DOCUMENT_NODE|DOCUMENT_TYPE_NODE|DOCUMENT_FRAGMENT_NODE|NOTATION_NODE|INDEX_SIZE_ERR|DOMSTRING_SIZE_ERR|HIERARCHY_REQUEST_ERR|WRONG_DOCUMENT_ERR|INVALID_CHARACTER_ERR|NO_DATA_ALLOWED_ERR|NO_MODIFICATION_ALLOWED_ERR|NOT_FOUND_ERR|NOT_SUPPORTED_ERR|INUSE_ATTRIBUTE_ERR)\b|([\s\S])/g,/\bon(R(ow(s(inserted|delete)|e(nter|xit))|e(s(ize(start|end)?|et)|adystatechange))|Mouse(o(ut|ver)|down|up|move)|B(efore(cut|deactivate|u(nload|pdate)|p(aste|rint)|editfocus|activate)|lur)|S(croll|top|ubmit|elect(start|ionchange)?)|H(over|elp)|C(hange|ont(extmenu|rolselect)|ut|ellchange|l(ick|ose))|D(eactivate|ata(setc(hanged|omplete)|available)|r(op|ag(start|over|drop|en(ter|d)|leave)?)|blclick)|Unload|P(aste|ropertychange)|Error(update)?|Key(down|up|press)|Focus|Load|A(ctivate|fter(update|print)|bort))\b|([\s\S])/g,/\(|/g,/!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?:|\*=|\/=|%=|\+=|\-=|&=|\^=|\b(in|instanceof|new|delete|typeof|void)\b|([\s\S])/g,/!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?:|\*=|%=|\+=|\-=|&=|\^=|\b(in|instanceof|new|delete|typeof|void)\b|([\s\S])/g,/\b(Infinity|NaN|undefined)\b|([\s\S])/g,/^[\s\S]|/g,/[=\(:]|/g,/return|/g,/\s*(\/)((?![\/\*\+\{\}\?]))|([\s\S])/g,/;|([\s\S])/g,/,[ \|\t]*|([\s\S])/g,/\.|([\s\S])/g,/\{|\}|([\s\S])/g,/\(|\)|([\s\S])/g,/\[|\]|([\s\S])/g,/(?=\n)|(\/)([igm]*)|([\s\S])/g,/\\.|([\s\S])/g,/\*\/|([\s\S])/g,/(?=\n)|'|([\s\S])/g,/\\(x[0-9a-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)|([\s\S])/g];
+ var exs = [[rxs[0],1,[0],[[]]],[rxs[1],2,[],[]],[rxs[2],7,[1,3,5],[[2],[4],[6]]],[rxs[3],15,[1,3,5,7,9,11,13,14],[[2],[4],[6],[8],[10],[12],[14],[]]],[rxs[4],9,[1,3,5,7],[[2],[4],[6],[8]]],[rxs[5],13,[1,3,5,7,9,11,12],[[2],[4],[6],[8],[10],[12],[]]],[rxs[6],11,[1,3,5,7,9,10],[[2],[4],[6],[8],[10],[]]],[rxs[7],9,[1,3,5,7,8],[[2],[4],[6],[8],[]]],[rxs[8],9,[1,3,5,7,8],[[2],[4],[6],[8],[]]],[rxs[9],18,[1,2,4,5,6,7,9,10,12,14,16,17],[[11],[3,11],[5,11],[11],[11],[8,11],[10,11],[11],[13],[15],[17],[]]],[rxs[10],4,[1,3],[[2],[]]],[rxs[11],2,[],[]],[rxs[12],2,[],[]],[rxs[13],6,[],[]],[rxs[14],1,[0],[[]]],[rxs[15],1,[0],[[]]],[rxs[16],1,[0],[[]]],[rxs[17],1,[0],[[]]],[rxs[18],3,[1],[[2]]],[rxs[19],2,[1],[[]]],[rxs[20],2,[],[]],[rxs[21],2,[],[]],[rxs[22],2,[],[]],[rxs[23],2,[],[]],[rxs[24],1,[],[]],[rxs[25],1,[],[]],[rxs[26],1,[],[]],[rxs[27],2,[],[]],[rxs[28],2,[],[]],[rxs[29],2,[],[]],[rxs[30],90,[],[]],[rxs[31],31,[],[]],[rxs[33],101,[],[]],[rxs[34],65,[],[]],[rxs[35],2,[],[]],[rxs[36],32,[],[]],[rxs[38],2,[],[]],[rxs[39],2,[],[]],[rxs[40],2,[],[]],[rxs[44],3,[1],[[2]]],[rxs[45],1,[],[]],[rxs[46],1,[],[]],[rxs[47],1,[],[]],[rxs[48],1,[],[]],[rxs[49],1,[],[]],[rxs[50],1,[],[]],[rxs[51],3,[1],[[2]]],[rxs[52],1,[],[]],[rxs[53],1,[0],[[]]],[rxs[53],1,[0],[[]]],[rxs[54],1,[0],[[]]],[rxs[55],2,[],[]]];
+ var frames = {3: ({ scopes:"string.quoted.double.js", go:function(str,startIndex,tokenFunc0,frameStack,scopeStack,optOnMatch) {var tokenFunc = function(txt, scps) { tokenFunc0(txt, (scopeStack.join('')+(scps&&' '+scps)).substring(1)); }; var matchResult; if ((matchResult = tryMatch2(str,startIndex,exs[0],["punctuation.definition.string.end.js"],[0,0],tokenFunc,"string.quoted.double.js",(function() {(optOnMatch&&optOnMatch());frameStack.pop();scopeStack.pop();})))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[1],[],[],tokenFunc,"constant.character.escape.js",optOnMatch))) {} else { return false; } return matchResult;} }),1: ({ scopes:"source.js", go:function(str,startIndex,tokenFunc0,frameStack,scopeStack,optOnMatch) {var tokenFunc = function(txt, scps) { tokenFunc0(txt, (scopeStack.join('')+(scps&&' '+scps)).substring(1)); }; var matchResult; if ((matchResult = tryMatch2(str,startIndex,exs[2],["support.class.js","support.constant.js","keyword.operator.js"],[0,0,1,1,2,2],tokenFunc,"meta.class.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[3],["support.class.js","support.constant.js","entity.name.function.js","keyword.operator.js","storage.type.function.js","punctuation.definition.parameters.begin.js","variable.parameter.function.js","punctuation.definition.parameters.end.js"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7],tokenFunc,"meta.function.prototype.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[4],["support.class.js","support.constant.js","entity.name.function.js","keyword.operator.js"],[0,0,1,1,2,2,3,3],tokenFunc,"meta.function.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[5],["support.class.js","entity.name.function.js","keyword.operator.js","storage.type.function.js","punctuation.definition.parameters.begin.js","variable.parameter.function.js","punctuation.definition.parameters.end.js"],[0,0,1,1,2,2,3,3,4,4,5,5,6,6],tokenFunc,"meta.function.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[6],["entity.name.function.js","keyword.operator.js","storage.type.function.js","punctuation.definition.parameters.begin.js","variable.parameter.function.js","punctuation.definition.parameters.end.js"],[0,0,1,1,2,2,3,3,4,4,5,5],tokenFunc,"meta.function.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[7],["storage.type.function.js","entity.name.function.js","punctuation.definition.parameters.begin.js","variable.parameter.function.js","punctuation.definition.parameters.end.js"],[0,0,1,1,2,2,3,3,4,4],tokenFunc,"meta.function.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[8],["entity.name.function.js","storage.type.function.js","punctuation.definition.parameters.begin.js","variable.parameter.function.js","punctuation.definition.parameters.end.js"],[0,0,1,1,2,2,3,3,4,4],tokenFunc,"meta.function.json.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[9],["string.quoted.single.js","punctuation.definition.string.begin.js","entity.name.function.js","punctuation.definition.string.end.js","string.quoted.double.js","punctuation.definition.string.begin.js","entity.name.function.js","punctuation.definition.string.end.js","entity.name.function.js","punctuation.definition.parameters.begin.js","variable.parameter.function.js","punctuation.definition.parameters.end.js"],[0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,8,8,9,9,10,10,11,11],tokenFunc,"meta.function.json.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[10],["keyword.operator.new.js","entity.name.type.instance.js"],[0,0,1,1],tokenFunc,"meta.class.instance.constructor",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[11],[],[],tokenFunc,"entity.name.type.object.js.firebug",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[12],[],[],tokenFunc,"support.function.js.firebug",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[13],[],[],tokenFunc,"constant.numeric.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[14],["punctuation.definition.string.begin.js"],[0,0],tokenFunc,"string.quoted.single.js",optOnMatch))) {frameStack.push(2);scopeStack.push(" string.quoted.single.js");} else if ((matchResult = tryMatch2(str,startIndex,exs[15],["punctuation.definition.string.begin.js"],[0,0],tokenFunc,"string.quoted.double.js",optOnMatch))) {frameStack.push(3);scopeStack.push(" string.quoted.double.js");} else if ((matchResult = tryMatch2(str,startIndex,exs[16],["punctuation.definition.comment.js"],[0,0],tokenFunc,"comment.block.documentation.js",optOnMatch))) {frameStack.push(4);scopeStack.push(" comment.block.documentation.js");} else if ((matchResult = tryMatch2(str,startIndex,exs[17],["punctuation.definition.comment.js"],[0,0],tokenFunc,"comment.block.js",optOnMatch))) {frameStack.push(5);scopeStack.push(" comment.block.js");} else if ((matchResult = tryMatch2(str,startIndex,exs[18],["punctuation.definition.comment.js"],[0,0],tokenFunc,"comment.line.double-slash.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[19],["punctuation.definition.comment.html.js"],[0,0],tokenFunc,"comment.block.html.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[20],[],[],tokenFunc,"storage.type.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[21],[],[],tokenFunc,"storage.modifier.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[22],[],[],tokenFunc,"keyword.control.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[23],[],[],tokenFunc,"keyword.operator.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[24],[],[],tokenFunc,"constant.language.boolean.true.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[25],[],[],tokenFunc,"constant.language.boolean.false.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[26],[],[],tokenFunc,"constant.language.null.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[27],[],[],tokenFunc,"variable.language.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[28],[],[],tokenFunc,"keyword.other.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[29],[],[],tokenFunc,"support.class.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[30],[],[],tokenFunc,"support.function.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[31],[],[],tokenFunc,"support.function.dom.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,(rxTest(str,rxs[32],(startIndex - 1))?exs[32]:null),[],[],tokenFunc,"support.constant.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,(rxTest(str,rxs[32],(startIndex - 1))?exs[33]:null),[],[],tokenFunc,"support.constant.dom.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[34],[],[],tokenFunc,"support.constant.dom.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[35],[],[],tokenFunc,"support.function.event-handler.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,((! rxTest(str,rxs[37],(startIndex - 1)))?exs[36]:exs[37]),[],[],tokenFunc,"keyword.operator.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[38],[],[],tokenFunc,"constant.language.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,(((rxTest(str,rxs[41],(startIndex - 0)) || rxTest(str,rxs[42],(startIndex - 1))) || rxTest(str,rxs[43],(startIndex - 6)))?exs[39]:null),["punctuation.definition.string.begin.js"],[0,0],tokenFunc,"string.regexp.js",optOnMatch))) {frameStack.push(6);scopeStack.push(" string.regexp.js");} else if ((matchResult = tryMatch2(str,startIndex,exs[40],[],[],tokenFunc,"punctuation.terminator.statement.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[41],[],[],tokenFunc,"meta.delimiter.object.comma.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[42],[],[],tokenFunc,"meta.delimiter.method.period.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[43],[],[],tokenFunc,"meta.brace.curly.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[44],[],[],tokenFunc,"meta.brace.round.js",optOnMatch))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[45],[],[],tokenFunc,"meta.brace.square.js",optOnMatch))) {} else { return false; } return matchResult;} }),6: ({ scopes:"string.regexp.js", go:function(str,startIndex,tokenFunc0,frameStack,scopeStack,optOnMatch) {var tokenFunc = function(txt, scps) { tokenFunc0(txt, (scopeStack.join('')+(scps&&' '+scps)).substring(1)); }; var matchResult; if ((matchResult = tryMatch2(str,startIndex,exs[46],["punctuation.definition.string.end.js"],[0,0],tokenFunc,"string.regexp.js",(function() {(optOnMatch&&optOnMatch());frameStack.pop();scopeStack.pop();})))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[47],[],[],tokenFunc,"constant.character.escape.js",optOnMatch))) {} else { return false; } return matchResult;} }),4: ({ scopes:"comment.block.documentation.js", go:function(str,startIndex,tokenFunc0,frameStack,scopeStack,optOnMatch) {var tokenFunc = function(txt, scps) { tokenFunc0(txt, (scopeStack.join('')+(scps&&' '+scps)).substring(1)); }; var matchResult; if ((matchResult = tryMatch2(str,startIndex,exs[48],["punctuation.definition.comment.js"],[0,0],tokenFunc,"comment.block.documentation.js",(function() {(optOnMatch&&optOnMatch());frameStack.pop();scopeStack.pop();})))) {} else { return false; } return matchResult;} }),5: ({ scopes:"comment.block.js", go:function(str,startIndex,tokenFunc0,frameStack,scopeStack,optOnMatch) {var tokenFunc = function(txt, scps) { tokenFunc0(txt, (scopeStack.join('')+(scps&&' '+scps)).substring(1)); }; var matchResult; if ((matchResult = tryMatch2(str,startIndex,exs[49],["punctuation.definition.comment.js"],[0,0],tokenFunc,"comment.block.js",(function() {(optOnMatch&&optOnMatch());frameStack.pop();scopeStack.pop();})))) {} else { return false; } return matchResult;} }),2: ({ scopes:"string.quoted.single.js", go:function(str,startIndex,tokenFunc0,frameStack,scopeStack,optOnMatch) {var tokenFunc = function(txt, scps) { tokenFunc0(txt, (scopeStack.join('')+(scps&&' '+scps)).substring(1)); }; var matchResult; if ((matchResult = tryMatch2(str,startIndex,exs[50],["punctuation.definition.string.end.js"],[0,0],tokenFunc,"string.quoted.single.js",(function() {(optOnMatch&&optOnMatch());frameStack.pop();scopeStack.pop();})))) {} else if ((matchResult = tryMatch2(str,startIndex,exs[51],[],[],tokenFunc,"constant.character.escape.js",optOnMatch))) {} else { return false; } return matchResult;} })};
+var parseLine = function(line, stateString, tokenFunc) {
+ var frameStack = stateString.split('/');
+ var scopeStack = [];
+ for(var i=0;i<frameStack.length;i++) {
+ var scps = frames[frameStack[i]].scopes;
+ scopeStack.push(scps && " "+scps);
+ }
+ var idx = 0;
+ var lineLen = line.length;
+ var tokenizedIdx = 0;
+ var tokenizeUnmatched = function() {
+ if (idx > tokenizedIdx) {
+ tokenFunc(line.substring(tokenizedIdx, idx), scopeStack.join('').substring(1));
+ tokenizedIdx = idx;
+ }
+ }
+ while(idx < lineLen) {
+ var frameResult = frames[frameStack[frameStack.length-1]].go(
+ line, idx, tokenFunc, frameStack, scopeStack, tokenizeUnmatched);
+ if (frameResult) {
+ idx += frameResult[0];
+ tokenizedIdx += frameResult[0];
+ }
+ else {
+ idx++;
+ }
+ }
+ tokenizeUnmatched();
+ return frameStack.join('/');
+ };
+ var getClassesForScope = (function(scope) { return (((/(?:^| )comment(?=\.| |$)|(?:^| )extract\.custom\.title\.sql(?=\.| |$)/.test(scope) && " t1") || "")+((/(?:^| )custom\.title\.sql(?=\.| |$)/.test(scope) && " t2") || "")+((/(?:^| )keyword(?=\.| |$)|(?:^| )storage(?=\.| |$)/.test(scope) && " t3") || "")+((/(?:^| )constant\.numeric(?=\.| |$)/.test(scope) && " t4") || "")+((/(?:^| )constant(?=\.| |$)/.test(scope) && " t5") || "")+((/(?:^| )constant\.language(?=\.| |$)/.test(scope) && " t6") || "")+((/(?:^| )variable\.language(?=\.| |$)|(?:^| )variable\.other(?=\.| |$)/.test(scope) && " t7") || "")+((/(?:^| )string(?=\.| |$)/.test(scope) && " t8") || "")+((/(?:^| )constant\.character\.escape(?=\.| |$)|(?:^| )string(?=\.| |$).*?(?:^| )source(?=\.| |$)/.test(scope) && " t9") || "")+((/(?:^| )meta\.preprocessor(?=\.| |$)/.test(scope) && " t10") || "")+((/(?:^| )keyword\.control\.import(?=\.| |$)/.test(scope) && " t11") || "")+((/(?:^| )entity\.name\.function(?=\.| |$)|(?:^| )support\.function\.any(?=\.| |$)/.test(scope) && " t12") || "")+((/(?:^| )entity\.name\.type(?=\.| |$)/.test(scope) && " t13") || "")+((/(?:^| )entity\.other\.inherited(?=\.| |$)/.test(scope) && " t14") || "")+((/(?:^| )variable\.parameter(?=\.| |$)/.test(scope) && " t15") || "")+((/(?:^| )storage\.type\.method(?=\.| |$)/.test(scope) && " t16") || "")+((/(?:^| )meta\.section(?=\.| |$).*?(?:^| )entity\.name\.section(?=\.| |$)|(?:^| )declaration\.section(?=\.| |$).*?(?:^| )entity\.name\.section(?=\.| |$)/.test(scope) && " t17") || "")+((/(?:^| )support\.function(?=\.| |$)/.test(scope) && " t18") || "")+((/(?:^| )support\.class(?=\.| |$)|(?:^| )support\.type(?=\.| |$)/.test(scope) && " t19") || "")+((/(?:^| )support\.constant(?=\.| |$)/.test(scope) && " t20") || "")+((/(?:^| )support\.variable(?=\.| |$)/.test(scope) && " t21") || "")+((/(?:^| )keyword\.operator\.js(?=\.| |$)/.test(scope) && " t22") || "")+((/(?:^| )invalid(?=\.| |$)/.test(scope) && " t23") || "")+((/(?:^| )invalid\.deprecated\.trailing(?=\.| |$)/.test(scope) && " t24") || "")+((/(?:^| )text(?=\.| |$).*?(?:^| )source(?=\.| |$)|(?:^| )string\.unquoted(?=\.| |$)/.test(scope) && " t25") || "")+((/(?:^| )text(?=\.| |$).*?(?:^| )source(?=\.| |$).*?(?:^| )string\.unquoted(?=\.| |$)|(?:^| )text(?=\.| |$).*?(?:^| )source(?=\.| |$).*?(?:^| )text(?=\.| |$).*?(?:^| )source(?=\.| |$)/.test(scope) && " t26") || "")+((/(?:^| )meta\.tag\.preprocessor\.xml(?=\.| |$)/.test(scope) && " t27") || "")+((/(?:^| )meta\.tag\.sgml\.doctype(?=\.| |$)|(?:^| )meta\.tag\.sgml\.doctype(?=\.| |$).*?(?:^| )entity(?=\.| |$)|(?:^| )meta\.tag\.sgml\.doctype(?=\.| |$).*?(?:^| )string(?=\.| |$)|(?:^| )meta\.tag\.preprocessor\.xml(?=\.| |$)|(?:^| )meta\.tag\.preprocessor\.xml(?=\.| |$).*?(?:^| )entity(?=\.| |$)|(?:^| )meta\.tag\.preprocessor\.xml(?=\.| |$).*?(?:^| )string(?=\.| |$)/.test(scope) && " t28") || "")+((/(?:^| )string\.quoted\.docinfo\.doctype\.DTD(?=\.| |$)/.test(scope) && " t29") || "")+((/(?:^| )meta\.tag(?=\.| |$)|(?:^| )declaration\.tag(?=\.| |$)/.test(scope) && " t30") || "")+((/(?:^| )entity\.name\.tag(?=\.| |$)/.test(scope) && " t31") || "")+((/(?:^| )entity\.other\.attribute(?=\.| |$)/.test(scope) && " t32") || "")+((/(?:^| )markup\.heading(?=\.| |$)/.test(scope) && " t33") || "")+((/(?:^| )markup\.quote(?=\.| |$)/.test(scope) && " t34") || "")+((/(?:^| )markup\.list(?=\.| |$)/.test(scope) && " t35") || "")).substring(1); });
+ return {parseLine:parseLine, initialState:"1",
+ getClassesForScope:getClassesForScope};}())
diff --git a/trunk/infrastructure/ace/www/lexer_support.js b/trunk/infrastructure/ace/www/lexer_support.js
new file mode 100644
index 0000000..3d54f5c
--- /dev/null
+++ b/trunk/infrastructure/ace/www/lexer_support.js
@@ -0,0 +1,1068 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/* This file is also a Helma module, referenced by its path! */
+
+AceLexer = (function lexer_init() {
+
+// utility functions, make this file self-contained
+
+function forEach(array, func) {
+ for(var i=0;i<array.length;i++) {
+ var result = func(array[i], i);
+ if (result) break;
+ }
+}
+
+function map(array, func) {
+ var result = [];
+ // must remain compatible with "arguments" pseudo-array
+ for(var i=0;i<array.length;i++) {
+ if (func) result.push(func(array[i], i));
+ else result.push(array[i]);
+ }
+ return result;
+}
+
+function filter(array, func) {
+ var result = [];
+ // must remain compatible with "arguments" pseudo-array
+ for(var i=0;i<array.length;i++) {
+ if (func(array[i], i)) result.push(array[i]);
+ }
+ return result;
+}
+
+function isArray(testObject) {
+ return testObject && typeof testObject === 'object' &&
+ !(testObject.propertyIsEnumerable('length')) &&
+ typeof testObject.length === 'number';
+}
+
+// these three lines inspired by Steven Levithan's XRegExp
+var singleLineRegex = /(?:[^[\\.]+|\\(?:[\S\s]|$)|\[\^?]?(?:[^\\\]]+|\\(?:[\S\s]|$))*]?)+|\./g;
+var backReferenceRegex = /(?:[^\\[]+|\\(?:[^0-9]|$)|\[\^?]?(?:[^\\\]]+|\\(?:[\S\s]|$))*]?)+|\\([0-9]+)/g;
+var parenFindingRegex = /(?:[^[(\\]+|\\(?:[\S\s]|$)|\[\^?]?(?:[^\\\]]+|\\(?:[\S\s]|$))*]?|\((?=\?))+|(\()/g;
+
+// Creates a function that, when called with (string, startIndex), finds the first of the patterns that
+// matches the string starting at startIndex (and anchored there). Expects startIndex < string.length.
+// The function returns a structure containing "whichCase", a number 0..(patterns.length-1) giving the
+// index of the pattern that matched, or -1 if no pattern did, and "result", an array of the kind
+// returned by RegExp.exec called on that pattern, or the array that would be returned by matching /[\S\s]/
+// (any single character) if no other pattern matched. Supports the flags 'i', 'm', and 's', where the
+// effect of 's' is to make dots match all characters, including newlines.
+// Patterns in general are not allowed to match zero-width strings, but a pattern that is specified
+// as a regular expression literal with the 'm' flag is considered special, and may be zero-width,
+// though as a consequence the match cannot include the final newline of the document. (Other flags
+// on regular expression literals are ignored; use the "flags" argument instead.)
+function makeRegexSwitch(patterns, flags) {
+ var numPatterns = patterns.length;
+ var patternStrings = map(patterns, function (p) {
+ if ((typeof p) == "string")
+ return p; // a string
+ else return p.source; // assume it's a regex
+ });
+ var patternZeros = map(patterns, function (p) {
+ // using "multiline" is a special way to indicate the reg-ex is zero-width
+ return ((typeof p) != "string") && p.multiline;
+ });
+ patternStrings.push("[\\S\\s]"); // default case
+ patternZeros.push(false);
+ // how many capturing groups each pattern has
+ var numGroups = map(patternStrings, function (p) {
+ var count = 0;
+ p.replace(parenFindingRegex, function (full,paren,offset) { if (paren) count++; });
+ return count;
+ });
+ // the group number for each case of the switch
+ var caseGroupNums = [];
+ var idx = 1;
+ forEach(numGroups, function (n) { caseGroupNums.push(idx); idx += n+1; });
+ // make a big alternation of capturing groups
+ var alternation = map(patternStrings, function(p, pi) {
+ // correct the back-reference numbers
+ p = p.replace(backReferenceRegex, function (full, num) {
+ if (num) return "\\"+((+num)+caseGroupNums[pi]);
+ else return full;
+ });
+ var extra = (patternZeros[pi] ? "[\\S\\s]": ""); // tack on another char for zero-widths
+ return '('+p+extra+')';
+ }).join('|');
+ // process regex flags
+ flags = (flags || "");
+ var realFlags = "g";
+ for(var i=0;i<flags.length;i++) {
+ var f = flags.charAt(i);
+ if (f == "i" || f == "m") realFlags += f;
+ else if (f == "s") {
+ alternation = alternation.replace(singleLineRegex,
+ function (x) { return x==='.' ? "[\\S\\s]" : x; });
+ }
+ }
+ //console.log(alternation);
+ var bigRegex = new RegExp(alternation, realFlags);
+ return function (string, matchIndex) {
+ bigRegex.lastIndex = matchIndex;
+ var execResult = bigRegex.exec(string);
+ var whichCase;
+ var resultArray = [];
+ // search linearly for which case matched in the alternation
+ for(var i=0;i<=numPatterns;i++) {
+ var groupNum = caseGroupNums[i];
+ if (execResult[groupNum]) {
+ whichCase = i;
+ for(var j=0;j<=numGroups[i];j++) {
+ var r = execResult[groupNum+j];
+ if (patternZeros[i] && j==0) {
+ r = r.substring(0, r.length-1);
+ }
+ resultArray[j] = r;
+ }
+ break;
+ }
+ }
+ if (whichCase == numPatterns)
+ whichCase = -1; // default case
+ return {whichCase: whichCase, result: resultArray};
+ }
+}
+
+
+var tokenClasses = {
+ 'Token': '',
+
+ 'Text': '',
+ 'TEST': 'test',
+ 'Whitespace': 'w',
+ 'Error': 'err',
+ 'Other': 'x',
+ 'Dirty': 'dirty',
+
+ 'Keyword': 'k',
+ 'Keyword.Constant': 'kc',
+ 'Keyword.Declaration': 'kd',
+ 'Keyword.Pseudo': 'kp',
+ 'Keyword.Reserved': 'kr',
+ 'Keyword.Type': 'kt',
+
+ 'Name': 'n',
+ 'Name.Attribute': 'na',
+ 'Name.Builtin': 'nb',
+ 'Name.Builtin.Pseudo': 'bp',
+ 'Name.Class': 'nc',
+ 'Name.Constant': 'no',
+ 'Name.Decorator': 'nd',
+ 'Name.Entity': 'ni',
+ 'Name.Exception': 'ne',
+ 'Name.Function': 'nf',
+ 'Name.Property': 'py',
+ 'Name.Label': 'nl',
+ 'Name.Namespace': 'nn',
+ 'Name.Other': 'nx',
+ 'Name.Tag': 'nt',
+ 'Name.Variable': 'nv',
+ 'Name.Variable.Class': 'vc',
+ 'Name.Variable.Global': 'vg',
+ 'Name.Variable.Instance': 'vi',
+
+ 'Literal': 'l',
+ 'Literal.Date': 'ld',
+
+ 'String': 's',
+ 'String.Backtick': 'sb',
+ 'String.Char': 'sc',
+ 'String.Doc': 'sd',
+ 'String.Double': 's2',
+ 'String.Escape': 'se',
+ 'String.Heredoc': 'sh',
+ 'String.Interpol': 'si',
+ 'String.Other': 'sx',
+ 'String.Regex': 'sr',
+ 'String.Single': 's1',
+ 'String.Symbol': 'ss',
+
+ 'Number': 'm',
+ 'Number.Float': 'mf',
+ 'Number.Hex': 'mh',
+ 'Number.Integer': 'mi',
+ 'Number.Integer.Long': 'il',
+ 'Number.Oct': 'mo',
+
+ 'Operator': 'o',
+ 'Operator.Word': 'ow',
+
+ 'Punctuation': 'p',
+
+ 'Comment': 'c',
+ 'Comment.Multiline': 'cm',
+ 'Comment.Preproc': 'cp',
+ 'Comment.Single': 'c1',
+ 'Comment.Special': 'cs',
+
+ 'Generic': 'g',
+ 'Generic.Deleted': 'gd',
+ 'Generic.Emph': 'ge',
+ 'Generic.Error': 'gr',
+ 'Generic.Heading': 'gh',
+ 'Generic.Inserted': 'gi',
+ 'Generic.Output': 'go',
+ 'Generic.Prompt': 'gp',
+ 'Generic.Strong': 'gs',
+ 'Generic.Subheading': 'gu',
+ 'Generic.Traceback': 'gt'
+}
+
+
+function makeTokenProducer(regexData, flags) {
+ var data = {};
+ var procCasesMap = {};
+
+ // topological sort of state dependencies
+ var statesToProcess = [];
+ var sortedStates = [];
+ var sortedStatesMap = {};
+ for(var state in regexData) statesToProcess.push(state);
+ while (statesToProcess.length > 0) {
+ var state = statesToProcess.shift();
+ var stateReady = true;
+ forEach(regexData[state], function (c) {
+ if ((typeof c) == "object" && c.include) {
+ var otherState = c.include;
+ if (/!$/.exec(otherState)) {
+ otherState = otherState.substring(0, otherState.length-1);
+ }
+ if (! sortedStatesMap[otherState]) {
+ stateReady = false;
+ return true;
+ }
+ }
+ });
+ if (stateReady) {
+ sortedStates.push(state);
+ sortedStatesMap[state] = true;
+ }
+ else {
+ // move to end of queue
+ statesToProcess.push(state);
+ }
+ }
+
+ forEach(sortedStates, function(state) {
+ var cases = regexData[state];
+ var procCases = [];
+ forEach(cases, function (c) {
+ if ((typeof c) == "object" && c.include) {
+ var otherState = c.include;
+ var isBang = false;
+ if (/!$/.exec(otherState)) {
+ // "bang" include, returns to other state
+ otherState = otherState.substring(0, otherState.length-1);
+ isBang = true;
+ }
+ forEach(procCasesMap[otherState], function (d) {
+ var dd = [d[0], d[1], d[2]];
+ if (isBang) {
+ if (! (d[2] && d[2][0] && d[2][0].indexOf('#pop') != 0)) {
+ dd[2] = ['#pop', otherState].concat(d[2] || []);
+ }
+ }
+ procCases.push(dd);
+ });
+ }
+ else procCases.push(c);
+ });
+ procCasesMap[state] = procCases;
+ data[state] = {
+ switcher: makeRegexSwitch(map(procCases, function(x) { return x[0]; }), flags),
+ tokenTypes: map(procCases, function(x) { return x[1]; }),
+ stateEffects: map(procCases, function(y) {
+ var x = y[2];
+ if (!x) return [];
+ if (isArray(x)) return x;
+ return [x];
+ })
+ }
+ });
+
+ // mutates stateStack, calls tokenFunc on each new token in order, returns new index
+ return function(string, startIndex, stateStack, tokenFunc) {
+ var stateBefore = stateStack.join('/');
+
+ while (true) { // loop until non-zero-length token
+ var stateData = data[stateStack[stateStack.length-1]];
+ var switcherResult = stateData.switcher(string, startIndex);
+ var whichCase = switcherResult.whichCase;
+ var regexResult = switcherResult.result;
+ var tokenTypes, stateEffects;
+ if (whichCase < 0) {
+ tokenTypes = 'Error';
+ stateEffects = null;
+ }
+ else {
+ tokenTypes = stateData.tokenTypes[whichCase];
+ stateEffects = stateData.stateEffects[whichCase];
+ }
+
+ if (stateEffects) {
+ forEach(stateEffects, function (se) {
+ if (se === '#pop') stateStack.pop();
+ else if (se === '#popall') {
+ while (stateStack.length > 0) stateStack.pop();
+ }
+ else stateStack.push(se);
+ });
+ }
+ var stateAfter = stateStack.join('/');
+
+ if (regexResult[0].length > 0) {
+ if ((typeof tokenTypes) === "object" && tokenTypes.bygroups) {
+ var types = tokenTypes.bygroups;
+ forEach(types, function (t,i) {
+ var tkn = { width:regexResult[i+1].length, type:t };
+ if (i == 0) tkn.stateBefore = stateBefore;
+ if (i == (types.length-1)) tkn.stateAfter = stateAfter;
+ tokenFunc(tkn);
+ });
+ }
+ else {
+ tokenFunc({ width:regexResult[0].length, type:tokenTypes,
+ stateBefore:stateBefore, stateAfter:stateAfter });
+ }
+ return startIndex + regexResult[0].length;
+ }
+ }
+ }
+}
+
+function makeSimpleLexer(tokenProducer) {
+ function lexString(str, tokenFunc) {
+ var state = ['root'];
+ var idx = 0;
+ while (idx < str.length) {
+ var i = idx;
+ idx = tokenProducer(str, idx, state, function (tkn) {
+ tokenFunc(str.substr(i, tkn.width), tkn.type);
+ i += tkn.width;
+ });
+ }
+ }
+ function lexAsLines(str, tokenFunc, newLineFunc) {
+ str += "\n";
+ var nextNewline = str.indexOf('\n');
+ var curIndex = 0;
+
+ lexString(str, function(txt, typ) {
+ var wid = txt.length;
+ var widthLeft = wid;
+ while (widthLeft > 0 && curIndex + wid > nextNewline) {
+ var w = nextNewline - curIndex;
+ if (w > 0) {
+ tokenFunc(str.substr(curIndex, w), typ);
+ }
+ curIndex += (w+1);
+ widthLeft -= (w+1);
+ if (curIndex < str.length) {
+ newLineFunc();
+ nextNewline = str.indexOf("\n", curIndex);
+ }
+ }
+ if (widthLeft > 0) {
+ tokenFunc(str.substr(curIndex, widthLeft), typ);
+ curIndex += widthLeft;
+ }
+ });
+ }
+ return {lexString:lexString, lexAsLines:lexAsLines};
+}
+
+var txtTokenProducer = makeTokenProducer(
+ {
+ 'root': [
+ [/.*?\n/, 'Text'],
+ [/.+/, 'Text']
+ ]
+ }, 's');
+
+var jsTokenProducer = makeTokenProducer(
+ {
+ 'root': [
+ [/\/\*[^\w\n]+appjet:version[^\w\n]+[0-9.]+[^\w\n]+\*\/[^\w\n]*(?=\n)/,
+ 'Comment.Special', 'main'],
+ [/(?:)/m, 'Text', ['main', 'regex-ready', 'linestart']]
+ ],
+ 'whitespace' : [
+ [/\n/, 'Text', 'linestart'],
+ [/[^\S\n]+/, 'Text'],
+ [/\/\*/, 'Comment', 'longcomment']
+ ],
+ 'common' : [
+ {include:'whitespace'},
+ [/\"/, 'String.Double', 'dstr'],
+ [/\'/, 'String.Single', 'sstr']
+ ],
+ 'regex-ready' : [
+ {include:'whitespace'},
+ [/\/(?:[^[\\\n\/]|\\.|\[\^?]?(?:[^\\\]\n]|\\.)+\]?)+\/[gim]*/, 'String.Regex'],
+ [/(?:)/m, 'Text', '#pop']
+ ],
+ 'main': [
+ [/\"\"\"/, 'String.Doc', 'mstr'],
+ {include:"common"},
+ [/<!--/, 'Comment'],
+ [/\/\/.*?(?=\n)/, 'Comment'],
+ [/[\{\}\[\]\(;]/, 'Punctuation', 'regex-ready'],
+ [/[\).]/, 'Punctuation'],
+ [/[~\^\*!%&<>\|=:,\/?\\]/, 'Operator', 'regex-ready'],
+ [/[+-]/, 'Operator'],
+ ['(import|break|case|catch|const|continue|default|delete|do|else|'+
+ 'export|for|function|if|in|instanceof|label|new|return|switch|this|'+
+ 'throw|try|typeof|var|void|while|with|abstract|boolean|byte|catch|char|'+
+ 'class|const|debugger|double|enum|extends|final|finally|float|goto|implements|'+
+ 'int|interface|long|native|package|private|protected|public|short|static|super|'+
+ 'synchronized|throws|transient|volatile|let|yield)\\b', 'Keyword'],
+ [/(true|false|null|NaN|Infinity|undefined)\b/, 'Keyword.Constant'],
+ [/[$a-zA-Z_][a-zA-Z0-9_]*/, 'Name.Other'],
+ [/[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, 'Number.Float'],
+ [/0x[0-9a-f]+/, 'Number.Hex'],
+ [/[0-9]+/, 'Number.Integer']
+ ],
+ 'csscommon': [ // common outside of style rule brackets
+ {include:'common'},
+ [/\{/, 'Punctuation', 'csscontent'],
+ [/\:[a-zA-Z0-9_-]+/, 'Name.Decorator'],
+ [/\.[a-zA-Z0-9_-]+/, 'Name.Class'],
+ [/\#[a-zA-Z0-9_-]+/, 'Name.Function'],
+ [/[a-zA-Z0-9_-]+/, 'Name.Tag'],
+ [/[~\^\*!%&\[\]\(\)<>\|+=@:;,.\/?-]/, 'Operator']
+ ],
+ 'cssmain': [
+ [/(@media)([^\S\n]+)(\w+)([^\S\n]*)(\{)/, {bygroups:['Keyword', 'Text', 'String',
+ 'Text', 'Punctuation']}, 'cssmedia'],
+ {include:'csscommon'}
+ ],
+ 'cssmedia': [
+ {include:'csscommon'},
+ [/\}/, 'Punctuation', '#pop']
+ ],
+ 'csscontent': [
+ {include:'common'},
+ [/\}/, 'Punctuation', '#pop'],
+ [/url\(.*?\)/, 'String.Other'],
+ ['(azimuth|background-attachment|background-color|'+
+ 'background-image|background-position|background-repeat|'+
+ 'background|border-bottom-color|border-bottom-style|'+
+ 'border-bottom-width|border-left-color|border-left-style|'+
+ 'border-left-width|border-right|border-right-color|'+
+ 'border-right-style|border-right-width|border-top-color|'+
+ 'border-top-style|border-top-width|border-bottom|'+
+ 'border-collapse|border-left|border-width|border-color|'+
+ 'border-spacing|border-style|border-top|border|caption-side|'+
+ 'clear|clip|color|content|counter-increment|counter-reset|'+
+ 'cue-after|cue-before|cue|cursor|direction|display|'+
+ 'elevation|empty-cells|float|font-family|font-size|'+
+ 'font-size-adjust|font-stretch|font-style|font-variant|'+
+ 'font-weight|font|height|letter-spacing|line-height|'+
+ 'list-style-type|list-style-image|list-style-position|'+
+ 'list-style|margin-bottom|margin-left|margin-right|'+
+ 'margin-top|margin|marker-offset|marks|max-height|max-width|'+
+ 'min-height|min-width|opacity|orphans|outline|outline-color|'+
+ 'outline-style|outline-width|overflow|padding-bottom|'+
+ 'padding-left|padding-right|padding-top|padding|page|'+
+ 'page-break-after|page-break-before|page-break-inside|'+
+ 'pause-after|pause-before|pause|pitch|pitch-range|'+
+ 'play-during|position|quotes|richness|right|size|'+
+ 'speak-header|speak-numeral|speak-punctuation|speak|'+
+ 'speech-rate|stress|table-layout|text-align|text-decoration|'+
+ 'text-indent|text-shadow|text-transform|top|unicode-bidi|'+
+ 'vertical-align|visibility|voice-family|volume|white-space|'+
+ 'widows|width|word-spacing|z-index|bottom|left|'+
+ 'above|absolute|always|armenian|aural|auto|avoid|baseline|'+
+ 'behind|below|bidi-override|blink|block|bold|bolder|both|'+
+ 'capitalize|center-left|center-right|center|circle|'+
+ 'cjk-ideographic|close-quote|collapse|condensed|continuous|'+
+ 'crop|crosshair|cross|cursive|dashed|decimal-leading-zero|'+
+ 'decimal|default|digits|disc|dotted|double|e-resize|embed|'+
+ 'extra-condensed|extra-expanded|expanded|fantasy|far-left|'+
+ 'far-right|faster|fast|fixed|georgian|groove|hebrew|help|'+
+ 'hidden|hide|higher|high|hiragana-iroha|hiragana|icon|'+
+ 'inherit|inline-table|inline|inset|inside|invert|italic|'+
+ 'justify|katakana-iroha|katakana|landscape|larger|large|'+
+ 'left-side|leftwards|level|lighter|line-through|list-item|'+
+ 'loud|lower-alpha|lower-greek|lower-roman|lowercase|ltr|'+
+ 'lower|low|medium|message-box|middle|mix|monospace|'+
+ 'n-resize|narrower|ne-resize|no-close-quote|no-open-quote|'+
+ 'no-repeat|none|normal|nowrap|nw-resize|oblique|once|'+
+ 'open-quote|outset|outside|overline|pointer|portrait|px|'+
+ 'relative|repeat-x|repeat-y|repeat|rgb|ridge|right-side|'+
+ 'rightwards|s-resize|sans-serif|scroll|se-resize|'+
+ 'semi-condensed|semi-expanded|separate|serif|show|silent|'+
+ 'slow|slower|small-caps|small-caption|smaller|soft|solid|'+
+ 'spell-out|square|static|status-bar|super|sw-resize|'+
+ 'table-caption|table-cell|table-column|table-column-group|'+
+ 'table-footer-group|table-header-group|table-row|'+
+ 'table-row-group|text|text-bottom|text-top|thick|thin|'+
+ 'transparent|ultra-condensed|ultra-expanded|underline|'+
+ 'upper-alpha|upper-latin|upper-roman|uppercase|url|'+
+ 'visible|w-resize|wait|wider|x-fast|x-high|x-large|x-loud|'+
+ 'x-low|x-small|x-soft|xx-large|xx-small|yes)\\b', 'Keyword'],
+ ['(indigo|gold|firebrick|indianred|yellow|darkolivegreen|'+
+ 'darkseagreen|mediumvioletred|mediumorchid|chartreuse|'+
+ 'mediumslateblue|black|springgreen|crimson|lightsalmon|brown|'+
+ 'turquoise|olivedrab|cyan|silver|skyblue|gray|darkturquoise|'+
+ 'goldenrod|darkgreen|darkviolet|darkgray|lightpink|teal|'+
+ 'darkmagenta|lightgoldenrodyellow|lavender|yellowgreen|thistle|'+
+ 'violet|navy|orchid|blue|ghostwhite|honeydew|cornflowerblue|'+
+ 'darkblue|darkkhaki|mediumpurple|cornsilk|red|bisque|slategray|'+
+ 'darkcyan|khaki|wheat|deepskyblue|darkred|steelblue|aliceblue|'+
+ 'gainsboro|mediumturquoise|floralwhite|coral|purple|lightgrey|'+
+ 'lightcyan|darksalmon|beige|azure|lightsteelblue|oldlace|'+
+ 'greenyellow|royalblue|lightseagreen|mistyrose|sienna|'+
+ 'lightcoral|orangered|navajowhite|lime|palegreen|burlywood|'+
+ 'seashell|mediumspringgreen|fuchsia|papayawhip|blanchedalmond|'+
+ 'peru|aquamarine|white|darkslategray|ivory|dodgerblue|'+
+ 'lemonchiffon|chocolate|orange|forestgreen|slateblue|olive|'+
+ 'mintcream|antiquewhite|darkorange|cadetblue|moccasin|'+
+ 'limegreen|saddlebrown|darkslateblue|lightskyblue|deeppink|'+
+ 'plum|aqua|darkgoldenrod|maroon|sandybrown|magenta|tan|'+
+ 'rosybrown|pink|lightblue|palevioletred|mediumseagreen|'+
+ 'dimgray|powderblue|seagreen|snow|mediumblue|midnightblue|'+
+ 'paleturquoise|palegoldenrod|whitesmoke|darkorchid|salmon|'+
+ 'lightslategray|lawngreen|lightgreen|tomato|hotpink|'+
+ 'lightyellow|lavenderblush|linen|mediumaquamarine|green|'+
+ 'blueviolet|peachpuff)\\b', 'Name.Builtin'],
+ [/\!important/, 'Comment.Preproc'],
+ [/\#[a-zA-Z0-9]{1,6}/, 'Number'],
+ [/[\.-]?[0-9]*[\.]?[0-9]+(em|px|\%|pt|pc|in|mm|cm|ex)/, 'Number'],
+ [/-?[0-9]+/, 'Number'],
+ [/[~\^\*!%&<>\|+=@:,.\/?-]+/, 'Operator'],
+ [/[\[\]();]+/, 'Punctuation'],
+ [/[a-zA-Z][a-zA-Z0-9]+/, 'Name']
+ ],
+ 'linestart': [
+ [/\/\*[^\w\n]+appjet:css[^\w\n]+\*\/[^\w\n]*(?=\n)/, 'Comment.Special',
+ ['#popall', 'root', 'cssmain']],
+ [/\/\*[^\w\n]+appjet:(\w+)[^\w\n]+\*\/[^\w\n]*(?=\n)/, 'Comment.Special',
+ ['#popall', 'root', 'main', 'regex-ready']],
+ [/(?:)/m, 'Text', '#pop']
+ ],
+ 'dstr': [
+ [/\"/, 'String.Double', '#pop'],
+ [/(?=\n)/m, 'String.Double', '#pop'],
+ [/(\\\\|\\\"|[^\"\n])+/, 'String.Double']
+ ],
+ 'sstr': [
+ [/\'/, 'String.Single', '#pop'],
+ [/(?=\n)/m, 'String.Single', '#pop'],
+ [/(\\\\|\\\'|[^\'\n])+/, 'String.Single']
+ ],
+ 'longcomment': [
+ [/\*\//, 'Comment', '#pop'],
+ [/\n/, 'Comment'],
+ [/.+?(?:\n|(?=\*\/))/, 'Comment']
+ ],
+ 'mstr': [
+ [/(\\\"\"\"|\n)/, 'String.Doc'],
+ [/\"\"\"/, 'String.Doc', '#pop'],
+ [/.+?(?=\\"""|"""|\n)/, 'String.Doc']
+ ]
+ }
+);
+
+function escapeHTML(s) {
+ var re = /[&<>\'\" ]/g;
+ if (! re.MAP) {
+ // persisted across function calls!
+ re.MAP = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&#34;',
+ "'": '&#39;',
+ ' ': '&#160;'
+ };
+ }
+ return s.replace(re, function(c) { return re.MAP[c]; });
+}
+
+var simpleLexer = makeSimpleLexer(jsTokenProducer);
+
+function codeStringToHTML(codeString) {
+ var atLineStart = true;
+ var html = [];
+ function tokenFunc(txt, type) {
+ var cls = tokenClasses[type];
+ if (cls) html.push('<tt class="',tokenClasses[type],'">');
+ else html.push('<tt>');
+ html.push(escapeHTML(txt),'</tt>');
+ atLineStart = false;
+ }
+ function newLineFunc() {
+ html.push('<br/>\n');
+ atLineStart = true;
+ }
+ simpleLexer.lexAsLines(codeString, tokenFunc, newLineFunc);
+ if (atLineStart) html.push('<br/>\n');
+ return html.join('');
+}
+
+/* ========== Incremental Lexer for ACE ========== */
+
+function makeIncrementalLexer(tokenProducer) {
+
+ var tokens = newSkipList();
+ var buffer = "";
+ var nextId = 1;
+ var dirtyTokenKeys = [];
+ var uncoloredRanges = [];
+
+ //top.dbg_uncoloredRanges = function() { return uncoloredRanges; }
+ //top.dbg_dirtyTokenKeys = function() { return dirtyTokenKeys; }
+
+ function mergeRangesIfTouching(a, b) {
+ // if a = [a0,a1] and b = [b0,b1] are overlapping or touching, return a single merged range
+ // else return null
+ var a0 = a[0], a1 = a[1], b0 = b[0], b1 = b[1];
+ if (a1 < b0) return null;
+ if (b1 < a0) return null;
+ var c0 = ((a0 < b0) ? a0 : b0);
+ var c1 = ((a1 > b1) ? a1 : b1);
+ return [c0,c1];
+ }
+
+ function addUncoloredRange(rng) {
+ // shouldn't this merge existing ranges if the new range overlaps multiple ones?
+ var done = false;
+ forEach(uncoloredRanges, function (x, i) {
+ var merged = mergeRangesIfTouching(x, rng);
+ if (merged) {
+ uncoloredRanges[i] = merged;
+ done = true;
+ return true;
+ }
+ });
+ if (! done) {
+ uncoloredRanges.push(rng);
+ }
+ }
+
+ function removeUncoloredRange(rng) {
+ var i = uncoloredRanges.length-1;
+ while (i >= 0) {
+ removeUncoloredRangeFrom(rng, i);
+ i--;
+ }
+ }
+
+ function removeUncoloredRangeFrom(rangeToRemove, containingRangeIndex) {
+ var idx = containingRangeIndex;
+ var cont = uncoloredRanges[idx];
+ var rem0 = rangeToRemove[0], rem1 = rangeToRemove[1];
+ // limit to containing range
+ if (rem0 < cont[0]) rem0 = cont[0];
+ if (rem1 > cont[1]) rem1 = cont[1];
+ if (rem1 <= rem0) return;
+ // splice out uncoloredRanes[containingRangeIndex] for 0, 1, or 2 ranges
+ uncoloredRanges.splice(idx, 1);
+ if (cont[0] < rem0)
+ uncoloredRanges.splice(idx, 0, [cont[0], rem0]);
+ if (rem1 < cont[1])
+ uncoloredRanges.splice(idx, 0, [rem1, cont[1]]);
+ }
+
+ function prepareTokens(tokenArray) {
+ forEach(tokenArray, function (t) {
+ t.key = "$"+(nextId++);
+ });
+ return tokenArray;
+ }
+
+ function roundBackToTokenBoundary(charOffset) {
+ return tokens.indexOfOffset(charOffset);
+ }
+ function roundForwardToTokenBoundary(charOffset) {
+ var tokenEnd;
+ if (charOffset == tokens.totalWidth())
+ tokenEnd = tokens.length();
+ else {
+ var endToken = tokens.keyAtOffset(charOffset);
+ tokenEnd = tokens.indexOfKey(endToken);
+ // round up to nearest token boundary
+ if (charOffset > tokens.offsetOfKey(endToken)) {
+ tokenEnd++;
+ }
+ }
+ return tokenEnd;
+ }
+
+ // findLexingStartPoint and findLexingEndPoint take a character boundary
+ // (0 .. buffer.length) and return a token boundary (0 .. tokens.length())
+ // that, if not at the document edge, is such that the next token outside
+ // the boundary has a pre/post lexing state associated with it (i.e is not
+ // a dirty-region token or in the middle of a multi-token lexing rule).
+
+ function findLexingStartPoint(startChar) {
+ if (tokens.length() == 0) return 0;
+ var tokenStart = roundBackToTokenBoundary(startChar);
+ // expand to not break up a series of tokens from the same
+ // lexing rule, and to include dirty regions
+ if (tokenStart > 0) {
+ var tokenBefore = tokens.atIndex(tokenStart - 1);
+ while (tokenBefore && (! tokenBefore.stateAfter)) {
+ tokenStart--;
+ tokenBefore = tokens.prev(tokenBefore);
+ }
+ }
+ return tokenStart;
+ }
+
+ function findLexingEndPoint(endChar) {
+ if (tokens.length() == 0) return 0;
+ var tokenEnd = roundForwardToTokenBoundary(endChar);
+ // expand to not break up a series of tokens from the same
+ // lexing rule, and to include dirty regions
+ if (tokenEnd < tokens.length()) {
+ var tokenAfter = tokens.atIndex(tokenEnd);
+ while (tokenAfter && (! tokenAfter.stateBefore)) {
+ tokenEnd++;
+ tokenAfter = tokens.next(tokenAfter);
+ }
+ }
+ return tokenEnd;
+ }
+
+ function updateBuffer(newBuffer, spliceStart, charsRemoved, charsAdded) {
+ buffer = newBuffer;
+
+ // back up to new line
+ if (spliceStart > 0) {
+ var newStart = buffer.lastIndexOf('\n', spliceStart-1) + 1;
+ var charsBack = spliceStart - newStart;
+ spliceStart -= charsBack;
+ charsRemoved += charsBack;
+ charsAdded += charsBack;
+ }
+ // expand to lexing points
+ var tokenRangeStart = findLexingStartPoint(spliceStart);
+ var tokenRangeEnd = findLexingEndPoint(spliceStart + charsRemoved);
+
+ var dirtyWidth = 0;
+ // make sure to mark at least one token dirty so that deletions correctly cause
+ // rehighlighting; in practice doesn't come up often except when an entire line
+ // is cleanly deleted, like deleting a blank line (which doesn't usually affect highlighting)
+ while (dirtyWidth == 0) {
+ var curStart = tokens.offsetOfIndex(tokenRangeStart);
+ var curEnd = tokens.offsetOfIndex(tokenRangeEnd);
+ dirtyWidth = (curEnd - curStart) + (charsAdded - charsRemoved);
+ if (dirtyWidth == 0) {
+ if (curEnd >= tokens.totalWidth()) break;
+ tokenRangeEnd = findLexingEndPoint(curEnd+1);
+ }
+ }
+
+ var dirtyTokens = []; // 0 or 1 of them
+ if (dirtyWidth > 0) {
+ dirtyTokens.push({ width: dirtyWidth, type: 'Dirty' });
+ }
+
+ //console.log("%d, %d, %d, %d", charsRemoved, charsAdded,
+ //(curEnd - curStart), dirtyWidth);
+
+ tokens.splice(tokenRangeStart, tokenRangeEnd - tokenRangeStart,
+ prepareTokens(dirtyTokens));
+
+ if (tokens.totalWidth() != buffer.length) {
+ console.error("updateBuffer: Bad total token width: "+
+ tokens.totalWidth()+" not "+buffer.length);
+ }
+
+ forEach(dirtyTokens, function (t) { dirtyTokenKeys.push(t.key); });
+ dirtyTokenKeys = filter(dirtyTokenKeys, function (k) { return tokens.containsKey(k); });
+ //console.log("after update: %s", toSource(tokens.slice()));
+
+ function applySpliceToIndex(i) {
+ if (i <= spliceStart) return i;
+ if (i >= (spliceStart + charsRemoved)) return i + charsAdded - charsRemoved;
+ return spliceStart;
+ }
+ for(var i=uncoloredRanges.length-1; i>=0; i--) {
+ var r = uncoloredRanges[i];
+ r[0] = applySpliceToIndex(r[0]);
+ r[1] = applySpliceToIndex(r[1]);
+ if (r[1] <= r[0]) uncoloredRanges.splice(i, 1);
+ }
+ }
+
+ function processDirtyToken(dirtyToken, isTimeUp, stopAtChar) {
+
+ //console.time("lexing");
+ //var p = PROFILER("lex", false);
+ var stateStack;
+ if (! tokens.prev(dirtyToken)) stateStack = ['root'];
+ else stateStack = tokens.prev(dirtyToken).stateAfter.split('/');
+ var newTokens = [];
+ var dirtyTokenIndex = tokens.indexOfEntry(dirtyToken);
+ var tokenCount = 0;
+ var startTime = (new Date()).getTime();
+ var stopBasedOnChar = (typeof(stopAtChar) == "number");
+ //p.mark("tokenize");
+
+ var curOffset = tokens.offsetOfEntry(dirtyToken);
+ var startedOffset = curOffset;
+ var oldToken = dirtyToken;
+ var oldTokenOffset = curOffset;
+ var done = false;
+
+ while ((! done) && (! isTimeUp()) && (! (stopBasedOnChar && curOffset >= stopAtChar))) {
+ curOffset = tokenProducer(buffer, curOffset, stateStack,
+ function (t) { newTokens.push(t); });
+ while (oldToken && (oldTokenOffset + oldToken.width <= curOffset)) {
+ oldTokenOffset += oldToken.width;
+ oldToken = tokens.next(oldToken);
+ }
+ if (curOffset == tokens.totalWidth()) {
+ // hit the end
+ done = true;
+ }
+ else if (oldTokenOffset == curOffset) {
+ // at a token boundary, the beginning of oldTokenOffset
+ if (stateStack.join('/') === oldToken.stateBefore) {
+ // state matches up, we can stop
+ done = true;
+ }
+ }
+ }
+
+ var endedOffset = curOffset;
+ var dist = endedOffset - startedOffset;
+ var tokensToRemove;
+ var newDirtyToken;
+ if (dist < dirtyToken.width) {
+ tokens.setEntryWidth(dirtyToken, dirtyToken.width - dist);
+ tokensToRemove = 0;
+ newDirtyToken = dirtyToken;
+ }
+ else {
+ var nextLexingPoint = findLexingEndPoint(endedOffset);
+ var lexingPointChar = tokens.offsetOfIndex(nextLexingPoint);
+ if (lexingPointChar == endedOffset && (! done) && endedOffset < tokens.totalWidth()) {
+ // happened to stop at token boundary before end, but not done lexing,
+ // so make next token dirty
+ nextLexingPoint = findLexingEndPoint(endedOffset+1);
+ lexingPointChar = tokens.offsetOfIndex(nextLexingPoint);
+ }
+ var dirtyCharsLeft = lexingPointChar - endedOffset;
+ if (dirtyCharsLeft > 0) {
+ newDirtyToken = { width: dirtyCharsLeft, type: 'Dirty' };
+ newTokens.push(newDirtyToken);
+ }
+ tokensToRemove = nextLexingPoint - dirtyTokenIndex;
+ }
+
+ //p.mark("prepare");
+ prepareTokens(newTokens);
+ //p.mark("remove");
+ tokens.splice(dirtyTokenIndex, tokensToRemove, []);
+ //p.mark("insert");
+ tokens.splice(dirtyTokenIndex, 0, newTokens);
+ if (tokens.totalWidth() != buffer.length)
+ console.error("processDirtyToken: Bad total token width: "+
+ tokens.totalWidth()+" not "+buffer.length);
+ //p.end();
+
+ addUncoloredRange([startedOffset, endedOffset]);
+
+ //console.log("processed chars %d to %d", startedOffset, endedOffset);
+ //console.timeEnd("lexing");
+
+ return (newDirtyToken && newDirtyToken.key);
+ }
+
+ function lexSomeDirty(filter, isTimeUp) {
+ var newDirtyTokenKeys = [];
+
+ forEach(dirtyTokenKeys, function (dirtyKey) {
+ if (! tokens.containsKey(dirtyKey)) return;
+ var dirtyToken = tokens.atKey(dirtyKey);
+ var filterResult;
+ if ((! isTimeUp()) && ((filterResult = filter(dirtyToken)))) {
+ var stopAtChar;
+ if ((typeof filterResult) == "object" && (typeof filterResult.stopAtChar) == "number") {
+ stopAtChar = filterResult.stopAtChar;
+ }
+ var tkn = processDirtyToken(dirtyToken, isTimeUp, filterResult.stopAtChar);
+ if (tkn) newDirtyTokenKeys.push(tkn);
+ }
+ else {
+ // leave the token behind
+ newDirtyTokenKeys.push(dirtyKey);
+ }
+
+ if (tokens.totalWidth() != buffer.length)
+ console.error("Bad total token width: "+tokens.totalWidth()+" not "+buffer.length);
+
+ });
+
+ dirtyTokenKeys = newDirtyTokenKeys;
+ }
+
+ function lexCharRange(charRange, isTimeUp) {
+ //var startTime = (new Date()).getTime();
+ //function isTimeUp() { return ((new Date()).getTime() - startTime) > timeLimit; }
+
+ if (isTimeUp()) return;
+
+ lexSomeDirty(function (dirtyToken) {
+ var start = tokens.offsetOfEntry(dirtyToken);
+ var end = start + dirtyToken.width;
+ if (end <= charRange[0]) return false;
+ if (start >= charRange[1]) return false;
+ //console.log("tokenStart: %d, tokenEnd: %d, visStart: %d, visEnd: %d",
+ //start, end, charRange[0], charRange[1]);
+ var result = {};
+ if (charRange[1] < end) {
+ result.stopAtChar = charRange[1];
+ }
+ return result;
+ }, isTimeUp);
+
+ //if (isTimeUp()) return;
+
+ /*
+ // highlight the visible area
+ var i = uncoloredRanges.length-1;
+ // iterate backwards because we change the array
+ while (i >= 0) {
+ var rng = uncoloredRanges[i];
+ var start = rng[0], end = rng[1];
+ if (start < viewRange[0]) start = viewRange[0];
+ if (end > viewRange[1]) end = viewRange[1];
+ if (end > start) {
+ var charsRecolored = recolorFunc(start, end-start,
+ isTimeUp, getSpansForRange);
+ removeUncoloredSubrange([start, start+charsRecolored], i);
+ }
+ if (isTimeUp()) break;
+ i--;
+ }*/
+ }
+
+ function tokenToString(tkn) {
+ return toSource({width:tkn.width, type:tkn.type, stateBefore:tkn.stateBefore, stateAfter:tkn.stateAfter});
+ }
+
+ // Calls func(startChar, endChar) on each range of characters that needs to be colored
+ // in the DOM, based on calls to getSpansForRange (which removes chars from consideration)
+ // and lexCharRange (which calculates new colors and adds chars for consideration).
+ // There are usually relatively few uncolored ranges, each of which may be many lines,
+ // even the whole document.
+ // func must return true iff any tokens are accessed through getSpansForRange during
+ // the call. func should not do new lexing.
+ function forEachUncoloredRange(func, isTimeUp) {
+ var i = 0;
+ // uncoloredRanges will change during this function!
+ // Terminates is time runs out, whole document is colored,
+ // or the func "passes" on all ranges by returning false.
+ while (i < uncoloredRanges.length && ! isTimeUp()) {
+ var rng = uncoloredRanges[i];
+ var returnVal = func(rng[0], rng[1], isTimeUp);
+ if (returnVal) {
+ // func did something, uncolored ranges may have changed around
+ i = 0;
+ }
+ else {
+ i++;
+ }
+ }
+ }
+
+ // Like forEachUncoloredRange, but "cropped" to the char range given. For example,
+ // if no "uncolored ranges" extend by a non-zero amount into the char range,
+ // func will never be called.
+ function forEachUncoloredSubrange(startChar, endChar, func, isTimeUp) {
+ forEachUncoloredRange(function (s, e, isTimeUp2) {
+ if (s < startChar) s = startChar;
+ if (e > endChar) e = endChar;
+ if (e > s) {
+ return func(s, e, isTimeUp2);
+ }
+ return false;
+ }, isTimeUp);
+ }
+
+ // This function takes note of what it's passed, and assumes that part of the
+ // DOM has been taken care of (unless justPeek).
+ // The "func" takes arguments tokenWidth and tokenClass, and is called on each
+ // token in the range, with the widths adding up to the range size.
+ function getSpansForRange(startChar, endChar, func, justPeek) {
+
+ if (startChar == endChar) return;
+
+ var startToken = tokens.atOffset(startChar);
+ var startTokenStart = tokens.offsetOfEntry(startToken);
+ var curOffset = startChar;
+ var curToken = startToken;
+ while (curOffset < endChar) {
+ var spanEnd;
+ if (curToken === startToken) {
+ spanEnd = startTokenStart + startToken.width;
+ }
+ else {
+ spanEnd = curOffset + curToken.width;
+ }
+ if (spanEnd > endChar) spanEnd = endChar;
+ if (spanEnd > curOffset) {
+ func(spanEnd - curOffset, tokenClasses[curToken.type]);
+ }
+ curOffset = spanEnd;
+ curToken = tokens.next(curToken);
+ }
+
+ if (! justPeek) removeUncoloredRange([startChar, endChar]);
+ }
+
+ function markRangeUncolored(start, end) {
+ addUncoloredRange([start, end]);
+ }
+
+ return {
+ updateBuffer: updateBuffer,
+ lexCharRange: lexCharRange,
+ getSpansForRange: getSpansForRange,
+ forEachUncoloredSubrange: forEachUncoloredSubrange,
+ markRangeUncolored: markRangeUncolored
+ };
+}
+
+/* ========== End Incremental Lexer ========== */
+
+tokenProds = {js: jsTokenProducer, txt: txtTokenProducer};
+
+function getTokenProducer(type) {
+ return tokenProds[type || 'txt'] || tokenProds['txt'];
+}
+
+function getIncrementalLexer(type) {
+ return makeIncrementalLexer(getTokenProducer(type));
+}
+function getSimpleLexer(type) {
+ return makeSimpleLexer(getTokenProducer(type));
+}
+
+return {getIncrementalLexer:getIncrementalLexer, getSimpleLexer:getSimpleLexer,
+ codeStringToHTML:codeStringToHTML};
+
+})();
diff --git a/trunk/infrastructure/ace/www/linestylefilter.js b/trunk/infrastructure/ace/www/linestylefilter.js
new file mode 100644
index 0000000..ef824cc
--- /dev/null
+++ b/trunk/infrastructure/ace/www/linestylefilter.js
@@ -0,0 +1,253 @@
+// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.linestylefilter
+// %APPJET%: import("etherpad.collab.ace.easysync2.Changeset");
+
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// requires: easysync2.Changeset
+
+var linestylefilter = {};
+
+linestylefilter.ATTRIB_CLASSES = {
+ 'bold':'tag:b',
+ 'italic':'tag:i',
+ 'underline':'tag:u',
+ 'strikethrough':'tag:s',
+ 'h1':'tag:h1',
+ 'h2':'tag:h2',
+ 'h3':'tag:h3',
+ 'h4':'tag:h4',
+ 'h5':'tag:h5',
+ 'h6':'tag:h6'
+};
+
+linestylefilter.getAuthorClassName = function(author) {
+ return "author-"+author.replace(/[^a-y0-9]/g, function(c) {
+ if (c == ".") return "-";
+ return 'z'+c.charCodeAt(0)+'z';
+ });
+};
+
+// lineLength is without newline; aline includes newline,
+// but may be falsy if lineLength == 0
+linestylefilter.getLineStyleFilter = function(lineLength, aline,
+ textAndClassFunc, apool) {
+
+ if (lineLength == 0) return textAndClassFunc;
+
+ var nextAfterAuthorColors = textAndClassFunc;
+
+ var authorColorFunc = (function() {
+ var lineEnd = lineLength;
+ var curIndex = 0;
+ var extraClasses;
+ var leftInAuthor;
+
+ function attribsToClasses(attribs) {
+ var classes = '';
+ Changeset.eachAttribNumber(attribs, function(n) {
+ var key = apool.getAttribKey(n);
+ if (key) {
+ var value = apool.getAttribValue(n);
+ if (value) {
+ if (key == 'author') {
+ classes += ' '+linestylefilter.getAuthorClassName(value);
+ }
+ else if (key == 'list') {
+ classes += ' list:'+value;
+ }
+ else if (linestylefilter.ATTRIB_CLASSES[key]) {
+ classes += ' '+linestylefilter.ATTRIB_CLASSES[key];
+ }
+ }
+ }
+ });
+ return classes.substring(1);
+ }
+
+ var attributionIter = Changeset.opIterator(aline);
+ var nextOp, nextOpClasses;
+ function goNextOp() {
+ nextOp = attributionIter.next();
+ nextOpClasses = (nextOp.opcode && attribsToClasses(nextOp.attribs));
+ }
+ goNextOp();
+ function nextClasses() {
+ if (curIndex < lineEnd) {
+ extraClasses = nextOpClasses;
+ leftInAuthor = nextOp.chars;
+ goNextOp();
+ while (nextOp.opcode && nextOpClasses == extraClasses) {
+ leftInAuthor += nextOp.chars;
+ goNextOp();
+ }
+ }
+ }
+ nextClasses();
+
+ return function(txt, cls) {
+ while (txt.length > 0) {
+ if (leftInAuthor <= 0) {
+ // prevent infinite loop if something funny's going on
+ return nextAfterAuthorColors(txt, cls);
+ }
+ var spanSize = txt.length;
+ if (spanSize > leftInAuthor) {
+ spanSize = leftInAuthor;
+ }
+ var curTxt = txt.substring(0, spanSize);
+ txt = txt.substring(spanSize);
+ nextAfterAuthorColors(curTxt, (cls&&cls+" ")+extraClasses);
+ curIndex += spanSize;
+ leftInAuthor -= spanSize;
+ if (leftInAuthor == 0) {
+ nextClasses();
+ }
+ }
+ };
+ })();
+ return authorColorFunc;
+};
+
+linestylefilter.getAtSignSplitterFilter = function(lineText,
+ textAndClassFunc) {
+ var at = /@/g;
+ at.lastIndex = 0;
+ var splitPoints = null;
+ var execResult;
+ while ((execResult = at.exec(lineText))) {
+ if (! splitPoints) {
+ splitPoints = [];
+ }
+ splitPoints.push(execResult.index);
+ }
+
+ if (! splitPoints) return textAndClassFunc;
+
+ return linestylefilter.textAndClassFuncSplitter(textAndClassFunc,
+ splitPoints);
+};
+
+linestylefilter.REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/;
+linestylefilter.REGEX_URLCHAR = new RegExp('('+/[-:@a-zA-Z0-9_.,~%+\/\\?=&#;()$]/.source+'|'+linestylefilter.REGEX_WORDCHAR.source+')');
+linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt):\/\/|mailto:)/.source+linestylefilter.REGEX_URLCHAR.source+'*(?![:.,;])'+linestylefilter.REGEX_URLCHAR.source, 'g');
+
+linestylefilter.getURLFilter = function(lineText, textAndClassFunc) {
+ linestylefilter.REGEX_URL.lastIndex = 0;
+ var urls = null;
+ var splitPoints = null;
+ var execResult;
+ while ((execResult = linestylefilter.REGEX_URL.exec(lineText))) {
+ if (! urls) {
+ urls = [];
+ splitPoints = [];
+ }
+ var startIndex = execResult.index;
+ var url = execResult[0];
+ urls.push([startIndex, url]);
+ splitPoints.push(startIndex, startIndex + url.length);
+ }
+
+ if (! urls) return textAndClassFunc;
+
+ function urlForIndex(idx) {
+ for(var k=0; k<urls.length; k++) {
+ var u = urls[k];
+ if (idx >= u[0] && idx < u[0]+u[1].length) {
+ return u[1];
+ }
+ }
+ return false;
+ }
+
+ var handleUrlsAfterSplit = (function() {
+ var curIndex = 0;
+ return function(txt, cls) {
+ var txtlen = txt.length;
+ var newCls = cls;
+ var url = urlForIndex(curIndex);
+ if (url) {
+ newCls += " url:"+url;
+ }
+ textAndClassFunc(txt, newCls);
+ curIndex += txtlen;
+ };
+ })();
+
+ return linestylefilter.textAndClassFuncSplitter(handleUrlsAfterSplit,
+ splitPoints);
+};
+
+linestylefilter.textAndClassFuncSplitter = function(func, splitPointsOpt) {
+ var nextPointIndex = 0;
+ var idx = 0;
+
+ // don't split at 0
+ while (splitPointsOpt &&
+ nextPointIndex < splitPointsOpt.length &&
+ splitPointsOpt[nextPointIndex] == 0) {
+ nextPointIndex++;
+ }
+
+ function spanHandler(txt, cls) {
+ if ((! splitPointsOpt) || nextPointIndex >= splitPointsOpt.length) {
+ func(txt, cls);
+ idx += txt.length;
+ }
+ else {
+ var splitPoints = splitPointsOpt;
+ var pointLocInSpan = splitPoints[nextPointIndex] - idx;
+ var txtlen = txt.length;
+ if (pointLocInSpan >= txtlen) {
+ func(txt, cls);
+ idx += txt.length;
+ if (pointLocInSpan == txtlen) {
+ nextPointIndex++;
+ }
+ }
+ else {
+ if (pointLocInSpan > 0) {
+ func(txt.substring(0, pointLocInSpan), cls);
+ idx += pointLocInSpan;
+ }
+ nextPointIndex++;
+ // recurse
+ spanHandler(txt.substring(pointLocInSpan), cls);
+ }
+ }
+ }
+ return spanHandler;
+};
+
+// domLineObj is like that returned by domline.createDomLine
+linestylefilter.populateDomLine = function(textLine, aline, apool,
+ domLineObj) {
+ // remove final newline from text if any
+ var text = textLine;
+ if (text.slice(-1) == '\n') {
+ text = text.substring(0, text.length-1);
+ }
+
+ function textAndClassFunc(tokenText, tokenClass) {
+ domLineObj.appendSpan(tokenText, tokenClass);
+ }
+
+ var func = textAndClassFunc;
+ func = linestylefilter.getURLFilter(text, func);
+ func = linestylefilter.getLineStyleFilter(text.length, aline,
+ func, apool);
+ func(text, '');
+};
diff --git a/trunk/infrastructure/ace/www/magicdom.js b/trunk/infrastructure/ace/www/magicdom.js
new file mode 100644
index 0000000..4bad3d4
--- /dev/null
+++ b/trunk/infrastructure/ace/www/magicdom.js
@@ -0,0 +1,293 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+function makeMagicDom(rootDomNode, contentWindow){
+ function nodeToString(node) {
+ if (isNodeText(node)) return '"'+node.nodeValue+'"';
+ else return '&lt;'+node.tagName+'&gt;';
+ }
+
+ var doc = rootDomNode.ownerDocument || rootDomNode.document;
+
+ function childIndex(dnode) {
+ var idx = 0;
+ var n = dnode;
+ while (n.previousSibling) {
+ idx++;
+ n = n.previousSibling;
+ }
+ return idx;
+ }
+
+ function ensureNormalized(dnode) {
+ function mergePair(text1, text2) {
+ var theParent = text1.parentNode;
+ var newTextNode = mdom.doc.createTextNode(text1.nodeValue+""+text2.nodeValue);
+ theParent.insertBefore(newTextNode, text1);
+ theParent.removeChild(text1);
+ theParent.removeChild(text2);
+ return newTextNode;
+ }
+
+ var n = dnode;
+ if (!isNodeText(n)) return;
+ while (n.previousSibling && isNodeText(n.previousSibling)) {
+ n = mergePair(n.previousSibling, n);
+ }
+ while (n.nextSibling && isNodeText(n.nextSibling)) {
+ n = mergePair(n, n.nextSibling);
+ }
+ }
+
+ function nextUniqueId() {
+ // returns new unique identifier string;
+ // not actually checked for uniqueness, but unique
+ // wrt magicdom.
+ // is document-unique to allow document.getElementById even
+ // in theoretical case of multiple magicdoms per doc
+ var doc = mdom.doc;
+ var nextId = (getAssoc(doc, "nextId") || 1);
+ setAssoc(doc, "nextId", nextId+1);
+ return "magicdomid"+nextId;
+ }
+
+ var nodeProto = {
+ parent: function() {
+ return wrapDom(((! this.isRoot) && this.dom.parentNode) || null);
+ },
+ index: function() {
+ return childIndex(this.dom);
+ },
+ equals: function (otherNode) {
+ return otherNode && otherNode.dom && (this.dom == otherNode.dom);
+ },
+ prev: function() {
+ return wrapDom(this.dom.previousSibling || null);
+ },
+ next: function() {
+ return wrapDom(this.dom.nextSibling || null);
+ },
+ remove: function() {
+ if (! this.isRoot) {
+ var dnode = this.dom;
+ var prevSib = dnode.previousSibling;
+ var nextSib = dnode.nextSibling;
+ var normalizeNeeded = (prevSib && isNodeText(prevSib) && nextSib && isNodeText(nextSib));
+ var theParent = dnode.parentNode;
+ theParent.removeChild(dnode);
+ if (normalizeNeeded) {
+ ensureNormalized(prevSib);
+ }
+ }
+ },
+ addNext: function (newNode) {
+ var dnode = this.dom;
+ var nextSib = dnode.nextSibling;
+ if (nextSib) {
+ dnode.parentNode.insertBefore(newNode.dom, nextSib);
+ }
+ else {
+ dnode.parentNode.appendChild(newNode.dom);
+ }
+ if (newNode.isText) ensureNormalized(newNode.dom);
+ },
+ addPrev: function (newNode) {
+ var dnode = this.dom;
+ dnode.parentNode.insertBefore(newNode.dom, dnode);
+ if (newNode.isText) ensureNormalized(newNode.dom);
+ },
+ replaceWith: function (newNodes) { // var-args
+ this.replaceWithArray(arguments);
+ },
+ replaceWithArray: function (newNodes) {
+ var addFunc;
+ if (this.next()) {
+ var next = this.next();
+ addFunc = function (n) { next.addPrev(n); };
+ }
+ else {
+ var parent = this.parent();
+ addFunc = function (n) { parent.appendChild(n); };
+ }
+ // when using "this" functions, have to keep text
+ // nodes from merging inappropriately
+ var tempNode = mdom.newElement("span");
+ this.addNext(tempNode);
+ this.remove();
+ forEach(newNodes, function (n) {
+ addFunc(n);
+ });
+ tempNode.remove();
+ },
+ getProp: function (propName) {
+ return getAssoc(this.dom, propName);
+ },
+ setProp: function (propName, value) {
+ setAssoc(this.dom, propName, value);
+ },
+ // not consistent between browsers in how line-breaks are handled
+ innerText: function() {
+ var dnode = this.dom;
+ if ((typeof dnode.innerText) == "string") return dnode.innerText;
+ if ((typeof dnode.textContent) == "string") return dnode.textContent;
+ if ((typeof dnode.nodeValue) == "string") return dnode.nodeValue;
+ return "";
+ },
+ depth: function() {
+ try { // ZZZ
+ var d = 0;
+ var n = this;
+ while (! n.isRoot) {
+ d++;
+ n = n.parent();
+ }
+ return d;
+ }
+ catch (e) {
+ parent.BAD_NODE = this.dom;
+ throw e;
+ }
+ }
+ };
+
+ var textNodeProto = extend(object(nodeProto), {
+ isText: true,
+ text: function() {
+ return this.dom.nodeValue;
+ },
+ eachChild: function() {},
+ childCount: function() { return 0; },
+ eachDescendant: function() {},
+ // precondition: 0 <= start < end <= length
+ wrapRange: function(start, end, newNode) {
+ var origText = this.text();
+ var text1 = null;
+ if (start > 0) {
+ text1 = mdom.newText(origText.substring(0, start));
+ }
+ var text2 = mdom.newText(origText.substring(start, end));
+ var text3 = null;
+ if (end < origText.length) {
+ text3 = mdom.newText(origText.substring(end, origText.length));
+ }
+ newNode.appendChild(text2);
+ var nodesToUse = []
+ if (text1) nodesToUse.push(text1);
+ nodesToUse.push(newNode);
+ if (text3) nodesToUse.push(text3);
+ this.replaceWithArray(nodesToUse);
+ return [text1, newNode, text3];
+ }
+ });
+
+ var elementNodeProto = extend(object(nodeProto), {
+ isText: false,
+ childCount: function() {
+ return this.dom.childNodes.length;
+ },
+ child: function (i) {
+ return wrapDom(this.dom.childNodes.item(i));
+ },
+ firstChild: function() {
+ return ((this.childCount() > 0) && this.child(0)) || null;
+ },
+ lastChild: function() {
+ return ((this.childCount() > 0) && this.child(this.childCount()-1)) || null;
+ },
+ appendChild: function (newNode) {
+ this.dom.appendChild(newNode.dom);
+ if (newNode.isText) {
+ ensureNormalized(newNode.dom);
+ }
+ },
+ prependChild: function (newNode) {
+ if (this.childCount() > 0) {
+ this.child(0).addPrev(newNode);
+ }
+ else {
+ this.appendChild(newNode);
+ }
+ },
+ eachChild: function (func) {
+ for(var i=0;i<this.childCount();i++) {
+ var result = func(this.child(i), i);
+ if (result) break;
+ }
+ },
+ eachDescendant: function (func) {
+ this.eachChild(function (n) {
+ var result = func(n);
+ if (! result) n.eachDescendant(func);
+ });
+ },
+ dumpContents: function() {
+ var mnode = this, dnode = this.dom;
+ if (mnode.childCount() < 1) {
+ mnode.remove();
+ }
+ else {
+ var theParent = dnode.parentNode;
+ var n;
+ while ((n = dnode.firstChild)) {
+ dnode.removeChild(n);
+ theParent.insertBefore(n, dnode);
+ ensureNormalized(n);
+ }
+ mnode.remove();
+ }
+ },
+ uniqueId: function() {
+ // not actually guaranteed to be unique, e.g. if user copy-pastes
+ // nodes with ids
+ var dnode = this.dom;
+ if (dnode.id) return dnode.id;
+ dnode.id = nextUniqueId();
+ return dnode.id;
+ }
+ });
+
+ function wrapDom(dnode) {
+ if (! dnode) return dnode;
+ var mnode;
+ if (isNodeText(dnode)) {
+ mnode = object(textNodeProto);
+ }
+ else {
+ mnode = object(elementNodeProto);
+ }
+ mnode.isRoot = (dnode == rootDomNode);
+ mnode.dom = dnode;
+ return mnode;
+ }
+
+ var mdom = {};
+ mdom.root = wrapDom(rootDomNode);
+ mdom.doc = doc;
+ mdom.win = contentWindow;
+ mdom.byId = function (id) {
+ return wrapDom(mdom.doc.getElementById(id));
+ }
+ mdom.newText = function (txt) {
+ return wrapDom(mdom.doc.createTextNode(txt));
+ }
+ mdom.newElement = function (tagName) {
+ return wrapDom(mdom.doc.createElement(tagName));
+ }
+ mdom.wrapDom = wrapDom;
+
+ return mdom;
+}
diff --git a/trunk/infrastructure/ace/www/multilang_lexer.js b/trunk/infrastructure/ace/www/multilang_lexer.js
new file mode 100644
index 0000000..9617981
--- /dev/null
+++ b/trunk/infrastructure/ace/www/multilang_lexer.js
@@ -0,0 +1,349 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+AceLexer = (function lexer_init() {
+
+function makeIncrementalLexer(lineParser) {
+
+ var parseLine = lineParser.parseLine;
+ var initialState = lineParser.initialState;
+ var getClassesForScope = lineParser.getClassesForScope;
+
+ var lineData = newSkipList(); // one entry per line
+ var buffer = ""; // full text of document, each line ending with \n
+ var lineStatus = ""; // one char per line in buffer, (d)irty/(u)ncolored/(c)olored
+ var nextLineDataId = 1;
+
+ // "dirty" lines are unparsed lines. Other lines have properties startState,endState.
+ // "uncolored" lines are parsed but the data has not been handled by ACE.
+
+ function roundBackToLineIndex(charOffset) { // charOffset is [0,document length]
+ return lineData.indexOfOffset(charOffset);
+ // result is [0,num lines]
+ }
+
+ function roundForwardToLineIndex(charOffset) { // charOffset is [0,document length]
+ var idx = lineData.indexOfOffset(charOffset);
+ var newCharOffset = lineData.offsetOfIndex(idx);
+ if (newCharOffset < charOffset) {
+ // rounded back, round forward instead
+ return idx + 1;
+ }
+ return idx;
+ // result is [0,num lines]
+ }
+
+ function updateBuffer(newBuffer, spliceStart, charsRemoved, charsAdded) {
+ // newBuffer is string to replace buffer, other args explain the splice
+ // that happened between the old buffer and newBuffer
+
+ // determine range of lines (and character offsets of line boundaries) affected
+ var spliceStartLineIndex = roundBackToLineIndex(spliceStart);
+ var spliceStartCharOffset = lineData.offsetOfIndex(spliceStartLineIndex);
+ var spliceEndLineIndex = roundForwardToLineIndex(spliceStart + charsRemoved);
+ var spliceEndCharOffset = lineData.offsetOfIndex(spliceEndLineIndex);
+
+ var extraBeginChars = spliceStart - spliceStartCharOffset;
+ var extraEndChars = spliceEndCharOffset - (spliceStart + charsRemoved);
+ var newChars = newBuffer.substring(spliceStart - extraBeginChars,
+ spliceStart + charsAdded + extraEndChars);
+
+ var newLineEntries = [];
+ newChars.replace(/[^\n]*\n/g, function(line) {
+ newLineEntries.push({ width: line.length, key: String(nextLineDataId++) });
+ });
+
+ lineData.splice(spliceStartLineIndex, spliceEndLineIndex - spliceStartLineIndex,
+ newLineEntries);
+
+ var newDirtyStatus = "";
+ for(var i=0;i<newLineEntries.length;i++) newDirtyStatus += "d";
+ var extraDirty = 0;
+ if ((! newDirtyStatus) && spliceEndLineIndex < lineStatus.length &&
+ spliceEndLineIndex > spliceStartLineIndex) {
+ // pure deletion of one or more lines, mark the next line after
+ // the deletion as dirty to trigger relexing
+ newDirtyStatus = "d";
+ extraDirty = 1;
+ }
+ lineStatus = lineStatus.substring(0, spliceStartLineIndex) +
+ newDirtyStatus + lineStatus.substring(spliceEndLineIndex + extraDirty);
+
+ buffer = newBuffer;
+ }
+
+ function findBeginningOfDirtyRegion(dirtyLineIndex) {
+ // search backwards for a line that is either the first line
+ // or is preceded by a non-dirty line.
+ var cleanLine = Math.max(lineStatus.lastIndexOf("c", dirtyLineIndex),
+ lineStatus.lastIndexOf("u", dirtyLineIndex));
+ // cleanLine is now either -1 (if all lines are dirty back to beginning of doc)
+ // or the index of a clean line
+ return cleanLine + 1;
+ }
+
+ function findEndOfUncoloredRegion(uncoloredLineIndex) {
+ // search forwards for a line that is not uncolored,
+ // or return number of lines in doc if end of doc is hit.
+ var idx1 = lineStatus.indexOf("c", uncoloredLineIndex);
+ var idx2 = lineStatus.indexOf("d", uncoloredLineIndex);
+ if (idx1 < 0) {
+ if (idx2 < 0) return lineStatus.length;
+ else return idx2;
+ }
+ else {
+ if (idx2 < 0) return idx1;
+ else return Math.min(idx1, idx2);
+ }
+ }
+
+ function getLineText(lineIndex) {
+ var lineEntry = lineData.atIndex(lineIndex);
+ var lineTextStart = lineData.offsetOfIndex(lineIndex);
+ var lineTextEnd = lineTextStart + lineEntry.width;
+ return buffer.substring(lineTextStart, lineTextEnd);
+ }
+
+ function setLineStatus(lineIndex, status) {
+ lineStatus = lineStatus.substring(0, lineIndex) + status +
+ lineStatus.substring(lineIndex+1);
+ }
+
+ function lexCharRange(charRange, isTimeUp) {
+ if (isTimeUp()) return;
+
+ var lexStart = roundBackToLineIndex(charRange[0]);
+ var lexEnd = roundForwardToLineIndex(charRange[1]);
+
+ // can't parse a dirty line in the middle of a dirty region,
+ // no sensible start state; so find beginning of dirty region
+ var nextCandidate = findBeginningOfDirtyRegion(lexStart);
+
+ while (! isTimeUp()) {
+ // find a dirty line to parse; if may be before lexStart,
+ // but stop at lexEnd.
+ var nextDirty = lineStatus.indexOf("d", nextCandidate);
+ if (nextDirty < 0 || nextDirty >= lexEnd) {
+ break;
+ }
+ var theLineIndex = nextDirty;
+ var theLineEntry = lineData.atIndex(theLineIndex);
+ var lineText = getLineText(theLineIndex);
+
+ // assert: previous line is not dirty
+ var startState;
+ if (theLineIndex > 0) {
+ startState = lineData.atIndex(theLineIndex-1).endState;
+ }
+ else {
+ startState = initialState;
+ }
+
+ var tokenWidths = [];
+ var tokenNames = [];
+ var tokenFunc = function(str, cls) {
+ tokenWidths.push(str.length);
+ tokenNames.push(cls);
+ }
+ var endState = parseLine(lineText, startState, tokenFunc);
+
+ theLineEntry.startState = startState;
+ theLineEntry.endState = endState;
+ theLineEntry.tokenWidths = tokenWidths;
+ theLineEntry.tokenNames = tokenNames;
+
+ setLineStatus(theLineIndex, "u");
+
+ nextCandidate = theLineIndex + 1;
+ if (nextCandidate < lineStatus.length &&
+ lineStatus.charAt(nextCandidate) != "d" &&
+ lineData.atIndex(nextCandidate).startState != endState) {
+ // state has changed, lexing must continue past end of dirty
+ // region
+ setLineStatus(nextCandidate, "d");
+ }
+ }
+ }
+
+ function forEachUncoloredSubrange(startChar, endChar, func, isTimeUp) {
+ var startLine = roundBackToLineIndex(startChar);
+ var endLine = roundForwardToLineIndex(endChar);
+
+ var nextCandidate = startLine;
+
+ while (! isTimeUp()) {
+ var nextUncolored = lineStatus.indexOf("u", nextCandidate);
+ if (nextUncolored < 0 || nextUncolored >= endLine) {
+ break;
+ }
+ var uncoloredEndLine = findEndOfUncoloredRegion(nextUncolored);
+
+ var rangeStart = Math.max(startChar, lineData.offsetOfIndex(nextUncolored));
+ var rangeEnd = Math.min(endChar, lineData.offsetOfIndex(uncoloredEndLine));
+
+ func(rangeStart, rangeEnd, isTimeUp);
+
+ nextCandidate = uncoloredEndLine;
+ }
+ }
+
+ function getSpansForRange(startChar, endChar, func, justPeek) {
+ var startLine = roundBackToLineIndex(startChar);
+ var endLine = roundForwardToLineIndex(endChar);
+
+ function doToken(tokenStart, tokenWidth, tokenClass) {
+ // crop token to [startChar,endChar] range
+ if (tokenStart + tokenWidth <= startChar) return;
+ if (tokenStart >= endChar) return;
+ if (tokenStart < startChar) {
+ tokenWidth -= (startChar - tokenStart);
+ tokenStart = startChar;
+ }
+ if (tokenStart + tokenWidth > endChar) {
+ tokenWidth -= (tokenStart + tokenWidth - endChar);
+ }
+ if (tokenWidth <= 0) return;
+ func(tokenWidth, tokenClass);
+ }
+
+ for(var i=startLine; i<endLine; i++) {
+ var status = lineStatus.charAt(i);
+ var lineEntry = lineData.atIndex(i);
+ var charOffset = lineData.offsetOfIndex(i);
+ if (status == "d") {
+ doToken(charOffset, lineEntry.width, "dirty");
+ }
+ else {
+ var tokenWidths = lineEntry.tokenWidths;
+ var tokenNames = lineEntry.tokenNames;
+ for(var j=0;j<tokenWidths.length;j++) {
+ var w = tokenWidths[j];
+ doToken(charOffset, w, getClassesForScope(tokenNames[j]));
+ charOffset += w;
+ }
+ if (status != "c" && ! justPeek) {
+ setLineStatus(i, "c");
+ }
+ }
+ }
+ }
+
+ function markRangeUncolored(startChar, endChar) {
+ var startLine = roundBackToLineIndex(startChar);
+ var endLine = roundForwardToLineIndex(endChar);
+
+ function stripColors(statuses) {
+ var a = [];
+ for(var i=0;i<statuses.length;i++) {
+ var x = statuses.charAt(i);
+ a.push((x == 'c') ? 'u' : x);
+ }
+ return a.join('');
+ }
+
+ lineStatus = lineStatus.substring(0, startLine) +
+ stripColors(lineStatus.substring(startLine, endLine)) +
+ lineStatus.substring(endLine);
+ }
+
+ function _vars() {
+ return {lineData:lineData, buffer:buffer, lineStatus:lineStatus, nextLineDataId:nextLineDataId,
+ lineParser:lineParser};
+ }
+
+ return {
+ updateBuffer: updateBuffer,
+ lexCharRange: lexCharRange,
+ getSpansForRange: getSpansForRange,
+ forEachUncoloredSubrange: forEachUncoloredSubrange,
+ markRangeUncolored: markRangeUncolored,
+ _vars: _vars
+ };
+}
+
+function makeSimpleLexer(lineParser) {
+ var parseLine = lineParser.parseLine;
+ var initialState = lineParser.initialState;
+ var getClassesForScope = lineParser.getClassesForScope;
+
+ function lexAsLines(str, tokenFunc, newLineFunc) {
+ if (str.charAt(str.length-1) != '\n') {
+ str = str+'\n';
+ }
+ function doToken(txt, scope) {
+ tokenFunc(txt, getClassesForScope(scope));
+ }
+ var state = initialState;
+ str.replace(/[^\n]*\n/g, function(line) {
+ state = parseLine(line, state, doToken);
+ newLineFunc();
+ });
+ }
+
+ function lexString(str, tokenFunc) {
+ lexAsLines(str, tokenFunc, function() {});
+ }
+
+ return {lexString:lexString, lexAsLines:lexAsLines};
+}
+
+function codeStringToHTML(codeString) {
+ var simpleLexer = makeSimpleLexer(grammars["source.js"]);
+ var atLineStart = true;
+ var html = [];
+ function tokenFunc(txt, type) {
+ var cls = type;
+ if (cls) html.push('<tt class="',cls,'">');
+ else html.push('<tt>');
+ html.push(escapeHTML(txt),'</tt>');
+ atLineStart = false;
+ }
+ function newLineFunc() {
+ html.push('<br/>\n');
+ atLineStart = true;
+ }
+ simpleLexer.lexAsLines(codeString, tokenFunc, newLineFunc);
+ if (atLineStart) html.push('<br/>\n');
+ return html.join('');
+}
+
+function escapeHTML(s) {
+ var re = /[&<>\'\" ]/g;
+ if (! re.MAP) {
+ // persisted across function calls!
+ re.MAP = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&#34;',
+ "'": '&#39;',
+ ' ': '&#160;'
+ };
+ }
+ return s.replace(re, function(c) { return re.MAP[c]; });
+}
+
+function getIncrementalLexer(type) {
+ return makeIncrementalLexer(grammars["text.html.basic"]);//grammars[type]);
+}
+function getSimpleLexer(type) {
+ return makeSimpleLexer(grammars[type]);
+}
+
+return {getIncrementalLexer:getIncrementalLexer, getSimpleLexer:getSimpleLexer,
+ codeStringToHTML:codeStringToHTML};
+
+})();
diff --git a/trunk/infrastructure/ace/www/processing.js b/trunk/infrastructure/ace/www/processing.js
new file mode 100644
index 0000000..988ef76
--- /dev/null
+++ b/trunk/infrastructure/ace/www/processing.js
@@ -0,0 +1,1714 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Processing.js - John Resig (http://ejohn.org/)
+ * MIT Licensed
+ * http://ejohn.org/blog/processingjs/
+ *
+ * This is a port of the Processing Visualization Language.
+ * More information: http://processing.org/
+ */
+
+(function(){
+
+this.Processing = function Processing( aElement, aCode )
+{
+ var p = buildProcessing( aElement );
+ p.init( aCode );
+ return p;
+};
+
+function log()
+{
+ try
+ {
+ console.log.apply( console, arguments );
+ }
+ catch(e)
+ {
+ try
+ {
+ opera.postError.apply( opera, arguments );
+ }
+ catch(e){}
+ }
+}
+
+function parse( aCode, p )
+{
+ // Angels weep at this parsing code :-(
+
+ // Remove end-of-line comments
+ aCode = aCode.replace(/\/\/ .*\n/g, "\n");
+
+ // Weird parsing errors with %
+ aCode = aCode.replace(/([^\s])%([^\s])/g, "$1 % $2");
+
+ // Simple convert a function-like thing to function
+ aCode = aCode.replace(/(?:static )?(\w+ )(\w+)\s*(\([^\)]*\)\s*{)/g, function(all, type, name, args)
+ {
+ if ( name == "if" || name == "for" || name == "while" )
+ {
+ return all;
+ }
+ else
+ {
+ return "Processing." + name + " = function " + name + args;
+ }
+ });
+
+ // Force .length() to be .length
+ aCode = aCode.replace(/\.length\(\)/g, ".length");
+
+ // foo( int foo, float bar )
+ aCode = aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g, "$1$4");
+ aCode = aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g, "$1$4");
+
+ // float[] foo = new float[5];
+ aCode = aCode.replace(/new (\w+)((?:\[([^\]]*)\])+)/g, function(all, name, args)
+ {
+ return "new ArrayList(" + args.slice(1,-1).split("][").join(", ") + ")";
+ });
+
+ aCode = aCode.replace(/(?:static )?\w+\[\]\s*(\w+)\[?\]?\s*=\s*{.*?};/g, function(all)
+ {
+ return all.replace(/{/g, "[").replace(/}/g, "]");
+ });
+
+ // int|float foo;
+ var intFloat = /(\n\s*(?:int|float)(?:\[\])?(?:\s*|[^\(]*?,\s*))([a-z]\w*)(;|,)/i;
+ while ( intFloat.test(aCode) )
+ {
+ aCode = aCode.replace(new RegExp(intFloat), function(all, type, name, sep)
+ {
+ return type + " " + name + " = 0" + sep;
+ });
+ }
+
+ // float foo = 5;
+ aCode = aCode.replace(/(?:static )?(\w+)((?:\[\])+| ) *(\w+)\[?\]?(\s*[=,;])/g, function(all, type, arr, name, sep)
+ {
+ if ( type == "return" )
+ return all;
+ else
+ return "var " + name + sep;
+ });
+
+ // Fix Array[] foo = {...} to [...]
+ aCode = aCode.replace(/=\s*{((.|\s)*?)};/g, function(all,data)
+ {
+ return "= [" + data.replace(/{/g, "[").replace(/}/g, "]") + "]";
+ });
+
+ // static { ... } blocks
+ aCode = aCode.replace(/static\s*{((.|\n)*?)}/g, function(all, init)
+ {
+ // Convert the static definitons to variable assignments
+ //return init.replace(/\((.*?)\)/g, " = $1");
+ return init;
+ });
+
+ // super() is a reserved word
+ aCode = aCode.replace(/super\(/g, "superMethod(");
+
+ var classes = ["int", "float", "boolean", "string"];
+
+ function ClassReplace(all, name, extend, vars, last)
+ {
+ classes.push( name );
+
+ var static = "";
+
+ vars = vars.replace(/final\s+var\s+(\w+\s*=\s*.*?;)/g, function(all,set)
+ {
+ static += " " + name + "." + set;
+ return "";
+ });
+
+ // Move arguments up from constructor and wrap contents with
+ // a with(this), and unwrap constructor
+ return "function " + name + "() {with(this){\n " +
+ (extend ? "var __self=this;function superMethod(){extendClass(__self,arguments," + extend + ");}\n" : "") +
+ // Replace var foo = 0; with this.foo = 0;
+ // and force var foo; to become this.foo = null;
+ vars
+ .replace(/,\s?/g, ";\n this.")
+ .replace(/\b(var |final |public )+\s*/g, "this.")
+ .replace(/this.(\w+);/g, "this.$1 = null;") +
+ (extend ? "extendClass(this, " + extend + ");\n" : "") +
+ "<CLASS " + name + " " + static + ">" + (typeof last == "string" ? last : name + "(");
+ }
+
+ var matchClasses = /(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)\b\1\s*\(/g;
+ var matchNoCon = /(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)(Processing)/g;
+
+ aCode = aCode.replace(matchClasses, ClassReplace);
+ aCode = aCode.replace(matchNoCon, ClassReplace);
+
+ var matchClass = /<CLASS (\w+) (.*?)>/, m;
+
+ while ( (m = aCode.match( matchClass )) )
+ {
+ var left = RegExp.leftContext,
+ allRest = RegExp.rightContext,
+ rest = nextBrace(allRest),
+ className = m[1],
+ staticVars = m[2] || "";
+
+ allRest = allRest.slice( rest.length + 1 );
+
+ rest = rest.replace(new RegExp("\\b" + className + "\\(([^\\)]*?)\\)\\s*{", "g"), function(all, args)
+ {
+ args = args.split(/,\s*?/);
+
+ if ( args[0].match(/^\s*$/) )
+ args.shift();
+
+ var fn = "if ( arguments.length == " + args.length + " ) {\n";
+
+ for ( var i = 0; i < args.length; i++ )
+ {
+ fn += " var " + args[i] + " = arguments[" + i + "];\n";
+ }
+
+ return fn;
+ });
+
+ // Fix class method names
+ // this.collide = function() { ... }
+ // and add closing } for with(this) ...
+ rest = rest.replace(/(?:public )?Processing.\w+ = function (\w+)\((.*?)\)/g, function(all, name, args)
+ {
+ return "ADDMETHOD(this, '" + name + "', function(" + args + ")";
+ });
+
+ var matchMethod = /ADDMETHOD([\s\S]*?{)/, mc;
+ var methods = "";
+
+ while ( (mc = rest.match( matchMethod )) )
+ {
+ var prev = RegExp.leftContext,
+ allNext = RegExp.rightContext,
+ next = nextBrace(allNext);
+
+ methods += "addMethod" + mc[1] + next + "});"
+
+ rest = prev + allNext.slice( next.length + 1 );
+
+ }
+
+ rest = methods + rest;
+
+ aCode = left + rest + "\n}}" + staticVars + allRest;
+ }
+
+ // Do some tidying up, where necessary
+ aCode = aCode.replace(/Processing.\w+ = function addMethod/g, "addMethod");
+
+ function nextBrace( right )
+ {
+ var rest = right;
+ var position = 0;
+ var leftCount = 1, rightCount = 0;
+
+ while ( leftCount != rightCount )
+ {
+ var nextLeft = rest.indexOf("{");
+ var nextRight = rest.indexOf("}");
+
+ if ( nextLeft < nextRight && nextLeft != -1 )
+ {
+ leftCount++;
+ rest = rest.slice( nextLeft + 1 );
+ position += nextLeft + 1;
+ }
+ else
+ {
+ rightCount++;
+ rest = rest.slice( nextRight + 1 );
+ position += nextRight + 1;
+ }
+ }
+
+ return right.slice(0, position - 1);
+ }
+
+ // Handle (int) Casting
+ aCode = aCode.replace(/\(int\)/g, "0|");
+
+ // Remove Casting
+ aCode = aCode.replace(new RegExp("\\((" + classes.join("|") + ")(\\[\\])?\\)", "g"), "");
+
+ // Convert 3.0f to just 3.0
+ aCode = aCode.replace(/(\d+)f/g, "$1");
+
+ // Force numbers to exist
+ //aCode = aCode.replace(/([^.])(\w+)\s*\+=/g, "$1$2 = ($2||0) +");
+
+ // Force characters-as-bytes to work
+ aCode = aCode.replace(/('[a-zA-Z0-9]')/g, "$1.charCodeAt(0)");
+
+ // Convert #aaaaaa into color
+ aCode = aCode.replace(/#([a-f0-9]{6})/ig, function(m, hex){
+ var num = toNumbers(hex);
+ return "color(" + num[0] + "," + num[1] + "," + num[2] + ")";
+ });
+
+ function toNumbers( str ){
+ var ret = [];
+ str.replace(/(..)/g, function(str){
+ ret.push( parseInt( str, 16 ) );
+ });
+ return ret;
+ }
+
+//log(aCode);
+
+ return aCode;
+}
+
+function buildProcessing( curElement ){
+
+ var p = {};
+
+ // init
+ p.PI = Math.PI;
+ p.TWO_PI = 2 * p.PI;
+ p.HALF_PI = p.PI / 2;
+ p.P3D = 3;
+ p.CORNER = 0;
+ p.CENTER = 1;
+ p.CENTER_RADIUS = 2;
+ p.RADIUS = 2;
+ p.POLYGON = 1;
+ p.TRIANGLES = 6;
+ p.POINTS = 7;
+ p.LINES = 8;
+ p.TRIANGLE_STRIP = 9;
+ p.CORNERS = 10;
+ p.CLOSE = true;
+ p.RGB = 1;
+ p.HSB = 2;
+
+ // "Private" variables used to maintain state
+ var curContext = curElement.getContext("2d");
+ var doFill = true;
+ var doStroke = true;
+ var loopStarted = false;
+ var hasBackground = false;
+ var doLoop = true;
+ var curRectMode = p.CORNER;
+ var curEllipseMode = p.CENTER;
+ var inSetup = false;
+ var inDraw = false;
+ var curBackground = "rgba(204,204,204,1)";
+ var curFrameRate = 1000;
+ var curShape = p.POLYGON;
+ var curShapeCount = 0;
+ var opacityRange = 255;
+ var redRange = 255;
+ var greenRange = 255;
+ var blueRange = 255;
+ var pathOpen = false;
+ var mousePressed = false;
+ var keyPressed = false;
+ var firstX, firstY, prevX, prevY;
+ var curColorMode = p.RGB;
+ var curTint = -1;
+ var curTextSize = 12;
+ var curTextFont = "Arial";
+ var getLoaded = false;
+ var start = (new Date).getTime();
+
+ // Global vars for tracking mouse position
+ p.pmouseX = 0;
+ p.pmouseY = 0;
+ p.mouseX = 0;
+ p.mouseY = 0;
+
+ // Will be replaced by the user, most likely
+ p.mouseDragged = undefined;
+ p.mouseMoved = undefined;
+ p.mousePressed = undefined;
+ p.mouseReleased = undefined;
+ p.keyPressed = undefined;
+ p.keyReleased = undefined;
+ p.draw = undefined;
+ p.setup = undefined;
+
+ // The height/width of the canvas
+ p.width = curElement.width - 0;
+ p.height = curElement.height - 0;
+
+ // In case I ever need to do HSV conversion:
+ // http://srufaculty.sru.edu/david.dailey/javascript/js/5rml.js
+ p.color = function color( aValue1, aValue2, aValue3, aValue4 )
+ {
+ var aColor = "";
+
+ if ( arguments.length == 3 )
+ {
+ aColor = p.color( aValue1, aValue2, aValue3, opacityRange );
+ }
+ else if ( arguments.length == 4 )
+ {
+ var a = aValue4 / opacityRange;
+ a = isNaN(a) ? 1 : a;
+
+ if ( curColorMode == p.HSB )
+ {
+ var rgb = HSBtoRGB(aValue1, aValue2, aValue3);
+ var r = rgb[0], g = rgb[1], b = rgb[2];
+ }
+ else
+ {
+ var r = getColor(aValue1, redRange);
+ var g = getColor(aValue2, greenRange);
+ var b = getColor(aValue3, blueRange);
+ }
+
+ aColor = "rgba(" + r + "," + g + "," + b + "," + a + ")";
+ }
+ else if ( typeof aValue1 == "string" )
+ {
+ aColor = aValue1;
+
+ if ( arguments.length == 2 )
+ {
+ var c = aColor.split(",");
+ c[3] = (aValue2 / opacityRange) + ")";
+ aColor = c.join(",");
+ }
+ }
+ else if ( arguments.length == 2 )
+ {
+ aColor = p.color( aValue1, aValue1, aValue1, aValue2 );
+ }
+ else if ( typeof aValue1 == "number" )
+ {
+ aColor = p.color( aValue1, aValue1, aValue1, opacityRange );
+ }
+ else
+ {
+ aColor = p.color( redRange, greenRange, blueRange, opacityRange );
+ }
+
+ // HSB conversion function from Mootools, MIT Licensed
+ function HSBtoRGB(h, s, b)
+ {
+ h = (h / redRange) * 100;
+ s = (s / greenRange) * 100;
+ b = (b / blueRange) * 100;
+ if (s == 0){
+ return [b, b, b];
+ } else {
+ var hue = h % 360;
+ var f = hue % 60;
+ var br = Math.round(b / 100 * 255);
+ var p = Math.round((b * (100 - s)) / 10000 * 255);
+ var q = Math.round((b * (6000 - s * f)) / 600000 * 255);
+ var t = Math.round((b * (6000 - s * (60 - f))) / 600000 * 255);
+ switch (Math.floor(hue / 60)){
+ case 0: return [br, t, p];
+ case 1: return [q, br, p];
+ case 2: return [p, br, t];
+ case 3: return [p, q, br];
+ case 4: return [t, p, br];
+ case 5: return [br, p, q];
+ }
+ }
+ }
+
+ function getColor( aValue, range )
+ {
+ return Math.round(255 * (aValue / range));
+ }
+
+ return aColor;
+ }
+
+ p.nf = function( num, pad )
+ {
+ var str = "" + num;
+ while ( pad - str.length )
+ str = "0" + str;
+ return str;
+ };
+
+ p.AniSprite = function( prefix, frames )
+ {
+ this.images = [];
+ this.pos = 0;
+
+ for ( var i = 0; i < frames; i++ )
+ {
+ this.images.push( prefix + p.nf( i, ("" + frames).length ) + ".gif" );
+ }
+
+ this.display = function( x, y )
+ {
+ p.image( this.images[ this.pos ], x, y );
+
+ if ( ++this.pos >= frames )
+ this.pos = 0;
+ };
+
+ this.getWidth = function()
+ {
+ return getImage(this.images[0]).width;
+ };
+
+ this.getHeight = function()
+ {
+ return getImage(this.images[0]).height;
+ };
+ };
+
+ function buildImageObject( obj )
+ {
+ var pixels = obj.data;
+ var data = p.createImage( obj.width, obj.height );
+
+ if ( data.__defineGetter__ && data.__lookupGetter__ && !data.__lookupGetter__("pixels") )
+ {
+ var pixelsDone;
+ data.__defineGetter__("pixels", function()
+ {
+ if ( pixelsDone )
+ return pixelsDone;
+
+ pixelsDone = [];
+
+ for ( var i = 0; i < pixels.length; i += 4 )
+ {
+ pixelsDone.push( p.color(pixels[i], pixels[i+1], pixels[i+2], pixels[i+3]) );
+ }
+
+ return pixelsDone;
+ });
+ }
+ else
+ {
+ data.pixels = [];
+
+ for ( var i = 0; i < pixels.length; i += 4 )
+ {
+ data.pixels.push( p.color(pixels[i], pixels[i+1], pixels[i+2], pixels[i+3]) );
+ }
+ }
+
+ return data;
+ }
+
+ p.createImage = function createImage( w, h, mode )
+ {
+ var data = {
+ width: w,
+ height: h,
+ pixels: new Array( w * h ),
+ get: function(x,y)
+ {
+ return this.pixels[w*y+x];
+ },
+ _mask: null,
+ mask: function(img)
+ {
+ this._mask = img;
+ },
+ loadPixels: function()
+ {
+ },
+ updatePixels: function()
+ {
+ }
+ };
+
+ return data;
+ }
+
+ p.createGraphics = function createGraphics( w, h )
+ {
+ var canvas = document.createElement("canvas");
+ var ret = buildProcessing( canvas );
+ ret.size( w, h );
+ ret.canvas = canvas;
+ return ret;
+ }
+
+ p.beginDraw = function beginDraw()
+ {
+
+ }
+
+ p.endDraw = function endDraw()
+ {
+
+ }
+
+ p.tint = function tint( rgb, a )
+ {
+ curTint = a;
+ }
+
+ function getImage( img ) {
+ if ( typeof img == "string" )
+ {
+ return document.getElementById(img);
+ }
+
+ if ( img.img || img.canvas )
+ {
+ return img.img || img.canvas;
+ }
+
+ img.data = [];
+
+ for ( var i = 0, l = img.pixels.length; i < l; i++ )
+ {
+ var c = (img.pixels[i] || "rgba(0,0,0,1)").slice(5,-1).split(",");
+ img.data.push( parseInt(c[0]), parseInt(c[1]), parseInt(c[2]), parseFloat(c[3]) * 100 );
+ }
+
+ var canvas = document.createElement("canvas")
+ canvas.width = img.width;
+ canvas.height = img.height;
+ var context = canvas.getContext("2d");
+ context.putImageData( img, 0, 0 );
+
+ img.canvas = canvas;
+
+ return canvas;
+ }
+
+ p.image = function image( img, x, y, w, h )
+ {
+ x = x || 0;
+ y = y || 0;
+
+ var obj = getImage(img);
+
+ if ( curTint >= 0 )
+ {
+ var oldAlpha = curContext.globalAlpha;
+ curContext.globalAlpha = curTint / opacityRange;
+ }
+
+ if ( arguments.length == 3 )
+ {
+ curContext.drawImage( obj, x, y );
+ }
+ else
+ {
+ curContext.drawImage( obj, x, y, w, h );
+ }
+
+ if ( curTint >= 0 )
+ {
+ curContext.globalAlpha = oldAlpha;
+ }
+
+ if ( img._mask )
+ {
+ var oldComposite = curContext.globalCompositeOperation;
+ curContext.globalCompositeOperation = "darker";
+ p.image( img._mask, x, y );
+ curContext.globalCompositeOperation = oldComposite;
+ }
+ }
+
+ p.exit = function exit()
+ {
+
+ }
+
+ p.save = function save( file )
+ {
+
+ }
+
+ p.loadImage = function loadImage( file )
+ {
+ var img = document.getElementById(file);
+ if ( !img )
+ return;
+
+ var h = img.height, w = img.width;
+
+ var canvas = document.createElement("canvas");
+ canvas.width = w;
+ canvas.height = h;
+ var context = canvas.getContext("2d");
+
+ context.drawImage( img, 0, 0 );
+ var data = buildImageObject( context.getImageData( 0, 0, w, h ) );
+ data.img = img;
+ return data;
+ }
+
+ p.loadFont = function loadFont( name )
+ {
+ return {
+ name: name,
+ width: function( str )
+ {
+ if ( curContext.mozMeasureText )
+ return curContext.mozMeasureText( typeof str == "number" ?
+ String.fromCharCode( str ) :
+ str) / curTextSize;
+ else
+ return 0;
+ }
+ };
+ }
+
+ p.textFont = function textFont( name, size )
+ {
+ curTextFont = name;
+ p.textSize( size );
+ }
+
+ p.textSize = function textSize( size )
+ {
+ if ( size )
+ {
+ curTextSize = size;
+ }
+ }
+
+ p.textAlign = function textAlign()
+ {
+
+ }
+
+ p.text = function text( str, x, y )
+ {
+ if ( str && curContext.mozDrawText )
+ {
+ curContext.save();
+ curContext.mozTextStyle = curTextSize + "px " + curTextFont.name;
+ curContext.translate(x, y);
+ curContext.mozDrawText( typeof str == "number" ?
+ String.fromCharCode( str ) :
+ str );
+ curContext.restore();
+ }
+ }
+
+ p.char = function char( key )
+ {
+ //return String.fromCharCode( key );
+ return key;
+ }
+
+ p.println = function println()
+ {
+
+ }
+
+ p.map = function map( value, istart, istop, ostart, ostop )
+ {
+ return ostart + (ostop - ostart) * ((value - istart) / (istop - istart));
+ };
+
+ String.prototype.replaceAll = function(re, replace)
+ {
+ return this.replace(new RegExp(re, "g"), replace);
+ };
+
+ p.Point = function Point( x, y )
+ {
+ this.x = x;
+ this.y = y;
+ this.copy = function()
+ {
+ return new Point( x, y );
+ }
+ }
+
+ p.Random = function()
+ {
+ var haveNextNextGaussian = false;
+ var nextNextGaussian;
+
+ this.nextGaussian = function()
+ {
+ if (haveNextNextGaussian) {
+ haveNextNextGaussian = false;
+
+ return nextNextGaussian;
+ } else {
+ var v1, v2, s;
+ do {
+ v1 = 2 * p.random(1) - 1; // between -1.0 and 1.0
+ v2 = 2 * p.random(1) - 1; // between -1.0 and 1.0
+ s = v1 * v1 + v2 * v2;
+ } while (s >= 1 || s == 0);
+ var multiplier = Math.sqrt(-2 * Math.log(s)/s);
+ nextNextGaussian = v2 * multiplier;
+ haveNextNextGaussian = true;
+
+ return v1 * multiplier;
+ }
+ };
+ }
+
+ p.ArrayList = function ArrayList( size, size2, size3 )
+ {
+ var array = new Array( 0 | size );
+
+ if ( size2 )
+ {
+ for ( var i = 0; i < size; i++ )
+ {
+ array[i] = [];
+
+ for ( var j = 0; j < size2; j++ )
+ {
+ var a = array[i][j] = size3 ? new Array( size3 ) : 0;
+ for ( var k = 0; k < size3; k++ )
+ {
+ a[k] = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ for ( var i = 0; i < size; i++ )
+ {
+ array[i] = 0;
+ }
+ }
+
+ array.size = function()
+ {
+ return this.length;
+ };
+ array.get = function( i )
+ {
+ return this[ i ];
+ };
+ array.remove = function( i )
+ {
+ return this.splice( i, 1 );
+ };
+ array.add = function( item )
+ {
+ for ( var i = 0; this[ i ] != undefined; i++ ) {}
+ this[ i ] = item;
+ };
+ array.clone = function()
+ {
+ var a = new ArrayList( size );
+ for ( var i = 0; i < size; i++ )
+ {
+ a[ i ] = this[ i ];
+ }
+ return a;
+ };
+ array.isEmpty = function()
+ {
+ return !this.length;
+ };
+ array.clear = function()
+ {
+ this.length = 0;
+ };
+
+ return array;
+ }
+
+ p.colorMode = function colorMode( mode, range1, range2, range3, range4 )
+ {
+ curColorMode = mode;
+
+ if ( arguments.length >= 4 )
+ {
+ redRange = range1;
+ greenRange = range2;
+ blueRange = range3;
+ }
+
+ if ( arguments.length == 5 )
+ {
+ opacityRange = range4;
+ }
+
+ if ( arguments.length == 2 )
+ {
+ p.colorMode( mode, range1, range1, range1, range1 );
+ }
+ }
+
+ p.beginShape = function beginShape( type )
+ {
+ curShape = type;
+ curShapeCount = 0;
+ }
+
+ p.endShape = function endShape( close )
+ {
+ if ( curShapeCount != 0 )
+ {
+ curContext.lineTo( firstX, firstY );
+
+ if ( doFill )
+ curContext.fill();
+
+ if ( doStroke )
+ curContext.stroke();
+
+ curContext.closePath();
+ curShapeCount = 0;
+ pathOpen = false;
+ }
+
+ if ( pathOpen )
+ {
+ curContext.closePath();
+ }
+ }
+
+ p.vertex = function vertex( x, y, x2, y2, x3, y3 )
+ {
+ if ( curShapeCount == 0 && curShape != p.POINTS )
+ {
+ pathOpen = true;
+ curContext.beginPath();
+ curContext.moveTo( x, y );
+ }
+ else
+ {
+ if ( curShape == p.POINTS )
+ {
+ p.point( x, y );
+ }
+ else if ( arguments.length == 2 )
+ {
+ if ( curShape == p.TRIANGLE_STRIP && curShapeCount == 2 )
+ {
+ curContext.moveTo( prevX, prevY );
+ curContext.lineTo( firstX, firstY );
+ }
+
+ curContext.lineTo( x, y );
+ }
+ else if ( arguments.length == 4 )
+ {
+ if ( curShapeCount > 1 )
+ {
+ curContext.moveTo( prevX, prevY );
+ curContext.quadraticCurveTo( firstX, firstY, x, y );
+ curShapeCount = 1;
+ }
+ }
+ else if ( arguments.length == 6 )
+ {
+ curContext.bezierCurveTo( x, y, x2, y2, x3, y3 );
+ curShapeCount = -1;
+ }
+ }
+
+ prevX = firstX;
+ prevY = firstY;
+ firstX = x;
+ firstY = y;
+
+
+ curShapeCount++;
+
+ if ( curShape == p.LINES && curShapeCount == 2 ||
+ (curShape == p.TRIANGLES || curShape == p.TRIANGLE_STRIP) && curShapeCount == 3 )
+ {
+ p.endShape();
+ }
+
+ if ( curShape == p.TRIANGLE_STRIP && curShapeCount == 3 )
+ {
+ curShapeCount = 2;
+ }
+ }
+
+ p.curveTightness = function()
+ {
+
+ }
+
+ // Unimplmented - not really possible with the Canvas API
+ p.curveVertex = function( x, y, x2, y2 )
+ {
+ p.vertex( x, y, x2, y2 );
+ }
+
+ p.bezierVertex = p.vertex
+
+ p.rectMode = function rectMode( aRectMode )
+ {
+ curRectMode = aRectMode;
+ }
+
+ p.imageMode = function()
+ {
+
+ }
+
+ p.ellipseMode = function ellipseMode( aEllipseMode )
+ {
+ curEllipseMode = aEllipseMode;
+ }
+
+ p.dist = function dist( x1, y1, x2, y2 )
+ {
+ return Math.sqrt( Math.pow( x2 - x1, 2 ) + Math.pow( y2 - y1, 2 ) );
+ }
+
+ p.year = function year()
+ {
+ return (new Date).getYear() + 1900;
+ }
+
+ p.month = function month()
+ {
+ return (new Date).getMonth();
+ }
+
+ p.day = function day()
+ {
+ return (new Date).getDay();
+ }
+
+ p.hour = function hour()
+ {
+ return (new Date).getHours();
+ }
+
+ p.minute = function minute()
+ {
+ return (new Date).getMinutes();
+ }
+
+ p.second = function second()
+ {
+ return (new Date).getSeconds();
+ }
+
+ p.millis = function millis()
+ {
+ return (new Date).getTime() - start;
+ }
+
+ p.ortho = function ortho()
+ {
+
+ }
+
+ p.translate = function translate( x, y )
+ {
+ curContext.translate( x, y );
+ }
+
+ p.scale = function scale( x, y )
+ {
+ curContext.scale( x, y || x );
+ }
+
+ p.rotate = function rotate( aAngle )
+ {
+ curContext.rotate( aAngle );
+ }
+
+ p.pushMatrix = function pushMatrix()
+ {
+ curContext.save();
+ }
+
+ p.popMatrix = function popMatrix()
+ {
+ curContext.restore();
+ }
+
+ p.redraw = function redraw()
+ {
+ if ( hasBackground )
+ {
+ p.background();
+ }
+
+ inDraw = true;
+ p.pushMatrix();
+ p.draw();
+ p.popMatrix();
+ inDraw = false;
+ }
+
+ p.loop = function loop()
+ {
+ if ( loopStarted )
+ return;
+
+ var looping = setInterval(function()
+ {
+ try
+ {
+ p.redraw();
+ }
+ catch(e)
+ {
+ clearInterval( looping );
+ throw e;
+ }
+ }, 1000 / curFrameRate );
+
+ loopStarted = true;
+ }
+
+ p.frameRate = function frameRate( aRate )
+ {
+ curFrameRate = aRate;
+ }
+
+ p.background = function background( img )
+ {
+ if ( arguments.length )
+ {
+ if ( img && img.img )
+ {
+ curBackground = img;
+ }
+ else
+ {
+ curBackground = p.color.apply( this, arguments );
+ }
+ }
+
+
+ if ( curBackground.img )
+ {
+ p.image( curBackground, 0, 0 );
+ }
+ else
+ {
+ var oldFill = curContext.fillStyle;
+ curContext.fillStyle = curBackground + "";
+ curContext.fillRect( 0, 0, p.width, p.height );
+ curContext.fillStyle = oldFill;
+ }
+ }
+
+ p.sq = function sq( aNumber )
+ {
+ return aNumber * aNumber;
+ }
+
+ p.sqrt = function sqrt( aNumber )
+ {
+ return Math.sqrt( aNumber );
+ }
+
+ p.int = function int( aNumber )
+ {
+ return Math.floor( aNumber );
+ }
+
+ p.min = function min( aNumber, aNumber2 )
+ {
+ return Math.min( aNumber, aNumber2 );
+ }
+
+ p.max = function max( aNumber, aNumber2 )
+ {
+ return Math.max( aNumber, aNumber2 );
+ }
+
+ p.ceil = function ceil( aNumber )
+ {
+ return Math.ceil( aNumber );
+ }
+
+ p.floor = function floor( aNumber )
+ {
+ return Math.floor( aNumber );
+ }
+
+ p.float = function float( aNumber )
+ {
+ return typeof aNumber == "string" ?
+ p.float( aNumber.charCodeAt(0) ) :
+ parseFloat( aNumber );
+ }
+
+ p.byte = function byte( aNumber )
+ {
+ return aNumber || 0;
+ }
+
+ p.random = function random( aMin, aMax )
+ {
+ return arguments.length == 2 ?
+ aMin + (Math.random() * (aMax - aMin)) :
+ Math.random() * aMin;
+ }
+
+ // From: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
+ p.noise = function( x, y, z )
+ {
+ return arguments.length >= 2 ?
+ PerlinNoise_2D( x, y ) :
+ PerlinNoise_2D( x, x );
+ }
+
+ function Noise(x, y)
+ {
+ var n = x + y * 57;
+ n = (n<<13) ^ n;
+ return Math.abs(1.0 - (((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0));
+ }
+
+ function SmoothedNoise(x, y)
+ {
+ var corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16;
+ var sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8;
+ var center = Noise(x, y) / 4;
+ return corners + sides + center;
+ }
+
+ function InterpolatedNoise(x, y)
+ {
+ var integer_X = Math.floor(x);
+ var fractional_X = x - integer_X;
+
+ var integer_Y = Math.floor(y);
+ var fractional_Y = y - integer_Y;
+
+ var v1 = SmoothedNoise(integer_X, integer_Y);
+ var v2 = SmoothedNoise(integer_X + 1, integer_Y);
+ var v3 = SmoothedNoise(integer_X, integer_Y + 1);
+ var v4 = SmoothedNoise(integer_X + 1, integer_Y + 1);
+
+ var i1 = Interpolate(v1 , v2 , fractional_X);
+ var i2 = Interpolate(v3 , v4 , fractional_X);
+
+ return Interpolate(i1 , i2 , fractional_Y);
+ }
+
+ function PerlinNoise_2D(x, y)
+ {
+ var total = 0;
+ var p = 0.25;
+ var n = 3;
+
+ for ( var i = 0; i <= n; i++ )
+ {
+ var frequency = Math.pow(2, i);
+ var amplitude = Math.pow(p, i);
+
+ total = total + InterpolatedNoise(x * frequency, y * frequency) * amplitude;
+ }
+
+ return total;
+ }
+
+ function Interpolate(a, b, x)
+ {
+ var ft = x * p.PI;
+ var f = (1 - p.cos(ft)) * .5;
+ return a*(1-f) + b*f;
+ }
+
+ p.red = function( aColor )
+ {
+ return parseInt(aColor.slice(5));
+ }
+
+ p.green = function( aColor )
+ {
+ return parseInt(aColor.split(",")[1]);
+ }
+
+ p.blue = function( aColor )
+ {
+ return parseInt(aColor.split(",")[2]);
+ }
+
+ p.alpha = function( aColor )
+ {
+ return parseInt(aColor.split(",")[3]);
+ }
+
+ p.abs = function abs( aNumber )
+ {
+ return Math.abs( aNumber );
+ }
+
+ p.cos = function cos( aNumber )
+ {
+ return Math.cos( aNumber );
+ }
+
+ p.sin = function sin( aNumber )
+ {
+ return Math.sin( aNumber );
+ }
+
+ p.pow = function pow( aNumber, aExponent )
+ {
+ return Math.pow( aNumber, aExponent );
+ }
+
+ p.constrain = function constrain( aNumber, aMin, aMax )
+ {
+ return Math.min( Math.max( aNumber, aMin ), aMax );
+ }
+
+ p.sqrt = function sqrt( aNumber )
+ {
+ return Math.sqrt( aNumber );
+ }
+
+ p.atan2 = function atan2( aNumber, aNumber2 )
+ {
+ return Math.atan2( aNumber, aNumber2 );
+ }
+
+ p.radians = function radians( aAngle )
+ {
+ return ( aAngle / 180 ) * p.PI;
+ }
+
+ p.size = function size( aWidth, aHeight )
+ {
+ var fillStyle = curContext.fillStyle;
+ var strokeStyle = curContext.strokeStyle;
+
+ curElement.width = p.width = aWidth;
+ curElement.height = p.height = aHeight;
+
+ curContext.fillStyle = fillStyle;
+ curContext.strokeStyle = strokeStyle;
+ }
+
+ p.noStroke = function noStroke()
+ {
+ doStroke = false;
+ }
+
+ p.noFill = function noFill()
+ {
+ doFill = false;
+ }
+
+ p.smooth = function smooth()
+ {
+
+ }
+
+ p.noLoop = function noLoop()
+ {
+ doLoop = false;
+ }
+
+ p.fill = function fill()
+ {
+ doFill = true;
+ curContext.fillStyle = p.color.apply( this, arguments );
+ }
+
+ p.stroke = function stroke()
+ {
+ doStroke = true;
+ curContext.strokeStyle = p.color.apply( this, arguments );
+ }
+
+ p.strokeWeight = function strokeWeight( w )
+ {
+ curContext.lineWidth = w;
+ }
+
+ p.point = function point( x, y )
+ {
+ var oldFill = curContext.fillStyle;
+ curContext.fillStyle = curContext.strokeStyle;
+ curContext.fillRect( Math.round( x ), Math.round( y ), 1, 1 );
+ curContext.fillStyle = oldFill;
+ }
+
+ p.get = function get( x, y )
+ {
+ if ( arguments.length == 0 )
+ {
+ var c = p.createGraphics( p.width, p.height );
+ c.image( curContext, 0, 0 );
+ return c;
+ }
+
+ if ( !getLoaded )
+ {
+ getLoaded = buildImageObject( curContext.getImageData(0, 0, p.width, p.height) );
+ }
+
+ return getLoaded.get( x, y );
+ }
+
+ p.set = function set( x, y, color )
+ {
+ var oldFill = curContext.fillStyle;
+ curContext.fillStyle = color;
+ curContext.fillRect( Math.round( x ), Math.round( y ), 1, 1 );
+ curContext.fillStyle = oldFill;
+ }
+
+ p.arc = function arc( x, y, width, height, start, stop )
+ {
+ if ( width <= 0 )
+ return;
+
+ if ( curEllipseMode == p.CORNER )
+ {
+ x += width / 2;
+ y += height / 2;
+ }
+
+ curContext.beginPath();
+
+ curContext.moveTo( x, y );
+ curContext.arc( x, y, curEllipseMode == p.CENTER_RADIUS ? width : width/2, start, stop, false );
+
+ if ( doFill )
+ curContext.fill();
+
+ if ( doStroke )
+ curContext.stroke();
+
+ curContext.closePath();
+ }
+
+ p.line = function line( x1, y1, x2, y2 )
+ {
+ curContext.lineCap = "round";
+ curContext.beginPath();
+
+ curContext.moveTo( x1 || 0, y1 || 0 );
+ curContext.lineTo( x2 || 0, y2 || 0 );
+
+ curContext.stroke();
+
+ curContext.closePath();
+ }
+
+ p.bezier = function bezier( x1, y1, x2, y2, x3, y3, x4, y4 )
+ {
+ curContext.lineCap = "butt";
+ curContext.beginPath();
+
+ curContext.moveTo( x1, y1 );
+ curContext.bezierCurveTo( x2, y2, x3, y3, x4, y4 );
+
+ curContext.stroke();
+
+ curContext.closePath();
+ }
+
+ p.triangle = function triangle( x1, y1, x2, y2, x3, y3 )
+ {
+ p.beginShape();
+ p.vertex( x1, y1 );
+ p.vertex( x2, y2 );
+ p.vertex( x3, y3 );
+ p.endShape();
+ }
+
+ p.quad = function quad( x1, y1, x2, y2, x3, y3, x4, y4 )
+ {
+ p.beginShape();
+ p.vertex( x1, y1 );
+ p.vertex( x2, y2 );
+ p.vertex( x3, y3 );
+ p.vertex( x4, y4 );
+ p.endShape();
+ }
+
+ p.rect = function rect( x, y, width, height )
+ {
+ if ( width == 0 && height == 0 )
+ return;
+
+ curContext.beginPath();
+
+ var offsetStart = 0;
+ var offsetEnd = 0;
+
+ if ( curRectMode == p.CORNERS )
+ {
+ width -= x;
+ height -= y;
+ }
+
+ if ( curRectMode == p.RADIUS )
+ {
+ width *= 2;
+ height *= 2;
+ }
+
+ if ( curRectMode == p.CENTER || curRectMode == p.RADIUS )
+ {
+ x -= width / 2;
+ y -= height / 2;
+ }
+
+ curContext.rect(
+ Math.round( x ) - offsetStart,
+ Math.round( y ) - offsetStart,
+ Math.round( width ) + offsetEnd,
+ Math.round( height ) + offsetEnd
+ );
+
+ if ( doFill )
+ curContext.fill();
+
+ if ( doStroke )
+ curContext.stroke();
+
+ curContext.closePath();
+ }
+
+ p.ellipse = function ellipse( x, y, width, height )
+ {
+ x = x || 0;
+ y = y || 0;
+
+ if ( width <= 0 && height <= 0 )
+ return;
+
+ curContext.beginPath();
+
+ if ( curEllipseMode == p.RADIUS )
+ {
+ width *= 2;
+ height *= 2;
+ }
+
+ var offsetStart = 0;
+
+ // Shortcut for drawing a circle
+ if ( width == height )
+ curContext.arc( x - offsetStart, y - offsetStart, width / 2, 0, Math.PI * 2, false );
+
+ if ( doFill )
+ curContext.fill();
+
+ if ( doStroke )
+ curContext.stroke();
+
+ curContext.closePath();
+ }
+
+ p.link = function( href, target )
+ {
+ window.location = href;
+ }
+
+ p.loadPixels = function()
+ {
+ p.pixels = buildImageObject( curContext.getImageData(0, 0, p.width, p.height) ).pixels;
+ }
+
+ p.updatePixels = function()
+ {
+ var colors = /(\d+),(\d+),(\d+),(\d+)/;
+ var pixels = {};
+ var data = pixels.data = [];
+ pixels.width = p.width;
+ pixels.height = p.height;
+
+ var pos = 0;
+
+ for ( var i = 0, l = p.pixels.length; i < l; i++ ) {
+ var c = (p.pixels[i] || "rgba(0,0,0,1)").match(colors);
+ data[pos] = parseInt(c[1]);
+ data[pos+1] = parseInt(c[2]);
+ data[pos+2] = parseInt(c[3]);
+ data[pos+3] = parseFloat(c[4]) * 100;
+ pos += 4;
+ }
+
+ curContext.putImageData(pixels, 0, 0);
+ }
+
+ p.extendClass = function extendClass( obj, args, fn )
+ {
+ if ( arguments.length == 3 )
+ {
+ fn.apply( obj, args );
+ }
+ else
+ {
+ args.call( obj );
+ }
+ }
+
+ p.addMethod = function addMethod( object, name, fn )
+ {
+ if ( object[ name ] )
+ {
+ var args = fn.length;
+
+ var oldfn = object[ name ];
+ object[ name ] = function()
+ {
+ if ( arguments.length == args )
+ return fn.apply( this, arguments );
+ else
+ return oldfn.apply( this, arguments );
+ };
+ }
+ else
+ {
+ object[ name ] = fn;
+ }
+ }
+
+ p.init = function init(code){
+ p.stroke( 0 );
+ p.fill( 255 );
+
+ // Canvas has trouble rendering single pixel stuff on whole-pixel
+ // counts, so we slightly offset it (this is super lame).
+ curContext.translate( 0.5, 0.5 );
+
+ if ( code )
+ {
+ (function(Processing){with (p){
+ eval(parse(code, p));
+ }})(p);
+ }
+
+ if ( p.setup )
+ {
+ inSetup = true;
+ p.setup();
+ }
+
+ inSetup = false;
+
+ if ( p.draw )
+ {
+ if ( !doLoop )
+ {
+ p.redraw();
+ }
+ else
+ {
+ p.loop();
+ }
+ }
+
+ attach( curElement, "mousemove", function(e)
+ {
+ p.pmouseX = p.mouseX;
+ p.pmouseY = p.mouseY;
+ p.mouseX = e.clientX - curElement.offsetLeft;
+ p.mouseY = e.clientY - curElement.offsetTop;
+
+ if ( p.mouseMoved )
+ {
+ p.mouseMoved();
+ }
+
+ if ( mousePressed && p.mouseDragged )
+ {
+ p.mouseDragged();
+ }
+ });
+
+ attach( curElement, "mousedown", function(e)
+ {
+ mousePressed = true;
+
+ if ( typeof p.mousePressed == "function" )
+ {
+ p.mousePressed();
+ }
+ else
+ {
+ p.mousePressed = true;
+ }
+ });
+
+ attach( curElement, "mouseup", function(e)
+ {
+ mousePressed = false;
+
+ if ( typeof p.mousePressed != "function" )
+ {
+ p.mousePressed = false;
+ }
+
+ if ( p.mouseReleased )
+ {
+ p.mouseReleased();
+ }
+ });
+
+ attach( document, "keydown", function(e)
+ {
+ keyPressed = true;
+
+ p.key = e.keyCode + 32;
+
+ if ( e.shiftKey )
+ {
+ p.key = String.fromCharCode(p.key).toUpperCase().charCodeAt(0);
+ }
+
+ if ( typeof p.keyPressed == "function" )
+ {
+ p.keyPressed();
+ }
+ else
+ {
+ p.keyPressed = true;
+ }
+ });
+
+ attach( document, "keyup", function(e)
+ {
+ keyPressed = false;
+
+ if ( typeof p.keyPressed != "function" )
+ {
+ p.keyPressed = false;
+ }
+
+ if ( p.keyReleased )
+ {
+ p.keyReleased();
+ }
+ });
+
+ function attach(elem, type, fn)
+ {
+ if ( elem.addEventListener )
+ elem.addEventListener( type, fn, false );
+ else
+ elem.attachEvent( "on" + type, fn );
+ }
+ };
+
+ return p;
+}
+
+})();
diff --git a/trunk/infrastructure/ace/www/profiler.js b/trunk/infrastructure/ace/www/profiler.js
new file mode 100644
index 0000000..24b68a2
--- /dev/null
+++ b/trunk/infrastructure/ace/www/profiler.js
@@ -0,0 +1,117 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// author: David Greenspan
+// a basic profiler
+// e.g. var p = PROFILER("somename", true);
+// p.mark("abc"); abc();
+// p.mark("xyz"); var x = xyz();
+// p.literal(x, "someNumber");
+// p.end();
+
+// Note that IE/Win only has 16 ms time resolution for each run.
+
+var _profilersByName = {};
+function PROFILER(name, enabled) {
+ if (!_profilersByName['$'+name]) {
+ _profilersByName['$'+name] = _makeProfiler(name, enabled);
+ }
+ var p = _profilersByName['$'+name];
+ p.start();
+ return p;
+}
+
+function resetProfiler(name) {
+ delete _profilersByName['$'+name];
+}
+
+function _makeProfiler(name, enabled) {
+ enabled = (enabled !== false);
+
+ var _profileTime;
+ var _profileResults;
+ var _profileTotal;
+ var _profileHistory = [];
+ var running = false;
+
+ function profileStart(name) {
+ _profileResults = [];
+ _profileTotal = 0;
+ if (name) _profileResults.push(name);
+ running = true;
+ _profileTime = (new Date()).getTime();
+ }
+
+ function profileMark(name) {
+ var stopTime = (new Date()).getTime();
+ var dt = stopTime - _profileTime;
+ _profileResults.push(dt);
+ _profileTotal += dt;
+ if (name) _profileResults.push(name);
+ _profileTime = (new Date()).getTime();
+ }
+
+ function profileLiteral(value, name) {
+ _profileResults.push(value);
+ if (name) _profileResults.push("%="+name);
+ }
+
+ function profileEnd(name) {
+ if (running == false) return;
+ var stopTime = (new Date()).getTime();
+ var dt = stopTime - _profileTime;
+ _profileResults.push(dt);
+ _profileTotal += dt;
+ if (name) _profileResults.push(name);
+ _profileResults.unshift(_profileTotal,"=");
+ _profileHistory.push(_profileResults);
+ if (dumpProfileDataTimeout)
+ top.clearTimeout(dumpProfileDataTimeout);
+ dumpProfileDataTimeout = top.setTimeout(dumpProfileData, 800);
+ running = false;
+ }
+
+ var dumpProfileDataTimeout = null;
+
+ function dumpProfileData() {
+ var data = _profileHistory[0].slice();
+ forEach(_profileHistory.slice(1), function (h) {
+ forEach(h, function (x, i) {
+ if ((typeof x) == "number") data[i] += x;
+ });
+ });
+ data = map(data, function (x) {
+ if ((typeof x) == "number") return String(x/_profileHistory.length).substring(0,4);
+ return x;
+ });
+ data.push("("+_profileHistory.length+")");
+ top.pad.dmesg(data.join(" ").replace(/ %/g,''));
+ dumpProfileDataTimeout = null;
+ }
+
+ function noop() {}
+ function cancel() {
+ running = false;
+ }
+
+ if (enabled) {
+ return {start:profileStart, mark:profileMark, literal:profileLiteral, end:profileEnd,
+ cancel:cancel};
+ }
+ else {
+ return {start:noop, mark:noop, literal:noop, end:noop, cancel:noop};
+ }
+}
diff --git a/trunk/infrastructure/ace/www/skiplist.js b/trunk/infrastructure/ace/www/skiplist.js
new file mode 100644
index 0000000..e6c2e04
--- /dev/null
+++ b/trunk/infrastructure/ace/www/skiplist.js
@@ -0,0 +1,347 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+function newSkipList() {
+ var PROFILER = window.PROFILER;
+ if (!PROFILER) {
+ PROFILER = function() { return {start:noop, mark:noop, literal:noop, end:noop, cancel:noop}; };
+ }
+ function noop() {}
+
+ // if there are N elements in the skiplist, "start" is element -1 and "end" is element N
+ var start = {key:null, levels: 1, upPtrs:[null], downPtrs:[null], downSkips:[1], downSkipWidths:[0]};
+ var end = {key:null, levels: 1, upPtrs:[null], downPtrs:[null], downSkips:[null], downSkipWidths:[null]};
+ var numNodes = 0;
+ var totalWidth = 0;
+ var keyToNodeMap = {};
+ start.downPtrs[0] = end;
+ end.upPtrs[0] = start;
+ // a "point" object at location x allows modifications immediately after the first
+ // x elements of the skiplist, such as multiple inserts or deletes.
+ // After an insert or delete using point P, the point is still valid and points
+ // to the same index in the skiplist. Other operations with other points invalidate
+ // this point.
+ function _getPoint(targetLoc) {
+ var numLevels = start.levels;
+ var lvl = numLevels-1;
+ var i = -1, ws = 0;
+ var nodes = new Array(numLevels);
+ var idxs = new Array(numLevels);
+ var widthSkips = new Array(numLevels);
+ nodes[lvl] = start;
+ idxs[lvl] = -1;
+ widthSkips[lvl] = 0;
+ while (lvl >= 0) {
+ var n = nodes[lvl];
+ while (n.downPtrs[lvl] &&
+ (i + n.downSkips[lvl] < targetLoc)) {
+ i += n.downSkips[lvl];
+ ws += n.downSkipWidths[lvl];
+ n = n.downPtrs[lvl];
+ }
+ nodes[lvl] = n;
+ idxs[lvl] = i;
+ widthSkips[lvl] = ws;
+ lvl--;
+ if (lvl >= 0) {
+ nodes[lvl] = n;
+ }
+ }
+ return {nodes:nodes, idxs:idxs, loc:targetLoc, widthSkips:widthSkips, toString: function() {
+ return "getPoint("+targetLoc+")"; } };
+ }
+ function _getNodeAtOffset(targetOffset) {
+ var i = 0;
+ var n = start;
+ var lvl = start.levels-1;
+ while (lvl >= 0 && n.downPtrs[lvl]) {
+ while (n.downPtrs[lvl] && (i + n.downSkipWidths[lvl] <= targetOffset)) {
+ i += n.downSkipWidths[lvl];
+ n = n.downPtrs[lvl];
+ }
+ lvl--;
+ }
+ if (n === start) return (start.downPtrs[0] || null);
+ else if (n === end) return (targetOffset == totalWidth ? (end.upPtrs[0] || null) : null);
+ return n;
+ }
+ function _entryWidth(e) { return (e && e.width) || 0; }
+ function _insertKeyAtPoint(point, newKey, entry) {
+ var p = PROFILER("insertKey", false);
+ var newNode = {key:newKey, levels: 0, upPtrs:[], downPtrs:[], downSkips:[], downSkipWidths:[]};
+ p.mark("donealloc");
+ var pNodes = point.nodes;
+ var pIdxs = point.idxs;
+ var pLoc = point.loc;
+ var widthLoc = point.widthSkips[0] + point.nodes[0].downSkipWidths[0];
+ var newWidth = _entryWidth(entry);
+ p.mark("loop1");
+ while (newNode.levels == 0 || Math.random() < 0.01) {
+ var lvl = newNode.levels;
+ newNode.levels++;
+ if (lvl == pNodes.length) {
+ // assume we have just passed the end of point.nodes, and reached one level greater
+ // than the skiplist currently supports
+ pNodes[lvl] = start;
+ pIdxs[lvl] = -1;
+ start.levels++;
+ end.levels++;
+ start.downPtrs[lvl] = end;
+ end.upPtrs[lvl] = start;
+ start.downSkips[lvl] = numNodes+1;
+ start.downSkipWidths[lvl] = totalWidth;
+ point.widthSkips[lvl] = 0;
+ }
+ var me = newNode;
+ var up = pNodes[lvl];
+ var down = up.downPtrs[lvl];
+ var skip1 = pLoc - pIdxs[lvl];
+ var skip2 = up.downSkips[lvl] + 1 - skip1;
+ up.downSkips[lvl] = skip1;
+ up.downPtrs[lvl] = me;
+ me.downSkips[lvl] = skip2;
+ me.upPtrs[lvl] = up;
+ me.downPtrs[lvl] = down;
+ down.upPtrs[lvl] = me;
+ var widthSkip1 = widthLoc - point.widthSkips[lvl];
+ var widthSkip2 = up.downSkipWidths[lvl] + newWidth - widthSkip1;
+ up.downSkipWidths[lvl] = widthSkip1;
+ me.downSkipWidths[lvl] = widthSkip2;
+ }
+ p.mark("loop2");
+ p.literal(pNodes.length, "PNL");
+ for(var lvl=newNode.levels; lvl<pNodes.length; lvl++) {
+ var up = pNodes[lvl];
+ up.downSkips[lvl]++;
+ up.downSkipWidths[lvl] += newWidth;
+ }
+ p.mark("map");
+ keyToNodeMap['$KEY$'+newKey] = newNode;
+ numNodes++;
+ totalWidth += newWidth;
+ p.end();
+ }
+ function _getNodeAtPoint(point) {
+ return point.nodes[0].downPtrs[0];
+ }
+ function _incrementPoint(point) {
+ point.loc++;
+ for(var i=0;i<point.nodes.length;i++) {
+ if (point.idxs[i] + point.nodes[i].downSkips[i] < point.loc) {
+ point.idxs[i] += point.nodes[i].downSkips[i];
+ point.widthSkips[i] += point.nodes[i].downSkipWidths[i];
+ point.nodes[i] = point.nodes[i].downPtrs[i];
+ }
+ }
+ }
+ function _deleteKeyAtPoint(point) {
+ var elem = point.nodes[0].downPtrs[0];
+ var elemWidth = _entryWidth(elem.entry);
+ for(var i=0;i<point.nodes.length;i++) {
+ if (i < elem.levels) {
+ var up = elem.upPtrs[i];
+ var down = elem.downPtrs[i];
+ var totalSkip = up.downSkips[i] + elem.downSkips[i] - 1;
+ up.downPtrs[i] = down;
+ down.upPtrs[i] = up;
+ up.downSkips[i] = totalSkip;
+ var totalWidthSkip = up.downSkipWidths[i] + elem.downSkipWidths[i] - elemWidth;
+ up.downSkipWidths[i] = totalWidthSkip;
+ }
+ else {
+ var up = point.nodes[i];
+ var down = up.downPtrs[i];
+ up.downSkips[i]--;
+ up.downSkipWidths[i] -= elemWidth;
+ }
+ }
+ delete keyToNodeMap['$KEY$'+elem.key];
+ numNodes--;
+ totalWidth -= elemWidth;
+ }
+ function _propagateWidthChange(node) {
+ var oldWidth = node.downSkipWidths[0];
+ var newWidth = _entryWidth(node.entry);
+ var widthChange = newWidth - oldWidth;
+ var n = node;
+ var lvl = 0;
+ while (lvl < n.levels) {
+ n.downSkipWidths[lvl] += widthChange;
+ lvl++;
+ while (lvl >= n.levels && n.upPtrs[lvl-1]) {
+ n = n.upPtrs[lvl-1];
+ }
+ }
+ totalWidth += widthChange;
+ }
+ function _getNodeIndex(node, byWidth) {
+ var dist = (byWidth ? 0 : -1);
+ var n = node;
+ while (n !== start) {
+ var lvl = n.levels-1;
+ n = n.upPtrs[lvl];
+ if (byWidth) dist += n.downSkipWidths[lvl];
+ else dist += n.downSkips[lvl];
+ }
+ return dist;
+ }
+ /*function _debugToString() {
+ var array = [start];
+ while (array[array.length-1] !== end) {
+ array[array.length] = array[array.length-1].downPtrs[0];
+ }
+ function getIndex(node) {
+ if (!node) return null;
+ for(var i=0;i<array.length;i++) {
+ if (array[i] === node)
+ return i-1;
+ }
+ return false;
+ }
+ var processedArray = map(array, function(node) {
+ var x = {key:node.key, levels: node.levels, downSkips: node.downSkips,
+ upPtrs: map(node.upPtrs, getIndex), downPtrs: map(node.downPtrs, getIndex),
+ downSkipWidths: node.downSkipWidths};
+ return x;
+ });
+ return map(processedArray, function (x) { return x.toSource(); }).join("\n");
+ }*/
+
+ function _getNodeByKey(key) {
+ return keyToNodeMap['$KEY$'+key];
+ }
+
+ // Returns index of first entry such that entryFunc(entry) is truthy,
+ // or length() if no such entry. Assumes all falsy entries come before
+ // all truthy entries.
+ function _search(entryFunc) {
+ var low = start;
+ var lvl = start.levels-1;
+ var lowIndex = -1;
+ function f(node) {
+ if (node === start) return false;
+ else if (node === end) return true;
+ else return entryFunc(node.entry);
+ }
+ while (lvl >= 0) {
+ var nextLow = low.downPtrs[lvl];
+ while (!f(nextLow)) {
+ lowIndex += low.downSkips[lvl];
+ low = nextLow;
+ nextLow = low.downPtrs[lvl];
+ }
+ lvl--;
+ }
+ return lowIndex+1;
+ }
+
+/*
+The skip-list contains "entries", JavaScript objects that each must have a unique "key" property
+that is a string.
+*/
+ var self = {
+ length: function() { return numNodes; },
+ atIndex: function(i) {
+ if (i < 0) console.warn("atIndex("+i+")");
+ if (i >= numNodes) console.warn("atIndex("+i+">="+numNodes+")");
+ return _getNodeAtPoint(_getPoint(i)).entry;
+ },
+ // differs from Array.splice() in that new elements are in an array, not varargs
+ splice: function(start, deleteCount, newEntryArray) {
+ if (start < 0) console.warn("splice("+start+", ...)");
+ if (start + deleteCount > numNodes) {
+ console.warn("splice("+start+", "+deleteCount+", ...), N="+numNodes);
+ console.warn("%s %s %s", typeof start, typeof deleteCount, typeof numNodes);
+ console.trace();
+ }
+
+ if (! newEntryArray) newEntryArray = [];
+ var pt = _getPoint(start);
+ for(var i=0;i<deleteCount;i++) {
+ _deleteKeyAtPoint(pt);
+ }
+ for(var i=(newEntryArray.length-1);i>=0;i--) {
+ var entry = newEntryArray[i];
+ _insertKeyAtPoint(pt, entry.key, entry);
+ var node = _getNodeByKey(entry.key);
+ node.entry = entry;
+ }
+ },
+ next: function (entry) {
+ return _getNodeByKey(entry.key).downPtrs[0].entry || null;
+ },
+ prev: function (entry) {
+ return _getNodeByKey(entry.key).upPtrs[0].entry || null;
+ },
+ push: function(entry) {
+ self.splice(numNodes, 0, [entry]);
+ },
+ slice: function(start, end) {
+ // act like Array.slice()
+ if (start === undefined) start = 0;
+ else if (start < 0) start += numNodes;
+ if (end === undefined) end = numNodes;
+ else if (end < 0) end += numNodes;
+
+ if (start < 0) start = 0;
+ if (start > numNodes) start = numNodes;
+ if (end < 0) end = 0;
+ if (end > numNodes) end = numNodes;
+
+ dmesg(String([start,end,numNodes]));
+ if (end <= start) return [];
+ var n = self.atIndex(start);
+ var array = [n];
+ for(var i=1;i<(end-start);i++) {
+ n = self.next(n);
+ array.push(n);
+ }
+ return array;
+ },
+ atKey: function(key) { return _getNodeByKey(key).entry; },
+ indexOfKey: function(key) { return _getNodeIndex(_getNodeByKey(key)); },
+ indexOfEntry: function (entry) { return self.indexOfKey(entry.key); },
+ containsKey: function(key) { return !!(_getNodeByKey(key)); },
+ // gets the last entry starting at or before the offset
+ atOffset: function(offset) { return _getNodeAtOffset(offset).entry; },
+ keyAtOffset: function(offset) { return self.atOffset(offset).key; },
+ offsetOfKey: function(key) { return _getNodeIndex(_getNodeByKey(key), true); },
+ offsetOfEntry: function(entry) { return self.offsetOfKey(entry.key); },
+ setEntryWidth: function(entry, width) { entry.width = width; _propagateWidthChange(_getNodeByKey(entry.key)); },
+ totalWidth: function() { return totalWidth; },
+ offsetOfIndex: function(i) {
+ if (i < 0) return 0;
+ if (i >= numNodes) return totalWidth;
+ return self.offsetOfEntry(self.atIndex(i));
+ },
+ indexOfOffset: function(offset) {
+ if (offset <= 0) return 0;
+ if (offset >= totalWidth) return numNodes;
+ return self.indexOfEntry(self.atOffset(offset));
+ },
+ search: function(entryFunc) {
+ return _search(entryFunc);
+ },
+ //debugToString: _debugToString,
+ debugGetPoint: _getPoint,
+ debugDepth: function() { return start.levels; }
+ }
+ return self;
+}
diff --git a/trunk/infrastructure/ace/www/spanlist.js b/trunk/infrastructure/ace/www/spanlist.js
new file mode 100644
index 0000000..756a411
--- /dev/null
+++ b/trunk/infrastructure/ace/www/spanlist.js
@@ -0,0 +1,279 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+function newSpanList() {
+ function encodeInt(num) {
+ num = num & 0x1fffffff;
+ // neither 16-bit char can be 0x0001 or mistakable for the other
+ return String.fromCharCode(((num >> 15) & 0x3fff) | 0x4000) +
+ String.fromCharCode((num & 0x7fff) | 0x8000);
+ }
+ function decodeInt(str) {
+ return ((str.charCodeAt(0) & 0x3fff) << 15) | (str.charCodeAt(1) & 0x7fff);
+ }
+ function indexOfInt(str, n) {
+ var result = str.indexOf(encodeInt(n));
+ if (result < 0) return result;
+ return result/2;
+ }
+ function intAt(str, i) {
+ var idx = i*2;
+ return decodeInt(str.substr(idx, 2));
+ }
+ function numInts(str) { return str.length/2; }
+ function subrange(str, start, end) {
+ return str.substring(start*2, end*2);
+ }
+ var nil = "\1\1";
+ var repeatNilCache = [''];
+ function repeatNil(times) {
+ while (times >= repeatNilCache.length) {
+ repeatNilCache.push(repeatNilCache[repeatNilCache.length-1] + nil);
+ }
+ return repeatNilCache[times];
+ }
+ function indexOfNonnil(str, start) {
+ startIndex = (start || 0)*2;
+ var nonnilChar = /[^\1]/g;
+ nonnilChar.lastIndex = startIndex;
+ var result = nonnilChar.exec(str);
+ if (! result) {
+ return str.length/2;
+ }
+ return (nonnilChar.lastIndex - 1)/2;
+ }
+ function intSplice(str, start, delCount, newStr) {
+ return str.substring(0, start*2) + newStr + str.substring((start+delCount)*2);
+ }
+
+ function entryWidth(entry) {
+ if ((typeof entry) == "number") return entry;
+ return (entry && entry.width) || 1;
+ }
+
+ // "func" is a function over 0..(numItems-1) that is monotonically
+ // "increasing" with index (false, then true). Finds the boundary
+ // between false and true, a number between 0 and numItems inclusive.
+ function binarySearch(numItems, func) {
+ if (numItems < 1) return 0;
+ if (func(0)) return 0;
+ if (! func(numItems-1)) return numItems;
+ var low = 0; // func(low) is always false
+ var high = numItems-1; // func(high) is always true
+ while ((high - low) > 1) {
+ var x = Math.floor((low+high)/2); // x != low, x != high
+ if (func(x)) high = x;
+ else low = x;
+ }
+ return high;
+ }
+
+ var NEXT_ID = 1;
+ var entryList = ""; // e.g. 2, 4, 3, 6
+ var charList = ""; // e.g. nil, nil, nil, 2, nil, 4, nil, nil, nil, nil, 3, 6
+ var keyToId = {};
+ var idToKey = {};
+ var idToEntry = {};
+ var idToNextId = {};
+ var idToPrevId = {};
+ var length = 0;
+ var totalWidth = 0;
+
+ function idAtIndex(i) { return intAt(entryList, i); }
+ function indexOfId(id) { return indexOfInt(entryList, id); }
+ function offsetOfId(id) {
+ if (! id) return totalWidth;
+ var entry = idToEntry[id];
+ var wid = entryWidth(entry);
+ var lastCharLoc = indexOfInt(charList, id);
+ return lastCharLoc + 1 - wid;
+ }
+ function idAtOffset(n) {
+ return intAt(charList, indexOfNonnil(charList, n));
+ }
+
+ var self = {
+ length: function() { return length; },
+ totalWidth: function() { return totalWidth; },
+ next: function (entryOrKey) {
+ if ((typeof entryOrKey) == "object") {
+ var entry = entryOrKey;
+ var id = idToNextId[keyToId[entry.key]];
+ if (id) return idToEntry[id];
+ return null;
+ }
+ else {
+ var k = entryOrKey;
+ var id = idToNextId[keyToId[k]];
+ if (id) return idToKey[id];
+ return null;
+ }
+ },
+ prev: function (entryOrKey) {
+ if ((typeof entryOrKey) == "object") {
+ var entry = entryOrKey;
+ var id = idToPrevId[keyToId[entry.key]];
+ if (id) return idToEntry[id];
+ return null;
+ }
+ else {
+ var k = entryOrKey;
+ var id = idToPrevId[keyToId[k]];
+ if (id) return idToKey[id];
+ return null;
+ }
+ },
+ atKey: function (k) { return idToEntry[keyToId[k]]; },
+ atIndex: function (i) { return idToEntry[idAtIndex(i)]; },
+ keyAtIndex: function(i) { return idToKey[idAtIndex(i)]; },
+ keyAtOffset: function(n) { return idToKey[idAtOffset(n)]; },
+ containsKey: function (k) { return !! keyToId[k]; },
+ indexOfKey: function (k) { return indexOfId(keyToId[k]); },
+ indexOfEntry: function (entry) { return self.indexOfKey(entry.key); },
+ setKeyWidth: function (k, width) {
+ var id = keyToId[k];
+ var charStart = offsetOfId(id);
+ var oldWidth = entryWidth(idToEntry[id]);
+ var toDelete = 0;
+ var toInsert = 0;
+ if (width < oldWidth) toDelete = oldWidth - width;
+ else if (width > oldWidth) toInsert = width - oldWidth;
+ charList = intSplice(charList, charStart, toDelete, repeatNil(toInsert));
+ totalWidth += (width - oldWidth);
+ },
+ setEntryWidth: function (entry, width) {
+ return self.setKeyWidth(entry.key, width);
+ },
+ getEntryWidth: function (entry) {
+ return entryWidth(entry);
+ },
+ getKeyWidth: function (k) {
+ return entryWidth(idToEntry[keyToId[k]]);
+ },
+ offsetOfKey: function(k) { return offsetOfId(keyToId[k]); },
+ offsetOfEntry: function(entry) { return self.offsetOfKey(entry.key); },
+ offsetOfIndex: function (i) {
+ if (i < 0) return 0;
+ else if (i >= length) {
+ return totalWidth;
+ }
+ else {
+ return offsetOfId(idAtIndex(i));
+ }
+ },
+ atOffset: function (n) {
+ return idToEntry[idAtOffset(n)];
+ },
+ indexOfOffset: function (n) {
+ if (n < 0) return 0;
+ else if (n >= totalWidth) return length;
+ return indexOfId(idAtOffset(n));
+ },
+ search: function(entryFunc) {
+ return binarySearch(length, function (i) {
+ return entryFunc(idToEntry[idAtIndex(i)]);
+ });
+ },
+ push: function(entry, optKey) {
+ self.splice(length, 0, [entry], (optKey && [optKey]));
+ },
+ // entries can be objects with a 'key' property, possibly a 'width' property,
+ // and any other properties; OR they can be just a width number, for an
+ // ultra-light-weight representation. In the latter case the key array is
+ // used to get the keys. Some functions become useless with this usage, i.e.
+ // the ones that use an entry for identity.
+ splice: function (start, deleteCount, newEntryArray, optKeyArray) {
+ var charStart = self.offsetOfIndex(start);
+ var charsToDelete = 0;
+ var idBefore = ((start == 0) ? null : intAt(entryList, start-1));
+ // idAfter is mutated into id of node following deleted nodes
+ var idAfter = ((start == length) ? null : (idBefore ? idToNextId[idBefore] :
+ intAt(entryList, start)));
+ if (deleteCount > 0) {
+ var deleteId = idAfter;
+ for(var i=0;i<deleteCount;i++) {
+ var nextId = idToNextId[deleteId];
+ var entry = idToEntry[deleteId];
+ var wid = entryWidth(entry);
+ delete keyToId[idToKey[deleteId]];
+ delete idToKey[deleteId];
+ delete idToEntry[deleteId];
+ delete idToNextId[deleteId];
+ delete idToPrevId[deleteId];
+ length--;
+ totalWidth -= wid;
+ charsToDelete += wid;
+ deleteId = nextId;
+ }
+ idAfter = (deleteId || null);
+ }
+ var newChars = [];
+ var newIds = [];
+ var prevId = idBefore;
+ if (newEntryArray && newEntryArray.length > 0) {
+ for(var i=0,n=newEntryArray.length; i<n; i++) {
+ var entry = newEntryArray[i];
+ var newId = (NEXT_ID++);
+ var encId = encodeInt(newId);
+ newIds.push(encId);
+ var wid = entryWidth(entry);
+ newChars.push(repeatNil(wid-1), encId);
+ var key = (optKeyArray ? optKeyArray[i] : entry.key);
+ keyToId[key] = newId;
+ idToKey[newId] = key;
+ idToEntry[newId] = entry;
+ if (prevId) {
+ idToNextId[prevId] = newId;
+ idToPrevId[newId] = prevId;
+ }
+ prevId = newId;
+ length++;
+ totalWidth += wid;
+ }
+ if (prevId && idAfter) {
+ idToNextId[prevId] = idAfter;
+ idToPrevId[idAfter] = prevId;
+ }
+ }
+ else {
+ if (idBefore && idAfter) {
+ idToNextId[idBefore] = idAfter;
+ idToPrevId[idAfter] = idBefore;
+ }
+ else if (idBefore) delete idToNextId[idBefore];
+ else if (idAfter) delete idToPrevId[idAfter];
+ }
+ entryList = intSplice(entryList, start, deleteCount, newIds.join(''));
+ charList = intSplice(charList, charStart, charsToDelete, newChars.join(''));
+
+ if (length > 0) {
+ // checkrep
+ if (idToPrevId[idAtIndex(0)]) console.error("a");
+ if (idToNextId[idAtIndex(length-1)]) console.error("b");
+ for(var i=0;i<length-1;i++) {
+ if (idToNextId[idAtIndex(i)] != idAtIndex(i+1)) console.error("c"+i);
+ }
+ for(var i=1;i<length;i++) {
+ if (idToPrevId[idAtIndex(i)] != idAtIndex(i-1)) console.error("d"+i);
+ }
+ }
+ }
+ };
+
+ return self;
+}
+
diff --git a/trunk/infrastructure/ace/www/syntax-new.css b/trunk/infrastructure/ace/www/syntax-new.css
new file mode 100644
index 0000000..30f1823
--- /dev/null
+++ b/trunk/infrastructure/ace/www/syntax-new.css
@@ -0,0 +1,35 @@
+.syntax .t1 {font-style:italic;color:#2AC300;}
+.syntax .t2 {color:#CC6633;}
+.syntax .t3 {font-weight:bold;color:#6699FF;}
+.syntax .t4 {color:#A700CC;}
+.syntax .t5 {color:#000000;}
+.syntax .t6 {font-weight:bold;color:#000CFF;}
+.syntax .t7 {color:#318495;}
+.syntax .t8 {color:#33CC33;}
+.syntax .t9 {color:#1A921C;}
+.syntax .t10 {font-weight:bold;color:#0C450D;}
+.syntax .t11 {font-weight:bold;color:#000099;}
+.syntax .t12 {}
+.syntax .t13 {}
+.syntax .t14 {}
+.syntax .t15 {color:#70727E;}
+.syntax .t16 {font-style:italic;color:#000000;}
+.syntax .t17 {color:#990099;}
+.syntax .t18 {color:#CC6633;}
+.syntax .t19 {color:#990099;}
+.syntax .t20 {color:#CC6633;}
+.syntax .t21 {color:#000000;}
+.syntax .t22 {color:#990000;font-weight:bold;}
+.syntax .t23 {}
+.syntax .t24 {}
+.syntax .t25 {}
+.syntax .t26 {color:#68685B;}
+.syntax .t27 {color:#888888;}
+.syntax .t28 {font-style:italic;}
+.syntax .t29 {color:#1C02FF;}
+.syntax .t30 {font-weight:bold;}
+.syntax .t31 {font-style:italic;}
+.syntax .t32 {font-weight:bold;color:#0C07FF;}
+.syntax .t33 {font-style:italic;color:#000000;}
+.syntax .t34 {color:#B90690;}
+.syntax .t35 {color:#666666;}
diff --git a/trunk/infrastructure/ace/www/syntax.css b/trunk/infrastructure/ace/www/syntax.css
new file mode 100644
index 0000000..e018320
--- /dev/null
+++ b/trunk/infrastructure/ace/www/syntax.css
@@ -0,0 +1,32 @@
+/* ---------- Used by JavaScript Lexer ---------- */
+.syntax .c { color: #bd3f00; font-style: italic } /* Comment */
+.syntax .o { font-weight: bold; } /* Operator */
+.syntax .p { font-weight: bold; } /* Punctuation */
+.syntax .k { color: blue; } /* Keyword */
+.syntax .kc { color: purple } /* Keyword.Constant */
+.syntax .nx { } /* Name.Other */
+.syntax .mf { color: purple } /* Literal.Number.Float */
+.syntax .mh { color: purple } /* Literal.Number.Hex */
+.syntax .mi { color: purple } /* Literal.Number.Integer */
+.syntax .sr { color: purple } /* Literal.String.Regex */
+.syntax .s2 { color: purple } /* Literal.String.Double */
+.syntax .s1 { color: purple } /* Literal.String.Single */
+.syntax .sd { color: purple } /* Literal.String.Doc */
+.syntax .cs { color: #00aa33; font-weight: bold; font-style: italic } /* Comment.Special */
+.syntax .err { color: #cc0000; font-weight: bold; text-decoration: underline; } /* Error */
+
+/* css */
+.syntax .nt { font-weight: bold; } /* tag */
+.syntax .nc { color: #336; } /* class */
+.syntax .nf { color: #336; } /* id */
+.syntax .nd { color: #999; } /* :foo */
+.syntax .m { color: purple } /* number */
+.syntax .nb { color: purple } /* built-in */
+.syntax .cp { color: #bd3f00; } /* !important */
+
+.syntax .flash { background-color: #adf !important; }
+.syntax .flashbad { background-color: #f55 !important; }
+
+/*.syntax .test { background-color: #0f0; }*/
+/*.syntax .test { background: url(http://dl.getdropbox.com/u/88/blackvert.gif)
+ repeat-y left top; }*/
diff --git a/trunk/infrastructure/ace/www/test.html b/trunk/infrastructure/ace/www/test.html
new file mode 100644
index 0000000..73fa45c
--- /dev/null
+++ b/trunk/infrastructure/ace/www/test.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <head>
+ <script src="bbtree.js"></script>
+ </head>
+ <body>
+ &nbsp;
+ </body>
+</html>
diff --git a/trunk/infrastructure/ace/www/testcode.js b/trunk/infrastructure/ace/www/testcode.js
new file mode 100644
index 0000000..f393335
--- /dev/null
+++ b/trunk/infrastructure/ace/www/testcode.js
@@ -0,0 +1,36 @@
+function getTestCode() {
+ var testCode = [
+'/* appjet:version 0.1 */',
+'(function(){',
+'/*',
+' * jQuery 1.2.1 - New Wave Javascript',
+' *',
+' * Copyright (c) 2007 John Resig (jquery.com)',
+' * Dual licensed under the MIT (MIT-LICENSE.txt)',
+' * and GPL (GPL-LICENSE.txt) licenses.',
+' *',
+' * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $',
+' * $Rev: 3353 $',
+' */',
+'',
+'// Map over jQuery in case of overwrite',
+'if ( typeof jQuery != "undefined" )',
+' var _jQuery = jQuery;',
+'',
+'var jQuery = window.jQuery = function(selector, context) {',
+' // If the context is a namespace object, return a new object',
+' return this instanceof jQuery ?',
+' this.init(selector, context) :',
+' new jQuery(selector, context);',
+'};',
+'',
+'// Map over the $ in case of overwrite',
+'if ( typeof $ != "undefined" )',
+' var _$ = $;',
+' ',
+'// Map the jQuery namespace to the \'$\' one',
+'window.$ = jQuery;',
+'',
+'var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;'].join('\n');
+ return testCode;
+}
diff --git a/trunk/infrastructure/ace/www/toSource.js b/trunk/infrastructure/ace/www/toSource.js
new file mode 100644
index 0000000..bf96df7
--- /dev/null
+++ b/trunk/infrastructure/ace/www/toSource.js
@@ -0,0 +1,274 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ based on: http://www.JSON.org/json2.js
+ 2008-07-15
+*/
+toSource = function () {
+
+ function f(n) {
+ // Format integers to have at least two digits.
+ return n < 10 ? '0' + n : n;
+ }
+
+ Date.prototype.toJSON = function (key) {
+
+ return this.getUTCFullYear() + '-' +
+ f(this.getUTCMonth() + 1) + '-' +
+ f(this.getUTCDate()) + 'T' +
+ f(this.getUTCHours()) + ':' +
+ f(this.getUTCMinutes()) + ':' +
+ f(this.getUTCSeconds()) + 'Z';
+ };
+
+ String.prototype.toJSON =
+ Number.prototype.toJSON =
+ Boolean.prototype.toJSON = function (key) {
+ return this.valueOf();
+ };
+
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ escapeable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ gap,
+ indent,
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ rep;
+
+
+ function quote(string) {
+
+ // If the string contains no control characters, no quote characters, and no
+ // backslash characters, then we can safely slap some quotes around it.
+ // Otherwise we must also replace the offending characters with safe escape
+ // sequences.
+
+ escapeable.lastIndex = 0;
+ return escapeable.test(string) ?
+ '"' + string.replace(escapeable, function (a) {
+ var c = meta[a];
+ if (typeof c === 'string') {
+ return c;
+ }
+ return '\\u' + ('0000' +
+ (+(a.charCodeAt(0))).toString(16)).slice(-4);
+ }) + '"' :
+ '"' + string + '"';
+ }
+
+
+ function str(key, holder) {
+
+ // Produce a string from holder[key].
+
+ var i, // The loop counter.
+ k, // The member key.
+ v, // The member value.
+ length,
+ mind = gap,
+ partial,
+ value = holder[key];
+
+ // If the value has a toJSON method, call it to obtain a replacement value.
+
+ if (value && typeof value === 'object' &&
+ typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+ // If we were called with a replacer function, then call the replacer to
+ // obtain a replacement value.
+
+ if (typeof rep === 'function') {
+ value = rep.call(holder, key, value);
+ }
+
+ // What happens next depends on the value's type.
+
+ switch (typeof value) {
+ case 'string':
+ return quote(value);
+
+ case 'number':
+
+ // JSON numbers must be finite. Encode non-finite numbers as null.
+
+ return isFinite(value) ? String(value) : 'null';
+
+ case 'boolean':
+ case 'null':
+
+ // If the value is a boolean or null, convert it to a string. Note:
+ // typeof null does not produce 'null'. The case is included here in
+ // the remote chance that this gets fixed someday.
+
+ return String(value);
+
+ // If the type is 'object', we might be dealing with an object or an array or
+ // null.
+
+ case 'object':
+
+ // Due to a specification blunder in ECMAScript, typeof null is 'object',
+ // so watch out for that case.
+
+ if (!value) {
+ return 'null';
+ }
+
+ // Make an array to hold the partial results of stringifying this object value.
+
+ gap += indent;
+ partial = [];
+
+ if (!(value instanceof Object)) {
+ function domNodeIndex(nd) {
+ if (nd.parentNode && nd.parentNode.childNodes.length) {
+ var nds = nd.parentNode.childNodes;
+ var i = 0;
+ while (i < nds.length && nds.item(i) !== nd) {
+ i++;
+ }
+ if (i < nds.length) {
+ return "("+i+")";
+ }
+ }
+ return "";
+ }
+ if (value.nodeType == 3) {
+ return "['"+value.nodeValue+domNodeIndex(value)+"']";
+ }
+ else if (value.tagName) {
+ return "["+value.tagName+domNodeIndex(value)+"]";
+ }
+ else {
+ return '(special)';
+ }
+ }
+
+ // If the object has a dontEnum length property, we'll treat it as an array.
+
+ if (typeof value.length === 'number' &&
+ !(value.propertyIsEnumerable('length'))) {
+
+ // The object is an array. Stringify every element. Use null as a placeholder
+ // for non-JSON values.
+
+ length = value.length;
+ for (i = 0; i < length; i += 1) {
+ partial[i] = str(i, value) || 'null';
+ }
+
+ // Join all of the elements together, separated with commas, and wrap them in
+ // brackets.
+
+ v = partial.length === 0 ? '[]' :
+ gap ? '[\n' + gap +
+ partial.join(',\n' + gap) + '\n' +
+ mind + ']' :
+ '[' + partial.join(',') + ']';
+ gap = mind;
+ return v;
+ }
+
+ // If the replacer is an array, use it to select the members to be stringified.
+
+ if (rep && typeof rep === 'object') {
+ length = rep.length;
+ for (i = 0; i < length; i += 1) {
+ k = rep[i];
+ if (typeof k === 'string') {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ } else {
+
+ // Otherwise, iterate through all of the keys in the object.
+
+ for (k in value) {
+ if (Object.hasOwnProperty.call(value, k)) {
+ v = str(k, value);
+ if (v) {
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
+ }
+ }
+ }
+ }
+
+ // Join all of the member texts together, separated with commas,
+ // and wrap them in braces.
+
+ v = partial.length === 0 ? '{}' :
+ gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
+ mind + '}' : '{' + partial.join(',') + '}';
+ gap = mind;
+ return v;
+ }
+ }
+
+ return function (value, replacer, space) {
+
+ // The stringify method takes a value and an optional replacer, and an optional
+ // space parameter, and returns a JSON text. The replacer can be a function
+ // that can replace values, or an array of strings that will select the keys.
+ // A default replacer method can be provided. Use of the space parameter can
+ // produce text that is more easily readable.
+
+ var i;
+ gap = '';
+ indent = '';
+
+ // If the space parameter is a number, make an indent string containing that
+ // many spaces.
+
+ if (typeof space === 'number') {
+ for (i = 0; i < space; i += 1) {
+ indent += ' ';
+ }
+
+ // If the space parameter is a string, it will be used as the indent string.
+
+ } else if (typeof space === 'string') {
+ indent = space;
+ }
+
+ // If there is a replacer, it must be a function or an array.
+ // Otherwise, throw an error.
+
+ rep = replacer;
+ if (replacer && typeof replacer !== 'function' &&
+ (typeof replacer !== 'object' ||
+ typeof replacer.length !== 'number')) {
+ throw new Error('JSON.stringify');
+ }
+
+ // Make a fake root object containing our value under the key of ''.
+ // Return the result of stringifying the value.
+
+ return str('', {'': value});
+ }
+}();
diff --git a/trunk/infrastructure/ace/www/undomodule.js b/trunk/infrastructure/ace/www/undomodule.js
new file mode 100644
index 0000000..b8a56f9
--- /dev/null
+++ b/trunk/infrastructure/ace/www/undomodule.js
@@ -0,0 +1,258 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+undoModule = (function() {
+ var stack = (function() {
+ var stackElements = [];
+ // two types of stackElements:
+ // 1) { elementType: UNDOABLE_EVENT, eventType: "anything", [backset: <changeset>,]
+ // [selStart: <char number>, selEnd: <char number>, selFocusAtStart: <boolean>] }
+ // 2) { elementType: EXTERNAL_CHANGE, changeset: <changeset> }
+ // invariant: no two consecutive EXTERNAL_CHANGEs
+ var numUndoableEvents = 0;
+
+ var UNDOABLE_EVENT = "undoableEvent";
+ var EXTERNAL_CHANGE = "externalChange";
+
+ function clearStack() {
+ stackElements.length = 0;
+ stackElements.push({ elementType: UNDOABLE_EVENT, eventType: "bottom" });
+ numUndoableEvents = 1;
+ }
+ clearStack();
+
+ function pushEvent(event) {
+ var e = extend({}, event);
+ e.elementType = UNDOABLE_EVENT;
+ stackElements.push(e);
+ numUndoableEvents++;
+ //dmesg("pushEvent backset: "+event.backset);
+ }
+
+ function pushExternalChange(cs) {
+ var idx = stackElements.length-1;
+ if (stackElements[idx].elementType == EXTERNAL_CHANGE) {
+ stackElements[idx].changeset = Changeset.compose(stackElements[idx].changeset, cs, getAPool());
+ }
+ else {
+ stackElements.push({elementType: EXTERNAL_CHANGE, changeset: cs});
+ }
+ }
+
+ function _exposeEvent(nthFromTop) {
+ // precond: 0 <= nthFromTop < numUndoableEvents
+ var targetIndex = stackElements.length - 1 - nthFromTop;
+ var idx = stackElements.length - 1;
+ while (idx > targetIndex || stackElements[idx].elementType == EXTERNAL_CHANGE) {
+ if (stackElements[idx].elementType == EXTERNAL_CHANGE) {
+ var ex = stackElements[idx];
+ var un = stackElements[idx-1];
+ if (un.backset) {
+ var excs = ex.changeset;
+ var unbs = un.backset;
+ un.backset = Changeset.follow(excs, un.backset, false, getAPool());
+ ex.changeset = Changeset.follow(unbs, ex.changeset, true, getAPool());
+ if ((typeof un.selStart) == "number") {
+ var newSel = Changeset.characterRangeFollow(excs, un.selStart, un.selEnd);
+ un.selStart = newSel[0];
+ un.selEnd = newSel[1];
+ if (un.selStart == un.selEnd) {
+ un.selFocusAtStart = false;
+ }
+ }
+ }
+ stackElements[idx-1] = ex;
+ stackElements[idx] = un;
+ if (idx >= 2 && stackElements[idx-2].elementType == EXTERNAL_CHANGE) {
+ ex.changeset = Changeset.compose(stackElements[idx-2].changeset,
+ ex.changeset, getAPool());
+ stackElements.splice(idx-2, 1);
+ idx--;
+ }
+ }
+ else {
+ idx--;
+ }
+ }
+ }
+
+ function getNthFromTop(n) {
+ // precond: 0 <= n < numEvents()
+ _exposeEvent(n);
+ return stackElements[stackElements.length - 1 - n];
+ }
+
+ function numEvents() {
+ return numUndoableEvents;
+ }
+
+ function popEvent() {
+ // precond: numEvents() > 0
+ _exposeEvent(0);
+ numUndoableEvents--;
+ return stackElements.pop();
+ }
+
+ return {numEvents:numEvents, popEvent:popEvent, pushEvent: pushEvent,
+ pushExternalChange: pushExternalChange, clearStack: clearStack,
+ getNthFromTop:getNthFromTop};
+ })();
+
+ // invariant: stack always has at least one undoable event
+
+ var undoPtr = 0; // zero-index from top of stack, 0 == top
+
+ function clearHistory() {
+ stack.clearStack();
+ undoPtr = 0;
+ }
+
+ function _charOccurrences(str, c) {
+ var i = 0;
+ var count = 0;
+ while (i >= 0 && i < str.length) {
+ i = str.indexOf(c, i);
+ if (i >= 0) {
+ count++;
+ i++;
+ }
+ }
+ return count;
+ }
+
+ function _opcodeOccurrences(cs, opcode) {
+ return _charOccurrences(Changeset.unpack(cs).ops, opcode);
+ }
+
+ function _mergeChangesets(cs1, cs2) {
+ if (! cs1) return cs2;
+ if (! cs2) return cs1;
+
+ // Rough heuristic for whether changesets should be considered one action:
+ // each does exactly one insertion, no dels, and the composition does also; or
+ // each does exactly one deletion, no ins, and the composition does also.
+ // A little weird in that it won't merge "make bold" with "insert char"
+ // but will merge "make bold and insert char" with "insert char",
+ // though that isn't expected to come up.
+ var plusCount1 = _opcodeOccurrences(cs1, '+');
+ var plusCount2 = _opcodeOccurrences(cs2, '+');
+ var minusCount1 = _opcodeOccurrences(cs1, '-');
+ var minusCount2 = _opcodeOccurrences(cs2, '-');
+ if (plusCount1 == 1 && plusCount2 == 1 && minusCount1 == 0 && minusCount2 == 0) {
+ var merge = Changeset.compose(cs1, cs2, getAPool());
+ var plusCount3 = _opcodeOccurrences(merge, '+');
+ var minusCount3 = _opcodeOccurrences(merge, '-');
+ if (plusCount3 == 1 && minusCount3 == 0) {
+ return merge;
+ }
+ }
+ else if (plusCount1 == 0 && plusCount2 == 0 && minusCount1 == 1 && minusCount2 == 1) {
+ var merge = Changeset.compose(cs1, cs2, getAPool());
+ var plusCount3 = _opcodeOccurrences(merge, '+');
+ var minusCount3 = _opcodeOccurrences(merge, '-');
+ if (plusCount3 == 0 && minusCount3 == 1) {
+ return merge;
+ }
+ }
+ return null;
+ }
+
+ function reportEvent(event) {
+ var topEvent = stack.getNthFromTop(0);
+
+ function applySelectionToTop() {
+ if ((typeof event.selStart) == "number") {
+ topEvent.selStart = event.selStart;
+ topEvent.selEnd = event.selEnd;
+ topEvent.selFocusAtStart = event.selFocusAtStart;
+ }
+ }
+
+ if ((! event.backset) || Changeset.isIdentity(event.backset)) {
+ applySelectionToTop();
+ }
+ else {
+ var merged = false;
+ if (topEvent.eventType == event.eventType) {
+ var merge = _mergeChangesets(event.backset, topEvent.backset);
+ if (merge) {
+ topEvent.backset = merge;
+ //dmesg("reportEvent merge: "+merge);
+ applySelectionToTop();
+ merged = true;
+ }
+ }
+ if (! merged) {
+ stack.pushEvent(event);
+ }
+ undoPtr = 0;
+ }
+
+ }
+
+ function reportExternalChange(changeset) {
+ if (changeset && ! Changeset.isIdentity(changeset)) {
+ stack.pushExternalChange(changeset);
+ }
+ }
+
+ function _getSelectionInfo(event) {
+ if ((typeof event.selStart) != "number") {
+ return null;
+ }
+ else {
+ return {selStart: event.selStart, selEnd: event.selEnd,
+ selFocusAtStart: event.selFocusAtStart};
+ }
+ }
+
+ // For "undo" and "redo", the change event must be returned
+ // by eventFunc and NOT reported through the normal mechanism.
+ // "eventFunc" should take a changeset and an optional selection info object,
+ // or can be called with no arguments to mean that no undo is possible.
+ // "eventFunc" will be called exactly once.
+
+ function performUndo(eventFunc) {
+ if (undoPtr < stack.numEvents()-1) {
+ var backsetEvent = stack.getNthFromTop(undoPtr);
+ var selectionEvent = stack.getNthFromTop(undoPtr+1);
+ var undoEvent = eventFunc(backsetEvent.backset, _getSelectionInfo(selectionEvent));
+ stack.pushEvent(undoEvent);
+ undoPtr += 2;
+ }
+ else eventFunc();
+ }
+
+ function performRedo(eventFunc) {
+ if (undoPtr >= 2) {
+ var backsetEvent = stack.getNthFromTop(0);
+ var selectionEvent = stack.getNthFromTop(1);
+ eventFunc(backsetEvent.backset, _getSelectionInfo(selectionEvent));
+ stack.popEvent();
+ undoPtr -= 2;
+ }
+ else eventFunc();
+ }
+
+ function getAPool() {
+ return undoModule.apool;
+ }
+
+ return {clearHistory:clearHistory, reportEvent:reportEvent, reportExternalChange:reportExternalChange,
+ performUndo:performUndo, performRedo:performRedo, enabled: true,
+ apool: null}; // apool is filled in by caller
+})(); \ No newline at end of file
diff --git a/trunk/infrastructure/ace/www/virtual_lines.js b/trunk/infrastructure/ace/www/virtual_lines.js
new file mode 100644
index 0000000..86e3dea
--- /dev/null
+++ b/trunk/infrastructure/ace/www/virtual_lines.js
@@ -0,0 +1,287 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function makeVirtualLineView(lineNode) {
+
+ // how much to jump forward or backward at once in a charSeeker before
+ // constructing a DOM node and checking the coordinates (which takes a
+ // significant fraction of a millisecond). From the
+ // coordinates and the approximate line height we can estimate how
+ // many lines we have moved. We risk being off if the number of lines
+ // we move is on the order of the line height in pixels. Fortunately,
+ // when the user boosts the font-size they increase both.
+ var maxCharIncrement = 20;
+ var seekerAtEnd = null;
+
+ function getNumChars() {
+ return lineNode.textContent.length;
+ }
+
+ function getNumVirtualLines() {
+ if (! seekerAtEnd) {
+ var seeker = makeCharSeeker();
+ seeker.forwardByWhile(maxCharIncrement);
+ seekerAtEnd = seeker;
+ }
+ return seekerAtEnd.getVirtualLine() + 1;
+ }
+
+ function getVLineAndOffsetForChar(lineChar) {
+ var seeker = makeCharSeeker();
+ seeker.forwardByWhile(maxCharIncrement, null, lineChar);
+ var theLine = seeker.getVirtualLine();
+ seeker.backwardByWhile(8, function() { return seeker.getVirtualLine() == theLine; });
+ seeker.forwardByWhile(1, function() { return seeker.getVirtualLine() != theLine; });
+ var lineStartChar = seeker.getOffset();
+ return {vline:theLine, offset:(lineChar - lineStartChar)};
+ }
+
+ function getCharForVLineAndOffset(vline, offset) {
+ // returns revised vline and offset as well as absolute char index within line.
+ // if offset is beyond end of line, for example, will give new offset at end of line.
+ var seeker = makeCharSeeker();
+ // go to start of line
+ seeker.binarySearch(function() {
+ return seeker.getVirtualLine() >= vline;
+ });
+ var lineStart = seeker.getOffset();
+ var theLine = seeker.getVirtualLine();
+ // go to offset, overshooting the virtual line only if offset is too large for it
+ seeker.forwardByWhile(maxCharIncrement, null, lineStart+offset);
+ // get back into line
+ seeker.backwardByWhile(1, function() { return seeker.getVirtualLine() != theLine; }, lineStart);
+ var lineChar = seeker.getOffset();
+ var theOffset = lineChar - lineStart;
+ // handle case of last virtual line; should be able to be at end of it
+ if (theOffset < offset && theLine == (getNumVirtualLines()-1)) {
+ var lineLen = getNumChars();
+ theOffset += lineLen-lineChar;
+ lineChar = lineLen;
+ }
+
+ return { vline:theLine, offset:theOffset, lineChar:lineChar };
+ }
+
+ return {getNumVirtualLines:getNumVirtualLines, getVLineAndOffsetForChar:getVLineAndOffsetForChar,
+ getCharForVLineAndOffset:getCharForVLineAndOffset,
+ makeCharSeeker: function() { return makeCharSeeker(); } };
+
+ function deepFirstChildTextNode(nd) {
+ nd = nd.firstChild;
+ while (nd && nd.firstChild) nd = nd.firstChild;
+ if (nd.data) return nd;
+ return null;
+ }
+
+ function makeCharSeeker(/*lineNode*/) {
+
+ function charCoords(tnode, i) {
+ var container = tnode.parentNode;
+
+ // treat space specially; a space at the end of a virtual line
+ // will have weird coordinates
+ var isSpace = (tnode.nodeValue.charAt(i) === " ");
+ if (isSpace) {
+ if (i == 0) {
+ if (container.previousSibling && deepFirstChildTextNode(container.previousSibling)) {
+ tnode = deepFirstChildTextNode(container.previousSibling);
+ i = tnode.length-1;
+ container = tnode.parentNode;
+ }
+ else {
+ return {top:container.offsetTop, left:container.offsetLeft};
+ }
+ }
+ else {
+ i--; // use previous char
+ }
+ }
+
+
+ var charWrapper = document.createElement("SPAN");
+
+ // wrap the character
+ var tnodeText = tnode.nodeValue;
+ var frag = document.createDocumentFragment();
+ frag.appendChild(document.createTextNode(tnodeText.substring(0, i)));
+ charWrapper.appendChild(document.createTextNode(tnodeText.substr(i, 1)));
+ frag.appendChild(charWrapper);
+ frag.appendChild(document.createTextNode(tnodeText.substring(i+1)));
+ container.replaceChild(frag, tnode);
+
+ var result = {top:charWrapper.offsetTop,
+ left:charWrapper.offsetLeft + (isSpace ? charWrapper.offsetWidth : 0),
+ height:charWrapper.offsetHeight};
+
+ while (container.firstChild) container.removeChild(container.firstChild);
+ container.appendChild(tnode);
+
+ return result;
+ }
+
+ var lineText = lineNode.textContent;
+ var lineLength = lineText.length;
+
+ var curNode = null;
+ var curChar = 0;
+ var curCharWithinNode = 0
+ var curTop;
+ var curLeft;
+ var approxLineHeight;
+ var whichLine = 0;
+
+ function nextNode() {
+ var n = curNode;
+ if (! n) n = lineNode.firstChild;
+ else n = n.nextSibling;
+ while (n && ! deepFirstChildTextNode(n)) {
+ n = n.nextSibling;
+ }
+ return n;
+ }
+ function prevNode() {
+ var n = curNode;
+ if (! n) n = lineNode.lastChild;
+ else n = n.previousSibling;
+ while (n && ! deepFirstChildTextNode(n)) {
+ n = n.previousSibling;
+ }
+ return n;
+ }
+
+ var seeker;
+ if (lineLength > 0) {
+ curNode = nextNode();
+ var firstCharData = charCoords(deepFirstChildTextNode(curNode), 0);
+ approxLineHeight = firstCharData.height;
+ curTop = firstCharData.top;
+ curLeft = firstCharData.left;
+
+ function updateCharData(tnode, i) {
+ var coords = charCoords(tnode, i);
+ whichLine += Math.round((coords.top - curTop) / approxLineHeight);
+ curTop = coords.top;
+ curLeft = coords.left;
+ }
+
+ seeker = {
+ forward: function(numChars) {
+ var oldChar = curChar;
+ var newChar = curChar + numChars;
+ if (newChar > (lineLength-1))
+ newChar = lineLength-1;
+ while (curChar < newChar) {
+ var curNodeLength = deepFirstChildTextNode(curNode).length;
+ var toGo = curNodeLength - curCharWithinNode;
+ if (curChar + toGo > newChar || ! nextNode()) {
+ // going to next node would be too far
+ var n = newChar - curChar;
+ if (n >= toGo) n = toGo-1;
+ curChar += n;
+ curCharWithinNode += n;
+ break;
+ }
+ else {
+ // go to next node
+ curChar += toGo;
+ curCharWithinNode = 0;
+ curNode = nextNode();
+ }
+ }
+ updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode);
+ return curChar - oldChar;
+ },
+ backward: function(numChars) {
+ var oldChar = curChar;
+ var newChar = curChar - numChars;
+ if (newChar < 0) newChar = 0;
+ while (curChar > newChar) {
+ if (curChar - curCharWithinNode <= newChar || !prevNode()) {
+ // going to prev node would be too far
+ var n = curChar - newChar;
+ if (n > curCharWithinNode) n = curCharWithinNode;
+ curChar -= n;
+ curCharWithinNode -= n;
+ break;
+ }
+ else {
+ // go to prev node
+ curChar -= curCharWithinNode+1;
+ curNode = prevNode();
+ curCharWithinNode = deepFirstChildTextNode(curNode).length-1;
+ }
+ }
+ updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode);
+ return oldChar - curChar;
+ },
+ getVirtualLine: function() { return whichLine; },
+ getLeftCoord: function() { return curLeft; }
+ };
+ }
+ else {
+ curLeft = lineNode.offsetLeft;
+ seeker = { forward: function(numChars) { return 0; },
+ backward: function(numChars) { return 0; },
+ getVirtualLine: function() { return 0; },
+ getLeftCoord: function() { return curLeft; }
+ };
+ }
+ seeker.getOffset = function() { return curChar; };
+ seeker.getLineLength = function() { return lineLength; };
+ seeker.toString = function() {
+ return "seeker[curChar: "+curChar+"("+lineText.charAt(curChar)+"), left: "+seeker.getLeftCoord()+", vline: "+seeker.getVirtualLine()+"]";
+ };
+
+ function moveByWhile(isBackward, amount, optCondFunc, optCharLimit) {
+ var charsMovedLast = null;
+ var hasCondFunc = ((typeof optCondFunc) == "function");
+ var condFunc = optCondFunc;
+ var hasCharLimit = ((typeof optCharLimit) == "number");
+ var charLimit = optCharLimit;
+ while (charsMovedLast !== 0 && ((! hasCondFunc) || condFunc())) {
+ var toMove = amount;
+ if (hasCharLimit) {
+ var untilLimit = (isBackward ? curChar - charLimit : charLimit - curChar);
+ if (untilLimit < toMove) toMove = untilLimit;
+ }
+ if (toMove < 0) break;
+ charsMovedLast = (isBackward ? seeker.backward(toMove) : seeker.forward(toMove));
+ }
+ }
+
+ seeker.forwardByWhile = function(amount, optCondFunc, optCharLimit) {
+ moveByWhile(false, amount, optCondFunc, optCharLimit);
+ }
+ seeker.backwardByWhile = function(amount, optCondFunc, optCharLimit) {
+ moveByWhile(true, amount, optCondFunc, optCharLimit);
+ }
+ seeker.binarySearch = function(condFunc) {
+ // returns index of boundary between false chars and true chars;
+ // positions seeker at first true char, or else last char
+ var trueFunc = condFunc;
+ var falseFunc = function() { return ! condFunc(); };
+ seeker.forwardByWhile(20, falseFunc);
+ seeker.backwardByWhile(20, trueFunc);
+ seeker.forwardByWhile(10, falseFunc);
+ seeker.backwardByWhile(5, trueFunc);
+ seeker.forwardByWhile(1, falseFunc);
+ return seeker.getOffset() + (condFunc() ? 0 : 1);
+ }
+
+ return seeker;
+ }
+
+}