ace.define(
	'ace/ext/menu_tools/get_editor_keyboard_shortcuts',
	['require', 'exports', 'module', 'ace/lib/keys'],
	function (e, t, n) {
		'use strict'
		var r = e('../../lib/keys')
		n.exports.getEditorKeybordShortcuts = function (e) {
			var t = r.KEY_MODS,
				n = [],
				i = {}
			return (
				e.keyBinding.$handlers.forEach(function (e) {
					var t = e.commandKeyBinding
					for (var r in t) {
						var s = r.replace(/(^|-)\w/g, function (e) {
								return e.toUpperCase()
							}),
							o = t[r]
						Array.isArray(o) || (o = [o]),
							o.forEach(function (e) {
								typeof e != 'string' && (e = e.name),
									i[e] ? (i[e].key += '|' + s) : ((i[e] = { key: s, command: e }), n.push(i[e]))
							})
					}
				}),
				n
			)
		}
	}
),
	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]
							r !== t.selectedNode &&
								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, a)
									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 }),
								t.message && r.push({ type: 'completion-message', value: t.message }),
								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 - 0.2 * t),
								  (s.style.top = l + 'px'),
								  (s.style.bottom = ''),
								  (n.isTopdown = !0)),
								(s.style.display = '')
							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.goTo = function (e) {
							var t = this.getRow(),
								n = this.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.setRow(t)
						}),
						(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_completion-message {    color: blue;}.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),
				(t.$singleLineEditor = f)
		}
	),
	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-\u2000\u2070-\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/snippets',
		[
			'require',
			'exports',
			'module',
			'ace/lib/oop',
			'ace/lib/event_emitter',
			'ace/lib/lang',
			'ace/range',
			'ace/range_list',
			'ace/keyboard/hash_handler',
			'ace/tokenizer',
			'ace/clipboard',
			'ace/lib/dom',
			'ace/editor',
		],
		function (e, t, n) {
			'use strict'
			function h(e) {
				var t = new Date().toLocaleString('en-us', e)
				return t.length == 1 ? '0' + t : t
			}
			var r = e('./lib/oop'),
				i = e('./lib/event_emitter').EventEmitter,
				s = e('./lib/lang'),
				o = e('./range').Range,
				u = e('./range_list').RangeList,
				a = e('./keyboard/hash_handler').HashHandler,
				f = e('./tokenizer').Tokenizer,
				l = e('./clipboard'),
				c = {
					CURRENT_WORD: function (e) {
						return e.session.getTextRange(e.session.getWordRange())
					},
					SELECTION: function (e, t, n) {
						var r = e.session.getTextRange()
						return n ? r.replace(/\n\r?([ \t]*\S)/g, '\n' + n + '$1') : r
					},
					CURRENT_LINE: function (e) {
						return e.session.getLine(e.getCursorPosition().row)
					},
					PREV_LINE: function (e) {
						return e.session.getLine(e.getCursorPosition().row - 1)
					},
					LINE_INDEX: function (e) {
						return e.getCursorPosition().row
					},
					LINE_NUMBER: function (e) {
						return e.getCursorPosition().row + 1
					},
					SOFT_TABS: function (e) {
						return e.session.getUseSoftTabs() ? 'YES' : 'NO'
					},
					TAB_SIZE: function (e) {
						return e.session.getTabSize()
					},
					CLIPBOARD: function (e) {
						return l.getText && l.getText()
					},
					FILENAME: function (e) {
						return /[^/\\]*$/.exec(this.FILEPATH(e))[0]
					},
					FILENAME_BASE: function (e) {
						return /[^/\\]*$/.exec(this.FILEPATH(e))[0].replace(/\.[^.]*$/, '')
					},
					DIRECTORY: function (e) {
						return this.FILEPATH(e).replace(/[^/\\]*$/, '')
					},
					FILEPATH: function (e) {
						return '/not implemented.txt'
					},
					WORKSPACE_NAME: function () {
						return 'Unknown'
					},
					FULLNAME: function () {
						return 'Unknown'
					},
					BLOCK_COMMENT_START: function (e) {
						var t = e.session.$mode || {}
						return (t.blockComment && t.blockComment.start) || ''
					},
					BLOCK_COMMENT_END: function (e) {
						var t = e.session.$mode || {}
						return (t.blockComment && t.blockComment.end) || ''
					},
					LINE_COMMENT: function (e) {
						var t = e.session.$mode || {}
						return t.lineCommentStart || ''
					},
					CURRENT_YEAR: h.bind(null, { year: 'numeric' }),
					CURRENT_YEAR_SHORT: h.bind(null, { year: '2-digit' }),
					CURRENT_MONTH: h.bind(null, { month: 'numeric' }),
					CURRENT_MONTH_NAME: h.bind(null, { month: 'long' }),
					CURRENT_MONTH_NAME_SHORT: h.bind(null, { month: 'short' }),
					CURRENT_DATE: h.bind(null, { day: '2-digit' }),
					CURRENT_DAY_NAME: h.bind(null, { weekday: 'long' }),
					CURRENT_DAY_NAME_SHORT: h.bind(null, { weekday: 'short' }),
					CURRENT_HOUR: h.bind(null, { hour: '2-digit', hour12: !1 }),
					CURRENT_MINUTE: h.bind(null, { minute: '2-digit' }),
					CURRENT_SECOND: h.bind(null, { second: '2-digit' }),
				}
			c.SELECTED_TEXT = c.SELECTION
			var p = function () {
				;(this.snippetMap = {}), (this.snippetNameMap = {})
			}
			;(function () {
				r.implement(this, i),
					(this.getTokenizer = function () {
						return p.$tokenizer || this.createTokenizer()
					}),
					(this.createTokenizer = function () {
						function e(e) {
							return (
								(e = e.substr(1)),
								/^\d+$/.test(e) ? [{ tabstopId: parseInt(e, 10) }] : [{ text: e }]
							)
						}
						function t(e) {
							return '(?:[^\\\\' + e + ']|\\\\.)'
						}
						var n = {
							regex: '/(' + t('/') + '+)/',
							onMatch: function (e, t, n) {
								var r = n[0]
								return (r.fmtString = !0), (r.guard = e.slice(1, -1)), (r.flag = ''), ''
							},
							next: 'formatString',
						}
						return (
							(p.$tokenizer = new f({
								start: [
									{
										regex: /\\./,
										onMatch: function (e, t, n) {
											var r = e[1]
											return (
												r == '}' && n.length ? (e = r) : '`$\\'.indexOf(r) != -1 && (e = r), [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))
											return r.unshift(i[0]), i
										},
										next: 'snippetVar',
									},
									{ regex: /\n/, token: 'newline', merge: !1 },
								],
								snippetVar: [
									{
										regex: '\\|' + t('\\|') + '*\\|',
										onMatch: function (e, t, n) {
											var r = e
												.slice(1, -1)
												.replace(/\\[,|\\]|,/g, function (e) {
													return e.length == 2 ? e[1] : '\0'
												})
												.split('\0')
												.map(function (e) {
													return { value: e }
												})
											return (n[0].choices = r), [r[0]]
										},
										next: 'start',
									},
									n,
									{ regex: '([^:}\\\\]|\\\\.)*:?', token: '', next: 'start' },
								],
								formatString: [
									{
										regex: /:/,
										onMatch: function (e, t, n) {
											return n.length && n[0].expectElse
												? ((n[0].expectElse = !1), (n[0].ifEnd = { elseEnd: n[0] }), [n[0].ifEnd])
												: ':'
										},
									},
									{
										regex: /\\./,
										onMatch: function (e, t, n) {
											var r = e[1]
											return (
												r == '}' && n.length
													? (e = r)
													: '`$\\'.indexOf(r) != -1
													  ? (e = r)
													  : r == 'n'
													    ? (e = '\n')
													    : r == 't'
													      ? (e = '	')
													      : 'ulULE'.indexOf(r) != -1 &&
													        (e = { changeCase: r, local: r > 'a' }),
												[e]
											)
										},
									},
									{
										regex: '/\\w*}',
										onMatch: function (e, t, n) {
											var r = n.shift()
											return (
												r && (r.flag = e.slice(1, -1)),
												(this.next = r && r.tabstopId ? 'start' : ''),
												[r || e]
											)
										},
										next: 'start',
									},
									{
										regex: /\$(?:\d+|\w+)/,
										onMatch: function (e, t, n) {
											return [{ text: e.slice(1) }]
										},
									},
									{
										regex: /\${\w+/,
										onMatch: function (e, t, n) {
											var r = { text: e.slice(2) }
											return n.unshift(r), [r]
										},
										next: 'formatStringVar',
									},
									{ regex: /\n/, token: 'newline', merge: !1 },
									{
										regex: /}/,
										onMatch: function (e, t, n) {
											var r = n.shift()
											return (this.next = r && r.tabstopId ? 'start' : ''), [r || e]
										},
										next: 'start',
									},
								],
								formatStringVar: [
									{
										regex: /:\/\w+}/,
										onMatch: function (e, t, n) {
											var r = n[0]
											return (r.formatFunction = e.slice(2, -1)), [n.shift()]
										},
										next: 'formatString',
									},
									n,
									{
										regex: /:[\?\-+]?/,
										onMatch: function (e, t, n) {
											e[1] == '+' && (n[0].ifEnd = n[0]), e[1] == '?' && (n[0].expectElse = !0)
										},
										next: 'formatString',
									},
									{ regex: '([^:}\\\\]|\\\\.)*:?', token: '', next: 'formatString' },
								],
							})),
							p.$tokenizer
						)
					}),
					(this.tokenizeTmSnippet = function (e, t) {
						return this.getTokenizer()
							.getLineTokens(e, t)
							.tokens.map(function (e) {
								return e.value || e
							})
					}),
					(this.getVariableValue = function (e, t, n) {
						if (/^\d+$/.test(t)) return (this.variables.__ || {})[t] || ''
						if (/^[A-Z]\d+$/.test(t)) return (this.variables[t[0] + '__'] || {})[t.substr(1)] || ''
						t = t.replace(/^TM_/, '')
						if (!this.variables.hasOwnProperty(t)) return ''
						var r = this.variables[t]
						return typeof r == 'function' && (r = this.variables[t](e, t, n)), r == null ? '' : r
					}),
					(this.variables = c),
					(this.tmStrFormat = function (e, t, n) {
						if (!t.fmt) return e
						var r = t.flag || '',
							i = t.guard
						i = new RegExp(i, r.replace(/[^gim]/g, ''))
						var s =
								typeof t.fmt == 'string' ? this.tokenizeTmSnippet(t.fmt, 'formatString') : t.fmt,
							o = this,
							u = e.replace(i, function () {
								var e = o.variables.__
								o.variables.__ = [].slice.call(arguments)
								var t = o.resolveVariables(s, n),
									r = 'E'
								for (var i = 0; i < t.length; i++) {
									var u = t[i]
									if (typeof u == 'object') {
										t[i] = ''
										if (u.changeCase && u.local) {
											var a = t[i + 1]
											a &&
												typeof a == 'string' &&
												(u.changeCase == 'u'
													? (t[i] = a[0].toUpperCase())
													: (t[i] = a[0].toLowerCase()),
												(t[i + 1] = a.substr(1)))
										} else u.changeCase && (r = u.changeCase)
									} else r == 'U' ? (t[i] = u.toUpperCase()) : r == 'L' && (t[i] = u.toLowerCase())
								}
								return (o.variables.__ = e), t.join('')
							})
						return u
					}),
					(this.tmFormatFunction = function (e, t, n) {
						return t.formatFunction == 'upcase'
							? e.toUpperCase()
							: t.formatFunction == 'downcase'
							  ? e.toLowerCase()
							  : e
					}),
					(this.resolveVariables = function (e, t) {
						function f(t) {
							var n = e.indexOf(t, s + 1)
							n != -1 && (s = n)
						}
						var n = [],
							r = '',
							i = !0
						for (var s = 0; s < e.length; s++) {
							var o = e[s]
							if (typeof o == 'string') {
								n.push(o),
									o == '\n'
										? ((i = !0), (r = ''))
										: i && ((r = /^\t*/.exec(o)[0]), (i = /\S/.test(o)))
								continue
							}
							if (!o) continue
							i = !1
							if (o.fmtString) {
								var u = e.indexOf(o, s + 1)
								u == -1 && (u = e.length), (o.fmt = e.slice(s + 1, u)), (s = u)
							}
							if (o.text) {
								var a = this.getVariableValue(t, o.text, r) + ''
								o.fmtString && (a = this.tmStrFormat(a, o, t)),
									o.formatFunction && (a = this.tmFormatFunction(a, o, t)),
									a && !o.ifEnd ? (n.push(a), f(o)) : !a && o.ifEnd && f(o.ifEnd)
							} else
								o.elseEnd
									? f(o.elseEnd)
									: o.tabstopId != null
									  ? n.push(o)
									  : o.changeCase != null && n.push(o)
						}
						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 = ''), (r.parents = {}))
							if (r.indexOf(e) !== -1) return
							e.choices && !r.choices && (r.choices = e.choices), 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 h = c.tabstopId,
								p = u[h],
								v = o.indexOf(c, l + 1)
							if (a[h]) {
								a[h] === c &&
									(delete a[h],
									Object.keys(a).forEach(function (e) {
										p.parents[e] = !0
									}))
								continue
							}
							a[h] = c
							var m = p.value
							typeof m != 'string' ? (m = f(m)) : c.fmt && (m = this.tmStrFormat(m, c, e)),
								o.splice.apply(o, [l + 1, Math.max(0, v - l)].concat(m, c)),
								p.indexOf(c) === -1 && p.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 && (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 d(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.prefix && (e.tabTrigger = e.prefix),
								!e.content &&
									e.body &&
									(e.content = Array.isArray(e.body) ? e.body.join('\n') : e.body),
								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 = []),
							Array.isArray(e)
								? e.forEach(a)
								: Object.keys(e).forEach(function (t) {
										a(e[t])
								  }),
							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))
										: o && (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(p.prototype)
			var d = 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.action[0] == 'r',
							n = this.selectedTabstop || {},
							r = n.parents || {},
							i = (this.tabstops || []).slice()
						for (var s = 0; s < i.length; s++) {
							var o = i[s],
								u = o == n || r[o.index]
							o.rangeList.$bias = u ? 0 : 1
							if (e.action == 'remove' && o !== n) {
								var a = o.parents && o.parents[n.index],
									f = o.rangeList.pointIndex(e.start, a)
								f = f < 0 ? -f - 1 : f + 1
								var l = o.rangeList.pointIndex(e.end, a)
								l = l < 0 ? -l - 1 : l - 1
								var c = o.rangeList.ranges.slice(f, l)
								for (var h = 0; h < c.length; h++) this.removeRange(c[h])
							}
							o.rangeList.$onChange(e)
						}
						var p = this.editor.session
						!this.$inChange && t && p.getLength() == 1 && !p.getValue() && this.detach()
					}),
					(this.updateLinkedFields = function () {
						var e = this.selectedTabstop
						if (!e || !e.hasLinkedRanges || !e.firstNonLinked) return
						this.$inChange = !0
						var n = this.editor.session,
							r = n.getTextRange(e.firstNonLinked)
						for (var i = 0; i < e.length; i++) {
							var s = e[i]
							if (!s.linked) continue
							var o = s.original,
								u = t.snippetManager.tmStrFormat(r, o, this.editor)
							n.replace(s, u)
						}
						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 = 0; 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
						var n = t.firstNonLinked || t
						t.choices && (n.cursor = n.start)
						if (!this.editor.inVirtualSelectionMode) {
							var r = this.editor.multiSelect
							r.toSingleRange(n)
							for (var i = 0; i < t.length; i++) {
								if (t.hasLinkedRanges && t[i].linked) continue
								r.addRange(t[i].clone(), !0)
							}
						} else this.editor.selection.fromOrientedRange(n)
						this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler),
							this.selectedTabstop &&
								this.selectedTabstop.choices &&
								this.editor.execCommand('startAutocomplete', {
									matches: this.selectedTabstop.choices,
								})
					}),
					(this.addTabstops = function (e, t, n) {
						var r = this.useLink || !this.editor.getOption('enableMultiselect')
						this.$openTabstops || (this.$openTabstops = [])
						if (!e[0]) {
							var i = o.fromPoints(n, n)
							m(i.start, t), m(i.end, t), (e[0] = [i]), (e[0].index = 0)
						}
						var s = this.index,
							a = [s + 1, 0],
							f = this.ranges
						e.forEach(function (e, n) {
							var i = this.$openTabstops[n] || e
							for (var s = 0; s < e.length; s++) {
								var l = e[s],
									c = o.fromPoints(l.start, l.end || l.start)
								v(c.start, t),
									v(c.end, t),
									(c.original = l),
									(c.tabstop = i),
									f.push(c),
									i != e ? i.unshift(c) : (i[s] = c),
									l.fmtString || (i.firstNonLinked && r)
										? ((c.linked = !0), (i.hasLinkedRanges = !0))
										: i.firstNonLinked || (i.firstNonLinked = c)
							}
							i.firstNonLinked || (i.hasLinkedRanges = !1),
								i === e && (a.push(i), (this.$openTabstops[n] = i)),
								this.addTabstopMarkers(i),
								(i.rangeList = i.rangeList || new u()),
								(i.rangeList.$bias = 0),
								i.rangeList.addList(i)
						}, this),
							a.length > 2 &&
								(this.tabstops.length && a.push(a.splice(2, 1)[0]),
								this.tabstops.splice.apply(this.tabstops, a))
					}),
					(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)
						t != -1 && e.tabstop.splice(t, 1),
							(t = this.ranges.indexOf(e)),
							t != -1 && this.ranges.splice(t, 1),
							(t = e.tabstop.rangeList.ranges.indexOf(e)),
							t != -1 && e.tabstop.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), e.renderer.scrollCursorIntoView()
						},
						'Shift-Tab': function (e) {
							e.tabstopManager.tabNext(-1), e.renderer.scrollCursorIntoView()
						},
						Esc: function (e) {
							e.tabstopManager.detach()
						},
					})
			}).call(d.prototype)
			var v = function (e, t) {
					e.row == 0 && (e.column += t.column), (e.row += t.row)
				},
				m = 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 p())
			var g = 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(g.prototype)
		}
	),
	ace.define(
		'ace/autocomplete',
		[
			'require',
			'exports',
			'module',
			'ace/keyboard/hash_handler',
			'ace/autocomplete/popup',
			'ace/autocomplete/util',
			'ace/lib/lang',
			'ace/lib/dom',
			'ace/snippets',
			'ace/config',
		],
		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/lang'),
				u = e('./lib/dom'),
				a = e('./snippets').snippetManager,
				f = e('./config'),
				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 = o.delayedCall(
							function () {
								this.updateCompletions(!0)
							}.bind(this)
						)),
						(this.tooltipTimer = o.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.changeTimer.cancel()
					}),
					(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) {
						this.popup.goTo(e)
					}),
					(this.insertMatch = function (e, t) {
						e || (e = this.popup.getData(this.popup.getRow()))
						if (!e) return !1
						var n = this.completions
						this.editor.startOperation({ command: { name: 'insertMatch' } })
						if (e.completer && e.completer.insertMatch) e.completer.insertMatch(this.editor, e)
						else {
							if (n.filterText) {
								var r = this.editor.selection.getAllRanges()
								for (var i = 0, s; (s = r[i]); i++)
									(s.start.column -= n.filterText.length), this.editor.session.remove(s)
							}
							e.snippet
								? a.insertSnippet(this.editor, e.snippet)
								: this.editor.execCommand('insertstring', e.value || e)
						}
						this.completions == n && this.detach(), this.editor.endOperation()
					}),
					(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, t) {
						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(!1, t)
					}),
					(this.updateCompletions = function (e, t) {
						if (e && this.base && this.completions) {
							var n = this.editor.getCursorPosition(),
								r = this.editor.session.getTextRange({ start: this.base, end: n })
							if (r == this.completions.filterText) return
							this.completions.setFilter(r)
							if (!this.completions.filtered.length) return this.detach()
							if (
								this.completions.filtered.length == 1 &&
								this.completions.filtered[0].value == r &&
								!this.completions.filtered[0].snippet
							)
								return this.detach()
							this.openPopup(this.editor, r, e)
							return
						}
						if (t && t.matches) {
							var n = this.editor.getSelectionRange().start
							return (
								(this.base = this.editor.session.doc.createAnchor(n.row, n.column)),
								(this.base.$insertRight = !0),
								(this.completions = new c(t.matches)),
								this.openPopup(this.editor, '', e)
							)
						}
						var i = this.gatherCompletionsId
						this.gatherCompletions(
							this.editor,
							function (t, n) {
								var r = function () {
										if (!n.finished) return
										return this.detach()
									}.bind(this),
									s = n.prefix,
									o = n && n.matches
								if (!o || !o.length) return r()
								if (s.indexOf(n.prefix) !== 0 || i != 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 r()
								if (u.length == 1 && u[0].value == s && !u[0].snippet) return r()
								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 && typeof n != 'string' && (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 = u.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
						}
					}),
					(this.destroy = function () {
						this.detach()
						if (this.popup) {
							this.popup.destroy()
							var e = this.popup.container
							e && e.parentNode && e.parentNode.removeChild(e)
						}
						this.editor && this.editor.completer == this && this.editor.completer == null,
							(this.popup = null)
					})
			}).call(l.prototype),
				(l.for = function (e) {
					return e.completer
						? e.completer
						: (f.get('sharedPopups')
								? (l.$shared || (l.$sharedInstance = new l()), (e.completer = l.$sharedInstance))
								: ((e.completer = new l()),
								  e.once('destroy', function (e, t) {
										t.completer.destroy()
								  })),
						  e.completer)
				}),
				(l.startCommand = {
					name: 'startAutocomplete',
					exec: function (e, t) {
						var n = l.for(e)
						;(n.autoInsert = !1), (n.autoSelect = !0), n.showPopup(e, t), n.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).localeCompare(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 e
							} 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/ext/menu_tools/overlay_page',
		['require', 'exports', 'module', 'ace/lib/dom'],
		function (e, t, n) {
			'use strict'
			var r = e('../../lib/dom'),
				i =
					'#ace_settingsmenu, #kbshortcutmenu {background-color: #F7F7F7;color: black;box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);padding: 1em 0.5em 2em 1em;overflow: auto;position: absolute;margin: 0;bottom: 0;right: 0;top: 0;z-index: 9991;cursor: default;}.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);background-color: rgba(255, 255, 255, 0.6);color: black;}.ace_optionsMenuEntry:hover {background-color: rgba(100, 100, 100, 0.1);transition: all 0.3s}.ace_closeButton {background: rgba(245, 146, 146, 0.5);border: 1px solid #F48A8A;border-radius: 50%;padding: 7px;position: absolute;right: -8px;top: -8px;z-index: 100000;}.ace_closeButton{background: rgba(245, 146, 146, 0.9);}.ace_optionsMenuKey {color: darkslateblue;font-weight: bold;}.ace_optionsMenuCommand {color: darkcyan;font-weight: normal;}.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {vertical-align: middle;}.ace_optionsMenuEntry button[ace_selected_button=true] {background: #e7e7e7;box-shadow: 1px 0px 2px 0px #adadad inset;border-color: #adadad;}.ace_optionsMenuEntry button {background: white;border: 1px solid lightgray;margin: 0px;}.ace_optionsMenuEntry button:hover{background: #f0f0f0;}'
			r.importCssString(i),
				(n.exports.overlayPage = function (t, n, r) {
					function o(e) {
						e.keyCode === 27 && u()
					}
					function u() {
						if (!i) return
						document.removeEventListener('keydown', o),
							i.parentNode.removeChild(i),
							t && t.focus(),
							(i = null),
							r && r()
					}
					function a(e) {
						;(s = e), e && ((i.style.pointerEvents = 'none'), (n.style.pointerEvents = 'auto'))
					}
					var i = document.createElement('div'),
						s = !1
					return (
						(i.style.cssText =
							'margin: 0; padding: 0; position: fixed; top:0; bottom:0; left:0; right:0;z-index: 9990; ' +
							(t ? 'background-color: rgba(0, 0, 0, 0.3);' : '')),
						i.addEventListener('click', function (e) {
							s || u()
						}),
						document.addEventListener('keydown', o),
						n.addEventListener('click', function (e) {
							e.stopPropagation()
						}),
						i.appendChild(n),
						document.body.appendChild(i),
						t && t.blur(),
						{ close: u, setIgnoreFocusOut: a }
					)
				})
		}
	),
	ace.define('ace/ext/modelist', ['require', 'exports', 'module'], function (e, t, n) {
		'use strict'
		function i(e) {
			var t = a.text,
				n = e.split(/[\/\\]/).pop()
			for (var i = 0; i < r.length; i++)
				if (r[i].supportsFile(n)) {
					t = r[i]
					break
				}
			return t
		}
		var r = [],
			s = function (e, t, n) {
				;(this.name = e), (this.caption = t), (this.mode = 'ace/mode/' + e), (this.extensions = n)
				var r
				;/\^/.test(n)
					? (r =
							n.replace(/\|(\^)?/g, function (e, t) {
								return '$|' + (t ? '^' : '^.*\\.')
							}) + '$')
					: (r = '^.*\\.(' + n + ')$'),
					(this.extRe = new RegExp(r, 'gi'))
			}
		s.prototype.supportsFile = function (e) {
			return e.match(this.extRe)
		}
		var o = {
				ABAP: ['abap'],
				ABC: ['abc'],
				ActionScript: ['as'],
				ADA: ['ada|adb'],
				Alda: ['alda'],
				Apache_Conf: ['^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd'],
				Apex: ['apex|cls|trigger|tgr'],
				AQL: ['aql'],
				AsciiDoc: ['asciidoc|adoc'],
				ASL: ['dsl|asl'],
				Assembly_x86: ['asm|a'],
				AutoHotKey: ['ahk'],
				BatchFile: ['bat|cmd'],
				C_Cpp: ['cpp|c|cc|cxx|h|hh|hpp|ino'],
				C9Search: ['c9search_results'],
				Cirru: ['cirru|cr'],
				Clojure: ['clj|cljs'],
				Cobol: ['CBL|COB'],
				coffee: ['coffee|cf|cson|^Cakefile'],
				ColdFusion: ['cfm'],
				Crystal: ['cr'],
				CSharp: ['cs'],
				Csound_Document: ['csd'],
				Csound_Orchestra: ['orc'],
				Csound_Score: ['sco'],
				CSS: ['css'],
				Curly: ['curly'],
				D: ['d|di'],
				Dart: ['dart'],
				Diff: ['diff|patch'],
				Dockerfile: ['^Dockerfile'],
				Dot: ['dot'],
				Drools: ['drl'],
				Edifact: ['edi'],
				Eiffel: ['e|ge'],
				EJS: ['ejs'],
				Elixir: ['ex|exs'],
				Elm: ['elm'],
				Erlang: ['erl|hrl'],
				Forth: ['frt|fs|ldr|fth|4th'],
				Fortran: ['f|f90'],
				FSharp: ['fsi|fs|ml|mli|fsx|fsscript'],
				FSL: ['fsl'],
				FTL: ['ftl'],
				Gcode: ['gcode'],
				Gherkin: ['feature'],
				Gitignore: ['^.gitignore'],
				Glsl: ['glsl|frag|vert'],
				Gobstones: ['gbs'],
				golang: ['go'],
				GraphQLSchema: ['gql'],
				Groovy: ['groovy'],
				HAML: ['haml'],
				Handlebars: ['hbs|handlebars|tpl|mustache'],
				Haskell: ['hs'],
				Haskell_Cabal: ['cabal'],
				haXe: ['hx'],
				Hjson: ['hjson'],
				HTML: ['html|htm|xhtml|vue|we|wpy'],
				HTML_Elixir: ['eex|html.eex'],
				HTML_Ruby: ['erb|rhtml|html.erb'],
				INI: ['ini|conf|cfg|prefs'],
				Io: ['io'],
				Jack: ['jack'],
				Jade: ['jade|pug'],
				Java: ['java'],
				JavaScript: ['js|jsm|jsx'],
				JSON: ['json'],
				JSON5: ['json5'],
				JSONiq: ['jq'],
				JSP: ['jsp'],
				JSSM: ['jssm|jssm_state'],
				JSX: ['jsx'],
				Julia: ['jl'],
				Kotlin: ['kt|kts'],
				LaTeX: ['tex|latex|ltx|bib'],
				LESS: ['less'],
				Liquid: ['liquid'],
				Lisp: ['lisp'],
				LiveScript: ['ls'],
				LogiQL: ['logic|lql'],
				LSL: ['lsl'],
				Lua: ['lua'],
				LuaPage: ['lp'],
				Lucene: ['lucene'],
				Makefile: ['^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make'],
				Markdown: ['md|markdown'],
				Mask: ['mask'],
				MATLAB: ['matlab'],
				Maze: ['mz'],
				MediaWiki: ['wiki|mediawiki'],
				MEL: ['mel'],
				MIXAL: ['mixal'],
				MUSHCode: ['mc|mush'],
				MySQL: ['mysql'],
				Nginx: ['nginx|conf'],
				Nim: ['nim'],
				Nix: ['nix'],
				NSIS: ['nsi|nsh'],
				Nunjucks: ['nunjucks|nunjs|nj|njk'],
				ObjectiveC: ['m|mm'],
				OCaml: ['ml|mli'],
				Pascal: ['pas|p'],
				Perl: ['pl|pm'],
				Perl6: ['p6|pl6|pm6'],
				pgSQL: ['pgsql'],
				PHP: ['php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module'],
				PHP_Laravel_blade: ['blade.php'],
				Pig: ['pig'],
				Powershell: ['ps1'],
				Praat: ['praat|praatscript|psc|proc'],
				Prisma: ['prisma'],
				Prolog: ['plg|prolog'],
				Properties: ['properties'],
				Protobuf: ['proto'],
				Puppet: ['epp|pp'],
				Python: ['py'],
				QML: ['qml'],
				R: ['r'],
				Razor: ['cshtml|asp'],
				RDoc: ['Rd'],
				Red: ['red|reds'],
				RHTML: ['Rhtml'],
				RST: ['rst'],
				Ruby: ['rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile'],
				Rust: ['rs'],
				SASS: ['sass'],
				SCAD: ['scad'],
				Scala: ['scala|sbt'],
				Scheme: ['scm|sm|rkt|oak|scheme'],
				SCSS: ['scss'],
				SH: ['sh|bash|^.bashrc'],
				SJS: ['sjs'],
				Slim: ['slim|skim'],
				Smarty: ['smarty|tpl'],
				snippets: ['snippets'],
				Soy_Template: ['soy'],
				Space: ['space'],
				SQL: ['sql'],
				SQLServer: ['sqlserver'],
				Stylus: ['styl|stylus'],
				SVG: ['svg'],
				Swift: ['swift'],
				Tcl: ['tcl'],
				Terraform: ['tf', 'tfvars', 'terragrunt'],
				Tex: ['tex'],
				Text: ['txt'],
				Textile: ['textile'],
				Toml: ['toml'],
				TSX: ['tsx'],
				Twig: ['latte|twig|swig'],
				Typescript: ['ts|typescript|str'],
				Vala: ['vala'],
				VBScript: ['vbs|vb'],
				Velocity: ['vm'],
				Verilog: ['v|vh|sv|svh'],
				VHDL: ['vhd|vhdl'],
				Visualforce: ['vfp|component|page'],
				Wollok: ['wlk|wpgm|wtest'],
				XML: ['xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml'],
				XQuery: ['xq'],
				YAML: ['yaml|yml'],
				Zeek: ['zeek|bro'],
				Django: ['html'],
			},
			u = {
				ObjectiveC: 'Objective-C',
				CSharp: 'C#',
				golang: 'Go',
				C_Cpp: 'C and C++',
				Csound_Document: 'Csound Document',
				Csound_Orchestra: 'Csound',
				Csound_Score: 'Csound Score',
				coffee: 'CoffeeScript',
				HTML_Ruby: 'HTML (Ruby)',
				HTML_Elixir: 'HTML (Elixir)',
				FTL: 'FreeMarker',
				PHP_Laravel_blade: 'PHP (Blade Template)',
				Perl6: 'Perl 6',
				AutoHotKey: 'AutoHotkey / AutoIt',
			},
			a = {}
		for (var f in o) {
			var l = o[f],
				c = (u[f] || f).replace(/_/g, ' '),
				h = f.toLowerCase(),
				p = new s(h, c, l[0])
			;(a[h] = p), r.push(p)
		}
		n.exports = { getModeForPath: i, modes: r, modesByName: a }
	}),
	ace.define(
		'ace/ext/prompt',
		[
			'require',
			'exports',
			'module',
			'ace/range',
			'ace/lib/dom',
			'ace/ext/menu_tools/get_editor_keyboard_shortcuts',
			'ace/autocomplete',
			'ace/autocomplete/popup',
			'ace/autocomplete/popup',
			'ace/undomanager',
			'ace/tokenizer',
			'ace/ext/menu_tools/overlay_page',
			'ace/ext/modelist',
		],
		function (e, t, n) {
			'use strict'
			function d(e, t, n, r) {
				function b() {
					var e
					m && m.getCursorPosition().row > 0 ? (e = x()) : (e = o.getValue())
					var t = m ? m.getData(m.getRow()) : e
					t && !t.error && (E(), n.onAccept && n.onAccept({ value: e, item: t }, o))
				}
				function E() {
					v.close(), r && r(), (p = null)
				}
				function S() {
					if (n.getCompletions) {
						var e
						n.getPrefix && (e = n.getPrefix(o))
						var t = n.getCompletions(o)
						m.setData(t, e), m.resize(!0)
					}
				}
				function x() {
					var e = m.getData(m.getRow())
					if (e && !e.error) return e.value || e.caption || e
				}
				if (typeof t == 'object') return d(e, '', t, n)
				if (p) {
					var s = p
					;(e = s.editor), s.close()
					if (s.name && s.name == n.name) return
				}
				if (n.$type) return d[n.$type](e, r)
				var o = a()
				o.session.setUndoManager(new f())
				var h = i.buildDom([
						'div',
						{
							class:
								'ace_prompt_container' + (n.hasDescription ? ' input-box-with-description' : ''),
						},
					]),
					v = c(e, h, E)
				h.appendChild(o.container),
					e && ((e.cmdLine = o), o.setOption('fontSize', e.getOption('fontSize'))),
					t && o.setValue(t, 1),
					n.selection &&
						o.selection.setRange({
							start: o.session.doc.indexToPosition(n.selection[0]),
							end: o.session.doc.indexToPosition(n.selection[1]),
						})
				if (n.getCompletions) {
					var m = new u()
					m.renderer.setStyle('ace_autocomplete_inline'),
						(m.container.style.display = 'block'),
						(m.container.style.maxWidth = '600px'),
						(m.container.style.width = '100%'),
						(m.container.style.marginTop = '3px'),
						m.renderer.setScrollMargin(2, 2, 0, 0),
						(m.autoSelect = !1),
						(m.renderer.$maxLines = 15),
						m.setRow(-1),
						m.on('click', function (e) {
							var t = m.getData(m.getRow())
							t.error || (o.setValue(t.value || t.name || t), b(), e.stop())
						}),
						h.appendChild(m.container),
						S()
				}
				if (n.$rules) {
					var g = new l(n.$rules)
					o.session.bgTokenizer.setTokenizer(g)
				}
				n.placeholder && o.setOption('placeholder', n.placeholder)
				if (n.hasDescription) {
					var y = i.buildDom(['div', { class: 'ace_prompt_text_container' }])
					i.buildDom(n.prompt || "Press 'Enter' to confirm or 'Escape' to cancel", y),
						h.appendChild(y)
				}
				v.setIgnoreFocusOut(n.ignoreFocusOut)
				var w = {
					Enter: b,
					'Esc|Shift-Esc': function () {
						n.onCancel && n.onCancel(o.getValue(), o), E()
					},
				}
				m &&
					Object.assign(w, {
						Up: function (e) {
							m.goTo('up'), x()
						},
						Down: function (e) {
							m.goTo('down'), x()
						},
						'Ctrl-Up|Ctrl-Home': function (e) {
							m.goTo('start'), x()
						},
						'Ctrl-Down|Ctrl-End': function (e) {
							m.goTo('end'), x()
						},
						Tab: function (e) {
							m.goTo('down'), x()
						},
						PageUp: function (e) {
							m.gotoPageUp(), x()
						},
						PageDown: function (e) {
							m.gotoPageDown(), x()
						},
					}),
					o.commands.bindKeys(w),
					o.on('input', function () {
						n.onInput && n.onInput(), S()
					}),
					o.resize(!0),
					m && m.resize(!0),
					o.focus(),
					(p = { close: E, name: n.name, editor: e })
			}
			var r = e('../range').Range,
				i = e('../lib/dom'),
				s = e('../ext/menu_tools/get_editor_keyboard_shortcuts'),
				o = e('../autocomplete').FilteredList,
				u = e('../autocomplete/popup').AcePopup,
				a = e('../autocomplete/popup').$singleLineEditor,
				f = e('../undomanager').UndoManager,
				l = e('../tokenizer').Tokenizer,
				c = e('./menu_tools/overlay_page').overlayPage,
				h = e('./modelist'),
				p
			;(d.gotoLine = function (e, t) {
				function n(e) {
					return (
						Array.isArray(e) || (e = [e]),
						e
							.map(function (e) {
								var t = e.isBackwards ? e.start : e.end,
									n = e.isBackwards ? e.end : e.start,
									r = n.row,
									i = r + 1 + ':' + n.column
								return (
									n.row == t.row
										? n.column != t.column && (i += '>:' + t.column)
										: (i += '>' + (t.row + 1) + ':' + t.column),
									i
								)
							})
							.reverse()
							.join(', ')
					)
				}
				d(e, ':' + n(e.selection.toJSON()), {
					name: 'gotoLine',
					selection: [1, Number.MAX_VALUE],
					onAccept: function (t) {
						var n = t.value,
							i = d.gotoLine._history
						i || (d.gotoLine._history = i = []),
							i.indexOf(n) != -1 && i.splice(i.indexOf(n), 1),
							i.unshift(n),
							i.length > 20 && (i.length = 20)
						var s = e.getCursorPosition(),
							o = []
						n
							.replace(/^:/, '')
							.split(/,/)
							.map(function (t) {
								function u() {
									var t = n[i++]
									if (!t) return
									if (t[0] == 'c') {
										var r = parseInt(t.slice(1)) || 0
										return e.session.doc.indexToPosition(r)
									}
									var o = s.row,
										u = 0
									return (
										/\d/.test(t) && ((o = parseInt(t) - 1), (t = n[i++])),
										t == ':' && ((t = n[i++]), /\d/.test(t) && (u = parseInt(t) || 0)),
										{ row: o, column: u }
									)
								}
								var n = t.split(/([<>:+-]|c?\d+)|[^c\d<>:+-]+/).filter(Boolean),
									i = 0
								s = u()
								var a = r.fromPoints(s, s)
								n[i] == '>' ? (i++, (a.end = u())) : n[i] == '<' && (i++, (a.start = u())),
									o.unshift(a)
							}),
							e.selection.fromJSON(o)
						var u = e.renderer.scrollTop
						e.renderer.scrollSelectionIntoView(e.selection.anchor, e.selection.cursor, 0.5),
							e.renderer.animateScrolling(u)
					},
					history: function () {
						var t = e.session.getUndoManager()
						return d.gotoLine._history ? d.gotoLine._history : []
					},
					getCompletions: function (t) {
						var n = t.getValue(),
							r = n.replace(/^:/, '').split(':'),
							i = Math.min(parseInt(r[0]) || 1, e.session.getLength()) - 1,
							s = e.session.getLine(i),
							o = n + '  ' + s
						return [o].concat(this.history())
					},
					$rules: {
						start: [
							{ regex: /\d+/, token: 'string' },
							{ regex: /[:,><+\-c]/, token: 'keyword' },
						],
					},
				})
			}),
				(d.commands = function (e, t) {
					function n(e) {
						return (e || '')
							.replace(/^./, function (e) {
								return e.toUpperCase(e)
							})
							.replace(/[a-z][A-Z]/g, function (e) {
								return e[0] + ' ' + e[1].toLowerCase(e)
							})
					}
					function r(t) {
						var r = [],
							i = {}
						return (
							e.keyBinding.$handlers.forEach(function (e) {
								var s = e.platform,
									o = e.byName
								for (var u in o) {
									var a
									o[u].bindKey && o[u].bindKey[s] !== null ? (a = o[u].bindKey.win) : (a = '')
									var f = o[u],
										l = f.description || n(f.name)
									Array.isArray(f) || (f = [f]),
										f.forEach(function (e) {
											typeof e != 'string' && (e = e.name)
											var n = t.find(function (t) {
												return t === e
											})
											n ||
												(i[e]
													? (i[e].key += '|' + a)
													: ((i[e] = { key: a, command: e, description: l }), r.push(i[e])))
										})
								}
							}),
							r
						)
					}
					var i = ['insertstring', 'inserttext', 'setIndentation', 'paste'],
						s = r(i)
					;(s = s.map(function (e) {
						return { value: e.description, meta: e.key, command: e.command }
					})),
						d(e, '', {
							name: 'commands',
							selection: [0, Number.MAX_VALUE],
							maxHistoryCount: 5,
							onAccept: function (t) {
								if (t.item) {
									var n = t.item.command
									this.addToHistory(t.item), e.execCommand(n)
								}
							},
							addToHistory: function (e) {
								var t = this.history()
								t.unshift(e), delete e.message
								for (var n = 1; n < t.length; n++)
									if (t[n]['command'] == e.command) {
										t.splice(n, 1)
										break
									}
								this.maxHistoryCount > 0 &&
									t.length > this.maxHistoryCount &&
									t.splice(t.length - 1, 1),
									(d.commands.history = t)
							},
							history: function () {
								return d.commands.history || []
							},
							getPrefix: function (e) {
								var t = e.getCursorPosition(),
									n = e.getValue()
								return n.substring(0, t.column)
							},
							getCompletions: function (e) {
								function t(e, t) {
									var n = JSON.parse(JSON.stringify(e)),
										r = new o(n)
									return r.filterCompletions(n, t)
								}
								function n(e, t) {
									if (!t || !t.length) return e
									var n = []
									t.forEach(function (e) {
										n.push(e.command)
									})
									var r = []
									return (
										e.forEach(function (e) {
											n.indexOf(e.command) === -1 && r.push(e)
										}),
										r
									)
								}
								var r = this.getPrefix(e),
									i = t(this.history(), r),
									u = n(s, i)
								;(u = t(u, r)),
									i.length &&
										u.length &&
										((i[0].message = ' Recently used'), (u[0].message = ' Other commands'))
								var a = i.concat(u)
								return a.length > 0 ? a : [{ value: 'No matching commands', error: 1 }]
							},
						})
				}),
				(d.modes = function (e, t) {
					var n = h.modes
					;(n = n.map(function (e) {
						return { value: e.caption, mode: e.name }
					})),
						d(e, '', {
							name: 'modes',
							selection: [0, Number.MAX_VALUE],
							onAccept: function (t) {
								if (t.item) {
									var n = 'ace/mode/' + t.item.mode
									e.session.setMode(n)
								}
							},
							getPrefix: function (e) {
								var t = e.getCursorPosition(),
									n = e.getValue()
								return n.substring(0, t.column)
							},
							getCompletions: function (e) {
								function t(e, t) {
									var n = JSON.parse(JSON.stringify(e)),
										r = new o(n)
									return r.filterCompletions(n, t)
								}
								var r = this.getPrefix(e),
									i = t(n, r)
								return i.length > 0
									? i
									: [{ caption: 'No mode matching', value: 'No mode matching', error: 1 }]
							},
						})
				}),
				i.importCssString(
					'.ace_prompt_container {    max-width: 600px;    width: 100%;    margin: 20px auto;    padding: 3px;    background: white;    border-radius: 2px;    box-shadow: 0px 2px 3px 0px #555;}'
				),
				(t.prompt = d)
		}
	)
;(function () {
	ace.require(['ace/ext/prompt'], function (m) {
		if (typeof module == 'object' && typeof exports == 'object' && module) {
			module.exports = m
		}
	})
})()
