mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-11-30 03:16:12 +03:00
1 line
1013 KiB
Plaintext
1 line
1013 KiB
Plaintext
{"version":3,"file":"xterm.js","mappings":"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AQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,M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","sources":["webpack://xterm/webpack/universalModuleDefinition","webpack://xterm/./src/browser/AccessibilityManager.ts","webpack://xterm/./src/browser/Clipboard.ts","webpack://xterm/./src/browser/ColorContrastCache.ts","webpack://xterm/./src/browser/ColorManager.ts","webpack://xterm/./src/browser/Dom.ts","webpack://xterm/./src/browser/Lifecycle.ts","webpack://xterm/./src/browser/Linkifier2.ts","webpack://xterm/./src/browser/LocalizableStrings.ts","webpack://xterm/./src/browser/OscLinkProvider.ts","webpack://xterm/./src/browser/RenderDebouncer.ts","webpack://xterm/./src/browser/ScreenDprMonitor.ts","webpack://xterm/./src/browser/Terminal.ts","webpack://xterm/./src/browser/TimeBasedDebouncer.ts","webpack://xterm/./src/browser/Viewport.ts","webpack://xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://xterm/./src/browser/input/CompositionHelper.ts","webpack://xterm/./src/browser/input/Mouse.ts","webpack://xterm/./src/browser/input/MoveToCell.ts","webpack://xterm/./src/browser/renderer/Constants.ts","webpack://xterm/./src/browser/renderer/RendererUtils.ts","webpack://xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://xterm/./src/browser/selection/SelectionModel.ts","webpack://xterm/./src/browser/services/CharSizeService.ts","webpack://xterm/./src/browser/services/CharacterJoinerService.ts","webpack://xterm/./src/browser/services/CoreBrowserService.ts","webpack://xterm/./src/browser/services/MouseService.ts","webpack://xterm/./src/browser/services/RenderService.ts","webpack://xterm/./src/browser/services/SelectionService.ts","webpack://xterm/./src/browser/services/Services.ts","webpack://xterm/./src/common/CircularList.ts","webpack://xterm/./src/common/Clone.ts","webpack://xterm/./src/common/Color.ts","webpack://xterm/./src/common/CoreTerminal.ts","webpack://xterm/./src/common/EventEmitter.ts","webpack://xterm/./src/common/InputHandler.ts","webpack://xterm/./src/common/Lifecycle.ts","webpack://xterm/./src/common/MultiKeyMap.ts","webpack://xterm/./src/common/Platform.ts","webpack://xterm/./src/common/SortedList.ts","webpack://xterm/./src/common/TypedArrayUtils.ts","webpack://xterm/./src/common/WindowsMode.ts","webpack://xterm/./src/common/buffer/AttributeData.ts","webpack://xterm/./src/common/buffer/Buffer.ts","webpack://xterm/./src/common/buffer/BufferLine.ts","webpack://xterm/./src/common/buffer/BufferRange.ts","webpack://xterm/./src/common/buffer/BufferReflow.ts","webpack://xterm/./src/common/buffer/BufferSet.ts","webpack://xterm/./src/common/buffer/CellData.ts","webpack://xterm/./src/common/buffer/Constants.ts","webpack://xterm/./src/common/buffer/Marker.ts","webpack://xterm/./src/common/data/Charsets.ts","webpack://xterm/./src/common/data/EscapeSequences.ts","webpack://xterm/./src/common/input/Keyboard.ts","webpack://xterm/./src/common/input/TextDecoder.ts","webpack://xterm/./src/common/input/UnicodeV6.ts","webpack://xterm/./src/common/input/WriteBuffer.ts","webpack://xterm/./src/common/input/XParseColor.ts","webpack://xterm/./src/common/parser/Constants.ts","webpack://xterm/./src/common/parser/DcsParser.ts","webpack://xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://xterm/./src/common/parser/OscParser.ts","webpack://xterm/./src/common/parser/Params.ts","webpack://xterm/./src/common/public/AddonManager.ts","webpack://xterm/./src/common/public/BufferApiView.ts","webpack://xterm/./src/common/public/BufferLineApiView.ts","webpack://xterm/./src/common/public/BufferNamespaceApi.ts","webpack://xterm/./src/common/public/ParserApi.ts","webpack://xterm/./src/common/public/UnicodeApi.ts","webpack://xterm/./src/common/services/BufferService.ts","webpack://xterm/./src/common/services/CharsetService.ts","webpack://xterm/./src/common/services/CoreMouseService.ts","webpack://xterm/./src/common/services/CoreService.ts","webpack://xterm/./src/common/services/DecorationService.ts","webpack://xterm/./src/common/services/DirtyRowService.ts","webpack://xterm/./src/common/services/InstantiationService.ts","webpack://xterm/./src/common/services/LogService.ts","webpack://xterm/./src/common/services/OptionsService.ts","webpack://xterm/./src/common/services/OscLinkService.ts","webpack://xterm/./src/common/services/ServiceRegistry.ts","webpack://xterm/./src/common/services/Services.ts","webpack://xterm/./src/common/services/UnicodeService.ts","webpack://xterm/webpack/bootstrap","webpack://xterm/./src/browser/public/Terminal.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from 'browser/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { isMac } from 'common/Platform';\nimport { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderService } from 'browser/services/Services';\nimport { removeElementFromParent } from 'browser/Dom';\n\nconst MAX_ROWS_TO_READ = 20;\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\nexport class AccessibilityManager extends Disposable {\n private _accessibilityTreeRoot: HTMLElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n\n private _renderRowsDebouncer: IRenderDebouncer;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _renderService: IRenderService\n ) {\n super();\n this._accessibilityTreeRoot = document.createElement('div');\n this._accessibilityTreeRoot.classList.add('xterm-accessibility');\n this._accessibilityTreeRoot.tabIndex = 0;\n\n this._rowContainer = document.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._onBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._onBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n this._accessibilityTreeRoot.appendChild(this._rowContainer);\n\n this._renderRowsDebouncer = new TimeBasedDebouncer(this._renderRows.bind(this));\n this._refreshRows();\n\n this._liveRegion = document.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityTreeRoot.appendChild(this._liveRegion);\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityTreeRoot);\n\n this.register(this._renderRowsDebouncer);\n this.register(this._terminal.onResize(e => this._onResize(e.rows)));\n this.register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this.register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this.register(this._terminal.onA11yChar(char => this._onChar(char)));\n this.register(this._terminal.onLineFeed(() => this._onChar('\\n')));\n this.register(this._terminal.onA11yTab(spaceCount => this._onTab(spaceCount)));\n this.register(this._terminal.onKey(e => this._onKey(e.key)));\n this.register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n\n this._screenDprMonitor = new ScreenDprMonitor(window);\n this.register(this._screenDprMonitor);\n this._screenDprMonitor.setListener(() => this._refreshRowsDimensions());\n // This shouldn't be needed on modern browsers but is present in case the\n // media query that drives the ScreenDprMonitor isn't supported\n this.register(addDisposableDomListener(window, 'resize', () => this._refreshRowsDimensions()));\n }\n\n public dispose(): void {\n super.dispose();\n removeElementFromParent(this._accessibilityTreeRoot);\n this._rowElements.length = 0;\n }\n\n private _onBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _onResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = document.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _onTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._onChar(' ');\n }\n }\n\n private _onChar(char: string): void {\n if (this._liveRegionLineCount < MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent += Strings.tooMuchOutput;\n }\n }\n\n // Only detach/attach on mac as otherwise messages can go unaccounced\n if (isMac) {\n if (this._liveRegion.textContent && this._liveRegion.textContent.length > 0 && !this._liveRegion.parentNode) {\n setTimeout(() => {\n this._accessibilityTreeRoot.appendChild(this._liveRegion);\n }, 0);\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n\n // Only detach/attach on mac as otherwise messages can go unaccounced\n if (isMac) {\n removeElementFromParent(this._liveRegion);\n }\n }\n\n private _onKey(keyChar: string): void {\n this._clearLiveRegion();\n this._charsToConsume.push(keyChar);\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._renderRowsDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true);\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.innerText = '\\u00a0';\n } else {\n element.textContent = lineData;\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n }\n }\n this._announceCharacters();\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.actualCellHeight) {\n return;\n }\n if (this._rowElements.length !== this._terminal.rows) {\n this._onResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.actualCellHeight}px`;\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from 'browser/services/Services';\nimport { ICoreService } from 'common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (bracketedPasteMode) {\n return '\\x1b[200~' + text + '\\x1b[201~';\n }\n return text;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n * @param ev The original paste event to be handled\n * @param term The terminal on which to apply the handled paste event\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n * @param selectionService The terminal's selection manager.\n * @param shouldSelectWord If true and there is no selection the current word will be selected\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { IColor } from 'common/Types';\nimport { TwoKeyMap } from 'common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();\n private _css: TwoKeyMap</* bg */number, /* fg */number, string | null> = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorManager, IColorSet, IColorContrastCache } from 'browser/Types';\nimport { ITheme } from 'common/services/Services';\nimport { channels, color, css } from 'common/Color';\nimport { ColorContrastCache } from 'browser/ColorContrastCache';\nimport { ColorIndex, IColor } from 'common/Types';\n\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = css.toColor('#000000');\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n\n/**\n * Manages the source of truth for a terminal's colors.\n */\nexport class ColorManager implements IColorManager {\n public colors: IColorSet;\n private _ctx: CanvasRenderingContext2D;\n private _litmusColor: CanvasGradient;\n private _contrastCache: IColorContrastCache;\n private _restoreColors!: IRestoreColorSet;\n\n constructor(document: Document, public allowTransparency: boolean) {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get rendering context');\n }\n this._ctx = ctx;\n this._ctx.globalCompositeOperation = 'copy';\n this._litmusColor = this._ctx.createLinearGradient(0, 0, 1, 1);\n this._contrastCache = new ColorContrastCache();\n this.colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache\n };\n this._updateRestoreColors();\n }\n\n public onOptionsChange(key: string, value: any): void {\n switch (key) {\n case 'minimumContrastRatio':\n this._contrastCache.clear();\n break;\n case 'allowTransparency':\n this.allowTransparency = value;\n break;\n }\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n public setTheme(theme: ITheme = {}): void {\n this.colors.foreground = this._parseColor(theme.foreground, DEFAULT_FOREGROUND);\n this.colors.background = this._parseColor(theme.background, DEFAULT_BACKGROUND);\n this.colors.cursor = this._parseColor(theme.cursor, DEFAULT_CURSOR, true);\n this.colors.cursorAccent = this._parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT, true);\n this.colors.selectionBackgroundTransparent = this._parseColor(theme.selectionBackground, DEFAULT_SELECTION, true);\n this.colors.selectionBackgroundOpaque = color.blend(this.colors.background, this.colors.selectionBackgroundTransparent);\n this.colors.selectionInactiveBackgroundTransparent = this._parseColor(theme.selectionInactiveBackground, this.colors.selectionBackgroundTransparent, true);\n this.colors.selectionInactiveBackgroundOpaque = color.blend(this.colors.background, this.colors.selectionInactiveBackgroundTransparent);\n const nullColor: IColor = {\n css: '',\n rgba: 0\n };\n this.colors.selectionForeground = theme.selectionForeground ? this._parseColor(theme.selectionForeground, nullColor) : undefined;\n if (this.colors.selectionForeground === nullColor) {\n this.colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(this.colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n this.colors.selectionBackgroundTransparent = color.opacity(this.colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(this.colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n this.colors.selectionInactiveBackgroundTransparent = color.opacity(this.colors.selectionInactiveBackgroundTransparent, opacity);\n }\n this.colors.ansi = DEFAULT_ANSI_COLORS.slice();\n this.colors.ansi[0] = this._parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n this.colors.ansi[1] = this._parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n this.colors.ansi[2] = this._parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n this.colors.ansi[3] = this._parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n this.colors.ansi[4] = this._parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n this.colors.ansi[5] = this._parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n this.colors.ansi[6] = this._parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n this.colors.ansi[7] = this._parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n this.colors.ansi[8] = this._parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n this.colors.ansi[9] = this._parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n this.colors.ansi[10] = this._parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n this.colors.ansi[11] = this._parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n this.colors.ansi[12] = this._parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n this.colors.ansi[13] = this._parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n this.colors.ansi[14] = this._parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n this.colors.ansi[15] = this._parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(this.colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n this.colors.ansi[i + 16] = this._parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear our the cache\n this._contrastCache.clear();\n this._updateRestoreColors();\n }\n\n public restoreColor(slot?: ColorIndex): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this.colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case ColorIndex.FOREGROUND:\n this.colors.foreground = this._restoreColors.foreground;\n break;\n case ColorIndex.BACKGROUND:\n this.colors.background = this._restoreColors.background;\n break;\n case ColorIndex.CURSOR:\n this.colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this.colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this.colors.foreground,\n background: this.colors.background,\n cursor: this.colors.cursor,\n ansi: this.colors.ansi.slice()\n };\n }\n\n private _parseColor(\n css: string | undefined,\n fallback: IColor,\n allowTransparency: boolean = this.allowTransparency\n ): IColor {\n if (css === undefined) {\n return fallback;\n }\n\n // If parsing the value results in failure, then it must be ignored, and the attribute must\n // retain its previous value.\n // -- https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n this._ctx.fillStyle = this._litmusColor;\n this._ctx.fillStyle = css;\n if (typeof this._ctx.fillStyle !== 'string') {\n console.warn(`Color: ${css} is invalid using fallback ${fallback.css}`);\n return fallback;\n }\n\n this._ctx.fillRect(0, 0, 1, 1);\n const data = this._ctx.getImageData(0, 0, 1, 1).data;\n\n // Check if the printed color was transparent\n if (data[3] !== 0xFF) {\n if (!allowTransparency) {\n // Ideally we'd just ignore the alpha channel, but...\n //\n // Browsers may not give back exactly the same RGB values we put in, because most/all\n // convert the color to a pre-multiplied representation. getImageData converts that back to\n // a un-premultipled representation, but the precision loss may make the RGB channels unuable\n // on their own.\n //\n // E.g. In Chrome #12345610 turns into #10305010, and in the extreme case, 0xFFFFFF00 turns\n // into 0x00000000.\n //\n // \"Note: Due to the lossy nature of converting to and from premultiplied alpha color values,\n // pixels that have just been set using putImageData() might be returned to an equivalent\n // getImageData() as different values.\"\n // -- https://html.spec.whatwg.org/multipage/canvas.html#pixel-manipulation\n //\n // So let's just use the fallback color in this case instead.\n console.warn(\n `Color: ${css} is using transparency, but allowTransparency is false. ` +\n `Using fallback ${fallback.css}.`\n );\n return fallback;\n }\n\n // https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n // the color value has alpha less than 1.0, and the string is the color value in the CSS rgba()\n const [r, g, b, a] = this._ctx.fillStyle.substring(5, this._ctx.fillStyle.length - 1).split(',').map(component => Number(component));\n const alpha = Math.round(a * 255);\n const rgba: number = channels.toRgba(r, g, b, alpha);\n return {\n rgba,\n css\n };\n }\n\n return {\n // https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n // if it has alpha equal to 1.0, then the string is a lowercase six-digit hex value, prefixed with a \"#\" character\n css: this._ctx.fillStyle,\n rgba: channels.toRgba(data[0], data[1], data[2], data[3])\n };\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function removeElementFromParent(...elements: (HTMLElement | undefined)[]): void {\n for (const e of elements) {\n e?.parentElement?.removeChild(e);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param type The event type.\n * @param handler The handler for the listener.\n */\nexport function addDisposableDomListener(\n node: Element | Window | Document,\n type: string,\n handler: (e: any) => void,\n options?: boolean | AddEventListenerOptions\n): IDisposable {\n node.addEventListener(type, handler, options);\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n node.removeEventListener(type, handler, options);\n }\n };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILinkifier2, ILinkProvider, IBufferCellPosition, ILink, ILinkifierEvent, ILinkDecorations, ILinkWithState } from 'browser/Types';\nimport { IDisposable } from 'common/Types';\nimport { IMouseService, IRenderService } from './services/Services';\nimport { IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable, getDisposeArrayDisposable, disposeArray } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\n\nexport class Linkifier2 extends Disposable implements ILinkifier2 {\n private _element: HTMLElement | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _linkProviders: ILinkProvider[] = [];\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _activeProviderReplies: Map<Number, ILinkWithState[] | undefined> | undefined;\n private _activeLine: number = -1;\n\n private _onShowLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n public get onShowLinkUnderline(): IEvent<ILinkifierEvent> { return this._onShowLinkUnderline.event; }\n private _onHideLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n public get onHideLinkUnderline(): IEvent<ILinkifierEvent> { return this._onHideLinkUnderline.event; }\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n this.register(getDisposeArrayDisposable(this._linkCacheDisposables));\n }\n\n public dispose(): void {\n super.dispose();\n this._lastMouseEvent = undefined;\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this._linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this._linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this._linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n\n public attachToDom(element: HTMLElement, mouseService: IMouseService, renderService: IRenderService): void {\n this._element = element;\n this._mouseService = mouseService;\n this._renderService = renderService;\n\n this.register(addDisposableDomListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this.register(addDisposableDomListener(this._element, 'mousemove', this._onMouseMove.bind(this)));\n this.register(addDisposableDomListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this.register(addDisposableDomListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _onMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n if (!this._element || !this._mouseService) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._onHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _onHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map<Number, ILinkWithState[] | undefined>): void {\n const occupiedCells = new Set<number>();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._element || !this._mouseService || !this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink === this._currentLink && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._element || !this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n disposeArray(this._linkCacheDisposables);\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._element || !this._lastMouseEvent || !this._mouseService) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element?.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Add listener for rerendering\n if (this._renderService) {\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n this._clearCurrentLink(start, e.end + 1 + this._bufferService.buffer.ydisp);\n }));\n }\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const sameLine = link.range.start.y === link.range.end.y;\n const wrappedFromLeft = link.range.start.y < position.y;\n const wrappedToRight = link.range.end.y > position.y;\n\n // If the start and end have the same y, then the position must be between start and end x\n // If not, then handle each case seperately, depending on which way it wraps\n return ((sameLine && link.range.start.x <= position.x && link.range.end.x >= position.x) ||\n (wrappedFromLeft && link.range.end.x >= position.x) ||\n (wrappedToRight && link.range.start.x <= position.x) ||\n (wrappedFromLeft && wrappedToRight)) &&\n link.range.start.y <= position.y &&\n link.range.end.y >= position.y;\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement, mouseService: IMouseService): IBufferCellPosition | undefined {\n const coords = mouseService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\n// eslint-disable-next-line prefer-const\nexport let promptLabel = 'Terminal input';\n\n// eslint-disable-next-line prefer-const\nexport let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read';\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink, ILinkProvider } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = new CellData();\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n // These ranges are 1-based\n const range: IBufferRange = {\n start: {\n x: currentStart + 1,\n y\n },\n end: {\n // Offset end x if it's a link that ends on the last cell in the line\n x: x + (!finishLink && x === lineLength - 1 ? 1 : 0),\n y\n }\n };\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same id\n callback(result);\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _parentWindow: Window,\n private _renderCallback: (start: number, end: number) => void\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame) {\n this._parentWindow.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n if (!this._animationFrame) {\n this._animationFrame = this._parentWindow.requestAnimationFrame(() => this._innerRefresh());\n }\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart !== undefined ? rowStart : 0;\n rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame) {\n return;\n }\n\n this._animationFrame = this._parentWindow.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\n\nexport type ScreenDprListener = (newDevicePixelRatio?: number, oldDevicePixelRatio?: number) => void;\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nexport class ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _listener: ScreenDprListener | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n\n constructor(private _parentWindow: Window) {\n super();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n }\n\n public setListener(listener: ScreenDprListener): void {\n if (this._listener) {\n this.clearListener();\n }\n this._listener = listener;\n this._outerListener = () => {\n if (!this._listener) {\n return;\n }\n this._listener(this._parentWindow.devicePixelRatio, this._currentDevicePixelRatio);\n this._updateDpr();\n };\n this._updateDpr();\n }\n\n public dispose(): void {\n super.dispose();\n this.clearListener();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._listener || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._listener = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { ICompositionHelper, ITerminal, IBrowser, CustomKeyEventHandler, IViewport, ILinkifier2, CharacterJoinerHandler, IBufferRange } from 'browser/Types';\nimport { IRenderer } from 'browser/renderer/Types';\nimport { CompositionHelper } from 'browser/input/CompositionHelper';\nimport { Viewport } from 'browser/Viewport';\nimport { rightClickHandler, moveTextAreaUnderMouseCursor, handlePasteEvent, copyHandler, paste } from 'browser/Clipboard';\nimport { C0, C1_ESCAPED } from 'common/data/EscapeSequences';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { SelectionService } from 'browser/services/SelectionService';\nimport * as Browser from 'common/Platform';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { ITheme, IMarker, IDisposable, ILinkProvider, IDecorationOptions, IDecoration } from 'xterm';\nimport { DomRenderer } from 'browser/renderer/dom/DomRenderer';\nimport { KeyboardResultType, CoreMouseEventType, CoreMouseButton, CoreMouseAction, ITerminalOptions, ScrollSource, IColorEvent, ColorIndex, ColorRequestType } from 'common/Types';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { ColorManager } from 'browser/ColorManager';\nimport { RenderService } from 'browser/services/RenderService';\nimport { ICharSizeService, IRenderService, IMouseService, ISelectionService, ICoreBrowserService, ICharacterJoinerService } from 'browser/services/Services';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { IBuffer } from 'common/buffer/Types';\nimport { MouseService } from 'browser/services/MouseService';\nimport { Linkifier2 } from 'browser/Linkifier2';\nimport { CoreBrowserService } from 'browser/services/CoreBrowserService';\nimport { CoreTerminal } from 'common/CoreTerminal';\nimport { color, rgba } from 'common/Color';\nimport { CharacterJoinerService } from 'browser/services/CharacterJoinerService';\nimport { toRgbString } from 'common/input/XParseColor';\nimport { BufferDecorationRenderer } from 'browser/decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from 'browser/decorations/OverviewRulerRenderer';\nimport { DecorationService } from 'common/services/DecorationService';\nimport { IDecorationService } from 'common/services/Services';\nimport { OscLinkProvider } from 'browser/OscLinkProvider';\n\n// Let it work inside Node.js for automated testing purposes.\nconst document: Document = (typeof window !== 'undefined') ? window.document : null as any;\n\nexport class Terminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportScrollArea: HTMLElement | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n\n // private _visualBellTimer: number;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // browser services\n private _decorationService: DecorationService;\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occured since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n public linkifier2: ILinkifier2;\n public viewport: IViewport | undefined;\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: AccessibilityManager | undefined;\n private _colorManager: ColorManager | undefined;\n private _theme: ITheme | undefined;\n\n private _onCursorMove = new EventEmitter<void>();\n public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n private _onKey = new EventEmitter<{ key: string, domEvent: KeyboardEvent }>();\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._onKey.event; }\n private _onRender = new EventEmitter<{ start: number, end: number }>();\n public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; }\n private _onSelectionChange = new EventEmitter<void>();\n public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n private _onTitleChange = new EventEmitter<string>();\n public get onTitleChange(): IEvent<string> { return this._onTitleChange.event; }\n private _onBell = new EventEmitter<void>();\n public get onBell(): IEvent<void> { return this._onBell.event; }\n\n private _onFocus = new EventEmitter<void>();\n public get onFocus(): IEvent<void> { return this._onFocus.event; }\n private _onBlur = new EventEmitter<void>();\n public get onBlur(): IEvent<void> { return this._onBlur.event; }\n private _onA11yCharEmitter = new EventEmitter<string>();\n public get onA11yChar(): IEvent<string> { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = new EventEmitter<number>();\n public get onA11yTab(): IEvent<number> { return this._onA11yTabEmitter.event; }\n\n /**\n * Creates a new `Terminal` object.\n *\n * @param options An object containing a set of options, the available options are:\n * - `cursorBlink` (boolean): Whether the terminal cursor blinks\n * - `cols` (number): The number of columns of the terminal (horizontal size)\n * - `rows` (number): The number of rows of the terminal (vertical size)\n *\n * @public\n * @class Xterm Xterm\n * @alias module:xterm/src/xterm\n */\n constructor(\n options: Partial<ITerminalOptions> = {}\n ) {\n super(options);\n\n this._setup();\n\n this.linkifier2 = this.register(this._instantiationService.createInstance(Linkifier2));\n this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n\n // Setup InputHandler listeners\n this.register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this.register(this._inputHandler.onRequestRefreshRows((start, end) => this.refresh(start, end)));\n this.register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this.register(this._inputHandler.onRequestReset(() => this.reset()));\n this.register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this.register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this.register(forwardEvent(this._inputHandler.onCursorMove, this._onCursorMove));\n this.register(forwardEvent(this._inputHandler.onTitleChange, this._onTitleChange));\n this.register(forwardEvent(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this.register(forwardEvent(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this.register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._colorManager) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi' | undefined = undefined;\n let ident = '';\n switch (req.index) {\n case ColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case ColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case ColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const channels = color.toColorRGB(acc === 'ansi'\n ? this._colorManager.colors.ansi[req.index]\n : this._colorManager.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(channels)}${C1_ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') this._colorManager.colors.ansi[req.index] = rgba.toColor(...req.color);\n else this._colorManager.colors[acc] = rgba.toColor(...req.color);\n break;\n case ColorRequestType.RESTORE:\n this._colorManager.restoreColor(req.index);\n break;\n }\n }\n this._renderService?.setColors(this._colorManager.colors);\n this.viewport?.onThemeChange(this._colorManager.colors);\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n super.dispose();\n this._renderService?.dispose();\n this._customKeyEventHandler = undefined;\n this.write = () => { };\n this.element?.parentNode?.removeChild(this.element);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n protected _updateOptions(key: string): void {\n super._updateOptions(key);\n\n // TODO: These listeners should be owned by individual components\n switch (key) {\n case 'fontFamily':\n case 'fontSize':\n // When the font changes the size of the cells may change which requires a renderer clear\n this._renderService?.clear();\n this._charSizeService?.measure();\n break;\n case 'cursorBlink':\n case 'cursorStyle':\n // The DOM renderer needs a row refresh to update the cursor styles\n this.refresh(this.buffer.y, this.buffer.y);\n break;\n case 'customGlyphs':\n case 'drawBoldTextInBrightColors':\n case 'letterSpacing':\n case 'lineHeight':\n case 'fontWeight':\n case 'fontWeightBold':\n case 'minimumContrastRatio':\n // When the font changes the size of the cells may change which requires a renderer clear\n if (this._renderService) {\n this._renderService.clear();\n this._renderService.onResize(this.cols, this.rows);\n this.refresh(0, this.rows - 1);\n }\n break;\n case 'scrollback':\n this.viewport?.syncScrollArea();\n break;\n case 'screenReaderMode':\n if (this.optionsService.rawOptions.screenReaderMode) {\n if (!this._accessibilityManager && this._renderService) {\n this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n }\n } else {\n this._accessibilityManager?.dispose();\n this._accessibilityManager = undefined;\n }\n break;\n case 'tabStopWidth': this.buffers.setupTabStops(); break;\n case 'theme':\n this._setTheme(this.optionsService.rawOptions.theme);\n break;\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _onTextAreaFocus(ev: KeyboardEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.updateCursorStyle(ev);\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _onTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.actualCellHeight;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.actualCellWidth * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.actualCellHeight;\n const cursorLeft = cursorX * this._renderService.dimensions.actualCellWidth;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this.register(addDisposableDomListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService);\n this.register(addDisposableDomListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this.register(addDisposableDomListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this.register(addDisposableDomListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this.register(addDisposableDomListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this.register(addDisposableDomListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this.register(addDisposableDomListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'compositionstart', () => this._compositionHelper!.compositionstart()));\n this.register(addDisposableDomListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this.register(addDisposableDomListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this.register(addDisposableDomListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this.register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n this._document = parent.ownerDocument!;\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.setAttribute('tabindex', '0');\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = document.createDocumentFragment();\n this._viewportElement = document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this._viewportScrollArea = document.createElement('div');\n this._viewportScrollArea.classList.add('xterm-scroll-area');\n this._viewportElement.appendChild(this._viewportScrollArea);\n\n this.screenElement = document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n this.textarea = document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel);\n this.textarea.setAttribute('aria-multiline', 'false');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this.register(addDisposableDomListener(this.textarea, 'focus', (ev: KeyboardEvent) => this._onTextAreaFocus(ev)));\n this.register(addDisposableDomListener(this.textarea, 'blur', () => this._onTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._coreBrowserService = this._instantiationService.createInstance(CoreBrowserService, this.textarea, this._document.defaultView ?? window);\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._theme = this.options.theme || this._theme;\n this._colorManager = new ColorManager(document, this.options.allowTransparency);\n this.register(this.optionsService.onOptionChange(e => this._colorManager!.onOptionsChange(e, this.optionsService.rawOptions[e])));\n this._colorManager.setTheme(this._theme);\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n const renderer = this._createRenderer();\n this._renderService = this.register(this._instantiationService.createInstance(RenderService, renderer, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this.register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n\n this.viewport = this._instantiationService.createInstance(Viewport,\n (amount: number) => this.scrollLines(amount, true, ScrollSource.VIEWPORT),\n this._viewportElement,\n this._viewportScrollArea,\n this.element\n );\n this.viewport.onThemeChange(this._colorManager.colors);\n this.register(this._inputHandler.onRequestSyncScrollBar(() => this.viewport!.syncScrollArea()));\n this.register(this.viewport);\n\n this.register(this.onCursorMove(() => {\n this._renderService!.onCursorMove();\n this._syncTextArea();\n }));\n this.register(this.onResize(() => this._renderService!.onResize(this.cols, this.rows)));\n this.register(this.onBlur(() => this._renderService!.onBlur()));\n this.register(this.onFocus(() => this._renderService!.onFocus()));\n this.register(this._renderService.onDimensionsChange(() => this.viewport!.syncScrollArea()));\n\n this._selectionService = this.register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n this.linkifier2\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this.register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this.register(this._selectionService.onRequestRedraw(e => this._renderService!.onSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this.register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this.register(this._onScroll.event(ev => {\n this.viewport!.syncScrollArea();\n this._selectionService!.refresh();\n }));\n this.register(addDisposableDomListener(this._viewportElement, 'scroll', () => this._selectionService!.refresh()));\n\n this.linkifier2.attachToDom(this.screenElement, this._mouseService, this._renderService);\n this.register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this.register(addDisposableDomListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.onMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.coreMouseService.areMouseEventsActive) {\n this._selectionService.disable();\n this.element.classList.add('enable-mouse-events');\n } else {\n this._selectionService.enable();\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n }\n\n if (this.options.overviewRulerWidth) {\n this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onOptionChange(() => {\n if (!this._overviewRulerRenderer && this.options.overviewRulerWidth && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this.bindMouse();\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this._colorManager!.colors, this.element!, this.screenElement!, this._viewportElement!, this.linkifier2);\n }\n\n /**\n * Sets the theme on the renderer. The renderer must have been initialized.\n * @param theme The theme to set.\n */\n private _setTheme(theme: ITheme): void {\n this._theme = theme;\n this._colorManager?.setTheme(theme);\n this._renderService?.setColors(this._colorManager!.colors);\n this.viewport?.onThemeChange(this._colorManager!.colors);\n }\n\n /**\n * Bind certain mouse events to the terminal.\n * By default only 3 button + wheel up/down is ativated. For higher buttons\n * no mouse report will be created. Typically the standard actions will be active.\n *\n * There are several reasons not to enable support for higher buttons/wheel:\n * - Button 4 and 5 are typically used for history back and forward navigation,\n * there is no straight forward way to supress/intercept those standard actions.\n * - Support for higher buttons does not work in some platform/browser combinations.\n * - Left/right wheel was not tested.\n * - Emulators vary in mouse button support, typically only 3 buttons and\n * wheel up/down work reliable.\n *\n * TODO: Move mouse event code into its own file.\n */\n public bindMouse(): void {\n const self = this;\n const el = this.element!;\n\n // send event to CoreMouseService\n function sendEvent(ev: MouseEvent | WheelEvent): boolean {\n // get mouse coordinates\n const pos = self._mouseService!.getMouseReportCoords(ev, self.screenElement!);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as any).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n const amount = self.viewport!.getLinesScrolled(ev as WheelEvent);\n\n if (amount === 0) {\n return false;\n }\n\n action = (ev as WheelEvent).deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n return self.coreMouseService.triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of CoreMouseService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: { [key: string]: ((ev: Event) => void) | null } = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const eventListeners: { [key: string]: (ev: any) => void | boolean } = {\n mouseup: (ev: MouseEvent) => {\n sendEvent(ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n if (requestedEvents.mousedrag) {\n this._document!.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }\n return this.cancel(ev);\n },\n wheel: (ev: WheelEvent) => {\n sendEvent(ev);\n return this.cancel(ev, true);\n },\n mousedrag: (ev: MouseEvent) => {\n // deal only with move while a button is held\n if (ev.buttons) {\n sendEvent(ev);\n }\n },\n mousemove: (ev: MouseEvent) => {\n // deal only with move without any button\n if (!ev.buttons) {\n sendEvent(ev);\n }\n }\n };\n this.register(this.coreMouseService.onProtocolChange(events => {\n // apply global changes on events\n if (events) {\n if (this.optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this.coreMouseService.explainEvents(events));\n }\n this.element!.classList.add('enable-mouse-events');\n this._selectionService!.disable();\n } else {\n this._logService.debug('Unbinding from mouse events.');\n this.element!.classList.remove('enable-mouse-events');\n this._selectionService!.enable();\n }\n\n // add/remove handlers from requestedEvents\n\n if (!(events & CoreMouseEventType.MOVE)) {\n el.removeEventListener('mousemove', requestedEvents.mousemove!);\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n el.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n el.removeEventListener('wheel', requestedEvents.wheel!);\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n el.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n requestedEvents.mouseup = null;\n } else if (!requestedEvents.mouseup) {\n requestedEvents.mouseup = eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n this._document!.removeEventListener('mousemove', requestedEvents.mousedrag!);\n requestedEvents.mousedrag = null;\n } else if (!requestedEvents.mousedrag) {\n requestedEvents.mousedrag = eventListeners.mousedrag;\n }\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n this.register(addDisposableDomListener(el, 'mousedown', (ev: MouseEvent) => {\n ev.preventDefault();\n this.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this.coreMouseService.areMouseEventsActive || this._selectionService!.shouldForceSelection(ev)) {\n return;\n }\n\n sendEvent(ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (requestedEvents.mouseup) {\n this._document!.addEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n this._document!.addEventListener('mousemove', requestedEvents.mousedrag);\n }\n\n return this.cancel(ev);\n }));\n\n this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n // do nothing, if app side handles wheel itself\n if (requestedEvents.wheel) return;\n\n if (!this.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux.\n const amount = this.viewport!.getLinesScrolled(ev);\n\n // Do nothing if there's no vertical scroll\n if (amount === 0) {\n return;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n let data = '';\n for (let i = 0; i < Math.abs(amount); i++) {\n data += sequence;\n }\n this.coreService.triggerDataEvent(data, true);\n return this.cancel(ev, true);\n }\n\n // normal viewport scrolling\n // conditionally stop event, if the viewport still had rows to scroll within\n if (this.viewport!.onWheel(ev)) {\n return this.cancel(ev);\n }\n }, { passive: false }));\n\n this.register(addDisposableDomListener(el, 'touchstart', (ev: TouchEvent) => {\n if (this.coreMouseService.areMouseEventsActive) return;\n this.viewport!.onTouchStart(ev);\n return this.cancel(ev);\n }, { passive: true }));\n\n this.register(addDisposableDomListener(el, 'touchmove', (ev: TouchEvent) => {\n if (this.coreMouseService.areMouseEventsActive) return;\n if (!this.viewport!.onTouchMove(ev)) {\n return this.cancel(ev);\n }\n }, { passive: false }));\n }\n\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number): void {\n this._renderService?.refreshRows(start, end);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean, source = ScrollSource.TERMINAL): void {\n super.scrollLines(disp, suppressScrollEvent, source);\n this.refresh(0, this.rows - 1);\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService);\n }\n\n /**\n * Attaches a custom key event handler which is run before keys are processed,\n * giving consumers of xterm.js ultimate control as to what keys should be\n * processed by the terminal and what keys should not.\n * @param customKeyEventHandler The custom KeyboardEvent handler to attach.\n * This is a function that takes a KeyboardEvent, allowing consumers to stop\n * propagation and/or prevent the default action. The function returns whether\n * the event should be processed by xterm.js.\n */\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this.linkifier2.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public addMarker(cursorYOffset: number): IMarker | undefined {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown event\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keydown event to be handled.\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.buffer.ybase !== this.buffer.ydisp) {\n this._bufferService.scrollToBottom();\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n return this.cancel(event, true);\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n this.cancel(event, true);\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on.\n if (event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, true);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, this could cause issues if the event\n // is handled at a higher level, this is a compromise in order to echo keys to the screen\n // reader.\n if (!this.optionsService.rawOptions.screenReaderMode) {\n return this.cancel(event, true);\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n this.cancel(ev);\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this.coreService.triggerDataEvent(key, true);\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n\n this.cancel(ev);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n\n // Sync the scroll area to make sure scroll events don't fire and scroll the viewport to an\n // invalid location\n this.viewport?.syncScrollArea(true);\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n if (this.buffer.ybase === 0 && this.buffer.y === 0) {\n // Don't clear if it's already clear\n return;\n }\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this.refresh(0, this.rows - 1);\n this._onScroll.fire({ position: this.buffer.ydisp, source: ScrollSource.TERMINAL });\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1);\n this.viewport?.syncScrollArea();\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.canvasWidth.toFixed(0);\n const canvasHeight = this._renderService.dimensions.canvasHeight.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.actualCellWidth.toFixed(0);\n const cellHeight = this._renderService.dimensions.actualCellHeight.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n // TODO: Remove cancel function and cancelEvents option\n public cancel(ev: Event, force?: boolean): boolean | undefined {\n if (!this.options.cancelEvents && !force) {\n return;\n }\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18; // Alt\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\nimport { IRenderDebouncer } from 'browser/Types';\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n }\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart !== undefined ? rowStart : 0;\n rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = Date.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has lapsed since the last refresh; refresh immediately\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = Date.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IColorSet, IViewport } from 'browser/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IRenderDimensions } from 'browser/renderer/Types';\n\nconst FALLBACK_SCROLL_BAR_WIDTH = 15;\n\ninterface ISmoothScrollState {\n startTime: number;\n origin: number;\n target: number;\n}\n\n/**\n * Represents the viewport of a terminal, the visible area within the larger buffer of output.\n * Logic for the virtual scroll bar is included in this object.\n */\nexport class Viewport extends Disposable implements IViewport {\n public scrollBarWidth: number = 0;\n private _currentRowHeight: number = 0;\n private _currentScaledCellHeight: number = 0;\n private _lastRecordedBufferLength: number = 0;\n private _lastRecordedViewportHeight: number = 0;\n private _lastRecordedBufferHeight: number = 0;\n private _lastTouchY: number = 0;\n private _lastScrollTop: number = 0;\n private _activeBuffer: IBuffer;\n private _renderDimensions: IRenderDimensions;\n\n // Stores a partial line amount when scrolling, this is used to keep track of how much of a line\n // is scrolled so we can \"scroll\" over partial lines and feel natural on touchpads. This is a\n // quick fix and could have a more robust solution in place that reset the value when needed.\n private _wheelPartialScroll: number = 0;\n\n private _refreshAnimationFrame: number | null = null;\n private _ignoreNextScrollEvent: boolean = false;\n private _smoothScrollState: ISmoothScrollState = {\n startTime: 0,\n origin: -1,\n target: -1\n };\n\n constructor(\n private readonly _scrollLines: (amount: number) => void,\n private readonly _viewportElement: HTMLElement,\n private readonly _scrollArea: HTMLElement,\n private readonly _element: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Measure the width of the scrollbar. If it is 0 we can assume it's an OSX overlay scrollbar.\n // Unfortunately the overlay scrollbar would be hidden underneath the screen element in that case,\n // therefore we account for a standard amount to make it visible\n this.scrollBarWidth = (this._viewportElement.offsetWidth - this._scrollArea.offsetWidth) || FALLBACK_SCROLL_BAR_WIDTH;\n this.register(addDisposableDomListener(this._viewportElement, 'scroll', this._onScroll.bind(this)));\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n this._renderDimensions = this._renderService.dimensions;\n this.register(this._renderService.onDimensionsChange(e => this._renderDimensions = e));\n\n // Perform this async to ensure the ICharSizeService is ready.\n setTimeout(() => this.syncScrollArea(), 0);\n }\n\n public onThemeChange(colors: IColorSet): void {\n this._viewportElement.style.backgroundColor = colors.background.css;\n }\n\n /**\n * Refreshes row height, setting line-height, viewport height and scroll area height if\n * necessary.\n */\n private _refresh(immediate: boolean): void {\n if (immediate) {\n this._innerRefresh();\n if (this._refreshAnimationFrame !== null) {\n this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame);\n }\n return;\n }\n if (this._refreshAnimationFrame === null) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n }\n\n private _innerRefresh(): void {\n if (this._charSizeService.height > 0) {\n this._currentRowHeight = this._renderService.dimensions.scaledCellHeight / this._coreBrowserService.dpr;\n this._currentScaledCellHeight = this._renderService.dimensions.scaledCellHeight;\n this._lastRecordedViewportHeight = this._viewportElement.offsetHeight;\n const newBufferHeight = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderService.dimensions.canvasHeight);\n if (this._lastRecordedBufferHeight !== newBufferHeight) {\n this._lastRecordedBufferHeight = newBufferHeight;\n this._scrollArea.style.height = this._lastRecordedBufferHeight + 'px';\n }\n }\n\n // Sync scrollTop\n const scrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n if (this._viewportElement.scrollTop !== scrollTop) {\n // Ignore the next scroll event which will be triggered by setting the scrollTop as we do not\n // want this event to scroll the terminal\n this._ignoreNextScrollEvent = true;\n this._viewportElement.scrollTop = scrollTop;\n }\n\n this._refreshAnimationFrame = null;\n }\n\n /**\n * Updates dimensions and synchronizes the scroll area if necessary.\n */\n public syncScrollArea(immediate: boolean = false): void {\n // If buffer height changed\n if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {\n this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;\n this._refresh(immediate);\n return;\n }\n\n // If viewport height changed\n if (this._lastRecordedViewportHeight !== this._renderService.dimensions.canvasHeight) {\n this._refresh(immediate);\n return;\n }\n\n // If the buffer position doesn't match last scroll top\n if (this._lastScrollTop !== this._activeBuffer.ydisp * this._currentRowHeight) {\n this._refresh(immediate);\n return;\n }\n\n // If row height changed\n if (this._renderDimensions.scaledCellHeight !== this._currentScaledCellHeight) {\n this._refresh(immediate);\n return;\n }\n }\n\n /**\n * Handles scroll events on the viewport, calculating the new viewport and requesting the\n * terminal to scroll to it.\n * @param ev The scroll event.\n */\n private _onScroll(ev: Event): void {\n // Record current scroll top position\n this._lastScrollTop = this._viewportElement.scrollTop;\n\n // Don't attempt to scroll if the element is not visible, otherwise scrollTop will be corrupt\n // which causes the terminal to scroll the buffer to the top\n if (!this._viewportElement.offsetParent) {\n return;\n }\n\n // Ignore the event if it was flagged to ignore (when the source of the event is from Viewport)\n if (this._ignoreNextScrollEvent) {\n this._ignoreNextScrollEvent = false;\n // Still trigger the scroll so lines get refreshed\n this._scrollLines(0);\n return;\n }\n\n const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);\n const diff = newRow - this._bufferService.buffer.ydisp;\n this._scrollLines(diff);\n }\n\n private _smoothScroll(): void {\n // Check valid state\n if (this._isDisposed || this._smoothScrollState.origin === -1 || this._smoothScrollState.target === -1) {\n return;\n }\n\n // Calculate position complete\n const percent = this._smoothScrollPercent();\n this._viewportElement.scrollTop = this._smoothScrollState.origin + Math.round(percent * (this._smoothScrollState.target - this._smoothScrollState.origin));\n\n // Continue or finish smooth scroll\n if (percent < 1) {\n this._coreBrowserService.window.requestAnimationFrame(() => this._smoothScroll());\n } else {\n this._clearSmoothScrollState();\n }\n }\n\n private _smoothScrollPercent(): number {\n if (!this._optionsService.rawOptions.smoothScrollDuration || !this._smoothScrollState.startTime) {\n return 1;\n }\n return Math.max(Math.min((Date.now() - this._smoothScrollState.startTime) / this._optionsService.rawOptions.smoothScrollDuration, 1), 0);\n }\n\n private _clearSmoothScrollState(): void {\n this._smoothScrollState.startTime = 0;\n this._smoothScrollState.origin = -1;\n this._smoothScrollState.target = -1;\n }\n\n /**\n * Handles bubbling of scroll event in case the viewport has reached top or bottom\n * @param ev The scroll event.\n * @param amount The amount scrolled\n */\n private _bubbleScroll(ev: Event, amount: number): boolean {\n const scrollPosFromTop = this._viewportElement.scrollTop + this._lastRecordedViewportHeight;\n if ((amount < 0 && this._viewportElement.scrollTop !== 0) ||\n (amount > 0 && scrollPosFromTop < this._lastRecordedBufferHeight)) {\n if (ev.cancelable) {\n ev.preventDefault();\n }\n return false;\n }\n return true;\n }\n\n /**\n * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual\n * scrolling to `onScroll`, this event needs to be attached manually by the consumer of\n * `Viewport`.\n * @param ev The mouse wheel event.\n */\n public onWheel(ev: WheelEvent): boolean {\n const amount = this._getPixelsScrolled(ev);\n if (amount === 0) {\n return false;\n }\n if (!this._optionsService.rawOptions.smoothScrollDuration) {\n this._viewportElement.scrollTop += amount;\n } else {\n this._smoothScrollState.startTime = Date.now();\n if (this._smoothScrollPercent() < 1) {\n this._smoothScrollState.origin = this._viewportElement.scrollTop;\n if (this._smoothScrollState.target === -1) {\n this._smoothScrollState.target = this._viewportElement.scrollTop + amount;\n } else {\n this._smoothScrollState.target += amount;\n }\n this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0);\n this._smoothScroll();\n } else {\n this._clearSmoothScrollState();\n }\n }\n return this._bubbleScroll(ev, amount);\n }\n\n private _getPixelsScrolled(ev: WheelEvent): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n // Fallback to WheelEvent.DOM_DELTA_PIXEL\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n amount *= this._currentRowHeight;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._currentRowHeight * this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Gets the number of pixels scrolled by the mouse event taking into account what type of delta\n * is being used.\n * @param ev The mouse wheel event.\n */\n public getLinesScrolled(ev: WheelEvent): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n // Fallback to WheelEvent.DOM_DELTA_LINE\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= this._currentRowHeight + 0.0; // Prevent integer division\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n const modifier = this._optionsService.rawOptions.fastScrollModifier;\n // Multiply the scroll speed when the modifier is down\n if ((modifier === 'alt' && ev.altKey) ||\n (modifier === 'ctrl' && ev.ctrlKey) ||\n (modifier === 'shift' && ev.shiftKey)) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Handles the touchstart event, recording the touch occurred.\n * @param ev The touch event.\n */\n public onTouchStart(ev: TouchEvent): void {\n this._lastTouchY = ev.touches[0].pageY;\n }\n\n /**\n * Handles the touchmove event, scrolling the viewport if the position shifted.\n * @param ev The touch event.\n */\n public onTouchMove(ev: TouchEvent): boolean {\n const deltaY = this._lastTouchY - ev.touches[0].pageY;\n this._lastTouchY = ev.touches[0].pageY;\n if (deltaY === 0) {\n return false;\n }\n this._viewportElement.scrollTop += deltaY;\n return this._bubbleScroll(ev, deltaY);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IRenderService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map<IInternalDecoration, HTMLElement> = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this.register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this.register(addDisposableDomListener(window, 'resize', () => this._queueRefresh()));\n this.register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this.register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n }\n\n public override dispose(): void {\n this._container.remove();\n this._decorationElements.clear();\n super.dispose();\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this.refreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n public refreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = document.createElement('div');\n element.classList.add('xterm-decoration');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.actualCellWidth)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.actualCellHeight}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.actualCellHeight}px`;\n element.style.lineHeight = `${this._renderService.dimensions.actualCellHeight}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n decoration.onDispose(() => this._removeDecoration(decoration));\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n }\n element.style.top = `${line * this._renderService.dimensions.actualCellHeight}px`;\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.actualCellWidth}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.actualCellWidth}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from 'common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick<IInternalDecoration['marker'], 'line'>;\n options: Pick<IInternalDecoration['options'], 'overviewRulerOptions'>;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n return this._optionsService.options.overviewRulerWidth || 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n private _containerHeight: number | undefined;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowseService: ICoreBrowserService\n ) {\n super();\n this._canvas = document.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n this._registerDecorationListeners();\n this._registerBufferChangeListeners();\n this._registerDimensionChangeListeners();\n }\n\n /**\n * On decoration add or remove, redraw\n */\n private _registerDecorationListeners(): void {\n this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this.register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n }\n\n /**\n * On buffer change, redraw\n * and hide the canvas if the alt buffer is active\n */\n private _registerBufferChangeListeners(): void {\n this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this.register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this.register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n }\n /**\n * On dimension change, update canvas dimensions\n * and then redraw\n */\n private _registerDimensionChangeListeners(): void {\n // container height changed\n this.register(this._renderService.onRender((): void => {\n if (!this._containerHeight || this._containerHeight !== this._screenElement.clientHeight) {\n this._queueRefresh(true);\n this._containerHeight = this._screenElement.clientHeight;\n }\n }));\n // overview ruler width changed\n this.register(this._optionsService.onOptionChange(o => {\n if (o === 'overviewRulerWidth') {\n this._queueRefresh(true);\n }\n }));\n // device pixel ratio changed\n this.register(addDisposableDomListener(this._coreBrowseService.window, 'resize', () => {\n this._queueRefresh(true);\n }));\n // set the canvas dimensions\n this._queueRefresh(true);\n }\n\n public override dispose(): void {\n this._canvas?.remove();\n super.dispose();\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor(this._canvas.width / 3);\n const innerWidth = Math.ceil(this._canvas.width / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = 0;\n drawX.left = 0;\n drawX.center = drawWidth.left;\n drawX.right = drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowseService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowseService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowseService.dpr);\n this._canvas.style.height = `${this._screenElement.clientHeight}px`;\n this._canvas.height = Math.round(this._screenElement.clientHeight * this._coreBrowseService.dpr);\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderColorZone(zone: IColorZone): void {\n // TODO: Is _decorationElements needed?\n\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowseService.window.requestAnimationFrame(() => {\n this._refreshDecorations();\n this._animationFrame = undefined;\n });\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from 'browser/services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\nimport { C0 } from 'common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._dataAlreadySent = '';\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n this._compositionPosition.start = this._textarea.value.length;\n this._compositionView.textContent = '';\n this._dataAlreadySent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick<CompositionEvent, 'data'>): void {\n this._compositionView.textContent = ev.data;\n this.updateCompositionElements();\n setTimeout(() => {\n this._compositionPosition.end = this._textarea.value.length;\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @return Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 229) {\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n // Add length of data already sent due to keydown event,\n // otherwise input characters can be duplicated. (Issue #3191)\n currentCompositionPosition.start += this._dataAlreadySent.length;\n if (this._isComposing) {\n // Use the end position to get the string if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end);\n } else {\n // Don't use the end position here in order to pick up any characters after the\n // composition has finished, for example when typing a non-composition character\n // (eg. 2) after a composition character.\n input = this._textarea.value.substring(currentCompositionPosition.start);\n }\n if (input.length > 0) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n const oldValue = this._textarea.value;\n setTimeout(() => {\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.actualCellHeight;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.actualCellHeight;\n const cursorLeft = cursorX * this._renderService.dimensions.actualCellWidth;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'));\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'));\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows n the terminal.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, actualCellWidth: number, actualCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there are no valid\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n if (!coords) {\n return undefined;\n }\n\n coords[0] = Math.ceil((coords[0] + (isSelection ? actualCellWidth / 2 : 0)) / actualCellWidth);\n coords[1] = Math.ceil(coords[1] / actualCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an addition point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from 'common/data/EscapeSequences';\nimport { IBufferService } from 'common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(bufferService, startY), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(bufferService, startY);\n const endRow = targetY - wrappedRowsForRow(bufferService, targetY);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(bufferService, targetY);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(bufferService, startY);\n const endRow = targetY - wrappedRowsForRow(bufferService, targetY);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(bufferService: IBufferService, currentRow: number): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(targetX, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(bufferService, targetY);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while (currentCol !== endCol || currentRow !== endRow) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param string The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge would\n// result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function excludeFromContrastRatioDemands(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { BOLD_CLASS, ITALIC_CLASS, CURSOR_CLASS, CURSOR_STYLE_BLOCK_CLASS, CURSOR_BLINK_CLASS, CURSOR_STYLE_BAR_CLASS, CURSOR_STYLE_UNDERLINE_CLASS, DomRendererRowFactory } from 'browser/renderer/dom/DomRendererRowFactory';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/Constants';\nimport { Disposable } from 'common/Lifecycle';\nimport { IColorSet, ILinkifierEvent, ILinkifier2 } from 'browser/Types';\nimport { ICharSizeService, ICoreBrowserService } from 'browser/services/Services';\nimport { IOptionsService, IBufferService, IInstantiationService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { color } from 'common/Color';\nimport { removeElementFromParent } from 'browser/Dom';\n\nconst TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';\nconst ROW_CONTAINER_CLASS = 'xterm-rows';\nconst FG_CLASS_PREFIX = 'xterm-fg-';\nconst BG_CLASS_PREFIX = 'xterm-bg-';\nconst FOCUS_CLASS = 'xterm-focus';\nconst SELECTION_CLASS = 'xterm-selection';\n\nlet nextTerminalId = 1;\n\n/**\n * A fallback renderer for when canvas is slow. This is not meant to be\n * particularly fast or feature complete, more just stable and usable for when\n * canvas is not an option.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n\n public dimensions: IRenderDimensions;\n\n public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return new EventEmitter<IRequestRedrawEvent>().event; }\n\n constructor(\n private _colors: IColorSet,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._rowContainer = document.createElement('div');\n this._rowContainer.classList.add(ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = document.createElement('div');\n this._selectionContainer.classList.add(SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = {\n scaledCharWidth: 0,\n scaledCharHeight: 0,\n scaledCellWidth: 0,\n scaledCellHeight: 0,\n scaledCharLeft: 0,\n scaledCharTop: 0,\n scaledCanvasWidth: 0,\n scaledCanvasHeight: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n actualCellWidth: 0,\n actualCellHeight: 0\n };\n this._updateDimensions();\n this._injectCss();\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document, this._colors);\n\n this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this.register(this._linkifier2.onShowLinkUnderline(e => this._onLinkHover(e)));\n this.register(this._linkifier2.onHideLinkUnderline(e => this._onLinkLeave(e)));\n }\n\n public dispose(): void {\n this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n removeElementFromParent(this._rowContainer, this._selectionContainer, this._themeStyleElement, this._dimensionsStyleElement);\n\n super.dispose();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.scaledCharWidth = this._charSizeService.width * dpr;\n this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.rawOptions.lineHeight);\n this.dimensions.scaledCharLeft = 0;\n this.dimensions.scaledCharTop = 0;\n this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._bufferService.cols;\n this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._bufferService.rows;\n this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / dpr);\n this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / dpr);\n this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;\n this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.canvasWidth}px`;\n element.style.height = `${this.dimensions.actualCellHeight}px`;\n element.style.lineHeight = `${this.dimensions.actualCellHeight}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` +\n ` height: 100%;` +\n ` vertical-align: top;` +\n ` width: ${this.dimensions.actualCellWidth}px` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n this._injectCss();\n }\n\n private _injectCss(): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +\n ` color: ${this._colors.foreground.css};` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}`;\n // Blink animation\n styles +=\n `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes blink_block` + `_` + this._terminalClass + ` {` +\n ` 0% {` +\n ` background-color: ${this._colors.cursor.css};` +\n ` color: ${this._colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: ${this._colors.cursorAccent.css};` +\n ` color: ${this._colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}:not(.${FOCUS_CLASS}) .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` outline: 1px solid ${this._colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}:not(.${CURSOR_STYLE_BLOCK_CLASS}) {` +\n ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${this._colors.cursor.css};` +\n ` color: ${this._colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${this._colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` box-shadow: 0 -1px 0 ${this._colors.cursor.css} inset;` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${this._colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${this._colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n this._colors.ansi.forEach((c, i) => {\n styles +=\n `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n });\n styles +=\n `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(this._colors.background).css}; }` +\n `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${this._colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n public onDevicePixelRatioChange(): void {\n this._updateDimensions();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n }\n\n public onResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n }\n\n public onCharSizeChanged(): void {\n this._updateDimensions();\n }\n\n public onBlur(): void {\n this._rowContainer.classList.remove(FOCUS_CLASS);\n }\n\n public onFocus(): void {\n this._rowContainer.classList.add(FOCUS_CLASS);\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n // Remove all selections\n while (this._selectionContainer.children.length) {\n this._selectionContainer.removeChild(this._selectionContainer.children[0]);\n }\n\n this._rowFactory.onSelectionChanged(start, end, columnSelectMode);\n this.renderRows(0, this._bufferService.rows - 1);\n\n // Selection does not exist\n if (!start || !end) {\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n return;\n }\n\n // Create the selections\n const documentFragment = document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = document.createElement('div');\n element.style.height = `${rowCount * this.dimensions.actualCellHeight}px`;\n element.style.top = `${row * this.dimensions.actualCellHeight}px`;\n element.style.left = `${colStart * this.dimensions.actualCellWidth}px`;\n element.style.width = `${this.dimensions.actualCellWidth * (colEnd - colStart)}px`;\n return element;\n }\n\n public onCursorMove(): void {\n // No-op, the cursor is drawn when rows are drawn\n }\n\n public onOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n this._injectCss();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n e.innerText = '';\n }\n }\n\n public renderRows(start: number, end: number): void {\n const cursorAbsoluteY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n\n for (let y = start; y <= end; y++) {\n const rowElement = this._rowElements[y];\n rowElement.innerText = '';\n const row = y + this._bufferService.buffer.ydisp;\n const lineData = this._bufferService.buffer.lines.get(row);\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n rowElement.appendChild(this._rowFactory.createRow(lineData!, row, row === cursorAbsoluteY, cursorStyle, cursorX, cursorBlink, this.dimensions.actualCellWidth, this._bufferService.cols));\n }\n }\n\n private get _terminalSelector(): string {\n return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _onLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _onLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n while (x !== x2 || y !== y2) {\n const row = this._rowElements[y];\n if (!row) {\n return;\n }\n const span = row.children[x] as HTMLElement;\n if (span) {\n span.style.textDecoration = enabled ? 'underline' : 'none';\n }\n if (++x >= cols) {\n x = 0;\n y++;\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, IColor } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/Constants';\nimport { NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { color, rgba } from 'common/Color';\nimport { IColorSet } from 'browser/Types';\nimport { ICharacterJoinerService, ICoreBrowserService } from 'browser/services/Services';\nimport { JoinedCellData } from 'browser/services/CharacterJoinerService';\nimport { excludeFromContrastRatioDemands } from 'browser/renderer/RendererUtils';\nimport { AttributeData } from 'common/buffer/AttributeData';\n\nexport const BOLD_CLASS = 'xterm-bold';\nexport const DIM_CLASS = 'xterm-dim';\nexport const ITALIC_CLASS = 'xterm-italic';\nexport const UNDERLINE_CLASS = 'xterm-underline';\nexport const STRIKETHROUGH_CLASS = 'xterm-strikethrough';\nexport const CURSOR_CLASS = 'xterm-cursor';\nexport const CURSOR_BLINK_CLASS = 'xterm-cursor-blink';\nexport const CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block';\nexport const CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar';\nexport const CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline';\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n constructor(\n private readonly _document: Document,\n private _colors: IColorSet,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService\n ) {\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(lineData: IBufferLine, row: number, isCursorRow: boolean, cursorStyle: string | undefined, cursorX: number, cursorBlink: boolean, cellWidth: number, cols: number): DocumentFragment {\n const fragment = this._document.createDocumentFragment();\n\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n // Find the line length first, this prevents the need to output a bunch of\n // empty cells at the end. This cannot easily be integrated into the main\n // loop below because of the colCount feature (which can be removed after we\n // properly support reflow and disallow data to go beyond the right-side of\n // the viewport).\n let lineLength = 0;\n for (let x = Math.min(lineData.length, cols) - 1; x >= 0; x--) {\n if (lineData.loadCell(x, this._workCell).getCode() !== NULL_CELL_CODE || (isCursorRow && x === cursorX)) {\n lineLength = x + 1;\n break;\n }\n }\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n const range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n\n const charElement = this._document.createElement('span');\n if (width > 1) {\n charElement.style.width = `${cellWidth * width}px`;\n }\n\n if (isJoined) {\n // Ligatures in the DOM renderer must use display inline, as they may not show with\n // inline-block if they are outside the bounds of the element\n charElement.style.display = 'inline';\n\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorRow && x === cursorX) {\n charElement.classList.add(CURSOR_CLASS);\n\n if (cursorBlink) {\n charElement.classList.add(CURSOR_BLINK_CLASS);\n }\n\n switch (cursorStyle) {\n case 'bar':\n charElement.classList.add(CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n charElement.classList.add(CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n charElement.classList.add(CURSOR_STYLE_BLOCK_CLASS);\n break;\n }\n }\n\n if (cell.isBold()) {\n charElement.classList.add(BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n charElement.classList.add(ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n charElement.classList.add(DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n charElement.textContent = WHITESPACE_CELL_CHAR;\n } else {\n charElement.textContent = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n charElement.classList.add(`${UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (charElement.textContent === ' ') {\n charElement.innerHTML = ' ';\n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = this._colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isStrikethrough()) {\n charElement.classList.add(STRIKETHROUGH_CLASS);\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection foreground if applicable\n const isInSelection = this._isCellInSelection(x, row);\n if (!isTop) {\n if (this._colors.selectionForeground && isInSelection) {\n fgColorMode = Attributes.CM_RGB;\n fg = this._colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = this._colors.selectionForeground;\n }\n }\n\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections\n if (isInSelection) {\n bgOverride = this._coreBrowserService.isFocused ? this._colors.selectionBackgroundOpaque : this._colors.selectionInactiveBackgroundOpaque;\n isTop = true;\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n charElement.classList.add(`xterm-decoration-top`);\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = this._colors.ansi[bg];\n charElement.classList.add(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = rgba.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${padStart((bg >>> 0).toString(16), '0', 6)}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = this._colors.foreground;\n charElement.classList.add(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = this._colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, this._colors.ansi[fg], cell, bgOverride, undefined)) {\n charElement.classList.add(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = rgba.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${padStart(fg.toString(16), '0', 6)}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, this._colors.foreground, cell, bgOverride, undefined)) {\n if (isInverse) {\n charElement.classList.add(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n fragment.appendChild(charElement);\n\n x = lastCharX;\n }\n return fragment;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || excludeFromContrastRatioDemands(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = this._colors.contrastCache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n adjustedColor = color.ensureContrastRatio(bgOverride || bg, fgOverride || fg, this._optionsService.rawOptions.minimumContrastRatio);\n this._colors.contrastCache.setColor((bgOverride || bg).rgba, (fgOverride || fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n\nfunction padStart(text: string, padChar: string, length: number): string {\n while (text.length < length) {\n text = padChar + text;\n }\n return text;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from 'common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @return Whether a refresh is necessary.\n */\n public onTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start is trimmed, ensure the start column is 0.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart[1] = 0;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { IEvent, EventEmitter } from 'common/EventEmitter';\nimport { ICharSizeService } from 'browser/services/Services';\n\nexport class CharSizeService implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private _onCharSizeChange = new EventEmitter<void>();\n public get onCharSizeChange(): IEvent<void> { return this._onCharSizeChange.event; }\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n this._measureStrategy = new DomMeasureStrategy(document, parentElement, this._optionsService);\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): IReadonlyMeasureResult;\n}\n\ninterface IReadonlyMeasureResult {\n readonly width: number;\n readonly height: number;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\n// TODO: For supporting browsers we should also provide a CanvasCharDimensionsProvider that uses ctx.measureText\nclass DomMeasureStrategy implements IMeasureStrategy {\n private _result: IMeasureResult = { width: 0, height: 0 };\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W';\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): IReadonlyMeasureResult {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n const geometry = this._measureElement.getBoundingClientRect();\n\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (geometry.width !== 0 && geometry.height !== 0) {\n this._result.width = geometry.width;\n this._result.height = Math.ceil(geometry.height);\n }\n\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoiner } from 'browser/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService } from 'common/services/Services';\nimport { ICharacterJoinerService } from 'browser/services/Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < line.getTrimmedLength(); x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (this._bufferService.cols - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n for (let x = startCol; x < this._bufferService.cols; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = this._bufferService.cols;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\n\nexport class CoreBrowserService implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n public readonly window: Window & typeof globalThis\n ) {\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n const docOrShadowRoot = this._textarea.getRootNode ? this._textarea.getRootNode() as Document | ShadowRoot : this._textarea.ownerDocument;\n return docOrShadowRoot.activeElement === this._textarea && this._textarea.ownerDocument.hasFocus();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService, IRenderService, IMouseService } from './Services';\nimport { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse';\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n window,\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.actualCellWidth,\n this._renderService.dimensions.actualCellHeight,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(window, event, element);\n\n // due to rounding issues in zoom states pixel values might be negative or overflow actual canvas\n // ignore those events effectively narrowing mouse area a tiny bit at the edges\n if (!this._charSizeService.hasValidSize\n || coords[0] < 0\n || coords[1] < 0\n || coords[0] >= this._renderService.dimensions.canvasWidth\n || coords[1] >= this._renderService.dimensions.canvasHeight) {\n return undefined;\n }\n\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.actualCellWidth),\n row: Math.floor(coords[1] / this._renderService.dimensions.actualCellHeight),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions } from 'browser/renderer/Types';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IColorSet, IRenderDebouncerWithCallback } from 'browser/Types';\nimport { IOptionsService, IBufferService, IDecorationService } from 'common/services/Services';\nimport { ICharSizeService, ICoreBrowserService, IRenderService } from 'browser/services/Services';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private _onDimensionsChange = new EventEmitter<IRenderDimensions>();\n public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._onDimensionsChange.event; }\n private _onRenderedViewportChange = new EventEmitter<{ start: number, end: number }>();\n public get onRenderedViewportChange(): IEvent<{ start: number, end: number }> { return this._onRenderedViewportChange.event; }\n private _onRender = new EventEmitter<{ start: number, end: number }>();\n public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; }\n private _onRefreshRequest = new EventEmitter<{ start: number, end: number }>();\n public get onRefreshRequest(): IEvent<{ start: number, end: number }> { return this._onRefreshRequest.event; }\n\n public get dimensions(): IRenderDimensions { return this._renderer.dimensions; }\n\n constructor(\n private _renderer: IRenderer,\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService optionsService: IOptionsService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n this.register({ dispose: () => this._renderer.dispose() });\n\n this._renderDebouncer = new RenderDebouncer(coreBrowserService.window, (start, end) => this._renderRows(start, end));\n this.register(this._renderDebouncer);\n\n this._screenDprMonitor = new ScreenDprMonitor(coreBrowserService.window);\n this._screenDprMonitor.setListener(() => this.onDevicePixelRatioChange());\n this.register(this._screenDprMonitor);\n\n this.register(bufferService.onResize(() => this._fullRefresh()));\n this.register(bufferService.buffers.onBufferActivate(() => this._renderer?.clear()));\n this.register(optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this.register(this._charSizeService.onCharSizeChange(() => this.onCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this.register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this.register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // No need to register this as renderer is explicitly disposed in RenderService.dispose\n this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n // dprchange should handle this case, we need this as well for browsers that don't support the\n // matchMedia query.\n this.register(addDisposableDomListener(coreBrowserService.window, 'resize', () => this.onDevicePixelRatioChange()));\n\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in coreBrowserService.window) {\n const observer = new coreBrowserService.window.IntersectionObserver(e => this._onIntersectionChange(e[e.length - 1]), { threshold: 0 });\n observer.observe(screenElement);\n this.register({ dispose: () => observer.disconnect() });\n }\n }\n\n private _onIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n\n private _renderRows(start: number, end: number): void {\n this._renderer.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.onSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n this._renderer.onOptionsChanged();\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.dimensions.canvasWidth === this._canvasWidth && this._renderer.dimensions.canvasHeight === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.dimensions);\n }\n\n public dispose(): void {\n super.dispose();\n }\n\n public setRenderer(renderer: IRenderer): void {\n // TODO: RenderService should be the only one to dispose the renderer\n this._renderer.dispose();\n this._renderer = renderer;\n this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public setColors(colors: IColorSet): void {\n this._renderer.setColors(colors);\n this._fullRefresh();\n }\n\n public onDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n this._renderer.onDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public onResize(cols: number, rows: number): void {\n this._renderer.onResize(cols, rows);\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public onCharSizeChanged(): void {\n this._renderer.onCharSizeChanged();\n }\n\n public onBlur(): void {\n this._renderer.onBlur();\n }\n\n public onFocus(): void {\n this._renderer.onFocus();\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.onSelectionChanged(start, end, columnSelectMode);\n }\n\n public onCursorMove(): void {\n this._renderer.onCursorMove();\n }\n\n public clear(): void {\n this._renderer.clear();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferLine, IDisposable } from 'common/Types';\nimport * as Browser from 'common/Platform';\nimport { SelectionModel } from 'browser/selection/SelectionModel';\nimport { CellData } from 'common/buffer/CellData';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IMouseService, ISelectionService, IRenderService, ICoreBrowserService } from 'browser/services/Services';\nimport { IBufferRange, ILinkifier2 } from 'browser/Types';\nimport { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\nimport { Disposable } from 'common/Lifecycle';\nimport { getRangeLength } from 'common/buffer/BufferRange';\n\n/**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\nconst DRAG_SCROLL_MAX_THRESHOLD = 50;\n\n/**\n * The maximum scrolling speed\n */\nconst DRAG_SCROLL_MAX_SPEED = 15;\n\n/**\n * The number of milliseconds between drag scroll updates.\n */\nconst DRAG_SCROLL_INTERVAL = 50;\n\n/**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\nconst ALT_CLICK_MOVE_CURSOR_TIME = 500;\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private _trimListener: IDisposable;\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private _onLinuxMouseSelection = this.register(new EventEmitter<string>());\n public get onLinuxMouseSelection(): IEvent<string> { return this._onLinuxMouseSelection.event; }\n private _onRedrawRequest = this.register(new EventEmitter<ISelectionRedrawRequestEvent>());\n public get onRequestRedraw(): IEvent<ISelectionRedrawRequestEvent> { return this._onRedrawRequest.event; }\n private _onSelectionChange = this.register(new EventEmitter<void>());\n public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n private _onRequestScrollLines = this.register(new EventEmitter<ISelectionRequestScrollLinesEvent>());\n public get onRequestScrollLines(): IEvent<ISelectionRequestScrollLinesEvent> { return this._onRequestScrollLines.event; }\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseService private readonly _mouseService: IMouseService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._onMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._onMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener = this._bufferService.buffer.lines.onTrim(amount => this._onTrim(amount));\n this.register(this._bufferService.buffers.onBufferActivate(e => this._onBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n }\n\n public dispose(): void {\n this._removeMouseDownListeners();\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _onTrim(amount: number): void {\n const needsRefresh = this._model.onTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.canvasHeight;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD);\n offset /= DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public onMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._onIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._onSingleClick(event);\n } else if (event.detail === 2) {\n this._onDoubleClick(event);\n } else if (event.detail === 3) {\n this._onTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _onIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _onSingleClick(event: MouseEvent): void {\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _onDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _onTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _onMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n this._model.selectionEnd[0]++;\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _onMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _onBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.dispose();\n this._trimListener = e.activeBuffer.lines.onTrim(amount => this._onTrim(amount));\n }\n\n /**\n * Converts a viewport column to the character index on the buffer line, the\n * latter takes into account wide characters.\n * @param coords The coordinates to find the 2 index for.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, coords: [number, number]): number {\n let charIndex = coords[0];\n for (let i = 0; coords[0] >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && coords[0] !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param char The character to check.\n */\n private _isCharWordSeparator(cell: CellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/Types';\nimport { IColorSet } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDisposable } from 'common/Types';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent<void>;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n /**\n * Parent window that the terminal is rendered into. DOM and rendering APIs\n * (e.g. requestAnimationFrame) should be invoked in the context of this\n * window.\n */\n readonly window: Window & typeof globalThis;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IRenderService = createDecorator<IRenderService>('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent<IRenderDimensions>;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n setRenderer(renderer: IRenderer): void;\n setColors(colors: IColorSet): void;\n onDevicePixelRatioChange(): void;\n onResize(cols: number, rows: number): void;\n // TODO: Is this useful when we have onResize?\n onCharSizeChanged(): void;\n onBlur(): void;\n onFocus(): void;\n onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n onCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent<string>;\n readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;\n readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;\n readonly onSelectionChange: IEvent<void>;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n onMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator<ICharacterJoinerService>('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICircularList } from 'common/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList<T> implements ICircularList<T> {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public onDeleteEmitter = new EventEmitter<IDeleteEvent>();\n public get onDelete(): IEvent<IDeleteEvent> { return this.onDeleteEmitter.event; }\n public onInsertEmitter = new EventEmitter<IInsertEvent>();\n public get onInsert(): IEvent<IInsertEvent> { return this.onInsertEmitter.event; }\n public onTrimEmitter = new EventEmitter<number>();\n public get onTrim(): IEvent<number> { return this.onTrimEmitter.event; }\n\n constructor(\n private _maxLength: number\n ) {\n this._array = new Array<T>(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array<T | undefined>(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @return The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @return The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/*\n * A simple utility for cloning values\n */\nexport function clone<T>(val: T, depth: number = 5): T {\n if (typeof val !== 'object') {\n return val;\n }\n\n // If we're cloning an array, use an array as the base, otherwise use an object\n const clonedObject: any = Array.isArray(val) ? [] : {};\n\n for (const key in val) {\n // Recursively clone eack item unless we're at the maximum depth\n clonedObject[key] = depth <= 1 ? val[key] : (val[key] && clone(val[key], depth - 1));\n }\n\n return clonedObject as T;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n const a = (fg.rgba & 0xFF) / 255;\n if (a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n const r = bgR + Math.round((fgR - bgR) * a);\n const g = bgG + Math.round((fgG - bgG) * a);\n const b = bgB + Math.round((fgB - bgB) * a);\n const css = channels.toCss(r, g, b);\n const rgba = channels.toRgba(r, g, b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return rgba.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n const [r, g, b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss(r, g, b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n const a = Math.round(opacity * 0xFF);\n const [r, g, b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n const a = color.rgba & 0xFF;\n return opacity(color, (a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb', '#rrggbbaa').\n */\nexport namespace css {\n export function toColor(css: string): IColor {\n if (css.match(/#[0-9a-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n const r = parseInt(css.slice(1, 2).repeat(2), 16);\n const g = parseInt(css.slice(2, 3).repeat(2), 16);\n const b = parseInt(css.slice(3, 4).repeat(2), 16);\n return rgba.toColor(r, g, b);\n }\n case 5: { // #rgba\n const r = parseInt(css.slice(1, 2).repeat(2), 16);\n const g = parseInt(css.slice(2, 3).repeat(2), 16);\n const b = parseInt(css.slice(3, 4).repeat(2), 16);\n const a = parseInt(css.slice(4, 5).repeat(2), 16);\n return rgba.toColor(r, g, b, a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) { // rgb() or rgba()\n const r = parseInt(rgbaMatch[1]);\n const g = parseInt(rgbaMatch[2]);\n const b = parseInt(rgbaMatch[3]);\n const a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return rgba.toColor(r, g, b, a);\n }\n throw new Error('css.toColor: Unsupported css format');\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n // FIXME: Move this to channels NS?\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, IDirtyRowService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { LogService } from 'common/services/LogService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent, ScrollSource } from 'common/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { CoreMouseService } from 'common/services/CoreMouseService';\nimport { DirtyRowService } from 'common/services/DirtyRowService';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { CharsetService } from 'common/services/CharsetService';\nimport { updateWindowsModeWrappedState } from 'common/WindowsMode';\nimport { IFunctionIdentifier, IParams } from 'common/parser/Types';\nimport { IBufferSet } from 'common/buffer/Types';\nimport { InputHandler } from 'common/InputHandler';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\nimport { OscLinkService } from 'common/services/OscLinkService';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _dirtyRowService: IDirtyRowService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly coreMouseService: ICoreMouseService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsMode: IDisposable | undefined;\n\n private _onBinary = new EventEmitter<string>();\n public get onBinary(): IEvent<string> { return this._onBinary.event; }\n private _onData = new EventEmitter<string>();\n public get onData(): IEvent<string> { return this._onData.event; }\n protected _onLineFeed = new EventEmitter<void>();\n public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }\n private _onResize = new EventEmitter<{ cols: number, rows: number }>();\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }\n protected _onScroll = new EventEmitter<IScrollEvent, void>();\n public get onWriteParsed(): IEvent<void> { return this._onWriteParsed.event; }\n protected _onWriteParsed = new EventEmitter<void>();\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: EventEmitter<number, void>;\n public get onScroll(): IEvent<number, void> {\n if (!this._onScrollApi) {\n this._onScrollApi = new EventEmitter<number, void>();\n this.register(this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n }));\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required<ITerminalOptions> { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial<ITerminalOptions>\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = new OptionsService(options);\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._bufferService = this.register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this._logService = this._instantiationService.createInstance(LogService);\n this._instantiationService.setService(ILogService, this._logService);\n this.coreService = this.register(this._instantiationService.createInstance(CoreService, () => this.scrollToBottom()));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.coreMouseService = this._instantiationService.createInstance(CoreMouseService);\n this._instantiationService.setService(ICoreMouseService, this.coreMouseService);\n this._dirtyRowService = this._instantiationService.createInstance(DirtyRowService);\n this._instantiationService.setService(IDirtyRowService, this._dirtyRowService);\n this.unicodeService = this._instantiationService.createInstance(UnicodeService);\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n // Register input handler and handle/forward events\n this._inputHandler = new InputHandler(this._bufferService, this._charsetService, this.coreService, this._dirtyRowService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService);\n this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed));\n this.register(this._inputHandler);\n\n // Setup listeners\n this.register(forwardEvent(this._bufferService.onResize, this._onResize));\n this.register(forwardEvent(this.coreService.onData, this._onData));\n this.register(forwardEvent(this.coreService.onBinary, this._onBinary));\n this.register(this.optionsService.onOptionChange(key => this._updateOptions(key)));\n this.register(this._bufferService.onScroll(event => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n this._dirtyRowService.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n this.register(this._inputHandler.onScroll(event => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n this._dirtyRowService.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n\n // Setup WriteBuffer\n this._writeBuffer = new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult));\n this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n super.dispose();\n this._windowsMode?.dispose();\n this._windowsMode = undefined;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, MINIMUM_COLS);\n y = Math.max(y, MINIMUM_ROWS);\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent, source);\n }\n\n /**\n * Scroll the display of the terminal by a number of pages.\n * @param pageCount The number of pages to scroll (negative scrolls up).\n */\n public scrollPages(pageCount: number): void {\n this._bufferService.scrollPages(pageCount);\n }\n\n /**\n * Scrolls the display of the terminal to the top.\n */\n public scrollToTop(): void {\n this._bufferService.scrollToTop();\n }\n\n /**\n * Scrolls the display of the terminal to the bottom.\n */\n public scrollToBottom(): void {\n this._bufferService.scrollToBottom();\n }\n\n public scrollToLine(line: number): void {\n this._bufferService.scrollToLine(line);\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n protected _setup(): void {\n if (this.optionsService.rawOptions.windowsMode) {\n this._enableWindowsMode();\n }\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.coreMouseService.reset();\n }\n\n protected _updateOptions(key: string): void {\n // TODO: These listeners should be owned by individual components\n switch (key) {\n case 'scrollback':\n this.buffers.resize(this.cols, this.rows);\n break;\n case 'windowsMode':\n if (this.optionsService.rawOptions.windowsMode) {\n this._enableWindowsMode();\n } else {\n this._windowsMode?.dispose();\n this._windowsMode = undefined;\n }\n break;\n }\n }\n\n protected _enableWindowsMode(): void {\n if (!this._windowsMode) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsMode = {\n dispose: () => {\n for (const d of disposables) {\n d.dispose();\n }\n }\n };\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: IListener<T, U>[] = [];\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.push(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (let i = 0; i < this._listeners.length; i++) {\n queue.push(this._listeners[i]);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n if (this._listeners) {\n this._listeners.length = 0;\n }\n this._disposed = true;\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType } from 'common/Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';\nimport { Disposable } from 'common/Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/input/TextDecoder';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IDirtyRowService, ICoreMouseService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from 'common/services/Services';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\nimport { IBuffer } from 'common/buffer/Types';\nimport { parseColor } from 'common/input/XParseColor';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * VT commands done by the parser - FIXME: move this to the parser?\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #E[Supported via xterm-addon-image.] DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q \tPt ST\" \"Draw SIXEL image.\"\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\n/**\n * Limit length of title and icon name stacks.\n */\nconst STACK_LIMIT = 10;\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// create a warning log if an async handler takes longer than the limit (in ms)\nconst SLOW_ASYNC_LIMIT = 5000;\n\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _workCell: CellData = new CellData();\n private _windowTitle = '';\n private _iconName = '';\n private _currentLinkId?: number;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private _onRequestBell = new EventEmitter<void>();\n public get onRequestBell(): IEvent<void> { return this._onRequestBell.event; }\n private _onRequestRefreshRows = new EventEmitter<number, number>();\n public get onRequestRefreshRows(): IEvent<number, number> { return this._onRequestRefreshRows.event; }\n private _onRequestReset = new EventEmitter<void>();\n public get onRequestReset(): IEvent<void> { return this._onRequestReset.event; }\n private _onRequestSendFocus = new EventEmitter<void>();\n public get onRequestSendFocus(): IEvent<void> { return this._onRequestSendFocus.event; }\n private _onRequestSyncScrollBar = new EventEmitter<void>();\n public get onRequestSyncScrollBar(): IEvent<void> { return this._onRequestSyncScrollBar.event; }\n private _onRequestWindowsOptionsReport = new EventEmitter<WindowsOptionsReportType>();\n public get onRequestWindowsOptionsReport(): IEvent<WindowsOptionsReportType> { return this._onRequestWindowsOptionsReport.event; }\n\n private _onA11yChar = new EventEmitter<string>();\n public get onA11yChar(): IEvent<string> { return this._onA11yChar.event; }\n private _onA11yTab = new EventEmitter<number>();\n public get onA11yTab(): IEvent<number> { return this._onA11yTab.event; }\n private _onCursorMove = new EventEmitter<void>();\n public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n private _onLineFeed = new EventEmitter<void>();\n public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }\n private _onScroll = new EventEmitter<number>();\n public get onScroll(): IEvent<number> { return this._onScroll.event; }\n private _onTitleChange = new EventEmitter<string>();\n public get onTitleChange(): IEvent<string> { return this._onTitleChange.event; }\n private _onColor = new EventEmitter<IColorEvent>();\n public get onColor(): IEvent<IColorEvent> { return this._onColor.event; }\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _dirtyRowService: IDirtyRowService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _coreMouseService: ICoreMouseService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this.register(this._parser);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n public dispose(): void {\n super.dispose();\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise<boolean>): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n Promise.race([p, new Promise((res, rej) => setTimeout(() => rej('#SLOW_TIMEOUT'), SLOW_ASYNC_LIMIT))])\n .catch(err => {\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\<boolean\\>:\n * execution stopped at async handler, stack saved, continue with\n * same chunk and the promise resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order and\n * proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise<boolean> {\n let result: void | Promise<boolean>;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowService.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += MAX_PARSEBUFFER_LENGTH) {\n const end = i + MAX_PARSEBUFFER_LENGTH < data.length ? i + MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing\n this._onRequestRefreshRows.fire(this._dirtyRowService.start, this._dirtyRowService.end);\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodePoint(this._activeBuffer.x - 1, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // calculate print space\n // expensive call, therefore we save width in line buffer\n chWidth = this._unicodeService.wcwidth(code);\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n if (this._currentLinkId !== undefined) {\n this._oscLinkService.addLineToLink(this._currentLinkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (!chWidth && this._activeBuffer.x) {\n if (!bufferRow.getWidth(this._activeBuffer.x - 1)) {\n // found empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - 2, code);\n } else {\n bufferRow.addCodepointToCell(this._activeBuffer.x - 1, code);\n }\n continue;\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - 1 >= cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n // clear left over cells to the right\n while (this._activeBuffer.x < cols) {\n bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n this._activeBuffer.x = 0;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth, this._activeBuffer.getNullCell(curAttr), curAttr);\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodePoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodePoint(this._activeBuffer.x++, code, chWidth, curAttr.fg, curAttr.bg, curAttr.extended);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n }\n }\n // store last char in Parser.precedingCodepoint for REP to work correctly\n // This needs to check whether:\n // - fullwidth + surrogates: reset\n // - combining: only base char gets carried on (bug in xterm?)\n if (end - start > 0) {\n bufferRow.loadCell(this._activeBuffer.x - 1, this._workCell);\n if (this._workCell.getWidth() === 2 || this._workCell.getCode() > 0xFFFF) {\n this._parser.precedingCodepoint = 0;\n } else if (this._workCell.isCombined()) {\n this._parser.precedingCodepoint = this._workCell.getChars().charCodeAt(0);\n } else {\n this._parser.precedingCodepoint = this._workCell.content;\n }\n }\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodePoint(this._activeBuffer.x, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once before\n // early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y row index\n * @param start first cell index to be erased\n * @param end end - 1 is last erased cell\n * @param cleanWrap clear the isWrapped flag\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData(),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowService.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowService.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowService.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n this._activeBuffer.lines.get(j + 1)!.isWrapped = false;\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowService.markDirty(0);\n break;\n case 2:\n j = this._bufferService.rows;\n this._dirtyRowService.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowService.markDirty(0);\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowService.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowService.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the blank characters.\n * Text between the cursor and right margin moves to the right. Characters moved past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to the left.\n * Character attributes move with the characters. The terminal adds blank characters at the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll margins,\n * moving content to the right. Content at the right margin is lost.\n * DECIC has no effect outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * Since we propagate the terminal as xterm-256color we have to follow xterm's behavior:\n * - fullwidth + surrogate chars are ignored\n * - for combining chars only the base char gets repeated\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty,\n * the preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is set.\n * REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n if (!this._parser.precedingCodepoint) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const data = new Uint32Array(length);\n for (let i = 0; i < length; ++i) {\n data[i] = this._parser.precedingCodepoint;\n }\n this.print(data, 0, data.length);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').indexOf(term) === 0;\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #Y |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n this._optionsService.options.cursorBlink = true;\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._coreMouseService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._coreMouseService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._coreMouseService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._coreMouseService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._coreMouseService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._coreMouseService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #Y |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n this._optionsService.options.cursorBlink = false;\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._coreMouseService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._coreMouseService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._coreMouseService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._coreMouseService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_SET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_RESET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58) as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n *\n *\n * FIXME: blinking is implemented in attrs, but not working in renderers?\n * FIXME: remove dead branch for p=100\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._curAttrData.fg = DEFAULT_ATTR_DATA.fg;\n this._curAttrData.bg = DEFAULT_ATTR_DATA.bg;\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else if (p === 100) { // FIXME: dead branch, p=100 already handled above!\n // reset fg/bg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full terminal bootstrap,\n * DECSTR only resets certain attributes. For most needs DECSTR should be sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> blinking block.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - empty, 0 or 1: steady block\n * - 2: blink block\n * - 3: steady underline\n * - 4: blink underline\n * - 5: steady bar\n * - 6: blink bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.params[0] || 1;\n switch (param) {\n case 1:\n case 2:\n this._optionsService.options.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._optionsService.options.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._optionsService.options.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._optionsService.options.cursorBlink = isBlinking;\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n this._charsetService.charset = (this as any)._savedCharset;\n if (this._activeBuffer.savedCharset) {\n this._charsetService.charset = this._activeBuffer.savedCharset;\n }\n this._restrictCursor();\n return true;\n }\n\n\n /**\n * OSC 2; <data> ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; <data> ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; <num> ; <text> ST (set ANSI color <num> to <text>)\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from `XParseColor` (see OSC 10 for supported formats).\n * There may be multipe `c ; spec` pairs present in the same instruction.\n * If `spec` contains `?` the terminal returns a sequence with the currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx);\n if (0 <= index && index < 256) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; <params> ; <uri> ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character. Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover feedback.\n * Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n const args = data.split(';');\n if (args.length < 2) {\n return false;\n }\n if (args[1]) {\n return this._createHyperlink(args[0], args[1]);\n }\n if (args[0]) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._currentLinkId !== undefined) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._currentLinkId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.extended.urlId = this._currentLinkId;\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n this._currentLinkId = undefined;\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [ColorIndex.FOREGROUND, ColorIndex.BACKGROUND, ColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; <xcolor name>|<?> ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb:<red>/<green>/<blue>` for `<red>, <green>, <blue>` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; <xcolor name>|<?> ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; <xcolor name>|<?> ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; <num> ST - restore ANSI color <num>\n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i]);\n if (0 <= index && index < 256) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: ColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: ColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: ColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] || DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowService.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the corresponding CSI string,\n * `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n constructor() {\n }\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nconst isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. This\n * list is based on binary search and as such locating a key will take O(log n) amortized, this\n * includes the by key iterator.\n */\nexport class SortedList<T> {\n private readonly _array: T[] = [];\n\n constructor(\n private readonly _getKey: (value: T) => number\n ) {\n }\n\n public clear(): void {\n this._array.length = 0;\n }\n\n public insert(value: T): void {\n if (this._array.length === 0) {\n this._array.push(value);\n return;\n }\n i = this._search(this._getKey(value), 0, this._array.length - 1);\n this._array.splice(i, 0, value);\n }\n\n public delete(value: T): boolean {\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n i = this._search(key, 0, this._array.length - 1);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n this._array.splice(i, 1);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n public *getKeyIterator(key: number): IterableIterator<T> {\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key, 0, this._array.length - 1);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key, 0, this._array.length - 1);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator<T> {\n return this._array.values();\n }\n\n private _search(key: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n let mid = Math.floor((min + max) / 2);\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n return this._search(key, min, mid - 1);\n }\n if (midKey < key) {\n return this._search(key, mid + 1, max);\n }\n // Value found! Since keys can be duplicates, move the result index back to the lowest index\n // that matches the key.\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport type TypedArray = Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array;\n\n\n/**\n * polyfill for TypedArray.fill\n * This is needed to support .fill in all safari versions and IE 11.\n */\nexport function fill<T extends TypedArray>(array: T, value: number, start?: number, end?: number): T {\n // all modern engines that support .fill\n if (array.fill) {\n return array.fill(value, start, end) as T;\n }\n return fillFallback(array, value, start, end);\n}\n\nexport function fillFallback<T extends TypedArray>(array: T, value: number, start: number = 0, end: number = array.length): T {\n // safari and IE 11\n // since IE 11 does not support Array.prototype.fill either\n // we cannot use the suggested polyfill from MDN\n // instead we simply fall back to looping\n if (start >= array.length) {\n return array;\n }\n start = (array.length + start) % array.length;\n if (end >= array.length) {\n end = array.length;\n } else {\n end = (array.length + end) % array.length;\n }\n for (let i = start; i < end; ++i) {\n array[i] = value;\n }\n return array;\n}\n\n/**\n * Concat two typed arrays `a` and `b`.\n * Returns a new typed array.\n */\nexport function concat<T extends TypedArray>(a: T, b: T): T {\n const result = new (a.constructor as any)(a.length + b.length);\n result.set(a);\n result.set(b, a.length);\n return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IBufferService } from 'common/services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from 'common/CircularList';\nimport { IBuffer, BufferIndex, IBufferStringIterator, IBufferStringIteratorResult } from 'common/buffer/Types';\nimport { IBufferLine, ICellData, IAttributeData, ICharset } from 'common/Types';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { CellData } from 'common/buffer/CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_CHAR_INDEX } from 'common/buffer/Constants';\nimport { reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths, getWrappedLineTrimmedLength } from 'common/buffer/BufferReflow';\nimport { Marker } from 'common/buffer/Marker';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { ExtendedAttrs } from 'common/buffer/AttributeData';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer implements IBuffer {\n public lines: CircularList<IBufferLine>;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n // TODO: Type me\n public tabs: any;\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService\n ) {\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n if (fillAttr === undefined) {\n fillAttr = DEFAULT_ATTR_DATA;\n }\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to it's initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsMode) {\n // Just add the new missing rows on Windows as conpty reprints the screen with it's\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n }\n\n private get _isReflowEnabled(): boolean {\n return this._hasScrollback && !this._optionsService.rawOptions.windowsMode;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA));\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n // private _reflowSmallerGetLinesNeeded()\n\n /**\n * Translates a string index back to a BufferIndex.\n * To get the correct buffer position the string must start at `startCol` 0\n * (default in translateBufferLineToString).\n * The method also works on wrapped line strings given rows were not trimmed.\n * The method operates on the CharData string length, there are no\n * additional content or boundary checks. Therefore the string and the buffer\n * should not be altered in between.\n * TODO: respect trim flag after fixing #1685\n * @param lineIndex line index the string was retrieved from\n * @param stringIndex index within the string\n * @param startCol column offset the string was retrieved from\n */\n public stringIndexToBufferIndex(lineIndex: number, stringIndex: number, trimRight: boolean = false): BufferIndex {\n while (stringIndex) {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return [-1, -1];\n }\n const length = (trimRight) ? line.getTrimmedLength() : line.length;\n for (let i = 0; i < length; ++i) {\n if (line.get(i)[CHAR_DATA_WIDTH_INDEX]) {\n // empty cells report a string length of 0, but get replaced\n // with a whitespace in translateToString, thus replace with 1\n stringIndex -= line.get(i)[CHAR_DATA_CHAR_INDEX].length || 1;\n }\n if (stringIndex < 0) {\n return [lineIndex, i];\n }\n }\n lineIndex++;\n }\n return [lineIndex, 0];\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param line The line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n if (x === null || x === undefined) {\n x = this.x;\n }\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n if (x === null || x === undefined) {\n x = this.x;\n }\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n\n public iterator(trimRight: boolean, startIndex?: number, endIndex?: number, startOverscan?: number, endOverscan?: number): IBufferStringIterator {\n return new BufferStringIterator(this, trimRight, startIndex, endIndex, startOverscan, endOverscan);\n }\n}\n\n/**\n * Iterator to get unwrapped content strings from the buffer.\n * The iterator returns at least the string data between the borders\n * `startIndex` and `endIndex` (exclusive) and will expand the lines\n * by `startOverscan` to the top and by `endOverscan` to the bottom,\n * if no new line was found in between.\n * It will never read/return string data beyond `startIndex - startOverscan`\n * or `endIndex + endOverscan`. Therefore the first and last line might be truncated.\n * It is possible to always get the full string for the first and last line as well\n * by setting the overscan values to the actual buffer length. This not recommended\n * since it might return the whole buffer within a single string in a worst case scenario.\n */\nexport class BufferStringIterator implements IBufferStringIterator {\n private _current: number;\n\n constructor(\n private _buffer: IBuffer,\n private _trimRight: boolean,\n private _startIndex: number = 0,\n private _endIndex: number = _buffer.lines.length,\n private _startOverscan: number = 0,\n private _endOverscan: number = 0\n ) {\n if (this._startIndex < 0) {\n this._startIndex = 0;\n }\n if (this._endIndex > this._buffer.lines.length) {\n this._endIndex = this._buffer.lines.length;\n }\n this._current = this._startIndex;\n }\n\n public hasNext(): boolean {\n return this._current < this._endIndex;\n }\n\n public next(): IBufferStringIteratorResult {\n const range = this._buffer.getWrappedRangeForLine(this._current);\n // limit search window to overscan value at both borders\n if (range.first < this._startIndex - this._startOverscan) {\n range.first = this._startIndex - this._startOverscan;\n }\n if (range.last > this._endIndex + this._endOverscan) {\n range.last = this._endIndex + this._endOverscan;\n }\n // limit to current buffer length\n range.first = Math.max(range.first, 0);\n range.last = Math.min(range.last, this._buffer.lines.length);\n let content = '';\n for (let i = range.first; i <= range.last; ++i) {\n content += this._buffer.translateBufferLineToString(i, this._trimRight);\n }\n this._current = range.last + 1;\n return { range, content };\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData, IAttributeData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Content, BgFlags, FgFlags } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * buffer memory layout:\n *\n * | uint32_t | uint32_t | uint32_t |\n * | `content` | `FG` | `BG` |\n * | wcwidth(2) comb(1) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |\n */\n\n\n/** typed array slots taken by one cell */\nconst CELL_SIZE = 3;\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * CELL_SIZE + Cell.CONTENT];`\n * `fg = data[column * CELL_SIZE + Cell.FG];`\n * `bg = data[column * CELL_SIZE + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n/** Work variables to avoid garbage collection. */\nconst w: { startIndex: number } = {\n startIndex: 0\n};\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n protected _combined: {[index: number]: string} = {};\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n public length: number;\n\n constructor(cols: number, fillCellData?: ICellData, public isWrapped: boolean = false) {\n this._data = new Uint32Array(cols * CELL_SIZE);\n const cell = fillCellData || CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * CELL_SIZE + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._data[index * CELL_SIZE + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * CELL_SIZE + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * CELL_SIZE + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * CELL_SIZE + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * CELL_SIZE + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n * */\n public hasContent(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * CELL_SIZE + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n w.startIndex = index * CELL_SIZE;\n cell.content = this._data[w.startIndex + Cell.CONTENT];\n cell.fg = this._data[w.startIndex + Cell.FG];\n cell.bg = this._data[w.startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = cell.content;\n this._data[index * CELL_SIZE + Cell.FG] = cell.fg;\n this._data[index * CELL_SIZE + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void {\n if (bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = eAttrs;\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * CELL_SIZE + Cell.FG] = fg;\n this._data[index * CELL_SIZE + Cell.BG] = bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number): void {\n let content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = content;\n }\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n\n if (n < this.length - pos) {\n const cell = new CellData();\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, cell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodePoint(this.length - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n pos %= this.length;\n if (n < this.length - pos) {\n const cell = new CellData();\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, cell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodePoint(pos, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, eraseAttr?: IAttributeData, respectProtect: boolean = false): void {\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n public resize(cols: number, fillCellData: ICellData): void {\n if (cols === this.length) {\n return;\n }\n if (cols > this.length) {\n const data = new Uint32Array(cols * CELL_SIZE);\n if (this.length) {\n if (cols * CELL_SIZE < this._data.length) {\n data.set(this._data.subarray(0, cols * CELL_SIZE));\n } else {\n data.set(this._data);\n }\n }\n this._data = data;\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n if (cols) {\n const data = new Uint32Array(cols * CELL_SIZE);\n data.set(this._data.subarray(0, cols * CELL_SIZE));\n this._data = data;\n // Remove any cut off combined data, FIXME: repeat this for extended attrs\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n } else {\n this._data = new Uint32Array(0);\n this._combined = {};\n }\n }\n this.length = cols;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._combined = {};\n for (const el in line._combined) {\n this._combined[el] = line._combined[el];\n }\n this._extendedAttrs = {};\n for (const el in line._extendedAttrs) {\n this._extendedAttrs[el] = line._extendedAttrs[el];\n }\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(0);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n for (const el in this._combined) {\n newLine._combined[el] = this._combined[el];\n }\n for (const el in this._extendedAttrs) {\n newLine._extendedAttrs[el] = this._extendedAttrs[el];\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < CELL_SIZE; i++) {\n this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n }\n if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n }\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < CELL_SIZE; i++) {\n this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n }\n if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n }\n }\n }\n\n // Move any combined data over as needed, FIXME: repeat for extended attrs\n const srcCombinedKeys = Object.keys(src._combined);\n for (let i = 0; i < srcCombinedKeys.length; i++) {\n const key = parseInt(srcCombinedKeys[i], 10);\n if (key >= srcCol) {\n this._combined[key - srcCol + destCol] = src._combined[key];\n }\n }\n }\n\n public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string {\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n let result = '';\n while (startCol < endCol) {\n const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1\n }\n return result;\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from 'xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from 'common/buffer/BufferLine';\nimport { CircularList } from 'common/CircularList';\nimport { IBufferLine, ICellData } from 'common/Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param newCols The columns after resize.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n // If these lines contain the cursor don't touch them, the program will handle fixing up wrapped\n // lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList<IBufferLine>, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList<IBufferLine>, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n const cellsNeeded = wrappedLines.map((l, i) => getWrappedLineTrimmedLength(wrappedLines, i, oldCols)).reduce((p, c) => p + c);\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IAttributeData } from 'common/Types';\nimport { Buffer } from 'common/buffer/Buffer';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { Disposable } from 'common/Lifecycle';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n\n private _onBufferActivate = this.register(new EventEmitter<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}>());\n public get onBufferActivate(): IEvent<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}> { return this._onBufferActivate.event; }\n\n /**\n * Create a new BufferSet for the given terminal.\n * @param _terminal - The terminal the BufferSet will belong to\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService\n ) {\n super();\n this.reset();\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService);\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService);\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n * */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 256;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.codepointMask;`\n * write: `content |= codepoint & Content.codepointMask;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indication whether a cell contains combined content\n * read: `isCombined = content & Content.isCombined;`\n * set: `content |= Content.isCombined;`\n * clear: `content &= ~Content.isCombined;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.hasContent)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.widthMask) >> Content.widthShift;`\n * `hasWidth = content & Content.widthMask;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.widthShift;`\n * write: `content |= (width << Content.widthShift) & Content.widthMask;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.widthShift;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..32 (upper 3 unused)\n */\n UNDERLINE_STYLE = 0x1C000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IMarker } from 'common/Types';\n\nexport class Marker extends Disposable implements IMarker {\n private static _nextId = 1;\n\n private _id: number = Marker._nextId++;\n public isDisposed: boolean = false;\n\n public get id(): number { return this._id; }\n\n private _onDispose = new EventEmitter<void>();\n public get onDispose(): IEvent<void> { return this._onDispose.event; }\n\n constructor(\n public line: number\n ) {\n super();\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a change to react\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from 'common/Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] =\nCHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] =\nCHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] =\nCHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * C0 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C0 {\n /** Null (Caret = ^@, C = \\0) */\n export const NUL = '\\x00';\n /** Start of Heading (Caret = ^A) */\n export const SOH = '\\x01';\n /** Start of Text (Caret = ^B) */\n export const STX = '\\x02';\n /** End of Text (Caret = ^C) */\n export const ETX = '\\x03';\n /** End of Transmission (Caret = ^D) */\n export const EOT = '\\x04';\n /** Enquiry (Caret = ^E) */\n export const ENQ = '\\x05';\n /** Acknowledge (Caret = ^F) */\n export const ACK = '\\x06';\n /** Bell (Caret = ^G, C = \\a) */\n export const BEL = '\\x07';\n /** Backspace (Caret = ^H, C = \\b) */\n export const BS = '\\x08';\n /** Character Tabulation, Horizontal Tabulation (Caret = ^I, C = \\t) */\n export const HT = '\\x09';\n /** Line Feed (Caret = ^J, C = \\n) */\n export const LF = '\\x0a';\n /** Line Tabulation, Vertical Tabulation (Caret = ^K, C = \\v) */\n export const VT = '\\x0b';\n /** Form Feed (Caret = ^L, C = \\f) */\n export const FF = '\\x0c';\n /** Carriage Return (Caret = ^M, C = \\r) */\n export const CR = '\\x0d';\n /** Shift Out (Caret = ^N) */\n export const SO = '\\x0e';\n /** Shift In (Caret = ^O) */\n export const SI = '\\x0f';\n /** Data Link Escape (Caret = ^P) */\n export const DLE = '\\x10';\n /** Device Control One (XON) (Caret = ^Q) */\n export const DC1 = '\\x11';\n /** Device Control Two (Caret = ^R) */\n export const DC2 = '\\x12';\n /** Device Control Three (XOFF) (Caret = ^S) */\n export const DC3 = '\\x13';\n /** Device Control Four (Caret = ^T) */\n export const DC4 = '\\x14';\n /** Negative Acknowledge (Caret = ^U) */\n export const NAK = '\\x15';\n /** Synchronous Idle (Caret = ^V) */\n export const SYN = '\\x16';\n /** End of Transmission Block (Caret = ^W) */\n export const ETB = '\\x17';\n /** Cancel (Caret = ^X) */\n export const CAN = '\\x18';\n /** End of Medium (Caret = ^Y) */\n export const EM = '\\x19';\n /** Substitute (Caret = ^Z) */\n export const SUB = '\\x1a';\n /** Escape (Caret = ^[, C = \\e) */\n export const ESC = '\\x1b';\n /** File Separator (Caret = ^\\) */\n export const FS = '\\x1c';\n /** Group Separator (Caret = ^]) */\n export const GS = '\\x1d';\n /** Record Separator (Caret = ^^) */\n export const RS = '\\x1e';\n /** Unit Separator (Caret = ^_) */\n export const US = '\\x1f';\n /** Space */\n export const SP = '\\x20';\n /** Delete (Caret = ^?) */\n export const DEL = '\\x7f';\n}\n\n/**\n * C1 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C1 {\n /** padding character */\n export const PAD = '\\x80';\n /** High Octet Preset */\n export const HOP = '\\x81';\n /** Break Permitted Here */\n export const BPH = '\\x82';\n /** No Break Here */\n export const NBH = '\\x83';\n /** Index */\n export const IND = '\\x84';\n /** Next Line */\n export const NEL = '\\x85';\n /** Start of Selected Area */\n export const SSA = '\\x86';\n /** End of Selected Area */\n export const ESA = '\\x87';\n /** Horizontal Tabulation Set */\n export const HTS = '\\x88';\n /** Horizontal Tabulation With Justification */\n export const HTJ = '\\x89';\n /** Vertical Tabulation Set */\n export const VTS = '\\x8a';\n /** Partial Line Down */\n export const PLD = '\\x8b';\n /** Partial Line Up */\n export const PLU = '\\x8c';\n /** Reverse Index */\n export const RI = '\\x8d';\n /** Single-Shift 2 */\n export const SS2 = '\\x8e';\n /** Single-Shift 3 */\n export const SS3 = '\\x8f';\n /** Device Control String */\n export const DCS = '\\x90';\n /** Private Use 1 */\n export const PU1 = '\\x91';\n /** Private Use 2 */\n export const PU2 = '\\x92';\n /** Set Transmit State */\n export const STS = '\\x93';\n /** Destructive backspace, intended to eliminate ambiguity about meaning of BS. */\n export const CCH = '\\x94';\n /** Message Waiting */\n export const MW = '\\x95';\n /** Start of Protected Area */\n export const SPA = '\\x96';\n /** End of Protected Area */\n export const EPA = '\\x97';\n /** Start of String */\n export const SOS = '\\x98';\n /** Single Graphic Character Introducer */\n export const SGCI = '\\x99';\n /** Single Character Introducer */\n export const SCI = '\\x9a';\n /** Control Sequence Introducer */\n export const CSI = '\\x9b';\n /** String Terminator */\n export const ST = '\\x9c';\n /** Operating System Command */\n export const OSC = '\\x9d';\n /** Privacy Message */\n export const PM = '\\x9e';\n /** Application Program Command */\n export const APC = '\\x9f';\n}\nexport namespace C1_ESCAPED {\n export const ST = `${C0.ESC}\\\\`;\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key even to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n if (ev.altKey) {\n result.key = C0.ESC + C0.DEL; // \\e ^?\n break;\n }\n result.key = C0.DEL; // ^?\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (result.key === C0.ESC + '[1;3D') {\n result.key = C0.ESC + (isMac ? 'b' : '[1;5D');\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (result.key === C0.ESC + '[1;3C') {\n result.key = C0.ESC + (isMac ? 'f' : '[1;5C');\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (!isMac && result.key === C0.ESC + '[1;3A') {\n result.key = C0.ESC + '[1;5A';\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (!isMac && result.key === C0.ESC + '[1;3B') {\n result.key = C0.ESC + '[1;5B';\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // <Ctrl> or <Shift> + <Insert> are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock, volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey) {\n if (ev.key === '_') { // ^_\n result.key = C0.US;\n }\n if (ev.key === '@') { // ^ + shift + 2 = ^ + @\n result.key = C0.NUL;\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate pair\n // conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint = 0;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n cp <<= 6;\n cp |= tmp;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider } from 'common/services/Services';\nimport { fill } from 'common/TypedArrayUtils';\n\ntype CharWidth = 0 | 1 | 2;\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n fill(table, 1);\n table[0] = 0;\n // control chars\n fill(table, 0, 1, 32);\n fill(table, 0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n fill(table, 2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n fill(table, 2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n fill(table, 2, 0xac00, 0xd7a4);\n fill(table, 2, 0xf900, 0xfb00);\n fill(table, 2, 0xfe10, 0xfe1a);\n fill(table, 2, 0xfe30, 0xfe70);\n fill(table, 2, 0xff00, 0xff61);\n fill(table, 2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n fill(table, 0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): CharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as CharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\ndeclare const setTimeout: (handler: () => void, timeout?: number) => void;\n\n/**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\nconst DISCARD_WATERMARK = 50000000; // ~50 MB\n\n/**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\nconst WRITE_TIMEOUT_MS = 12;\n\n/**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\nconst WRITE_BUFFER_LENGTH_THRESHOLD = 50;\n\n// queueMicrotask polyfill for nodejs < v11\nconst qmt: (cb: () => void) => void = (typeof queueMicrotask === 'undefined')\n ? (cb: () => void) => { Promise.resolve().then(cb); }\n : queueMicrotask;\n\n\nexport class WriteBuffer {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n public get onWriteParsed(): IEvent<void> { return this._onWriteParsed.event; }\n private _onWriteParsed = new EventEmitter<void>();\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise<boolean>) { }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._pendingData > DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n setTimeout(() => this._innerWrite());\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (Date.now() - (lastTime | 0) < WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n const startTime = lastTime || Date.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens took very long).\n * This cannot be solved here for the handler itself (it is the handlers responsibility to slice hard work),\n * but we can at least schedule a screen update as we gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => Date.now() - startTime >= WRITE_TIMEOUT_MS\n ? setTimeout(() => this._innerWrite(0, r))\n : this._innerWrite(startTime, r);\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughtput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = Date.now() - startTime >= WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n qmt(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (Date.now() - startTime >= WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n setTimeout(() => this._innerWrite());\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:<red>/<green>/<blue> with <red>, <green>, <blue> in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.indexOf('rgb:') === 0) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.indexOf('#') === 0) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Internal states of EscapeSequenceParser.\n */\nexport const enum ParserState {\n GROUND = 0,\n ESCAPE = 1,\n ESCAPE_INTERMEDIATE = 2,\n CSI_ENTRY = 3,\n CSI_PARAM = 4,\n CSI_INTERMEDIATE = 5,\n CSI_IGNORE = 6,\n SOS_PM_APC_STRING = 7,\n OSC_STRING = 8,\n DCS_ENTRY = 9,\n DCS_PARAM = 10,\n DCS_IGNORE = 11,\n DCS_INTERMEDIATE = 12,\n DCS_PASSTHROUGH = 13\n}\n\n/**\n* Internal actions of EscapeSequenceParser.\n*/\nexport const enum ParserAction {\n IGNORE = 0,\n ERROR = 1,\n PRINT = 2,\n EXECUTE = 3,\n OSC_START = 4,\n OSC_PUT = 5,\n OSC_END = 6,\n CSI_DISPATCH = 7,\n PARAM = 8,\n COLLECT = 9,\n ESC_DISPATCH = 10,\n CLEAR = 11,\n DCS_HOOK = 12,\n DCS_PUT = 13,\n DCS_UNHOOK = 14\n}\n\n/**\n * Internal states of OscParser.\n */\nexport const enum OscState {\n START = 0,\n ID = 1,\n PAYLOAD = 2,\n ABORT = 3\n}\n\n// payload limit for OSC and DCS\nexport const PAYLOAD_LIMIT = 10000000;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { Params } from 'common/parser/Params';\nimport { PAYLOAD_LIMIT } from 'common/parser/Constants';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n if (this._handlers[ident] === undefined) {\n this._handlers[ident] = [];\n }\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise<boolean> = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private _data = '';\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise<boolean>) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data = '';\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n this._data += utf32ToString(data, start, end);\n if (this._data.length > PAYLOAD_LIMIT) {\n this._data = '';\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise<boolean> {\n let ret: boolean | Promise<boolean> = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data, this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data = '';\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data = '';\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types';\nimport { ParserState, ParserAction } from 'common/parser/Constants';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { fill } from 'common/TypedArrayUtils';\nimport { Params } from 'common/parser/Params';\nimport { OscParser } from 'common/parser/OscParser';\nimport { DcsParser } from 'common/parser/DcsParser';\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 4,\n TRANSITION_STATE_MASK = 15,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint8Array;\n\n constructor(length: number) {\n this.table = new Uint8Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n fill(this.table, action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n const table: TransitionTable = new TransitionTable(4095);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);\n let state: any;\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (state in states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm/apc does nothing\n table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This this is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingCodepoint: number;\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n protected _csiHandlers: IHandlerCollection<CsiHandlerType>;\n protected _escHandlers: IHandlerCollection<EscHandlerType>;\n protected _oscParser: IOscParser;\n protected _dcsParser: IDcsParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._oscParser = new OscParser();\n this._dcsParser = new DcsParser();\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res && 0x3c > res || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public dispose(): void {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._oscParser.dispose();\n this._dcsParser.dispose();\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n if (this._escHandlers[ident] === undefined) {\n this._escHandlers[ident] = [];\n }\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n this._executeHandlers[flag.charCodeAt(0)] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n if (this._csiHandlers[ident] === undefined) {\n this._csiHandlers[ident] = [];\n }\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise<void> {\n * for (const chunk of chunks) {\n * let result: void | Promise<boolean>;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise<boolean> {\n let code = 0;\n let transition = 0;\n let start = 0;\n let handlerResult: void | boolean | Promise<boolean>;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing.\n * This is a really bad condition with screwed up execution order and prolly messed up\n * terminal state, therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that,\n * as the pending async handler still might mess up the terminal later. Instead fix the faulty\n * async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingCodepoint = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // normal transition & action lookup\n transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // read ahead with loop unrolling\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingCodepoint = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingCodepoint = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingCodepoint = 0;\n break;\n case ParserAction.CLEAR:\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';\nimport { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n if (this._handlers[ident] === undefined) {\n this._handlers[ident] = [];\n }\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise<boolean> = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private _data = '';\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }\n\n public start(): void {\n this._data = '';\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n this._data += utf32ToString(data, start, end);\n if (this._data.length > PAYLOAD_LIMIT) {\n this._data = '';\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n let ret: boolean | Promise<boolean> = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data);\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data = '';\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data = '';\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from 'common/parser/Types';\n\n// max value supported for a single param/subparam (clamped to positive int32 range)\nconst MAX_VALUE = 0x7FFFFFFF;\n// max allowed subparams for a single sequence (hardcoded limitation)\nconst MAX_SUBPARAMS = 256;\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values lesser than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > MAX_VALUE ? MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `subParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values lesser than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > MAX_VALUE ? MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from 'xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n constructor() {\n }\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from 'xterm';\nimport { IBuffer } from 'common/buffer/Types';\nimport { BufferLineApiView } from 'common/public/BufferLineApiView';\nimport { CellData } from 'common/buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferLine, ICellData } from 'common/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from 'xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData());\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from 'xterm';\nimport { BufferApiView } from 'common/public/BufferApiView';\nimport { IEvent, EventEmitter } from 'common/EventEmitter';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class BufferNamespaceApi implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n private _onBufferChange = new EventEmitter<IBufferApi>();\n public get onBufferChange(): IEvent<IBufferApi> { return this._onBufferChange.event; }\n\n constructor(private _core: ICoreTerminal) {\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from 'common/parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from 'xterm';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from 'common/Types';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from 'xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { BufferSet } from 'common/buffer/BufferSet';\nimport { IBufferSet, IBuffer } from 'common/buffer/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData, IBufferLine, ScrollSource } from 'common/Types';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private _onResize = new EventEmitter<{ cols: number, rows: number }>();\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }\n private _onScroll = new EventEmitter<number>();\n public get onScroll(): IEvent<number> { return this._onScroll.event; }\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(@IOptionsService optionsService: IOptionsService) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, MINIMUM_ROWS);\n this.buffers = new BufferSet(optionsService, this);\n }\n\n public dispose(): void {\n super.dispose();\n this.buffers.dispose();\n }\n\n public resize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this.buffers.setupTabStops(this.cols);\n this._onResize.fire({ cols, rows });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n\n /**\n * Scroll the display of the terminal by a number of pages.\n * @param pageCount The number of pages to scroll (negative scrolls up).\n */\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n /**\n * Scrolls the display of the terminal to the top.\n */\n public scrollToTop(): void {\n this.scrollLines(-this.buffer.ydisp);\n }\n\n /**\n * Scrolls the display of the terminal to the bottom.\n */\n public scrollToBottom(): void {\n this.scrollLines(this.buffer.ybase - this.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from 'common/services/Services';\nimport { ICharset } from 'common/Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * CoreMouseService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class CoreMouseService implements ICoreMouseService {\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _onProtocolChange = new EventEmitter<CoreMouseEventType>();\n private _lastEvent: ICoreMouseEvent | null = null;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService\n ) {\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n this._lastEvent = null;\n }\n\n /**\n * Event to announce changes in mouse tracking.\n */\n public get onProtocolChange(): IEvent<CoreMouseEventType> {\n return this._onProtocolChange.event;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n public triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._activeEncoding === 'SGR_PIXELS')\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._protocols[this._activeProtocol].restrict(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._encodings[this._activeEncoding](e);\n if (report) {\n // always send DEFAULT as binary data\n if (this._activeEncoding === 'DEFAULT') {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n\n return true;\n }\n\n public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IDecPrivateModes, IModes } from 'common/Types';\nimport { clone } from 'common/Clone';\nimport { Disposable } from 'common/Lifecycle';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean = false;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n\n // Circular dependency, this must be unset or memory will leak after Terminal.dispose\n private _scrollToBottom: (() => void) | undefined;\n\n private _onData = this.register(new EventEmitter<string>());\n public get onData(): IEvent<string> { return this._onData.event; }\n private _onUserInput = this.register(new EventEmitter<void>());\n public get onUserInput(): IEvent<void> { return this._onUserInput.event; }\n private _onBinary = this.register(new EventEmitter<string>());\n public get onBinary(): IEvent<string> { return this._onBinary.event; }\n\n constructor(\n // TODO: Move this into a service\n scrollToBottom: () => void,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._scrollToBottom = scrollToBottom;\n this.register({ dispose: () => this._scrollToBottom = undefined });\n this.modes = clone(DEFAULT_MODES);\n this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n }\n\n public reset(): void {\n this.modes = clone(DEFAULT_MODES);\n this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (buffer.ybase !== buffer.ydisp) {\n this._scrollToBottom!();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { css } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDecorationService, IInternalDecoration } from 'common/services/Services';\nimport { SortedList } from 'common/SortedList';\nimport { IColor } from 'common/Types';\nimport { IDecorationOptions, IDecoration, IMarker, IEvent } from 'xterm';\n\n/** Work variables to avoid garbage collection. */\nconst w = {\n xmin: 0,\n xmax: 0\n};\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList<IInternalDecoration> = new SortedList(e => e?.marker.line);\n\n private _onDecorationRegistered = this.register(new EventEmitter<IInternalDecoration>());\n public get onDecorationRegistered(): IEvent<IInternalDecoration> { return this._onDecorationRegistered.event; }\n private _onDecorationRemoved = this.register(new EventEmitter<IInternalDecoration>());\n public get onDecorationRemoved(): IEvent<IInternalDecoration> { return this._onDecorationRemoved.event; }\n\n public get decorations(): IterableIterator<IInternalDecoration> { return this._decorations.values(); }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n decoration.onDispose(() => {\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator<IInternalDecoration> {\n let xmin = 0;\n let xmax = 0;\n for (const d of this._decorations.getKeyIterator(line)) {\n xmin = d.options.x ?? 0;\n xmax = xmin + (d.options.width ?? 1);\n if (x >= xmin && x < xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n this._decorations.forEachByKey(line, d => {\n w.xmin = d.options.x ?? 0;\n w.xmax = w.xmin + (d.options.width ?? 1);\n if (x >= w.xmin && x < w.xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n });\n }\n\n public dispose(): void {\n for (const d of this._decorations.values()) {\n this._onDecorationRemoved.fire(d);\n }\n this.reset();\n }\n}\n\nclass Decoration extends Disposable implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n public isDisposed: boolean = false;\n\n public readonly onRenderEmitter = this.register(new EventEmitter<HTMLElement>());\n public readonly onRender = this.onRenderEmitter.event;\n private _onDispose = this.register(new EventEmitter<void>());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService, IDirtyRowService } from 'common/services/Services';\n\nexport class DirtyRowService implements IDirtyRowService {\n public serviceBrand: any;\n\n private _start!: number;\n private _end!: number;\n\n public get start(): number { return this._start; }\n public get end(): number { return this._end; }\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this._start = this._bufferService.buffer.y;\n this._end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this._start) {\n this._start = y;\n } else if (y > this._end) {\n this._end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n const temp = y1;\n y1 = y2;\n y2 = temp;\n }\n if (y1 < this._start) {\n this._start = y1;\n }\n if (y2 > this._end) {\n this._end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService, IServiceIdentifier } from 'common/services/Services';\nimport { getServiceDependencies } from 'common/services/ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map<IServiceIdentifier<any>, any>();\n\n constructor(...entries: [IServiceIdentifier<any>, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set<T>(id: IServiceIdentifier<T>, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n this._entries.forEach((value, key) => callback(key, value));\n }\n\n public has(id: IServiceIdentifier<any>): boolean {\n return this._entries.has(id);\n }\n\n public get<T>(id: IServiceIdentifier<T>): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService<T>(id: IServiceIdentifier<T>, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService<T>(id: IServiceIdentifier<T>): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance<T>(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService implements ILogService {\n public serviceBrand: any;\n\n public logLevel: LogLevelEnum = LogLevelEnum.OFF;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n this._updateLogLevel();\n this._optionsService.onOptionChange(key => {\n if (key === 'logLevel') {\n this._updateLogLevel();\n }\n });\n }\n\n private _updateLogLevel(): void {\n this.logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, LOG_PREFIX + message, ...optionalParams);\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.DEBUG) {\n this._log(console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.INFO) {\n this._log(console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.WARN) {\n this._log(console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this.logLevel <= LogLevelEnum.ERROR) {\n this._log(console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService, ITerminalOptions, FontWeight } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { isMac } from 'common/Platform';\nimport { CursorStyle } from 'common/Types';\n\nexport const DEFAULT_OPTIONS: Readonly<Required<ITerminalOptions>> = {\n cols: 80,\n rows: 24,\n cursorBlink: false,\n cursorStyle: 'block',\n cursorWidth: 1,\n customGlyphs: true,\n drawBoldTextInBrightColors: true,\n fastScrollModifier: 'alt',\n fastScrollSensitivity: 5,\n fontFamily: 'courier-new, courier, monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n scrollback: 1000,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsMode: false,\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n cancelEvents: false,\n overviewRulerWidth: 0\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract<FontWeight, string>[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required<ITerminalOptions>;\n public options: Required<ITerminalOptions>;\n\n private _onOptionChange = new EventEmitter<string>();\n public get onOptionChange(): IEvent<string> { return this._onOptionChange.event; }\n\n constructor(options: Partial<ITerminalOptions>) {\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from 'common/services/Services';\nimport { IMarker, IOscLinkData } from 'common/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map<string, IOscLinkEntryWithId> = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map<number, IOscLinkEntryNoId | IOscLinkEntryWithId> = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required<IOscLinkData>;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required<IOscLinkData>): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry<T extends IOscLinkData> {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry<IOscLinkData> {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry<Required<IOscLinkData>> {\n key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator.toString = () => id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[DI_TARGET] === target) {\n (target as any)[DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler } from 'xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent<{ cols: number, rows: number }>;\n onScroll: IEvent<number>;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollToBottom(): void;\n scrollToTop(): void;\n scrollToLine(line: number): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n scrollPages(pageCount: number): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent<CoreMouseEventType>;\n\n /**\n * Human readable version of mouse events.\n */\n explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n\n readonly onData: IEvent<string>;\n readonly onUserInput: IEvent<void>;\n readonly onBinary: IEvent<string>;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasFromUser Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer.s\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport const IDirtyRowService = createDecorator<IDirtyRowService>('DirtyRowService');\nexport interface IDirtyRowService {\n serviceBrand: undefined;\n\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nexport interface IServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<Args> =\n Args extends [...IBrandedService[]] ? []\n : Args extends [infer A1, ...IBrandedService[]] ? [A1]\n : Args extends [infer A1, infer A2, ...IBrandedService[]] ? [A1, A2]\n : Args extends [infer A1, infer A2, infer A3, ...IBrandedService[]] ? [A1, A2, A3]\n : Args extends [infer A1, infer A2, infer A3, infer A4, ...IBrandedService[]] ? [A1, A2, A3, A4]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, ...IBrandedService[]] ? [A1, A2, A3, A4, A5]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, infer A8, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7, A8]\n : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n getService<T>(id: IServiceIdentifier<T>): T | undefined;\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n OFF = 4\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n logLevel: LogLevelEnum;\n\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required<ITerminalOptions>;\n readonly options: Required<ITerminalOptions>;\n\n readonly onOptionChange: IEvent<string>;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n customGlyphs?: boolean;\n disableStdin?: boolean;\n drawBoldTextInBrightColors?: boolean;\n fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n rightClickSelectsWord?: boolean;\n rows?: number;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsMode?: boolean;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n overviewRulerWidth?: number;\n\n [key: string]: any;\n cancelEvents: boolean;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register an Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered, when activate version changed. */\n readonly onChange: IEvent<string>;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): number;\n getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): 0 | 1 | 2;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator<IInternalDecoration>;\n readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeService, IUnicodeVersionProvider } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { UnicodeV6 } from 'common/input/UnicodeV6';\n\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider: IUnicodeVersionProvider;\n private _onChange = new EventEmitter<string>();\n public get onChange(): IEvent<string> { return this._onChange.event; }\n\n constructor() {\n const defaultProvider = new UnicodeV6();\n this.register(defaultProvider);\n this._active = defaultProvider.version;\n this._activeProvider = defaultProvider;\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): number {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n result += this.wcwidth(code);\n }\n return result;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal as ITerminalApi, IMarker, IDisposable, ILocalizableStrings, ITerminalAddon, IBufferNamespace as IBufferNamespaceApi, IParser, ILinkProvider, IUnicodeHandling, IModes, IDecorationOptions, IDecoration } from 'xterm';\nimport { IBufferRange, ITerminal } from 'browser/Types';\nimport { Terminal as TerminalCore } from 'browser/Terminal';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { IEvent } from 'common/EventEmitter';\nimport { ParserApi } from 'common/public/ParserApi';\nimport { UnicodeApi } from 'common/public/UnicodeApi';\nimport { AddonManager } from 'common/public/AddonManager';\nimport { BufferNamespaceApi } from 'common/public/BufferNamespaceApi';\nimport { ITerminalOptions } from 'common/Types';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nexport class Terminal implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required<ITerminalOptions>;\n\n constructor(options?: ITerminalOptions) {\n this._core = new TerminalCore(options);\n this._addonManager = new AddonManager();\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent<void> { return this._core.onBell; }\n public get onBinary(): IEvent<string> { return this._core.onBinary; }\n public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n public get onData(): IEvent<string> { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent<number> { return this._core.onScroll; }\n public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent<void> { return this._core.onWriteParsed; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get parser(): IParser {\n this._checkProposedApi();\n if (!this._parser) {\n this._parser = new ParserApi(this._core);\n }\n return this._parser;\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n this._checkProposedApi();\n if (!this._buffer) {\n this._buffer = new BufferNamespaceApi(this._core);\n }\n return this._buffer;\n }\n public get markers(): ReadonlyArray<IMarker> {\n this._checkProposedApi();\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.coreMouseService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n wraparoundMode: m.wraparound\n };\n }\n public get options(): Required<ITerminalOptions> {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this._checkProposedApi();\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n this._checkProposedApi();\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._checkProposedApi();\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker | undefined {\n this._verifyIntegers(cursorYOffset);\n return this._core.addMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._checkProposedApi();\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n this._addonManager.dispose();\n this._core.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n return this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n return Strings;\n }\n\n private _verifyIntegers(...values: number[]): void {\n for (const value of values) {\n if (value === Infinity || isNaN(value) || value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for (const value of values) {\n if (value && (value === Infinity || isNaN(value) || value % 1 !== 0 || value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","self","AccessibilityManager","Disposable","constructor","_terminal","_renderService","super","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","this","_accessibilityTreeRoot","document","createElement","classList","add","tabIndex","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_onBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_refreshRowsDimensions","_renderRowsDebouncer","TimeBasedDebouncer","_renderRows","bind","_refreshRows","_liveRegion","element","Error","insertAdjacentElement","register","onResize","_onResize","onRender","start","end","onScroll","onA11yChar","char","_onChar","onLineFeed","onA11yTab","spaceCount","_onTab","onKey","_onKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_screenDprMonitor","ScreenDprMonitor","window","setListener","addDisposableDomListener","dispose","removeElementFromParent","position","boundaryElement","target","beforeBoundaryElement","getAttribute","buffer","lines","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","shift","removeEventListener","newElement","unshift","push","scrollLines","focus","preventDefault","stopImmediatePropagation","children","_refreshRowDimensions","MAX_ROWS_TO_READ","textContent","Strings","tooMuchOutput","isMac","parentNode","setTimeout","keyChar","refresh","setSize","toString","lineData","translateBufferLineToString","ydisp","posInSet","innerText","_announceCharacters","dimensions","actualCellHeight","style","height","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","decPrivateModes","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","getBoundingClientRect","left","clientX","top","clientY","width","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","select","_color","TwoKeyMap","_css","setCss","bg","fg","set","getCss","get","setColor","getColor","clear","DEFAULT_FOREGROUND","css","toColor","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","rgba","DEFAULT_ANSI_COLORS","Object","freeze","colors","v","r","g","b","channels","toCss","toRgba","c","allowTransparency","canvas","ctx","getContext","_ctx","globalCompositeOperation","_litmusColor","createLinearGradient","_contrastCache","ColorContrastCache","foreground","background","cursor","cursorAccent","selectionForeground","undefined","selectionBackgroundTransparent","selectionBackgroundOpaque","color","blend","selectionInactiveBackgroundTransparent","selectionInactiveBackgroundOpaque","ansi","slice","contrastCache","_updateRestoreColors","onOptionsChange","setTheme","theme","_parseColor","selectionBackground","selectionInactiveBackground","nullColor","isOpaque","opacity","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","Math","min","restoreColor","slot","_restoreColors","fallback","fillStyle","console","warn","fillRect","data","getImageData","substring","split","map","component","Number","alpha","round","elements","parentElement","node","type","handler","options","disposed","Linkifier2","_bufferService","_linkProviders","_linkCacheDisposables","_isMouseOut","_activeLine","_onShowLinkUnderline","EventEmitter","_onHideLinkUnderline","getDisposeArrayDisposable","currentLink","_currentLink","onShowLinkUnderline","event","onHideLinkUnderline","_lastMouseEvent","registerLinkProvider","linkProvider","providerIndex","indexOf","splice","attachToDom","mouseService","renderService","_element","_mouseService","_clearCurrentLink","_onMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","contains","_lastBufferCell","x","y","_onHover","_askForLink","_linkAtPosition","link","useLineCache","_activeProviderReplies","forEach","reply","linkWithState","Map","linkProvided","entries","_checkLinkProviderResult","provideLinks","links","linksWithState","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","cols","has","index","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","disposeArray","state","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","toggle","_fireUnderlineEvent","onRenderedViewportChange","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","fire","remove","leave","sameLine","wrappedFromLeft","wrappedToRight","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabel","OscLinkProvider","_optionsService","_oscLinkService","callback","line","result","linkHandler","rawOptions","cell","CellData","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","defaultActivate","confirm","newWindow","open","opener","location","href","IOptionsService","IOscLinkService","_parentWindow","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","requestAnimationFrame","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","_rowEnd","max","_runRefreshCallbacks","_currentDevicePixelRatio","devicePixelRatio","listener","_listener","clearListener","_outerListener","_updateDpr","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Terminal","CoreTerminal","browser","Browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_onCursorMove","_onRender","_onSelectionChange","_onTitleChange","_onBell","_onFocus","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","_setup","linkifier2","_instantiationService","createInstance","_decorationService","DecorationService","setService","IDecorationService","_inputHandler","onRequestBell","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","_reportWindowsOptions","onColor","_handleColorEvent","forwardEvent","onCursorMove","onTitleChange","_afterResize","onSelectionChange","onBell","onFocus","_colorManager","req","acc","ident","toColorRGB","C0","ESC","toRgbString","C1_ESCAPED","ST","setColors","viewport","onThemeChange","_isDisposed","_customKeyEventHandler","write","buffers","active","preventScroll","_updateOptions","_charSizeService","measure","syncScrollArea","optionsService","screenReaderMode","_accessibilityManager","setupTabStops","_setTheme","_onTextAreaFocus","sendFocus","updateCursorStyle","_showCursor","blur","_onTextAreaBlur","_syncTextArea","isCursorInViewport","_compositionHelper","isComposing","cursorY","ybase","bufferLine","cursorX","cellHeight","getWidth","cellWidth","actualCellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","compositionupdate","compositionend","_inputEvent","updateCompositionElements","parent","isConnected","_logService","debug","_document","ownerDocument","dir","fragment","createDocumentFragment","_viewportElement","_viewportScrollArea","_helperContainer","_coreBrowserService","CoreBrowserService","defaultView","ICoreBrowserService","CharSizeService","ICharSizeService","_theme","ColorManager","onOptionChange","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","renderer","_createRenderer","RenderService","IRenderService","resize","_compositionView","CompositionHelper","MouseService","IMouseService","Viewport","amount","onRequestSyncScrollBar","SelectionService","ISelectionService","onRequestScrollLines","suppressScrollEvent","onRequestRedraw","onSelectionChanged","columnSelectMode","onLinuxMouseSelection","_onScroll","BufferDecorationRenderer","onMouseDown","coreMouseService","areMouseEventsActive","disable","enable","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","bindMouse","DomRenderer","el","sendEvent","getMouseReportCoords","but","action","overrideType","buttons","getLinesScrolled","deltaY","triggerMouseEvent","col","row","ctrl","ctrlKey","alt","altKey","shiftKey","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","cancel","onProtocolChange","events","logLevel","explainEvents","passive","activeProtocol","shouldForceSelection","hasScrollback","sequence","applicationCursorKeys","abs","onWheel","onTouchStart","onTouchMove","refreshRows","shouldColumnSelect","isCursorInitialized","disp","source","attachCustomKeyEventHandler","customKeyEventHandler","registerCharacterJoiner","joinerId","deregisterCharacterJoiner","deregister","markers","addMarker","cursorYOffset","registerDecoration","decorationOptions","column","setSelection","getSelection","getSelectionPosition","selectionStart","selectionEnd","clearSelection","selectAll","selectLines","shouldIgnoreComposition","macOptionIsMeta","keydown","scrollToBottom","evaluateKeyboardEvent","scrollCount","_isThirdLevelShift","metaKey","charCodeAt","ETX","CR","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","wasModifierKeyOnlyEvent","charCode","which","String","fromCharCode","inputType","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","force","cancelEvents","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","Date","now","elapsed","waitPeriodBeforeTrailingRefresh","_scrollLines","_scrollArea","scrollBarWidth","_currentRowHeight","_currentScaledCellHeight","_lastRecordedBufferLength","_lastRecordedViewportHeight","_lastRecordedBufferHeight","_lastTouchY","_lastScrollTop","_wheelPartialScroll","_refreshAnimationFrame","_ignoreNextScrollEvent","_smoothScrollState","startTime","origin","offsetWidth","_activeBuffer","onBufferActivate","activeBuffer","_renderDimensions","backgroundColor","_refresh","immediate","scaledCellHeight","dpr","offsetHeight","newBufferHeight","scrollTop","offsetParent","diff","_smoothScroll","percent","_smoothScrollPercent","_clearSmoothScrollState","smoothScrollDuration","_bubbleScroll","scrollPosFromTop","cancelable","_getPixelsScrolled","scrollHeight","_applyScrollModifier","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","DOM_DELTA_PIXEL","floor","modifier","fastScrollModifier","fastScrollSensitivity","scrollSensitivity","touches","pageY","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_queueRefresh","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","refreshDecorations","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","marker","display","onRenderEmitter","onDispose","anchor","right","delete","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","drawHeight","drawWidth","drawX","_coreBrowseService","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","insertBefore","_registerDecorationListeners","_registerBufferChangeListeners","_registerDimensionChangeListeners","_width","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_containerHeight","clientHeight","o","_refreshDrawConstants","outerWidth","innerWidth","ceil","pixelsPerLine","nonFullHeight","_refreshDecorations","clearRect","lineWidth","_renderColorZone","updateCanvasDimensions","updateAnchor","_textarea","_coreService","_isComposing","_isSendingComposition","_compositionPosition","_dataAlreadySent","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","currentCompositionPosition","input","oldValue","newValue","DEL","dontRecurse","fontFamily","fontSize","compositionViewBounds","ICoreService","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","parseInt","getPropertyValue","topPadding","colCount","hasValidCharSize","isSelection","moveToRequestedRow","startY","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","wrappedRows","direction","verticalDirection","isWrapped","wrappedRowsCount","repeat","currentRow","lineWraps","startCol","endCol","forward","currentCol","bufferStr","mod","count","str","rpt","targetX","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","INVERTED_DEFAULT_COLOR","DIM_OPACITY","TEXT_BASELINE","isLegacyEdge","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","TERMINAL_CLASS_PREFIX","FOCUS_CLASS","nextTerminalId","_colors","_linkifier2","instantiationService","_terminalClass","_refreshRowElements","_selectionContainer","scaledCharWidth","scaledCharHeight","scaledCellWidth","scaledCharLeft","scaledCharTop","scaledCanvasWidth","scaledCanvasHeight","_updateDimensions","_injectCss","_rowFactory","DomRendererRowFactory","_onLinkHover","_onLinkLeave","_themeStyleElement","_dimensionsStyleElement","letterSpacing","overflow","styles","_terminalSelector","BOLD_CLASS","fontWeight","fontWeightBold","ITALIC_CLASS","CURSOR_CLASS","CURSOR_STYLE_BLOCK_CLASS","CURSOR_BLINK_CLASS","CURSOR_STYLE_BAR_CLASS","cursorWidth","CURSOR_STYLE_UNDERLINE_CLASS","opaque","onDevicePixelRatioChange","onCharSizeChanged","renderRows","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","colStart","colEnd","onOptionsChanged","cursorAbsoluteY","cursorBlink","rowElement","cursorStyle","createRow","_setCellUnderline","enabled","span","textDecoration","IInstantiationService","DIM_CLASS","UNDERLINE_CLASS","STRIKETHROUGH_CLASS","_workCell","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","joinedRanges","getJoinedCharacters","getCode","NULL_CELL_CODE","isJoined","lastCharX","JoinedCellData","translateToString","charElement","isCursorHidden","isBold","isItalic","isDim","isInvisible","WHITESPACE_CELL_CHAR","getChars","isUnderline","underlineStyle","innerHTML","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","join","drawBoldTextInBrightColors","isStrikethrough","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","isTop","forEachDecorationAtCell","d","layer","backgroundColorRGB","foregroundColorRGB","isInSelection","_isCellInSelection","resolvedBg","isFocused","_addStyle","padStart","multiplyOpacity","_applyMinimumContrast","minimumContrastRatio","excludeFromContrastRatioDemands","adjustedColor","ensureContrastRatio","padChar","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","onTrim","_onCharSizeChange","_measureStrategy","DomMeasureStrategy","onCharSizeChange","_parentElement","_result","_measureElement","geometry","firstCell","chars","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","id","ranges","lineStr","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","error","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","static","newRange","inRange","getRootNode","activeElement","hasFocus","_renderer","decorationService","coreBrowserService","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onDimensionsChange","_onRenderedViewportChange","_onRefreshRequest","_renderDebouncer","RenderDebouncer","_fullRefresh","_handleOptionsChanged","observer","IntersectionObserver","_onIntersectionChange","threshold","observe","disconnect","onRefreshRequest","entry","isIntersecting","intersectionRatio","isRedrawOnly","_fireOnCanvasResize","setRenderer","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_linkifier","_dragScrollAmount","_enabled","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_onRequestScrollLines","_mouseMoveListener","_mouseUpListener","_onMouseUp","onUserInput","_trimListener","_onTrim","_onBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","lineText","startRowEndCol","isLinuxMouseSelection","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","offset","terminalHeight","macOptionClickForcesSelection","timeStamp","_onIncrementalClick","detail","_onSingleClick","_onDoubleClick","_onTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","setInterval","_dragScroll","clearInterval","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","_fireOnSelectionChange","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","trim","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","createDecorator","_maxLength","onDeleteEmitter","onInsertEmitter","onTrimEmitter","_array","Array","_startIndex","_length","onDelete","onInsert","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","clone","val","depth","clonedObject","isArray","rgb","toPaddedHex","s","contrastRatio","l1","l2","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","ratio","rgbaColor","factor","match","rgbaMatch","parseFloat","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","hasWriteSyncWarnHappened","_onBinary","_onData","_onLineFeed","_onWriteParsed","InstantiationService","OptionsService","BufferService","LogService","ILogService","CoreService","CoreMouseService","ICoreMouseService","_dirtyRowService","DirtyRowService","IDirtyRowService","unicodeService","UnicodeService","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onData","onBinary","markRangeDirty","scrollBottom","_writeBuffer","WriteBuffer","promiseResult","parse","onWriteParsed","_onScrollApi","_windowsMode","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","isNaN","MINIMUM_COLS","MINIMUM_ROWS","scroll","eraseAttr","scrollPages","pageCount","scrollToTop","scrollToLine","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","windowsMode","_enableWindowsMode","disposables","updateWindowsModeWrappedState","final","_listeners","_disposed","_event","arg1","arg2","queue","call","from","to","GLEVEL","MAX_PARSEBUFFER_LENGTH","paramToWindowOption","n","opts","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","_coreMouseService","_unicodeService","_parser","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_curAttrData","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","setCsiHandlerFallback","params","identifier","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","code","setOscHandlerFallback","setDcsHandlerFallback","payload","setPrintHandler","print","insertChars","intermediates","scrollLeft","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","setExecuteHandler","BEL","bell","LF","lineFeed","VT","FF","carriageReturn","BS","backspace","HT","tab","SO","shiftOut","SI","shiftIn","C1","IND","NEL","nextLine","HTS","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","getAttrData","_preserveStack","_logSlowResolvingAsync","p","Promise","race","res","rej","catch","err","wasPaused","DEBUG","prototype","clearRange","len","decode","subarray","chWidth","charset","wraparoundMode","wraparound","insertMode","modes","curAttr","bufferRow","markDirty","setCellFromCodePoint","wcwidth","ch","stringFromCodePoint","_currentLinkId","addLineToLink","_eraseAttrData","insertCells","getNullCell","NULL_CELL_WIDTH","addCodepointToCell","precedingCodepoint","convertEol","reverseWraparound","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","fill","clearMarkers","scrollBackSize","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","_is","term","termName","setgCharset","DEFAULT_CHARSET","applicationKeypad","activeEncoding","activateAltBuffer","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","b2v","m","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","l","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","bottom","second","_savedCharset","slots","idx","spec","exec","parseColor","args","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","startsWith","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","f","isProtected","_disposables","unregister","array","_data","third","fourth","isNode","navigator","userAgent","platform","includes","isSafari","test","isIpad","isIphone","_getKey","insert","_search","forEachByKey","values","mid","midKey","fillFallback","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isBlink","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","ext","_ext","_urlId","MAX_BUFFER_SIZE","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_cols","_rows","CircularList","_getCorrectBufferLength","getWhitespaceCell","BufferLine","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","addToY","amountToTrim","_isReflowEnabled","_reflow","_reflowLarger","_reflowSmaller","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","copyCellsFrom","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","stringIndexToBufferIndex","lineIndex","stringIndex","trimRight","CHAR_DATA_WIDTH_INDEX","CHAR_DATA_CHAR_INDEX","tabStopWidth","Marker","_removeMarker","iterator","startOverscan","endOverscan","BufferStringIterator","_buffer","_trimRight","_endIndex","_startOverscan","_endOverscan","_current","hasNext","next","w","fillCellData","_combined","_extendedAttrs","cp","CHAR_DATA_ATTR_INDEX","codePoint","eAttrs","keys","copyFrom","src","applyInReverse","srcData","srcCombinedKeys","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","reduce","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","BufferSet","_normal","Buffer","_alt","inactiveBuffer","obj","combined","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","_nextId","isDisposed","_onDispose","C","NUL","SOH","STX","EOT","ENQ","ACK","DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM","SUB","FS","GS","RS","US","SP","PAD","HOP","BPH","NBH","SSA","ESA","HTJ","VTS","PLD","PLU","RI","SS2","SS3","DCS","PU1","PU2","STS","CCH","MW","SPA","EPA","SOS","SGCI","SCI","CSI","OSC","PM","APC","KEYCODE_KEY_MAPPINGS","applicationCursorMode","modifiers","keyMapping","keyString","toUpperCase","toLowerCase","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","num","ucs","bisearch","qmt","queueMicrotask","cb","resolve","then","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","chunk","_innerWrite","lastTime","continuation","RGB_REX","HASH_REX","pad","bits","s2","low","base","adv","PAYLOAD_LIMIT","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","unhook","hook","put","utf32ToString","success","handlerResult","EMPTY_PARAMS","Params","addParam","_handler","_params","_hitLimit","ret","TransitionTable","setDefault","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","apply","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearErrorHandler","collect","abort","addSubParam","addDigit","handlersEsc","jj","_state","_start","_put","MAX_VALUE","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","Uint16Array","_rejectDigits","_rejectSubDigits","_digitIsSub","k","newParams","getSubParamsAll","store","cur","_addons","instance","loadAddon","terminal","loadedAddon","_wrappedAddonDispose","init","viewportY","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","_core","_onBufferChange","BufferApiView","_alternate","onBufferChange","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","isUserScrolling","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","scrollAmount","glevel","_charsets","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","_lastEvent","name","addProtocol","addEncoding","protocol","encoding","_equalEvents","report","triggerBinaryEvent","down","up","drag","move","e1","e2","pixels","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_scrollToBottom","wasUserInput","disableStdin","xmin","xmax","_decorations","SortedList","_onDecorationRegistered","_onDecorationRemoved","Decoration","markerDispose","getKeyIterator","_cachedBg","_cachedFg","foregroundColor","_end","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","sort","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","info","INFO","ERROR","off","OFF","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","log","DEFAULT_OPTIONS","customGlyphs","allowProposedApi","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","getter","propName","setter","desc","defineProperty","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","linkId","every","linkData","storeServiceDependency","serviceRegistry","decorator","arguments","_providers","_onChange","defaultProvider","UnicodeV6","_activeProvider","onChange","getStringCellWidth","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","CONSTRUCTOR_ONLY_OPTIONS","_addonManager","AddonManager","_publicOptions","_checkReadonlyOptions","_checkProposedApi","parser","ParserApi","unicode","UnicodeApi","BufferNamespaceApi","mouseTrackingMode","applicationCursorKeysMode","applicationKeypadMode","originMode","reverseWraparoundMode","sendFocusMode","columns","_verifyIntegers","registerMarker","_verifyPositiveIntegers","writeln","addon","strings","Infinity"],"sourceRoot":""} |