ace.define("ace/snippets", ["require", "exports", "module", "ace/lib/oop", "ace/lib/event_emitter", "ace/lib/lang", "ace/range", "ace/anchor", "ace/keyboard/hash_handler", "ace/tokenizer", "ace/lib/dom", "ace/editor"], function (e, t, n) { "use strict"; var r = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, s = e("./lib/lang"), o = e("./range").Range, u = e("./anchor").Anchor, a = e("./keyboard/hash_handler").HashHandler, f = e("./tokenizer").Tokenizer, l = o.comparePoints, c = function () { this.snippetMap = {}, this.snippetNameMap = {} }; (function () { r.implement(this, i), this.getTokenizer = function () { function e(e, t, n) { return e = e.substr(1), /^\d+$/.test(e) && !n.inFormatString ? [{tabstopId: parseInt(e, 10)}] : [{text: e}] } function t(e) { return "(?:[^\\\\" + e + "]|\\\\.)" } return c.$tokenizer = new f({ start: [{ regex: /:/, onMatch: function (e, t, n) { return n.length && n[0].expectIf ? (n[0].expectIf = !1, n[0].elseBranch = n[0], [n[0]]) : ":" } }, { regex: /\\./, onMatch: function (e, t, n) { var r = e[1]; return r == "}" && n.length ? e = r : "`$\\".indexOf(r) != -1 ? e = r : n.inFormatString && (r == "n" ? e = "\n" : r == "t" ? e = "\n" : "ulULE".indexOf(r) != -1 && (e = { changeCase: r, local: r > "a" })), [e] } }, { regex: /}/, onMatch: function (e, t, n) { return [n.length ? n.shift() : e] } }, {regex: /\$(?:\d+|\w+)/, onMatch: e}, { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (t, n, r) { var i = e(t.substr(1), n, r); return r.unshift(i[0]), i }, next: "snippetVar" }, {regex: /\n/, token: "newline", merge: !1}], snippetVar: [{ regex: "\\|" + t("\\|") + "*\\|", onMatch: function (e, t, n) { n[0].choices = e.slice(1, -1).split(",") }, next: "start" }, { regex: "/(" + t("/") + "+)/(?:(" + t("/") + "*)/)(\\w*):?", onMatch: function (e, t, n) { var r = n[0]; return r.fmtString = e, e = this.splitRegex.exec(e), r.guard = e[1], r.fmt = e[2], r.flag = e[3], "" }, next: "start" }, { regex: "`" + t("`") + "*`", onMatch: function (e, t, n) { return n[0].code = e.splice(1, -1), "" }, next: "start" }, { regex: "\\?", onMatch: function (e, t, n) { n[0] && (n[0].expectIf = !0) }, next: "start" }, {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"}], formatString: [{regex: "/(" + t("/") + "+)/", token: "regex"}, { regex: "", onMatch: function (e, t, n) { n.inFormatString = !0 }, next: "start" }] }), c.prototype.getTokenizer = function () { return c.$tokenizer }, c.$tokenizer }, this.tokenizeTmSnippet = function (e, t) { return this.getTokenizer().getLineTokens(e, t).tokens.map(function (e) { return e.value || e }) }, this.$getDefaultValue = function (e, t) { if (/^[A-Z]\d+$/.test(t)) { var n = t.substr(1); return (this.variables[t[0] + "__"] || {})[n] } if (/^\d+$/.test(t)) return (this.variables.__ || {})[t]; t = t.replace(/^TM_/, ""); if (!e) return; var r = e.session; switch (t) { case"CURRENT_WORD": var i = r.getWordRange(); case"SELECTION": case"SELECTED_TEXT": return r.getTextRange(i); case"CURRENT_LINE": return r.getLine(e.getCursorPosition().row); case"PREV_LINE": return r.getLine(e.getCursorPosition().row - 1); case"LINE_INDEX": return e.getCursorPosition().column; case"LINE_NUMBER": return e.getCursorPosition().row + 1; case"SOFT_TABS": return r.getUseSoftTabs() ? "YES" : "NO"; case"TAB_SIZE": return r.getTabSize(); case"FILENAME": case"FILEPATH": return ""; case"FULLNAME": return "Ace" } }, this.variables = {}, this.getVariableValue = function (e, t) { return this.variables.hasOwnProperty(t) ? this.variables[t](e, t) || "" : this.$getDefaultValue(e, t) || "" }, this.tmStrFormat = function (e, t, n) { var r = t.flag || "", i = t.guard; i = new RegExp(i, r.replace(/[^gi]/, "")); var s = this.tokenizeTmSnippet(t.fmt, "formatString"), o = this, u = e.replace(i, function () { o.variables.__ = arguments; var e = o.resolveVariables(s, n), t = "E"; for (var r = 0; r < e.length; r++) { var i = e[r]; if (typeof i == "object") { e[r] = ""; if (i.changeCase && i.local) { var u = e[r + 1]; u && typeof u == "string" && (i.changeCase == "u" ? e[r] = u[0].toUpperCase() : e[r] = u[0].toLowerCase(), e[r + 1] = u.substr(1)) } else i.changeCase && (t = i.changeCase) } else t == "U" ? e[r] = i.toUpperCase() : t == "L" && (e[r] = i.toLowerCase()) } return e.join("") }); return this.variables.__ = null, u }, this.resolveVariables = function (e, t) { function o(t) { var n = e.indexOf(t, r + 1); n != -1 && (r = n) } var n = []; for (var r = 0; r < e.length; r++) { var i = e[r]; if (typeof i == "string") n.push(i); else { if (typeof i != "object") continue; if (i.skip) o(i); else { if (i.processed < r) continue; if (i.text) { var s = this.getVariableValue(t, i.text); s && i.fmtString && (s = this.tmStrFormat(s, i)), i.processed = r, i.expectIf == null ? s && (n.push(s), o(i)) : s ? i.skip = i.elseBranch : o(i) } else i.tabstopId != null ? n.push(i) : i.changeCase != null && n.push(i) } } } return n }, this.insertSnippetForSelection = function (e, t) { function f(e) { var t = []; for (var n = 0; n < e.length; n++) { var r = e[n]; if (typeof r == "object") { if (a[r.tabstopId]) continue; var i = e.lastIndexOf(r, n - 1); r = t[i] || {tabstopId: r.tabstopId} } t[n] = r } return t } var n = e.getCursorPosition(), r = e.session.getLine(n.row), i = e.session.getTabString(), s = r.match(/^\s*/)[0]; n.column < s.length && (s = s.slice(0, n.column)), t = t.replace(/\r/g, ""); var o = this.tokenizeTmSnippet(t); o = this.resolveVariables(o, e), o = o.map(function (e) { return e == "\n" ? e + s : typeof e == "string" ? e.replace(/\t/g, i) : e }); var u = []; o.forEach(function (e, t) { if (typeof e != "object") return; var n = e.tabstopId, r = u[n]; r || (r = u[n] = [], r.index = n, r.value = ""); if (r.indexOf(e) !== -1) return; r.push(e); var i = o.indexOf(e, t + 1); if (i === -1) return; var s = o.slice(t + 1, i), a = s.some(function (e) { return typeof e == "object" }); a && !r.value ? r.value = s : s.length && (!r.value || typeof r.value != "string") && (r.value = s.join("")) }), u.forEach(function (e) { e.length = 0 }); var a = {}; for (var l = 0; l < o.length; l++) { var c = o[l]; if (typeof c != "object") continue; var p = c.tabstopId, d = o.indexOf(c, l + 1); if (a[p]) { a[p] === c && (a[p] = null); continue } var v = u[p], m = typeof v.value == "string" ? [v.value] : f(v.value); m.unshift(l + 1, Math.max(0, d - l)), m.push(c), a[p] = c, o.splice.apply(o, m), v.indexOf(c) === -1 && v.push(c) } var g = 0, y = 0, b = ""; o.forEach(function (e) { if (typeof e == "string") { var t = e.split("\n"); t.length > 1 ? (y = t[t.length - 1].length, g += t.length - 1) : y += e.length, b += e } else e.start ? e.end = {row: g, column: y} : e.start = {row: g, column: y} }); var w = e.getSelectionRange(), E = e.session.replace(w, b), S = new h(e), x = e.inVirtualSelectionMode && e.selection.index; S.addTabstops(u, w.start, E, x) }, this.insertSnippet = function (e, t) { var n = this; if (e.inVirtualSelectionMode) return n.insertSnippetForSelection(e, t); e.forEachSelection(function () { n.insertSnippetForSelection(e, t) }, null, {keepOrder: !0}), e.tabstopManager && e.tabstopManager.tabNext() }, this.$getScope = function (e) { var t = e.session.$mode.$id || ""; t = t.split("/").pop(); if (t === "html" || t === "php") { t === "php" && !e.session.$mode.inlinePhp && (t = "html"); var n = e.getCursorPosition(), r = e.session.getState(n.row); typeof r == "object" && (r = r[0]), r.substring && (r.substring(0, 3) == "js-" ? t = "javascript" : r.substring(0, 4) == "css-" ? t = "css" : r.substring(0, 4) == "php-" && (t = "php")) } return t }, this.getActiveScopes = function (e) { var t = this.$getScope(e), n = [t], r = this.snippetMap; return r[t] && r[t].includeScopes && n.push.apply(n, r[t].includeScopes), n.push("_"), n }, this.expandWithTab = function (e, t) { var n = this, r = e.forEachSelection(function () { return n.expandSnippetForSelection(e, t) }, null, {keepOrder: !0}); return r && e.tabstopManager && e.tabstopManager.tabNext(), r }, this.expandSnippetForSelection = function (e, t) { var n = e.getCursorPosition(), r = e.session.getLine(n.row), i = r.substring(0, n.column), s = r.substr(n.column), o = this.snippetMap, u; return this.getActiveScopes(e).some(function (e) { var t = o[e]; return t && (u = this.findMatchingSnippet(t, i, s)), !!u }, this), u ? t && t.dryRun ? !0 : (e.session.doc.removeInLine(n.row, n.column - u.replaceBefore.length, n.column + u.replaceAfter.length), this.variables.M__ = u.matchBefore, this.variables.T__ = u.matchAfter, this.insertSnippetForSelection(e, u.content), this.variables.M__ = this.variables.T__ = null, !0) : !1 }, this.findMatchingSnippet = function (e, t, n) { for (var r = e.length; r--;) { var i = e[r]; if (i.startRe && !i.startRe.test(t)) continue; if (i.endRe && !i.endRe.test(n)) continue; if (!i.startRe && !i.endRe) continue; return i.matchBefore = i.startRe ? i.startRe.exec(t) : [""], i.matchAfter = i.endRe ? i.endRe.exec(n) : [""], i.replaceBefore = i.triggerRe ? i.triggerRe.exec(t)[0] : "", i.replaceAfter = i.endTriggerRe ? i.endTriggerRe.exec(n)[0] : "", i } }, this.snippetMap = {}, this.snippetNameMap = {}, this.register = function (e, t) { function o(e) { return e && !/^\^?\(.*\)\$?$|^\\b$/.test(e) && (e = "(?:" + e + ")"), e || "" } function u(e, t, n) { return e = o(e), t = o(t), n ? (e = t + e, e && e[e.length - 1] != "$" && (e += "$")) : (e += t, e && e[0] != "^" && (e = "^" + e)), new RegExp(e) } function a(e) { e.scope || (e.scope = t || "_"), t = e.scope, n[t] || (n[t] = [], r[t] = {}); var o = r[t]; if (e.name) { var a = o[e.name]; a && i.unregister(a), o[e.name] = e } n[t].push(e), e.tabTrigger && !e.trigger && (!e.guard && /^\w/.test(e.tabTrigger) && (e.guard = "\\b"), e.trigger = s.escapeRegExp(e.tabTrigger)); if (!e.trigger && !e.guard && !e.endTrigger && !e.endGuard) return; e.startRe = u(e.trigger, e.guard, !0), e.triggerRe = new RegExp(e.trigger), e.endRe = u(e.endTrigger, e.endGuard, !0), e.endTriggerRe = new RegExp(e.endTrigger) } var n = this.snippetMap, r = this.snippetNameMap, i = this; e || (e = []), e && e.content ? a(e) : Array.isArray(e) && e.forEach(a), this._signal("registerSnippets", {scope: t}) }, this.unregister = function (e, t) { function i(e) { var i = r[e.scope || t]; if (i && i[e.name]) { delete i[e.name]; var s = n[e.scope || t], o = s && s.indexOf(e); o >= 0 && s.splice(o, 1) } } var n = this.snippetMap, r = this.snippetNameMap; e.content ? i(e) : Array.isArray(e) && e.forEach(i) }, this.parseSnippetFile = function (e) { e = e.replace(/\r/g, ""); var t = [], n = {}, r = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm, i; while (i = r.exec(e)) { if (i[1]) try { n = JSON.parse(i[1]), t.push(n) } catch (s) { } if (i[4]) n.content = i[4].replace(/^\t/gm, ""), t.push(n), n = {}; else { var o = i[2], u = i[3]; if (o == "regex") { var a = /\/((?:[^\/\\]|\\.)*)|$/g; n.guard = a.exec(u)[1], n.trigger = a.exec(u)[1], n.endTrigger = a.exec(u)[1], n.endGuard = a.exec(u)[1] } else o == "snippet" ? (n.tabTrigger = u.match(/^\S*/)[0], n.name || (n.name = u)) : n[o] = u } } return t }, this.getSnippetByName = function (e, t) { var n = this.snippetNameMap, r; return this.getActiveScopes(t).some(function (t) { var i = n[t]; return i && (r = i[e]), !!r }, this), r } }).call(c.prototype); var h = function (e) { if (e.tabstopManager) return e.tabstopManager; e.tabstopManager = this, this.$onChange = this.onChange.bind(this), this.$onChangeSelection = s.delayedCall(this.onChangeSelection.bind(this)).schedule, this.$onChangeSession = this.onChangeSession.bind(this), this.$onAfterExec = this.onAfterExec.bind(this), this.attach(e) }; (function () { this.attach = function (e) { this.index = 0, this.ranges = [], this.tabstops = [], this.$openTabstops = null, this.selectedTabstop = null, this.editor = e, this.editor.on("change", this.$onChange), this.editor.on("changeSelection", this.$onChangeSelection), this.editor.on("changeSession", this.$onChangeSession), this.editor.commands.on("afterExec", this.$onAfterExec), this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler) }, this.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this), this.ranges = null, this.tabstops = null, this.selectedTabstop = null, this.editor.removeListener("change", this.$onChange), this.editor.removeListener("changeSelection", this.$onChangeSelection), this.editor.removeListener("changeSession", this.$onChangeSession), this.editor.commands.removeListener("afterExec", this.$onAfterExec), this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler), this.editor.tabstopManager = null, this.editor = null }, this.onChange = function (e) { var t = e, n = e.action[0] == "r", r = e.start, i = e.end, s = r.row, o = i.row, u = o - s, a = i.column - r.column; n && (u = -u, a = -a); if (!this.$inChange && n) { var f = this.selectedTabstop, c = f && !f.some(function (e) { return l(e.start, r) <= 0 && l(e.end, i) >= 0 }); if (c) return this.detach() } var h = this.ranges; for (var p = 0; p < h.length; p++) { var d = h[p]; if (d.end.row < r.row) continue; if (n && l(r, d.start) < 0 && l(i, d.end) > 0) { this.removeRange(d), p--; continue } d.start.row == s && d.start.column > r.column && (d.start.column += a), d.end.row == s && d.end.column >= r.column && (d.end.column += a), d.start.row >= s && (d.start.row += u), d.end.row >= s && (d.end.row += u), l(d.start, d.end) > 0 && this.removeRange(d) } h.length || this.detach() }, this.updateLinkedFields = function () { var e = this.selectedTabstop; if (!e || !e.hasLinkedRanges) return; this.$inChange = !0; var n = this.editor.session, r = n.getTextRange(e.firstNonLinked); for (var i = e.length; i--;) { var s = e[i]; if (!s.linked) continue; var o = t.snippetManager.tmStrFormat(r, s.original); n.replace(s, o) } this.$inChange = !1 }, this.onAfterExec = function (e) { e.command && !e.command.readOnly && this.updateLinkedFields() }, this.onChangeSelection = function () { if (!this.editor) return; var e = this.editor.selection.lead, t = this.editor.selection.anchor, n = this.editor.selection.isEmpty(); for (var r = this.ranges.length; r--;) { if (this.ranges[r].linked) continue; var i = this.ranges[r].contains(e.row, e.column), s = n || this.ranges[r].contains(t.row, t.column); if (i && s) return } this.detach() }, this.onChangeSession = function () { this.detach() }, this.tabNext = function (e) { var t = this.tabstops.length, n = this.index + (e || 1); n = Math.min(Math.max(n, 1), t), n == t && (n = 0), this.selectTabstop(n), n === 0 && this.detach() }, this.selectTabstop = function (e) { this.$openTabstops = null; var t = this.tabstops[this.index]; t && this.addTabstopMarkers(t), this.index = e, t = this.tabstops[this.index]; if (!t || !t.length) return; this.selectedTabstop = t; if (!this.editor.inVirtualSelectionMode) { var n = this.editor.multiSelect; n.toSingleRange(t.firstNonLinked.clone()); for (var r = t.length; r--;) { if (t.hasLinkedRanges && t[r].linked) continue; n.addRange(t[r].clone(), !0) } n.ranges[0] && n.addRange(n.ranges[0].clone()) } else this.editor.selection.setRange(t.firstNonLinked); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler) }, this.addTabstops = function (e, t, n) { this.$openTabstops || (this.$openTabstops = []); if (!e[0]) { var r = o.fromPoints(n, n); v(r.start, t), v(r.end, t), e[0] = [r], e[0].index = 0 } var i = this.index, s = [i + 1, 0], u = this.ranges; e.forEach(function (e, n) { var r = this.$openTabstops[n] || e; for (var i = e.length; i--;) { var a = e[i], f = o.fromPoints(a.start, a.end || a.start); d(f.start, t), d(f.end, t), f.original = a, f.tabstop = r, u.push(f), r != e ? r.unshift(f) : r[i] = f, a.fmtString ? (f.linked = !0, r.hasLinkedRanges = !0) : r.firstNonLinked || (r.firstNonLinked = f) } r.firstNonLinked || (r.hasLinkedRanges = !1), r === e && (s.push(r), this.$openTabstops[n] = r), this.addTabstopMarkers(r) }, this), s.length > 2 && (this.tabstops.length && s.push(s.splice(2, 1)[0]), this.tabstops.splice.apply(this.tabstops, s)) }, this.addTabstopMarkers = function (e) { var t = this.editor.session; e.forEach(function (e) { e.markerId || (e.markerId = t.addMarker(e, "ace_snippet-marker", "text")) }) }, this.removeTabstopMarkers = function (e) { var t = this.editor.session; e.forEach(function (e) { t.removeMarker(e.markerId), e.markerId = null }) }, this.removeRange = function (e) { var t = e.tabstop.indexOf(e); e.tabstop.splice(t, 1), t = this.ranges.indexOf(e), this.ranges.splice(t, 1), this.editor.session.removeMarker(e.markerId), e.tabstop.length || (t = this.tabstops.indexOf(e.tabstop), t != -1 && this.tabstops.splice(t, 1), this.tabstops.length || this.detach()) }, this.keyboardHandler = new a, this.keyboardHandler.bindKeys({ Tab: function (e) { if (t.snippetManager && t.snippetManager.expandWithTab(e)) return; e.tabstopManager.tabNext(1) }, "Shift-Tab": function (e) { e.tabstopManager.tabNext(-1) }, Esc: function (e) { e.tabstopManager.detach() }, Return: function (e) { return !1 } }) }).call(h.prototype); var p = {}; p.onChange = u.prototype.onChange, p.setPosition = function (e, t) { this.pos.row = e, this.pos.column = t }, p.update = function (e, t, n) { this.$insertRight = n, this.pos = e, this.onChange(t) }; var d = function (e, t) { e.row == 0 && (e.column += t.column), e.row += t.row }, v = function (e, t) { e.row == t.row && (e.column -= t.column), e.row -= t.row }; e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"), t.snippetManager = new c; var m = e("./editor").Editor; (function () { this.insertSnippet = function (e, n) { return t.snippetManager.insertSnippet(this, e, n) }, this.expandSnippet = function (e) { return t.snippetManager.expandWithTab(this, e) } }).call(m.prototype) }), ace.define("ace/autocomplete/popup", ["require", "exports", "module", "ace/virtual_renderer", "ace/editor", "ace/range", "ace/lib/event", "ace/lib/lang", "ace/lib/dom"], function (e, t, n) { "use strict"; var r = e("../virtual_renderer").VirtualRenderer, i = e("../editor").Editor, s = e("../range").Range, o = e("../lib/event"), u = e("../lib/lang"), a = e("../lib/dom"), f = function (e) { var t = new r(e); t.$maxLines = 4; var n = new i(t); return n.setHighlightActiveLine(!1), n.setShowPrintMargin(!1), n.renderer.setShowGutter(!1), n.renderer.setHighlightGutterLine(!1), n.$mouseHandler.$focusTimeout = 0, n.$highlightTagPending = !0, n }, l = function (e) { var t = a.createElement("div"), n = new f(t); e && e.appendChild(t), t.style.display = "none", n.renderer.content.style.cursor = "default", n.renderer.setStyle("ace_autocomplete"), n.setOption("displayIndentGuides", !1), n.setOption("dragDelay", 150); var r = function () { }; n.focus = r, n.$isFocused = !0, n.renderer.$cursorLayer.restartTimer = r, n.renderer.$cursorLayer.element.style.opacity = 0, n.renderer.$maxLines = 8, n.renderer.$keepTextAreaAtCursor = !1, n.setHighlightActiveLine(!1), n.session.highlight(""), n.session.$searchHighlight.clazz = "ace_highlight-marker", n.on("mousedown", function (e) { var t = e.getDocumentPosition(); n.selection.moveToPosition(t), c.start.row = c.end.row = t.row, e.stop() }); var i, l = new s(-1, 0, -1, Infinity), c = new s(-1, 0, -1, Infinity); c.id = n.session.addMarker(c, "ace_active-line", "fullLine"), n.setSelectOnHover = function (e) { e ? l.id && (n.session.removeMarker(l.id), l.id = null) : l.id = n.session.addMarker(l, "ace_line-hover", "fullLine") }, n.setSelectOnHover(!1), n.on("mousemove", function (e) { if (!i) { i = e; return } if (i.x == e.x && i.y == e.y) return; i = e, i.scrollTop = n.renderer.scrollTop; var t = i.getDocumentPosition().row; l.start.row != t && (l.id || n.setRow(t), p(t)) }), n.renderer.on("beforeRender", function () { if (i && l.start.row != -1) { i.$pos = null; var e = i.getDocumentPosition().row; l.id || n.setRow(e), p(e, !0) } }), n.renderer.on("afterRender", function () { var e = n.getRow(), t = n.renderer.$textLayer, r = t.element.childNodes[e - t.config.firstRow]; if (r == t.selectedNode) return; t.selectedNode && a.removeCssClass(t.selectedNode, "ace_selected"), t.selectedNode = r, r && a.addCssClass(r, "ace_selected") }); var h = function () { p(-1) }, p = function (e, t) { e !== l.start.row && (l.start.row = l.end.row = e, t || n.session._emit("changeBackMarker"), n._emit("changeHoverMarker")) }; n.getHoveredRow = function () { return l.start.row }, o.addListener(n.container, "mouseout", h), n.on("hide", h), n.on("changeSelection", h), n.session.doc.getLength = function () { return n.data.length }, n.session.doc.getLine = function (e) { var t = n.data[e]; return typeof t == "string" ? t : t && t.value || "" }; var d = n.session.bgTokenizer; return d.$tokenizeRow = function (e) { function s(e, n) { e && r.push({type: (t.className || "") + (n || ""), value: e}) } var t = n.data[e], r = []; if (!t) return r; typeof t == "string" && (t = {value: t}); var i = t.caption || t.value || t.name, o = i.toLowerCase(), u = (n.filterText || "").toLowerCase(), a = 0, f = 0; for (var l = 0; l <= u.length; l++) if (l != f && (t.matchMask & 1 << l || l == u.length)) { var c = u.slice(f, l); f = l; var h = o.indexOf(c); if (h == -1) continue; s(i.slice(a, h), ""), a = h + c.length, s(i.slice(h, a), "completion-highlight") } return s(i.slice(a, i.length), ""), t.meta && r.push({type: "completion-meta", value: t.meta}), r }, d.$updateOnChange = r, d.start = r, n.session.$computeWidth = function () { return this.screenWidth = 0 }, n.isOpen = !1, n.isTopdown = !1, n.autoSelect = !0, n.filterText = "", n.data = [], n.setData = function (e, t) { n.filterText = t || "", n.setValue(u.stringRepeat("\n", e.length), -1), n.data = e || [], n.setRow(0) }, n.getData = function (e) { return n.data[e] }, n.getRow = function () { return c.start.row }, n.setRow = function (e) { e = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, e)), c.start.row != e && (n.selection.clearSelection(), c.start.row = c.end.row = e || 0, n.session._emit("changeBackMarker"), n.moveCursorTo(e || 0, 0), n.isOpen && n._signal("select")) }, n.on("changeSelection", function () { n.isOpen && n.setRow(n.selection.lead.row), n.renderer.scrollCursorIntoView() }), n.hide = function () { this.container.style.display = "none", this._signal("hide"), n.isOpen = !1 }, n.show = function (e, t, r) { var s = this.container, o = window.innerHeight, u = window.innerWidth, a = this.renderer, f = a.$maxLines * t * 1.4, l = e.top + this.$borderSize, c = l > o / 2 && !r; c && l + t + f > o ? (a.$maxPixelHeight = l - 2 * this.$borderSize, s.style.top = "", s.style.bottom = o - l + "px", n.isTopdown = !1) : (l += t, a.$maxPixelHeight = o - l - .2 * t, s.style.top = l + "px", s.style.bottom = "", n.isTopdown = !0), s.style.display = "", this.renderer.$textLayer.checkForSizeChanges(); var h = e.left; h + s.offsetWidth > u && (h = u - s.offsetWidth), s.style.left = h + "px", this._signal("show"), i = null, n.isOpen = !0 }, n.getTextLeftOffset = function () { return this.$borderSize + this.renderer.$padding + this.$imageSize }, n.$imageSize = 0, n.$borderSize = 1, n }; a.importCssString(".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #3a674e;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4); position: absolute; z-index: 2;}.ace_dark.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid rgba(109, 150, 13, 0.8); background: rgba(58, 103, 78, 0.62);}.ace_completion-meta { opacity: 0.5; margin: 0.9em;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #2d69c7;}.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #93ca12;}.ace_editor.ace_autocomplete { width: 300px; z-index: 200000; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4; background: #fefefe; color: #111;}.ace_dark.ace_editor.ace_autocomplete { border: 1px #484747 solid; box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51); line-height: 1.4; background: #25282c; color: #c1c1c1;}", "autocompletion.css"), t.AcePopup = l }), ace.define("ace/autocomplete/util", ["require", "exports", "module"], function (e, t, n) { "use strict"; t.parForEach = function (e, t, n) { var r = 0, i = e.length; i === 0 && n(); for (var s = 0; s < i; s++) t(e[s], function (e, t) { r++, r === i && n(e, t) }) }; var r = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/; t.retrievePrecedingIdentifier = function (e, t, n) { n = n || r; var i = []; for (var s = t - 1; s >= 0; s--) { if (!n.test(e[s])) break; i.push(e[s]) } return i.reverse().join("") }, t.retrieveFollowingIdentifier = function (e, t, n) { n = n || r; var i = []; for (var s = t; s < e.length; s++) { if (!n.test(e[s])) break; i.push(e[s]) } return i }, t.getCompletionPrefix = function (e) { var t = e.getCursorPosition(), n = e.session.getLine(t.row), r; return e.completers.forEach(function (e) { e.identifierRegexps && e.identifierRegexps.forEach(function (e) { !r && e && (r = this.retrievePrecedingIdentifier(n, t.column, e)) }.bind(this)) }.bind(this)), r || this.retrievePrecedingIdentifier(n, t.column) } }), ace.define("ace/autocomplete", ["require", "exports", "module", "ace/keyboard/hash_handler", "ace/autocomplete/popup", "ace/autocomplete/util", "ace/lib/event", "ace/lib/lang", "ace/lib/dom", "ace/snippets"], function (e, t, n) { "use strict"; var r = e("./keyboard/hash_handler").HashHandler, i = e("./autocomplete/popup").AcePopup, s = e("./autocomplete/util"), o = e("./lib/event"), u = e("./lib/lang"), a = e("./lib/dom"), f = e("./snippets").snippetManager, l = function () { this.autoInsert = !1, this.autoSelect = !0, this.exactMatch = !1, this.gatherCompletionsId = 0, this.keyboardHandler = new r, this.keyboardHandler.bindKeys(this.commands), this.blurListener = this.blurListener.bind(this), this.changeListener = this.changeListener.bind(this), this.mousedownListener = this.mousedownListener.bind(this), this.mousewheelListener = this.mousewheelListener.bind(this), this.changeTimer = u.delayedCall(function () { this.updateCompletions(!0) }.bind(this)), this.tooltipTimer = u.delayedCall(this.updateDocTooltip.bind(this), 50) }; (function () { this.$init = function () { return this.popup = new i(document.body || document.documentElement), this.popup.on("click", function (e) { this.insertMatch(), e.stop() }.bind(this)), this.popup.focus = this.editor.focus.bind(this.editor), this.popup.on("show", this.tooltipTimer.bind(null, null)), this.popup.on("select", this.tooltipTimer.bind(null, null)), this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)), this.popup }, this.getPopup = function () { return this.popup || this.$init() }, this.openPopup = function (e, t, n) { this.popup || this.$init(), this.popup.autoSelect = this.autoSelect, this.popup.setData(this.completions.filtered, this.completions.filterText), e.keyBinding.addKeyboardHandler(this.keyboardHandler); var r = e.renderer; this.popup.setRow(this.autoSelect ? 0 : -1); if (!n) { this.popup.setTheme(e.getTheme()), this.popup.setFontSize(e.getFontSize()); var i = r.layerConfig.lineHeight, s = r.$cursorLayer.getPixelPosition(this.base, !0); s.left -= this.popup.getTextLeftOffset(); var o = e.container.getBoundingClientRect(); s.top += o.top - r.layerConfig.offset, s.left += o.left - e.renderer.scrollLeft, s.left += r.gutterWidth, this.popup.show(s, i) } else n && !t && this.detach() }, this.detach = function () { this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler), this.editor.off("changeSelection", this.changeListener), this.editor.off("blur", this.blurListener), this.editor.off("mousedown", this.mousedownListener), this.editor.off("mousewheel", this.mousewheelListener), this.changeTimer.cancel(), this.hideDocTooltip(), this.gatherCompletionsId += 1, this.popup && this.popup.isOpen && this.popup.hide(), this.base && this.base.detach(), this.activated = !1, this.completions = this.base = null }, this.changeListener = function (e) { var t = this.editor.selection.lead; (t.row != this.base.row || t.column < this.base.column) && this.detach(), this.activated ? this.changeTimer.schedule() : this.detach() }, this.blurListener = function (e) { var t = document.activeElement, n = this.editor.textInput.getElement(), r = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget), i = this.popup && this.popup.container; t != n && t.parentNode != i && !r && t != this.tooltipNode && e.relatedTarget != n && this.detach() }, this.mousedownListener = function (e) { this.detach() }, this.mousewheelListener = function (e) { this.detach() }, this.goTo = function (e) { var t = this.popup.getRow(), n = this.popup.session.getLength() - 1; switch (e) { case"up": t = t <= 0 ? n : t - 1; break; case"down": t = t >= n ? -1 : t + 1; break; case"start": t = 0; break; case"end": t = n } this.popup.setRow(t) }, this.insertMatch = function (e, t) { e || (e = this.popup.getData(this.popup.getRow())); if (!e) return !1; if (e.completer && e.completer.insertMatch) e.completer.insertMatch(this.editor, e); else { if (this.completions.filterText) { var n = this.editor.selection.getAllRanges(); for (var r = 0, i; i = n[r]; r++) i.start.column -= this.completions.filterText.length, this.editor.session.remove(i) } e.snippet ? f.insertSnippet(this.editor, e.snippet) : this.editor.execCommand("insertstring", e.value || e) } this.detach() }, this.commands = { Up: function (e) { e.completer.goTo("up") }, Down: function (e) { e.completer.goTo("down") }, "Ctrl-Up|Ctrl-Home": function (e) { e.completer.goTo("start") }, "Ctrl-Down|Ctrl-End": function (e) { e.completer.goTo("end") }, Esc: function (e) { e.completer.detach() }, Return: function (e) { return e.completer.insertMatch() }, "Shift-Return": function (e) { e.completer.insertMatch(null, {deleteSuffix: !0}) }, Tab: function (e) { var t = e.completer.insertMatch(); if (!!t || !!e.tabstopManager) return t; e.completer.goTo("down") }, PageUp: function (e) { e.completer.popup.gotoPageUp() }, PageDown: function (e) { e.completer.popup.gotoPageDown() } }, this.gatherCompletions = function (e, t) { var n = e.getSession(), r = e.getCursorPosition(), i = s.getCompletionPrefix(e); this.base = n.doc.createAnchor(r.row, r.column - i.length), this.base.$insertRight = !0; var o = [], u = e.completers.length; return e.completers.forEach(function (a, f) { a.getCompletions(e, n, r, i, function (n, r) { !n && r && (o = o.concat(r)), t(null, { prefix: s.getCompletionPrefix(e), matches: o, finished: --u === 0 }) }) }), !0 }, this.showPopup = function (e) { this.editor && this.detach(), this.activated = !0, this.editor = e, e.completer != this && (e.completer && e.completer.detach(), e.completer = this), e.on("changeSelection", this.changeListener), e.on("blur", this.blurListener), e.on("mousedown", this.mousedownListener), e.on("mousewheel", this.mousewheelListener), this.updateCompletions() }, this.updateCompletions = function (e) { if (e && this.base && this.completions) { var t = this.editor.getCursorPosition(), n = this.editor.session.getTextRange({start: this.base, end: t}); if (n == this.completions.filterText) return; this.completions.setFilter(n); if (!this.completions.filtered.length) return this.detach(); if (this.completions.filtered.length == 1 && this.completions.filtered[0].value == n && !this.completions.filtered[0].snippet) return this.detach(); this.openPopup(this.editor, n, e); return } var r = this.gatherCompletionsId; this.gatherCompletions(this.editor, function (t, n) { var i = function () { if (!n.finished) return; return this.detach() }.bind(this), s = n.prefix, o = n && n.matches; if (!o || !o.length) return i(); if (s.indexOf(n.prefix) !== 0 || r != this.gatherCompletionsId) return; this.completions = new c(o), this.exactMatch && (this.completions.exactMatch = !0), this.completions.setFilter(s); var u = this.completions.filtered; if (!u.length) return i(); if (u.length == 1 && u[0].value == s && !u[0].snippet) return i(); if (this.autoInsert && u.length == 1 && n.finished) return this.insertMatch(u[0]); this.openPopup(this.editor, s, e) }.bind(this)) }, this.cancelContextMenu = function () { this.editor.$mouseHandler.cancelContextMenu() }, this.updateDocTooltip = function () { var e = this.popup, t = e.data, n = t && (t[e.getHoveredRow()] || t[e.getRow()]), r = null; if (!n || !this.editor || !this.popup.isOpen) return this.hideDocTooltip(); this.editor.completers.some(function (e) { return e.getDocTooltip && (r = e.getDocTooltip(n)), r }), r || (r = n), typeof r == "string" && (r = {docText: r}); if (!r || !r.docHTML && !r.docText) return this.hideDocTooltip(); this.showDocTooltip(r) }, this.showDocTooltip = function (e) { this.tooltipNode || (this.tooltipNode = a.createElement("div"), this.tooltipNode.className = "ace_tooltip ace_doc-tooltip", this.tooltipNode.style.margin = 0, this.tooltipNode.style.pointerEvents = "auto", this.tooltipNode.tabIndex = -1, this.tooltipNode.onblur = this.blurListener.bind(this), this.tooltipNode.onclick = this.onTooltipClick.bind(this)); var t = this.tooltipNode; e.docHTML ? t.innerHTML = e.docHTML : e.docText && (t.textContent = e.docText), t.parentNode || document.body.appendChild(t); var n = this.popup, r = n.container.getBoundingClientRect(); t.style.top = n.container.style.top, t.style.bottom = n.container.style.bottom, t.style.display = "block", window.innerWidth - r.right < 320 ? r.left < 320 ? n.isTopdown ? (t.style.top = r.bottom + "px", t.style.left = r.left + "px", t.style.right = "", t.style.bottom = "") : (t.style.top = n.container.offsetTop - t.offsetHeight + "px", t.style.left = r.left + "px", t.style.right = "", t.style.bottom = "") : (t.style.right = window.innerWidth - r.left + "px", t.style.left = "") : (t.style.left = r.right + 1 + "px", t.style.right = "") }, this.hideDocTooltip = function () { this.tooltipTimer.cancel(); if (!this.tooltipNode) return; var e = this.tooltipNode; !this.editor.isFocused() && document.activeElement == e && this.editor.focus(), this.tooltipNode = null, e.parentNode && e.parentNode.removeChild(e) }, this.onTooltipClick = function (e) { var t = e.target; while (t && t != this.tooltipNode) { if (t.nodeName == "A" && t.href) { t.rel = "noreferrer", t.target = "_blank"; break } t = t.parentNode } } }).call(l.prototype), l.startCommand = { name: "startAutocomplete", exec: function (e) { e.completer || (e.completer = new l), e.completer.autoInsert = !1, e.completer.autoSelect = !0, e.completer.showPopup(e), e.completer.cancelContextMenu() }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; var c = function (e, t) { this.all = e, this.filtered = e, this.filterText = t || "", this.exactMatch = !1 }; (function () { this.setFilter = function (e) { if (e.length > this.filterText && e.lastIndexOf(this.filterText, 0) === 0) var t = this.filtered; else var t = this.all; this.filterText = e, t = this.filterCompletions(t, this.filterText), t = t.sort(function (e, t) { return t.exactMatch - e.exactMatch || t.$score - e.$score || (e.caption || e.value) < (t.caption || t.value) }); var n = null; t = t.filter(function (e) { var t = e.snippet || e.caption || e.value; return t === n ? !1 : (n = t, !0) }), this.filtered = t }, this.filterCompletions = function (e, t) { var n = [], r = t.toUpperCase(), i = t.toLowerCase(); e:for (var s = 0, o; o = e[s]; s++) { var u = o.caption || o.value || o.snippet; if (!u) continue; var a = -1, f = 0, l = 0, c, h; if (this.exactMatch) { if (t !== u.substr(0, t.length)) continue; } else { var p = u.toLowerCase().indexOf(i); if (p > -1) l = p; else for (var d = 0; d < t.length; d++) { var v = u.indexOf(i[d], a + 1), m = u.indexOf(r[d], a + 1); c = v >= 0 ? m < 0 || v < m ? v : m : m; if (c < 0) continue e; h = c - a - 1, h > 0 && (a === -1 && (l += 10), l += h, f |= 1 << d), a = c } } o.matchMask = f, o.exactMatch = l ? 0 : 1, o.$score = (o.score || 0) - l, n.push(o) } return n } }).call(c.prototype), t.Autocomplete = l, t.FilteredList = c }), ace.define("ace/autocomplete/text_completer", ["require", "exports", "module", "ace/range"], function (e, t, n) { function s(e, t) { var n = e.getTextRange(r.fromPoints({row: 0, column: 0}, t)); return n.split(i).length - 1 } function o(e, t) { var n = s(e, t), r = e.getValue().split(i), o = Object.create(null), u = r[n]; return r.forEach(function (e, t) { if (!e || e === u) return; var i = Math.abs(n - t), s = r.length - i; o[e] ? o[e] = Math.max(s, o[e]) : o[e] = s }), o } var r = e("../range").Range, i = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; t.getCompletions = function (e, t, n, r, i) { var s = o(t, n), u = Object.keys(s); i(null, u.map(function (e) { return {caption: e, value: e, score: s[e], meta: "local"} })) } }), ace.define("ace/ext/language_tools", ["require", "exports", "module", "ace/snippets", "ace/autocomplete", "ace/config", "ace/lib/lang", "ace/autocomplete/util", "ace/autocomplete/text_completer", "ace/editor", "ace/config"], function (e, t, n) { "use strict"; var r = e("../snippets").snippetManager, i = e("../autocomplete").Autocomplete, s = e("../config"), o = e("../lib/lang"), u = e("../autocomplete/util"), a = e("../autocomplete/text_completer"), f = { getCompletions: function (e, t, n, r, i) { if (t.$mode.completer) return t.$mode.completer.getCompletions(e, t, n, r, i); var s = e.session.getState(n.row), o = t.$mode.getCompletions(s, t, n, r); i(null, o) } }, l = { getCompletions: function (e, t, n, i, s) { var o = [], u = t.getTokenAt(n.row, n.column); u && u.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\.xml$/) ? o.push("html-tag") : o = r.getActiveScopes(e); var a = r.snippetMap, f = []; o.forEach(function (e) { var t = a[e] || []; for (var n = t.length; n--;) { var r = t[n], i = r.name || r.tabTrigger; if (!i) continue; f.push({ caption: i, snippet: r.content, meta: r.tabTrigger && !r.name ? r.tabTrigger + "\u21e5 " : "snippet", type: "snippet" }) } }, this), s(null, f) }, getDocTooltip: function (e) { e.type == "snippet" && !e.docHTML && (e.docHTML = ["", o.escapeHTML(e.caption), "", "
", o.escapeHTML(e.snippet)].join("")) } }, c = [l, a, f]; t.setCompleters = function (e) { c.length = 0, e && c.push.apply(c, e) }, t.addCompleter = function (e) { c.push(e) }, t.textCompleter = a, t.keyWordCompleter = f, t.snippetCompleter = l; var h = { name: "expandSnippet", exec: function (e) { return r.expandWithTab(e) }, bindKey: "Tab" }, p = function (e, t) { d(t.session.$mode) }, d = function (e) { var t = e.$id; r.files || (r.files = {}), v(t), e.modes && e.modes.forEach(d) }, v = function (e) { if (!e || r.files[e]) return; var t = e.replace("mode", "snippets"); r.files[e] = {}, s.loadModule(t, function (t) { t && (r.files[e] = t, !t.snippets && t.snippetText && (t.snippets = r.parseSnippetFile(t.snippetText)), r.register(t.snippets || [], t.scope), t.includeScopes && (r.snippetMap[t.scope].includeScopes = t.includeScopes, t.includeScopes.forEach(function (e) { v("ace/mode/" + e) }))) }) }, m = function (e) { var t = e.editor, n = t.completer && t.completer.activated; if (e.command.name === "backspace") n && !u.getCompletionPrefix(t) && t.completer.detach(); else if (e.command.name === "insertstring") { var r = u.getCompletionPrefix(t); r && !n && (t.completer || (t.completer = new i), t.completer.autoInsert = !1, t.completer.showPopup(t)) } }, g = e("../editor").Editor; e("../config").defineOptions(g.prototype, "editor", { enableBasicAutocompletion: { set: function (e) { e ? (this.completers || (this.completers = Array.isArray(e) ? e : c), this.commands.addCommand(i.startCommand)) : this.commands.removeCommand(i.startCommand) }, value: !1 }, enableLiveAutocompletion: { set: function (e) { e ? (this.completers || (this.completers = Array.isArray(e) ? e : c), this.commands.on("afterExec", m)) : this.commands.removeListener("afterExec", m) }, value: !1 }, enableSnippets: { set: function (e) { e ? (this.commands.addCommand(h), this.on("changeMode", p), p(null, this)) : (this.commands.removeCommand(h), this.off("changeMode", p)) }, value: !1 } }) }); (function() { ace.require(["ace/ext/language_tools"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { module.exports = m; } }); })();