]> git.proxmox.com Git - pve-xtermjs.git/commitdiff
download and use xterm-addon-webgl as renderer
authorDominik Csapak <d.csapak@proxmox.com>
Tue, 26 Sep 2023 06:34:39 +0000 (08:34 +0200)
committerDominik Csapak <d.csapak@proxmox.com>
Tue, 26 Sep 2023 08:20:11 +0000 (10:20 +0200)
since xterm.js 5.0.0, the previous default canvas renderer is not
built-in anymore and only recommended as a fallback. The new recommended
renderer is this webgl one, so use it with a fallback to the default
built-in dom renderer (which is slower, but still functional).

to use it we have to load the addon after `terminal.open` so move the
`open` call to before the addon loading. While we're touching that line,
remove the superfluous second 'true' parameter that did not do anything.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Makefile
src/www/index.html.hbs.in
src/www/index.html.tpl.in
src/www/main.js
src/www/xterm-addon-webgl.js [new file with mode: 0644]
src/www/xterm-addon-webgl.js.map [new file with mode: 0644]

index 2c730a913680f143b7ab79da120f3205eade2cbe..4ea718d69b5ddbc7d067f7d205dacaea4dbc4f75 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -15,6 +15,9 @@ XTERMJSTGZ=xterm-$(XTERMJSVER).tgz
 FITADDONVER=0.8.0
 FITADDONTGZ=xterm-addon-fit-$(FITADDONVER).tgz
 
+WEBGLADDONVER=0.16.0
+WEBGLADDONTGZ=xterm-addon-webgl-$(WEBGLADDONVER).tgz
+
 DEB=$(PACKAGE)_$(DEB_VERSION_UPSTREAM_REVISION)_$(DEB_HOST_ARCH).deb
 DBG_DEB=$(PACKAGE)-dbgsym_$(DEB_VERSION_UPSTREAM_REVISION)_$(DEB_HOST_ARCH).deb
 DSC=rust-$(CRATENAME)_$(DEB_VERSION_UPSTREAM_REVISION).dsc
@@ -98,11 +101,14 @@ X_EXCLUSIONS=$(foreach ADDON,$(EXCLUDED_ADDONS),--exclude=addons/$(ADDON))
 download:
        wget https://registry.npmjs.org/xterm/-/$(XTERMJSTGZ) -O $(XTERMJSTGZ).tmp
        wget https://registry.npmjs.org/xterm-addon-fit/-/$(FITADDONTGZ) -O $(FITADDONTGZ).tmp
+       wget https://registry.npmjs.org/xterm-addon-webgl/-/$(WEBGLADDONTGZ) -O $(WEBGLADDONTGZ).tmp
        mv $(XTERMJSTGZ).tmp $(XTERMJSTGZ)
        mv $(FITADDONTGZ).tmp $(FITADDONTGZ)
+       mv $(WEBGLADDONTGZ).tmp $(WEBGLADDONTGZ)
        tar -C src/www -xf $(XTERMJSTGZ) package/lib package/css --strip-components=2 $(X_EXCLUSIONS)
        tar -C src/www -xf $(FITADDONTGZ) package/lib --strip-components=2 $(X_EXCLUSIONS)
-       rm $(XTERMJSTGZ) $(FITADDONTGZ)
+       tar -C src/www -xf $(WEBGLADDONTGZ) package/lib --strip-components=2 $(X_EXCLUSIONS)
+       rm $(XTERMJSTGZ) $(FITADDONTGZ) $(WEBGLADDONTGZ)
 
 .PHONY: upload
 upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
index 0520340e474898285592de7ab12297174617b479..6216e67394ca5efc08baa222abea655685e2664f 100644 (file)
@@ -6,6 +6,7 @@
        <link rel="stylesheet" href="/xtermjs/style.css?version=@VERSION@" />
        <script src="/xtermjs/xterm.js?version=@VERSION@" ></script>
        <script src="/xtermjs/xterm-addon-fit.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/xterm-addon-webgl.js?version=@VERSION@" ></script>
        <script src="/xtermjs/util.js?version=@VERSION@" ></script>
     </head>
     <body>
index f38e0b21a08a373178a84c5393102a9ac2a7affd..fd7ba774b43a1f8c2ae8851e1b0b6349eaddd828 100644 (file)
@@ -6,6 +6,7 @@
        <link rel="stylesheet" href="/xtermjs/style.css?version=@VERSION@" />
        <script src="/xtermjs/xterm.js?version=@VERSION@" ></script>
        <script src="/xtermjs/xterm-addon-fit.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/xterm-addon-webgl.js?version=@VERSION@" ></script>
        <script src="/xtermjs/util.js?version=@VERSION@" ></script>
     </head>
     <body>
index f952f2ff467646e12f2e0ff150cd6cee8c535a61..85cc39953c928bc2003323777069a49fca5078ab 100644 (file)
@@ -99,6 +99,7 @@ var terminalContainer = document.getElementById('terminal-container');
 document.getElementById('status_bar').addEventListener('click', hideMsg);
 document.getElementById('connect_btn').addEventListener('click', startGuest);
 const fitAddon = new FitAddon.FitAddon();
+const webglAddon = new WebglAddon.WebglAddon();
 
 createTerminal();
 
@@ -112,7 +113,6 @@ function startConnection(url, params, term) {
            ticket = result.data.ticket;
            socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/api2/json' + url + '/vncwebsocket?port=' + port + '&vncticket=' + encodeURIComponent(ticket);
 
-           term.open(terminalContainer, true);
            socket = new WebSocket(socketURL, 'binary');
            socket.binaryType = 'arraybuffer';
            socket.onopen = runTerminal;
@@ -152,7 +152,13 @@ function startGuest() {
 
 function createTerminal() {
     term = new Terminal(getTerminalSettings());
+    term.open(terminalContainer);
     term.loadAddon(fitAddon);
+    try {
+       term.loadAddon(webglAddon);
+    } catch (_e) {
+       console.warn("webgl-addon loading failed, falling back to regular dom renderer");
+    }
 
     term.onResize(function (size) {
        if (state === states.connected) {
diff --git a/src/www/xterm-addon-webgl.js b/src/www/xterm-addon-webgl.js
new file mode 100644 (file)
index 0000000..d020f0d
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.WebglAddon=t():e.WebglAddon=t()}(self,(()=>(()=>{"use strict";var e={965:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.GlyphRenderer=void 0;const r=i(374),o=i(509),n=i(855),a=i(859),h=i(776),l=i(381),c=11,d=c*Float32Array.BYTES_PER_ELEMENT;let _,u=0,g=0,v=0;class f extends a.Disposable{constructor(e,t,i){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const s=this._gl;void 0===o.TextureAtlas.maxAtlasPages&&(o.TextureAtlas.maxAtlasPages=Math.min(32,(0,r.throwIfFalsy)(s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS))),o.TextureAtlas.maxTextureSize=(0,r.throwIfFalsy)(s.getParameter(s.MAX_TEXTURE_SIZE))),this._program=(0,r.throwIfFalsy)((0,l.createProgram)(s,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n  vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_texpage = int(a_texpage);\n  v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(e){let t="";for(let i=1;i<e;i++)t+=` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;return`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${e}];\n\nout vec4 outColor;\n\nvoid main() {\n  if (v_texpage == 0) {\n    outColor = texture(u_texture[0], v_texcoord);\n  } ${t}\n}`}(o.TextureAtlas.maxAtlasPages))),this.register((0,a.toDisposable)((()=>s.deleteProgram(this._program)))),this._projectionLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=s.createVertexArray(),s.bindVertexArray(this._vertexArrayObject);const n=new Float32Array([0,0,1,0,0,1,1,1]),h=s.createBuffer();this.register((0,a.toDisposable)((()=>s.deleteBuffer(h)))),s.bindBuffer(s.ARRAY_BUFFER,h),s.bufferData(s.ARRAY_BUFFER,n,s.STATIC_DRAW),s.enableVertexAttribArray(0),s.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const c=new Uint8Array([0,1,2,3]),_=s.createBuffer();this.register((0,a.toDisposable)((()=>s.deleteBuffer(_)))),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,_),s.bufferData(s.ELEMENT_ARRAY_BUFFER,c,s.STATIC_DRAW),this._attributesBuffer=(0,r.throwIfFalsy)(s.createBuffer()),this.register((0,a.toDisposable)((()=>s.deleteBuffer(this._attributesBuffer)))),s.bindBuffer(s.ARRAY_BUFFER,this._attributesBuffer),s.enableVertexAttribArray(2),s.vertexAttribPointer(2,2,s.FLOAT,!1,d,0),s.vertexAttribDivisor(2,1),s.enableVertexAttribArray(3),s.vertexAttribPointer(3,2,s.FLOAT,!1,d,2*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(3,1),s.enableVertexAttribArray(4),s.vertexAttribPointer(4,1,s.FLOAT,!1,d,4*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(4,1),s.enableVertexAttribArray(5),s.vertexAttribPointer(5,2,s.FLOAT,!1,d,5*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(5,1),s.enableVertexAttribArray(6),s.vertexAttribPointer(6,2,s.FLOAT,!1,d,7*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(6,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,2,s.FLOAT,!1,d,9*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(1,1),s.useProgram(this._program);const u=new Int32Array(o.TextureAtlas.maxAtlasPages);for(let e=0;e<o.TextureAtlas.maxAtlasPages;e++)u[e]=e;s.uniform1iv(this._textureLocation,u),s.uniformMatrix4fv(this._projectionLocation,!1,l.PROJECTION_MATRIX),this._atlasTextures=[];for(let e=0;e<o.TextureAtlas.maxAtlasPages;e++){const t=new l.GLTexture((0,r.throwIfFalsy)(s.createTexture()));this.register((0,a.toDisposable)((()=>s.deleteTexture(t.texture)))),s.activeTexture(s.TEXTURE0+e),s.bindTexture(s.TEXTURE_2D,t.texture),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,1,1,0,s.RGBA,s.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[e]=t}s.enable(s.BLEND),s.blendFunc(s.SRC_ALPHA,s.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.beginFrame()}updateCell(e,t,i,s,r,o,n,a){this._updateCell(this._vertices.attributes,e,t,i,s,r,o,n,a)}_updateCell(e,t,i,s,r,o,a,h,l){u=(i*this._terminal.cols+t)*c,s!==n.NULL_CELL_CODE&&void 0!==s?this._atlas&&(_=h&&h.length>1?this._atlas.getRasterizedGlyphCombinedChar(h,r,o,a,!1):this._atlas.getRasterizedGlyph(s,r,o,a,!1),g=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),r!==l&&_.offset.x>g?(v=_.offset.x-g,e[u]=-(_.offset.x-v)+this._dimensions.device.char.left,e[u+1]=-_.offset.y+this._dimensions.device.char.top,e[u+2]=(_.size.x-v)/this._dimensions.device.canvas.width,e[u+3]=_.size.y/this._dimensions.device.canvas.height,e[u+4]=_.texturePage,e[u+5]=_.texturePositionClipSpace.x+v/this._atlas.pages[_.texturePage].canvas.width,e[u+6]=_.texturePositionClipSpace.y,e[u+7]=_.sizeClipSpace.x-v/this._atlas.pages[_.texturePage].canvas.width,e[u+8]=_.sizeClipSpace.y):(e[u]=-_.offset.x+this._dimensions.device.char.left,e[u+1]=-_.offset.y+this._dimensions.device.char.top,e[u+2]=_.size.x/this._dimensions.device.canvas.width,e[u+3]=_.size.y/this._dimensions.device.canvas.height,e[u+4]=_.texturePage,e[u+5]=_.texturePositionClipSpace.x,e[u+6]=_.texturePositionClipSpace.y,e[u+7]=_.sizeClipSpace.x,e[u+8]=_.sizeClipSpace.y)):e.fill(0,u,u+c-1-2)}clear(){const e=this._terminal,t=e.cols*e.rows*c;this._vertices.count!==t?this._vertices.attributes=new Float32Array(t):this._vertices.attributes.fill(0);let i=0;for(;i<this._vertices.attributesBuffers.length;i++)this._vertices.count!==t?this._vertices.attributesBuffers[i]=new Float32Array(t):this._vertices.attributesBuffers[i].fill(0);this._vertices.count=t,i=0;for(let t=0;t<e.rows;t++)for(let s=0;s<e.cols;s++)this._vertices.attributes[i+9]=s/e.cols,this._vertices.attributes[i+10]=t/e.rows,i+=c}handleResize(){const e=this._gl;e.useProgram(this._program),e.viewport(0,0,e.canvas.width,e.canvas.height),e.uniform2f(this._resolutionLocation,e.canvas.width,e.canvas.height),this.clear()}render(e){if(!this._atlas)return;const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),this._activeBuffer=(this._activeBuffer+1)%2;const i=this._vertices.attributesBuffers[this._activeBuffer];let s=0;for(let t=0;t<e.lineLengths.length;t++){const r=t*this._terminal.cols*c,o=this._vertices.attributes.subarray(r,r+e.lineLengths[t]*c);i.set(o,s),s+=o.length}t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,i.subarray(0,s),t.STREAM_DRAW);for(let e=0;e<this._atlas.pages.length;e++)this._atlas.pages[e].version!==this._atlasTextures[e].version&&this._bindAtlasPageTexture(t,this._atlas,e);t.drawElementsInstanced(t.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,s/c)}setAtlas(e){this._atlas=e;for(const e of this._atlasTextures)e.version=-1}_bindAtlasPageTexture(e,t,i){e.activeTexture(e.TEXTURE0+i),e.bindTexture(e.TEXTURE_2D,this._atlasTextures[i].texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.pages[i].canvas),e.generateMipmap(e.TEXTURE_2D),this._atlasTextures[i].version=t.pages[i].version}setDimensions(e){this._dimensions=e}}t.GlyphRenderer=f,s([h.traceCall],f.prototype,"updateCell",null)},742:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RectangleRenderer=void 0;const s=i(374),r=i(859),o=i(310),n=i(381),a=8*Float32Array.BYTES_PER_ELEMENT;class h{constructor(){this.attributes=new Float32Array(160),this.count=0}}let l=0,c=0,d=0,_=0,u=0,g=0,v=0;class f extends r.Disposable{constructor(e,t,i,o){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._themeService=o,this._vertices=new h,this._verticesCursor=new h;const l=this._gl;this._program=(0,s.throwIfFalsy)((0,n.createProgram)(l,"#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_size;\nlayout (location = 2) in vec4 a_color;\nlayout (location = 3) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n  vec2 zeroToOne = a_position + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_color = a_color;\n}","#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n  outColor = v_color;\n}")),this.register((0,r.toDisposable)((()=>l.deleteProgram(this._program)))),this._projectionLocation=(0,s.throwIfFalsy)(l.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=l.createVertexArray(),l.bindVertexArray(this._vertexArrayObject);const c=new Float32Array([0,0,1,0,0,1,1,1]),d=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(d)))),l.bindBuffer(l.ARRAY_BUFFER,d),l.bufferData(l.ARRAY_BUFFER,c,l.STATIC_DRAW),l.enableVertexAttribArray(3),l.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),u=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(u)))),l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,u),l.bufferData(l.ELEMENT_ARRAY_BUFFER,_,l.STATIC_DRAW),this._attributesBuffer=(0,s.throwIfFalsy)(l.createBuffer()),this.register((0,r.toDisposable)((()=>l.deleteBuffer(this._attributesBuffer)))),l.bindBuffer(l.ARRAY_BUFFER,this._attributesBuffer),l.enableVertexAttribArray(0),l.vertexAttribPointer(0,2,l.FLOAT,!1,a,0),l.vertexAttribDivisor(0,1),l.enableVertexAttribArray(1),l.vertexAttribPointer(1,2,l.FLOAT,!1,a,2*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(1,1),l.enableVertexAttribArray(2),l.vertexAttribPointer(2,4,l.FLOAT,!1,a,4*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(2,1),this._updateCachedColors(o.colors),this.register(this._themeService.onChangeColors((e=>{this._updateCachedColors(e),this._updateViewportRectangle()})))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(e){const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),t.uniformMatrix4fv(this._projectionLocation,!1,n.PROJECTION_MATRIX),t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,e.attributes,t.DYNAMIC_DRAW),t.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,e.count)}handleResize(){this._updateViewportRectangle()}setDimensions(e){this._dimensions=e}_updateCachedColors(e){this._bgFloat=this._colorToFloat32Array(e.background),this._cursorFloat=this._colorToFloat32Array(e.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(e){const t=this._terminal,i=this._vertices;let s,r,n,a,h,l,c,d,_,u,g,v=1;for(s=0;s<t.rows;s++){for(n=-1,a=0,h=0,l=!1,r=0;r<t.cols;r++)c=(s*t.cols+r)*o.RENDER_MODEL_INDICIES_PER_CELL,d=e.cells[c+o.RENDER_MODEL_BG_OFFSET],_=e.cells[c+o.RENDER_MODEL_FG_OFFSET],u=!!(67108864&_),(d!==a||_!==h&&(l||u))&&((0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,r,s)),n=r,a=d,h=_,l=u);(0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,t.cols,s))}i.count=v}updateCursor(e){const t=this._verticesCursor,i=e.cursor;if(!i||"block"===i.style)return void(t.count=0);let s,r=0;"bar"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,"bar"===i.style?i.dpr*i.cursorWidth:i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),"underline"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,(i.y+1)*this._dimensions.device.cell.height-i.dpr,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat)),"outline"===i.style&&(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat),s=8*r++,this._addRectangleFloat(t.attributes,s,(i.x+i.width)*this._dimensions.device.cell.width-i.dpr,i.y*this._dimensions.device.cell.height,i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),t.count=r}_updateRectangle(e,t,i,s,r,o,a){if(67108864&i)switch(50331648&i){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&i].rgba;break;case 50331648:l=(16777215&i)<<8;break;default:l=this._themeService.colors.foreground.rgba}else switch(50331648&s){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&s].rgba;break;case 50331648:l=(16777215&s)<<8;break;default:l=this._themeService.colors.background.rgba}e.attributes.length<t+4&&(e.attributes=(0,n.expandFloat32Array)(e.attributes,this._terminal.rows*this._terminal.cols*8)),c=r*this._dimensions.device.cell.width,d=a*this._dimensions.device.cell.height,_=(l>>24&255)/255,u=(l>>16&255)/255,g=(l>>8&255)/255,v=1,this._addRectangle(e.attributes,t,c,d,(o-r)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,_,u,g,v)}_addRectangle(e,t,i,s,r,o,n,a,h,l){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n,e[t+5]=a,e[t+6]=h,e[t+7]=l}_addRectangleFloat(e,t,i,s,r,o,n){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n[0],e[t+5]=n[1],e[t+6]=n[2],e[t+7]=n[3]}_colorToFloat32Array(e){return new Float32Array([(e.rgba>>24&255)/255,(e.rgba>>16&255)/255,(e.rgba>>8&255)/255,(255&e.rgba)/255])}}t.RectangleRenderer=f},310:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderModel=t.COMBINED_CHAR_BIT_MASK=t.RENDER_MODEL_EXT_OFFSET=t.RENDER_MODEL_FG_OFFSET=t.RENDER_MODEL_BG_OFFSET=t.RENDER_MODEL_INDICIES_PER_CELL=void 0;const s=i(296);t.RENDER_MODEL_INDICIES_PER_CELL=4,t.RENDER_MODEL_BG_OFFSET=1,t.RENDER_MODEL_FG_OFFSET=2,t.RENDER_MODEL_EXT_OFFSET=3,t.COMBINED_CHAR_BIT_MASK=2147483648,t.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(e,i){const s=e*i*t.RENDER_MODEL_INDICIES_PER_CELL;s!==this.cells.length&&(this.cells=new Uint32Array(s),this.lineLengths=new Uint32Array(i))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},666:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.JoinedCellData=t.WebglRenderer=void 0;const r=i(820),o=i(274),n=i(627),a=i(457),h=i(56),l=i(374),c=i(345),d=i(859),_=i(147),u=i(782),g=i(855),v=i(776),f=i(965),p=i(742),C=i(310),m=i(733);class L extends d.Disposable{constructor(e,t,i,s,a,_,g,v,f){super(),this._terminal=e,this._characterJoinerService=t,this._charSizeService=i,this._coreBrowserService=s,this._coreService=a,this._decorationService=_,this._optionsService=g,this._themeService=v,this._cursorBlinkStateManager=new d.MutableDisposable,this._charAtlasDisposable=this.register(new d.MutableDisposable),this._model=new C.RenderModel,this._workCell=new u.CellData,this._rectangleRenderer=this.register(new d.MutableDisposable),this._glyphRenderer=this.register(new d.MutableDisposable),this._onChangeTextureAtlas=this.register(new c.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new c.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new c.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onRequestRedraw=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRequestRedraw.event,this._onContextLoss=this.register(new c.EventEmitter),this.onContextLoss=this._onContextLoss.event,this.register(this._themeService.onChangeColors((()=>this._handleColorChange()))),this._cellColorResolver=new o.CellColorResolver(this._terminal,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new m.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier2,this._coreBrowserService,g,this._themeService)],this.dimensions=(0,l.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this.register(g.onOptionChange((()=>this._handleOptionsChanged()))),this._canvas=document.createElement("canvas");const p={antialias:!1,depth:!1,preserveDrawingBuffer:f};if(this._gl=this._canvas.getContext("webgl2",p),!this._gl)throw new Error("WebGL2 not supported "+this._gl);this.register((0,r.addDisposableDomListener)(this._canvas,"webglcontextlost",(e=>{console.log("webglcontextlost event received"),e.preventDefault(),this._contextRestorationTimeout=setTimeout((()=>{this._contextRestorationTimeout=void 0,console.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(e)}),3e3)}))),this.register((0,r.addDisposableDomListener)(this._canvas,"webglcontextrestored",(e=>{console.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,n.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()}))),this.register((0,h.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,((e,t)=>this._setCanvasDevicePixelDimensions(e,t)))),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._coreBrowserService.window.document.body.contains(this._core.screenElement),this.register((0,d.toDisposable)((()=>{var e;for(const e of this._renderLayers)e.dispose();null===(e=this._canvas.parentElement)||void 0===e||e.removeChild(this._canvas),(0,n.removeTerminalFromCache)(this._terminal)})))}get textureAtlas(){var e;return null===(e=this._charAtlas)||void 0===e?void 0:e.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(e,t){var i,s,r,o;this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows);for(const e of this._renderLayers)e.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,null===(i=this._rectangleRenderer.value)||void 0===i||i.setDimensions(this.dimensions),null===(s=this._rectangleRenderer.value)||void 0===s||s.handleResize(),null===(r=this._glyphRenderer.value)||void 0===r||r.setDimensions(this.dimensions),null===(o=this._glyphRenderer.value)||void 0===o||o.handleResize(),this._refreshCharAtlas(),this._clearModel(!1)}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){var e;for(const e of this._renderLayers)e.handleBlur(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.pause(),this._requestRedrawViewport()}handleFocus(){var e;for(const e of this._renderLayers)e.handleFocus(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.resume(),this._requestRedrawViewport()}handleSelectionChanged(e,t,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,e,t,i);this._model.selection.update(this._terminal,e,t,i),this._requestRedrawViewport()}handleCursorMove(){var e;for(const e of this._renderLayers)e.handleCursorMove(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new p.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService),this._glyphRenderer.value=new f.GlyphRenderer(this._terminal,this._gl,this.dimensions),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){var e;if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const t=(0,n.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=(0,d.getDisposeArrayDisposable)([(0,c.forwardEvent)(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),(0,c.forwardEvent)(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)])),this._charAtlas=t,this._charAtlas.warmUp(),null===(e=this._glyphRenderer.value)||void 0===e||e.setAtlas(this._charAtlas)}_clearModel(e){var t;this._model.clear(),e&&(null===(t=this._glyphRenderer.value)||void 0===t||t.clear())}clearTextureAtlas(){var e;null===(e=this._charAtlas)||void 0===e||e.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){var e;this._clearModel(!0);for(const e of this._renderLayers)e.reset(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.restartBlinkAnimation(),this._updateCursorBlink()}registerCharacterJoiner(e){return-1}deregisterCharacterJoiner(e){return!1}renderRows(e,t){if(!this._isAttached){if(!(this._coreBrowserService.window.document.body.contains(this._core.screenElement)&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,e,t);this._glyphRenderer.value&&this._rectangleRenderer.value&&(this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(e,t),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor())}_updateCursorBlink(){this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager((()=>{this._requestRedrawCursor()}),this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(e,t){const i=this._core;let s,r,o,n,a,h,l,c,d,_,u,v,f,p=this._workCell;e=w(e,i.rows-1,0),t=w(t,i.rows-1,0);const m=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,L=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let b=-1;const R=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let M=!1;for(r=e;r<=t;r++)for(o=r+i.buffer.ydisp,n=i.buffer.lines.get(o),this._model.lineLengths[r]=0,a=this._characterJoinerService.getJoinedCharacters(o),v=0;v<i.cols;v++)if(s=this._cellColorResolver.result.bg,n.loadCell(v,p),0===v&&(s=this._cellColorResolver.result.bg),h=!1,l=v,a.length>0&&v===a[0][0]&&(h=!0,c=a.shift(),p=new x(p,n.translateToString(!0,c[0],c[1]),c[1]-c[0]),l=c[1]-1),d=p.getChars(),_=p.getCode(),u=(r*i.cols+v)*C.RENDER_MODEL_INDICIES_PER_CELL,this._cellColorResolver.resolve(p,v,o),R&&o===m&&(v===L&&(this._model.cursor={x:L,y:this._terminal.buffer.active.cursorY,width:p.getWidth(),style:this._coreBrowserService.isFocused?i.options.cursorStyle||"block":i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},b=L+p.getWidth()-1),v>=L&&v<=b&&(this._coreBrowserService.isFocused&&"block"===(i.options.cursorStyle||"block")||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),_!==g.NULL_CELL_CODE&&(this._model.lineLengths[r]=v+1),(this._model.cells[u]!==_||this._model.cells[u+C.RENDER_MODEL_BG_OFFSET]!==this._cellColorResolver.result.bg||this._model.cells[u+C.RENDER_MODEL_FG_OFFSET]!==this._cellColorResolver.result.fg||this._model.cells[u+C.RENDER_MODEL_EXT_OFFSET]!==this._cellColorResolver.result.ext)&&(M=!0,d.length>1&&(_|=C.COMBINED_CHAR_BIT_MASK),this._model.cells[u]=_,this._model.cells[u+C.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[u+C.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[u+C.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext,this._glyphRenderer.value.updateCell(v,r,_,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,d,s),h))for(p=this._workCell,v++;v<l;v++)f=(r*i.cols+v)*C.RENDER_MODEL_INDICIES_PER_CELL,this._glyphRenderer.value.updateCell(v,r,g.NULL_CELL_CODE,0,0,0,g.NULL_CELL_CHAR,0),this._model.cells[f]=g.NULL_CELL_CODE,this._model.cells[f+C.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[f+C.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[f+C.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext;M&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(e,t){this._canvas.width===e&&this._canvas.height===t||(this._canvas.width=e,this._canvas.height=t,this._requestRedrawViewport())}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const e=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:e,end:e})}}t.WebglRenderer=L,s([v.traceCall],L.prototype,"renderRows",null);class x extends _.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function w(e,t,i=0){return Math.max(Math.min(e,t),i)}t.JoinedCellData=x},381:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GLTexture=t.expandFloat32Array=t.createShader=t.createProgram=t.PROJECTION_MATRIX=void 0;const s=i(374);function r(e,t,i){const r=(0,s.throwIfFalsy)(e.createShader(t));if(e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.error(e.getShaderInfoLog(r)),e.deleteShader(r)}t.PROJECTION_MATRIX=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]),t.createProgram=function(e,t,i){const o=(0,s.throwIfFalsy)(e.createProgram());if(e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.VERTEX_SHADER,t))),e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.FRAGMENT_SHADER,i))),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;console.error(e.getProgramInfoLog(o)),e.deleteProgram(o)},t.createShader=r,t.expandFloat32Array=function(e,t){const i=Math.min(2*e.length,t),s=new Float32Array(i);for(let t=0;t<e.length;t++)s[t]=e[t];return s},t.GLTexture=class{constructor(e){this.texture=e,this.version=-1}}},592:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BaseRenderLayer=void 0;const s=i(627),r=i(237),o=i(374),n=i(859);class a extends n.Disposable{constructor(e,t,i,s,r,o,a,h){super(),this._container=t,this._alpha=r,this._coreBrowserService=o,this._optionsService=a,this._themeService=h,this._deviceCharWidth=0,this._deviceCharHeight=0,this._deviceCellWidth=0,this._deviceCellHeight=0,this._deviceCharLeft=0,this._deviceCharTop=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add(`xterm-${i}-layer`),this._canvas.style.zIndex=s.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this.register(this._themeService.onChangeColors((t=>{this._refreshCharAtlas(e,t),this.reset(e)}))),this.register((0,n.toDisposable)((()=>{this._canvas.remove()})))}_initCanvas(){this._ctx=(0,o.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(e){}handleFocus(e){}handleCursorMove(e){}handleGridChanged(e,t,i){}handleSelectionChanged(e,t,i,s=!1){}_setTransparency(e,t){if(t===this._alpha)return;const i=this._canvas;this._alpha=t,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(e,this._themeService.colors),this.handleGridChanged(e,0,e.rows-1)}_refreshCharAtlas(e,t){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(e,this._optionsService.rawOptions,t,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr),this._charAtlas.warmUp())}resize(e,t){this._deviceCellWidth=t.device.cell.width,this._deviceCellHeight=t.device.cell.height,this._deviceCharWidth=t.device.char.width,this._deviceCharHeight=t.device.char.height,this._deviceCharLeft=t.device.char.left,this._deviceCharTop=t.device.char.top,this._canvas.width=t.device.canvas.width,this._canvas.height=t.device.canvas.height,this._canvas.style.width=`${t.css.canvas.width}px`,this._canvas.style.height=`${t.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(e,this._themeService.colors)}_fillBottomLineAtCells(e,t,i=1){this._ctx.fillRect(e*this._deviceCellWidth,(t+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(e,t,i,s){this._alpha?this._ctx.clearRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(e,t,i,s){this._ctx.font=this._getFont(e,!1,!1),this._ctx.textBaseline=r.TEXT_BASELINE,this._clipCell(i,s,t.getWidth()),this._ctx.fillText(t.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(e,t,i){this._ctx.beginPath(),this._ctx.rect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(e,t,i){return`${i?"italic":""} ${t?e.options.fontWeightBold:e.options.fontWeight} ${e.options.fontSize*this._coreBrowserService.dpr}px ${e.options.fontFamily}`}}t.BaseRenderLayer=a},733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkRenderLayer=void 0;const s=i(197),r=i(237),o=i(592);class n extends o.BaseRenderLayer{constructor(e,t,i,s,r,o,n){super(i,e,"link",t,!0,r,o,n),this.register(s.onShowLinkUnderline((e=>this._handleShowLinkUnderline(e)))),this.register(s.onHideLinkUnderline((e=>this._handleHideLinkUnderline(e))))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==e.fg&&(0,s.is256Color)(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;t<e.y2;t++)this._fillBottomLineAtCells(0,t,e.cols);this._fillBottomLineAtCells(0,e.y2,e.x2)}this._state=e}_handleHideLinkUnderline(e){this._clearCurrentLink()}}t.LinkRenderLayer=n},820:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},274:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellColorResolver=void 0;let i,s=0,r=0,o=!1,n=!1,a=!1;t.CellColorResolver=class{constructor(e,t,i,s,r){this._terminal=e,this._selectionRenderModel=t,this._decorationService=i,this._coreBrowserService=s,this._themeService=r,this.result={fg:0,bg:0,ext:0}}resolve(e,t,h){this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=268435456&e.bg?e.extended.ext:0,r=0,s=0,n=!1,o=!1,a=!1,i=this._themeService.colors,this._decorationService.forEachDecorationAtCell(t,h,"bottom",(e=>{e.backgroundColorRGB&&(r=e.backgroundColorRGB.rgba>>8&16777215,n=!0),e.foregroundColorRGB&&(s=e.foregroundColorRGB.rgba>>8&16777215,o=!0)})),a=this._selectionRenderModel.isCellSelected(this._terminal,t,h),a&&(r=(this._coreBrowserService.isFocused?i.selectionBackgroundOpaque:i.selectionInactiveBackgroundOpaque).rgba>>8&16777215,n=!0,i.selectionForeground&&(s=i.selectionForeground.rgba>>8&16777215,o=!0)),this._decorationService.forEachDecorationAtCell(t,h,"top",(e=>{e.backgroundColorRGB&&(r=e.backgroundColorRGB.rgba>>8&16777215,n=!0),e.foregroundColorRGB&&(s=e.foregroundColorRGB.rgba>>8&16777215,o=!0)})),n&&(r=a?-16777216&e.bg&-134217729|r|50331648:-16777216&e.bg|r|50331648),o&&(s=-16777216&e.fg&-67108865|s|50331648),67108864&this.result.fg&&(n&&!o&&(s=0==(50331648&this.result.bg)?-134217728&this.result.fg|16777215&i.background.rgba>>8|50331648:-134217728&this.result.fg|67108863&this.result.bg,o=!0),!n&&o&&(r=0==(50331648&this.result.fg)?-67108864&this.result.bg|16777215&i.foreground.rgba>>8|50331648:-67108864&this.result.bg|67108863&this.result.fg,n=!0)),i=void 0,this.result.bg=n?r:this.result.bg,this.result.fg=o?s:this.result.fg}}},627:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.removeTerminalFromCache=t.acquireTextureAtlas=void 0;const s=i(509),r=i(197),o=[];t.acquireTextureAtlas=function(e,t,i,n,a,h,l,c){const d=(0,r.generateConfig)(n,a,h,l,t,i,c);for(let t=0;t<o.length;t++){const i=o[t],s=i.ownedBy.indexOf(e);if(s>=0){if((0,r.configEquals)(i.config,d))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),o.splice(t,1)):i.ownedBy.splice(s,1);break}}for(let t=0;t<o.length;t++){const i=o[t];if((0,r.configEquals)(i.config,d))return i.ownedBy.push(e),i.atlas}const _=e._core,u={atlas:new s.TextureAtlas(document,d,_.unicodeService),config:d,ownedBy:[e]};return o.push(u),u.atlas},t.removeTerminalFromCache=function(e){for(let t=0;t<o.length;t++){const i=o[t].ownedBy.indexOf(e);if(-1!==i){1===o[t].ownedBy.length?(o[t].atlas.dispose(),o.splice(t,1)):o[t].ownedBy.splice(i,1);break}}}},197:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.is256Color=t.configEquals=t.generateConfig=void 0;const s=i(160);t.generateConfig=function(e,t,i,r,o,n,a){const h={foreground:n.foreground,background:n.background,cursor:s.NULL_COLOR,cursorAccent:s.NULL_COLOR,selectionForeground:s.NULL_COLOR,selectionBackgroundTransparent:s.NULL_COLOR,selectionBackgroundOpaque:s.NULL_COLOR,selectionInactiveBackgroundTransparent:s.NULL_COLOR,selectionInactiveBackgroundOpaque:s.NULL_COLOR,ansi:n.ansi.slice(),contrastCache:n.contrastCache,halfContrastCache:n.halfContrastCache};return{customGlyphs:o.customGlyphs,devicePixelRatio:a,letterSpacing:o.letterSpacing,lineHeight:o.lineHeight,deviceCellWidth:e,deviceCellHeight:t,deviceCharWidth:i,deviceCharHeight:r,fontFamily:o.fontFamily,fontSize:o.fontSize,fontWeight:o.fontWeight,fontWeightBold:o.fontWeightBold,allowTransparency:o.allowTransparency,drawBoldTextInBrightColors:o.drawBoldTextInBrightColors,minimumContrastRatio:o.minimumContrastRatio,colors:h}},t.configEquals=function(e,t){for(let i=0;i<e.colors.ansi.length;i++)if(e.colors.ansi[i].rgba!==t.colors.ansi[i].rgba)return!1;return e.devicePixelRatio===t.devicePixelRatio&&e.customGlyphs===t.customGlyphs&&e.lineHeight===t.lineHeight&&e.letterSpacing===t.letterSpacing&&e.fontFamily===t.fontFamily&&e.fontSize===t.fontSize&&e.fontWeight===t.fontWeight&&e.fontWeightBold===t.fontWeightBold&&e.allowTransparency===t.allowTransparency&&e.deviceCharWidth===t.deviceCharWidth&&e.deviceCharHeight===t.deviceCharHeight&&e.drawBoldTextInBrightColors===t.drawBoldTextInBrightColors&&e.minimumContrastRatio===t.minimumContrastRatio&&e.colors.foreground.rgba===t.colors.foreground.rgba&&e.colors.background.rgba===t.colors.background.rgba},t.is256Color=function(e){return 16777216==(50331648&e)||33554432==(50331648&e)}},237:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(399);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},457:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CursorBlinkStateManager=void 0;t.CursorBlinkStateManager=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this.isCursorVisible=!0,this._coreBrowserService.isFocused&&this._restartInterval()}get isPaused(){return!(this._blinkStartTimeout||this._blinkInterval)}dispose(){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}restartBlinkAnimation(){this.isPaused||(this._animationTimeRestarted=Date.now(),this.isCursorVisible=!0,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,e>0)return void this._restartInterval(e)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0})),this._blinkInterval=this._coreBrowserService.window.setInterval((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(e)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))}),600)}),e)}pause(){this.isCursorVisible=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this.restartBlinkAnimation()}}},860:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tryDrawCustomChar=t.powerlineDefinitions=t.boxDrawingDefinitions=t.blockElementDefinitions=void 0;const s=i(374);t.blockElementDefinitions={"▀":[{x:0,y:0,w:8,h:4}],"▁":[{x:0,y:7,w:8,h:1}],"▂":[{x:0,y:6,w:8,h:2}],"▃":[{x:0,y:5,w:8,h:3}],"▄":[{x:0,y:4,w:8,h:4}],"▅":[{x:0,y:3,w:8,h:5}],"▆":[{x:0,y:2,w:8,h:6}],"▇":[{x:0,y:1,w:8,h:7}],"█":[{x:0,y:0,w:8,h:8}],"▉":[{x:0,y:0,w:7,h:8}],"▊":[{x:0,y:0,w:6,h:8}],"▋":[{x:0,y:0,w:5,h:8}],"▌":[{x:0,y:0,w:4,h:8}],"▍":[{x:0,y:0,w:3,h:8}],"▎":[{x:0,y:0,w:2,h:8}],"▏":[{x:0,y:0,w:1,h:8}],"▐":[{x:4,y:0,w:4,h:8}],"▔":[{x:0,y:0,w:8,h:1}],"▕":[{x:7,y:0,w:1,h:8}],"▖":[{x:0,y:4,w:4,h:4}],"▗":[{x:4,y:4,w:4,h:4}],"▘":[{x:0,y:0,w:4,h:4}],"▙":[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"▚":[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}],"▛":[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}],"▜":[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}],"▝":[{x:4,y:0,w:4,h:4}],"▞":[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}],"▟":[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"🭰":[{x:1,y:0,w:1,h:8}],"🭱":[{x:2,y:0,w:1,h:8}],"🭲":[{x:3,y:0,w:1,h:8}],"🭳":[{x:4,y:0,w:1,h:8}],"🭴":[{x:5,y:0,w:1,h:8}],"🭵":[{x:6,y:0,w:1,h:8}],"🭶":[{x:0,y:1,w:8,h:1}],"🭷":[{x:0,y:2,w:8,h:1}],"🭸":[{x:0,y:3,w:8,h:1}],"🭹":[{x:0,y:4,w:8,h:1}],"🭺":[{x:0,y:5,w:8,h:1}],"🭻":[{x:0,y:6,w:8,h:1}],"🭼":[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🭽":[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭾":[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭿":[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🮀":[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮁":[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮂":[{x:0,y:0,w:8,h:2}],"🮃":[{x:0,y:0,w:8,h:3}],"🮄":[{x:0,y:0,w:8,h:5}],"🮅":[{x:0,y:0,w:8,h:6}],"🮆":[{x:0,y:0,w:8,h:7}],"🮇":[{x:6,y:0,w:2,h:8}],"🮈":[{x:5,y:0,w:3,h:8}],"🮉":[{x:3,y:0,w:5,h:8}],"🮊":[{x:2,y:0,w:6,h:8}],"🮋":[{x:1,y:0,w:7,h:8}],"🮕":[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}],"🮖":[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}],"🮗":[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]};const r={"░":[[1,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],"▒":[[1,0],[0,0],[0,1],[0,0]],"▓":[[0,1],[1,1],[1,0],[1,1]]};t.boxDrawingDefinitions={"─":{1:"M0,.5 L1,.5"},"━":{3:"M0,.5 L1,.5"},"│":{1:"M.5,0 L.5,1"},"┃":{3:"M.5,0 L.5,1"},"┌":{1:"M0.5,1 L.5,.5 L1,.5"},"┏":{3:"M0.5,1 L.5,.5 L1,.5"},"┐":{1:"M0,.5 L.5,.5 L.5,1"},"┓":{3:"M0,.5 L.5,.5 L.5,1"},"└":{1:"M.5,0 L.5,.5 L1,.5"},"┗":{3:"M.5,0 L.5,.5 L1,.5"},"┘":{1:"M.5,0 L.5,.5 L0,.5"},"┛":{3:"M.5,0 L.5,.5 L0,.5"},"├":{1:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┣":{3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┤":{1:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┫":{3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┬":{1:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┳":{3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┴":{1:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┻":{3:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┼":{1:"M0,.5 L1,.5 M.5,0 L.5,1"},"╋":{3:"M0,.5 L1,.5 M.5,0 L.5,1"},"╴":{1:"M.5,.5 L0,.5"},"╸":{3:"M.5,.5 L0,.5"},"╵":{1:"M.5,.5 L.5,0"},"╹":{3:"M.5,.5 L.5,0"},"╶":{1:"M.5,.5 L1,.5"},"╺":{3:"M.5,.5 L1,.5"},"╷":{1:"M.5,.5 L.5,1"},"╻":{3:"M.5,.5 L.5,1"},"═":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"║":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╒":{1:(e,t)=>`M.5,1 L.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╓":{1:(e,t)=>`M${.5-e},1 L${.5-e},.5 L1,.5 M${.5+e},.5 L${.5+e},1`},"╔":{1:(e,t)=>`M1,${.5-t} L${.5-e},${.5-t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╕":{1:(e,t)=>`M0,${.5-t} L.5,${.5-t} L.5,1 M0,${.5+t} L.5,${.5+t}`},"╖":{1:(e,t)=>`M${.5+e},1 L${.5+e},.5 L0,.5 M${.5-e},.5 L${.5-e},1`},"╗":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5+e},${.5-t} L${.5+e},1`},"╘":{1:(e,t)=>`M.5,0 L.5,${.5+t} L1,${.5+t} M.5,${.5-t} L1,${.5-t}`},"╙":{1:(e,t)=>`M1,.5 L${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╚":{1:(e,t)=>`M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0 M1,${.5+t} L${.5-e},${.5+t} L${.5-e},0`},"╛":{1:(e,t)=>`M0,${.5+t} L.5,${.5+t} L.5,0 M0,${.5-t} L.5,${.5-t}`},"╜":{1:(e,t)=>`M0,.5 L${.5+e},.5 L${.5+e},0 M${.5-e},.5 L${.5-e},0`},"╝":{1:(e,t)=>`M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M0,${.5+t} L${.5+e},${.5+t} L${.5+e},0`},"╞":{1:(e,t)=>`M.5,0 L.5,1 M.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╟":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1 M${.5+e},.5 L1,.5`},"╠":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╡":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L.5,${.5-t} M0,${.5+t} L.5,${.5+t}`},"╢":{1:(e,t)=>`M0,.5 L${.5-e},.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╣":{1:(e,t)=>`M${.5+e},0 L${.5+e},1 M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0`},"╤":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t} M.5,${.5+t} L.5,1`},"╥":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},1 M${.5+e},.5 L${.5+e},1`},"╦":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╧":{1:(e,t)=>`M.5,0 L.5,${.5-t} M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╨":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╩":{1:(e,t)=>`M0,${.5+t} L1,${.5+t} M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╪":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╫":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╬":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╱":{1:"M1,0 L0,1"},"╲":{1:"M0,0 L1,1"},"╳":{1:"M1,0 L0,1 M0,0 L1,1"},"╼":{1:"M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"╽":{1:"M.5,.5 L.5,0",3:"M.5,.5 L.5,1"},"╾":{1:"M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"╿":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┍":{1:"M.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┎":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┑":{1:"M.5,.5 L.5,1",3:"M.5,.5 L0,.5"},"┒":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┕":{1:"M.5,.5 L.5,0",3:"M.5,.5 L1,.5"},"┖":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┙":{1:"M.5,.5 L.5,0",3:"M.5,.5 L0,.5"},"┚":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,0"},"┝":{1:"M.5,0 L.5,1",3:"M.5,.5 L1,.5"},"┞":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┟":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┠":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1"},"┡":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"┢":{1:"M.5,.5 L.5,0",3:"M0.5,1 L.5,.5 L1,.5"},"┥":{1:"M.5,0 L.5,1",3:"M.5,.5 L0,.5"},"┦":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┧":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┨":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1"},"┩":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L0,.5"},"┪":{1:"M.5,.5 L.5,0",3:"M0,.5 L.5,.5 L.5,1"},"┭":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┮":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┯":{1:"M.5,.5 L.5,1",3:"M0,.5 L1,.5"},"┰":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"┱":{1:"M.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"┲":{1:"M.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"┵":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┶":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┷":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5"},"┸":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,0"},"┹":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"┺":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,.5 L1,.5"},"┽":{1:"M.5,0 L.5,1 M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┾":{1:"M.5,0 L.5,1 M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┿":{1:"M.5,0 L.5,1",3:"M0,.5 L1,.5"},"╀":{1:"M0,.5 L1,.5 M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"╁":{1:"M.5,.5 L.5,0 M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"╂":{1:"M0,.5 L1,.5",3:"M.5,0 L.5,1"},"╃":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"╄":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"╅":{1:"M.5,0 L.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"╆":{1:"M.5,0 L.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"╇":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0 M0,.5 L1,.5"},"╈":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"╉":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"╊":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"╌":{1:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"╍":{3:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"┄":{1:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┅":{3:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┈":{1:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"┉":{3:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"╎":{1:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"╏":{3:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"┆":{1:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┇":{3:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┊":{1:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"┋":{3:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"╭":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,1,.5`},"╮":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,0,.5`},"╯":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,0,.5`},"╰":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,1,.5`}},t.powerlineDefinitions={"":{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2},"":{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2},"":{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1},"":{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1},"":{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1},"":{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0},"":{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.tryDrawCustomChar=function(e,i,n,l,c,d,_,u){const g=t.blockElementDefinitions[i];if(g)return function(e,t,i,s,r,o){for(let n=0;n<t.length;n++){const a=t[n],h=r/8,l=o/8;e.fillRect(i+a.x*h,s+a.y*l,a.w*h,a.h*l)}}(e,g,n,l,c,d),!0;const v=r[i];if(v)return function(e,t,i,r,n,a){let h=o.get(t);h||(h=new Map,o.set(t,h));const l=e.fillStyle;if("string"!=typeof l)throw new Error(`Unexpected fillStyle type "${l}"`);let c=h.get(l);if(!c){const i=t[0].length,r=t.length,o=document.createElement("canvas");o.width=i,o.height=r;const n=(0,s.throwIfFalsy)(o.getContext("2d")),a=new ImageData(i,r);let d,_,u,g;if(l.startsWith("#"))d=parseInt(l.slice(1,3),16),_=parseInt(l.slice(3,5),16),u=parseInt(l.slice(5,7),16),g=l.length>7&&parseInt(l.slice(7,9),16)||1;else{if(!l.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${l}" when drawing pattern glyph`);[d,_,u,g]=l.substring(5,l.length-1).split(",").map((e=>parseFloat(e)))}for(let e=0;e<r;e++)for(let s=0;s<i;s++)a.data[4*(e*i+s)]=d,a.data[4*(e*i+s)+1]=_,a.data[4*(e*i+s)+2]=u,a.data[4*(e*i+s)+3]=t[e][s]*(255*g);n.putImageData(a,0,0),c=(0,s.throwIfFalsy)(e.createPattern(o,null)),h.set(l,c)}e.fillStyle=c,e.fillRect(i,r,n,a)}(e,v,n,l,c,d),!0;const f=t.boxDrawingDefinitions[i];if(f)return function(e,t,i,s,r,o,n){e.strokeStyle=e.fillStyle;for(const[l,c]of Object.entries(t)){let t;e.beginPath(),e.lineWidth=n*Number.parseInt(l),t="function"==typeof c?c(.15,.15/o*r):c;for(const l of t.split(" ")){const t=l[0],c=a[t];if(!c){console.error(`Could not find drawing instructions for "${t}"`);continue}const d=l.substring(1).split(",");d[0]&&d[1]&&c(e,h(d,r,o,i,s,!0,n))}e.stroke(),e.closePath()}}(e,f,n,l,c,d,u),!0;const p=t.powerlineDefinitions[i];return!!p&&(function(e,t,i,s,r,o,n,l){var c,d;const _=new Path2D;_.rect(i,s,r,o),e.clip(_),e.beginPath();const u=n/12;e.lineWidth=l*u;for(const n of t.d.split(" ")){const _=n[0],g=a[_];if(!g){console.error(`Could not find drawing instructions for "${_}"`);continue}const v=n.substring(1).split(",");v[0]&&v[1]&&g(e,h(v,r,o,i,s,!1,l,(null!==(c=t.leftPadding)&&void 0!==c?c:0)*(u/2),(null!==(d=t.rightPadding)&&void 0!==d?d:0)*(u/2)))}1===t.type?(e.strokeStyle=e.fillStyle,e.stroke()):e.fill(),e.closePath()}(e,p,n,l,c,d,_,u),!0)};const o=new Map;function n(e,t,i=0){return Math.max(Math.min(e,t),i)}const a={C:(e,t)=>e.bezierCurveTo(t[0],t[1],t[2],t[3],t[4],t[5]),L:(e,t)=>e.lineTo(t[0],t[1]),M:(e,t)=>e.moveTo(t[0],t[1])};function h(e,t,i,s,r,o,a,h=0,l=0){const c=e.map((e=>parseFloat(e)||parseInt(e)));if(c.length<2)throw new Error("Too few arguments for instruction");for(let e=0;e<c.length;e+=2)c[e]*=t-h*a-l*a,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,t,0)),c[e]+=s+h*a;for(let e=1;e<c.length;e+=2)c[e]*=i,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,i,0)),c[e]+=r;return c}},56:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.observeDevicePixelDimensions=void 0;const s=i(859);t.observeDevicePixelDimensions=function(e,t,i){let r=new t.ResizeObserver((t=>{const s=t.find((t=>t.target===e));if(!s)return;if(!("devicePixelContentBoxSize"in s))return null==r||r.disconnect(),void(r=void 0);const o=s.devicePixelContentBoxSize[0].inlineSize,n=s.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&i(o,n)}));try{r.observe(e,{box:["device-pixel-content-box"]})}catch(e){r.disconnect(),r=void 0}return(0,s.toDisposable)((()=>null==r?void 0:r.disconnect()))}},374:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.createRenderDimensions=t.excludeFromContrastRatioDemands=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.excludeFromContrastRatioDemands=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},296:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=t[1]-e.buffer.active.viewportY,o=i[1]-e.buffer.active.viewportY,n=Math.max(r,0),a=Math.min(o,e.rows-1);n>=e.rows||a<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=r,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=a,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t<this.endCol&&i<=this.viewportCappedEndRow:t<this.startCol&&i>=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i<this.viewportEndRow||this.viewportStartRow===this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportEndRow&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},509:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.TextureAtlas=void 0;const r=i(237),o=i(860),n=i(374),a=i(160),h=i(345),l=i(485),c=i(385),d=i(147),_=i(855),u=i(776),g={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let v;class f{get pages(){return this._pages}constructor(e,t,i){this._document=e,this._config=t,this._unicodeService=i,this._didWarmUp=!1,this._cacheMap=new l.FourKeyMap,this._cacheMapCombined=new l.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new d.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new h.EventEmitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new h.EventEmitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=m(e,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,n.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){for(const e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const e=new c.IdleTaskQueue;for(let t=33;t<126;t++)e.enqueue((()=>{if(!this._cacheMap.get(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT)){const e=this._drawToCache(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT);this._cacheMap.set(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT,e)}}))}beginFrame(){return this._requestClearModel}clearTexture(){if(0!==this._pages[0].currentRow.x||0!==this._pages[0].currentRow.y){for(const e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(f.maxAtlasPages&&this._pages.length>=Math.max(4,f.maxAtlasPages)){const e=this._pages.filter((e=>2*e.canvas.width<=(f.maxTextureSize||4096))).sort(((e,t)=>t.canvas.width!==e.canvas.width?t.canvas.width-e.canvas.width:t.percentageUsed-e.percentageUsed));let t=-1,i=0;for(let s=0;s<e.length;s++)if(e[s].canvas.width!==i)t=s,i=e[s].canvas.width;else if(s-t==3)break;const s=e.slice(t,t+4),r=s.map((e=>e.glyphs[0].texturePage)).sort(((e,t)=>e>t?1:-1)),o=this.pages.length-s.length,n=this._mergePages(s,o);n.version++;for(let e=r.length-1;e>=0;e--)this._deletePage(r[e]);this.pages.push(n),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(n.canvas)}const e=new p(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){const i=2*e[0].canvas.width,s=new p(this._document,i,e);for(const[r,o]of e.entries()){const e=r*o.canvas.width%i,n=Math.floor(r/2)*o.canvas.height;s.ctx.drawImage(o.canvas,e,n);for(const s of o.glyphs)s.texturePage=t,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=e,s.texturePosition.y+=n,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(o.canvas);const a=this._activePages.indexOf(o);-1!==a&&this._activePages.splice(a,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t<this._pages.length;t++){const e=this._pages[t];for(const t of e.glyphs)t.texturePage--;e.version++}}getRasterizedGlyphCombinedChar(e,t,i,s,r){return this._getFromCacheMap(this._cacheMapCombined,e,t,i,s,r)}getRasterizedGlyph(e,t,i,s,r){return this._getFromCacheMap(this._cacheMap,e,t,i,s,r)}_getFromCacheMap(e,t,i,s,r,o=!1){return v=e.get(t,i,s,r),v||(v=this._drawToCache(t,i,s,r,o),e.set(t,i,s,r,v)),v}_getColorFromAnsiIndex(e){if(e>=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,i,s){if(this._config.allowTransparency)return a.NULL_COLOR;let r;switch(e){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(t);break;case 50331648:const e=d.AttributeData.toColorRGB(t);r=a.rgba.toColor(e[0],e[1],e[2]);break;default:r=i?a.color.opaque(this._config.colors.foreground):this._config.colors.background}return r}_getForegroundColor(e,t,i,s,o,n,h,l,c,_){const u=this._getMinimumContrastColor(e,t,i,s,o,n,!1,c,l,_);if(u)return u;let g;switch(o){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&c&&n<8&&(n+=8),g=this._getColorFromAnsiIndex(n);break;case 50331648:const e=d.AttributeData.toColorRGB(n);g=a.rgba.toColor(e[0],e[1],e[2]);break;default:g=h?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(g=a.color.opaque(g)),l&&(g=a.color.multiplyOpacity(g,r.DIM_OPACITY)),g}_resolveBackgroundRgba(e,t,i){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,i,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,i,s,r,o,n,h,l,c){if(1===this._config.minimumContrastRatio||c)return;const d=this._getContrastCache(l),_=d.getColor(e,s);if(void 0!==_)return _||void 0;const u=this._resolveBackgroundRgba(t,i,n),g=this._resolveForegroundRgba(r,o,n,h),v=a.rgba.ensureContrastRatio(u,g,this._config.minimumContrastRatio/(l?2:1));if(!v)return void d.setColor(e,s,null);const f=a.rgba.toColor(v>>24&255,v>>16&255,v>>8&255);return d.setColor(e,s,f),f}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,i,s,a=!1){const h="number"==typeof e?String.fromCharCode(e):e,l=Math.min(this._config.deviceCellWidth*Math.max(h.length,2)+4,this._textureSize);this._tmpCanvas.width<l&&(this._tmpCanvas.width=l);const c=Math.min(this._config.deviceCellHeight+8,this._textureSize);if(this._tmpCanvas.height<c&&(this._tmpCanvas.height=c),this._tmpCtx.save(),this._workAttributeData.fg=i,this._workAttributeData.bg=t,this._workAttributeData.extended.ext=s,this._workAttributeData.isInvisible())return g;const _=!!this._workAttributeData.isBold(),u=!!this._workAttributeData.isInverse(),v=!!this._workAttributeData.isDim(),p=!!this._workAttributeData.isItalic(),m=!!this._workAttributeData.isUnderline(),L=!!this._workAttributeData.isStrikethrough(),x=!!this._workAttributeData.isOverline();let w=this._workAttributeData.getFgColor(),b=this._workAttributeData.getFgColorMode(),R=this._workAttributeData.getBgColor(),M=this._workAttributeData.getBgColorMode();if(u){const e=w;w=R,R=e;const t=b;b=M,M=t}const y=this._getBackgroundColor(M,R,u,v);this._tmpCtx.globalCompositeOperation="copy",this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.globalCompositeOperation="source-over";const A=_?this._config.fontWeightBold:this._config.fontWeight,E=p?"italic":"";this._tmpCtx.font=`${E} ${A} ${this._config.fontSize*this._config.devicePixelRatio}px ${this._config.fontFamily}`,this._tmpCtx.textBaseline=r.TEXT_BASELINE;const S=1===h.length&&(0,n.isPowerlineGlyph)(h.charCodeAt(0)),T=1===h.length&&(0,n.isRestrictedPowerlineGlyph)(h.charCodeAt(0)),D=this._getForegroundColor(t,M,R,i,b,w,u,v,_,(0,n.excludeFromContrastRatioDemands)(h.charCodeAt(0)));this._tmpCtx.fillStyle=D.css;const P=T?0:4;let F=!1;!1!==this._config.customGlyphs&&(F=(0,o.tryDrawCustomChar)(this._tmpCtx,h,P,P,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.fontSize,this._config.devicePixelRatio));let B,I=!S;if(B="number"==typeof e?this._unicodeService.wcwidth(e):this._unicodeService.getStringCellWidth(e),m){this._tmpCtx.save();const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;if(this._tmpCtx.lineWidth=e,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())I=!1,this._tmpCtx.strokeStyle=`rgb(${d.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{I=!1;let e=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&e<8&&(e+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(e).css}this._tmpCtx.beginPath();const i=P,s=Math.ceil(P+this._config.deviceCharHeight)-t-(a?2*e:0),r=s+e,o=s+2*e;for(let n=0;n<B;n++){this._tmpCtx.save();const a=i+n*this._config.deviceCellWidth,h=i+(n+1)*this._config.deviceCellWidth,l=a+this._config.deviceCellWidth/2;switch(this._workAttributeData.extended.underlineStyle){case 2:this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s),this._tmpCtx.moveTo(a,o),this._tmpCtx.lineTo(h,o);break;case 3:const i=e<=1?o:Math.ceil(P+this._config.deviceCharHeight-e/2)-t,n=e<=1?s:Math.ceil(P+this._config.deviceCharHeight+e/2)-t,c=new Path2D;c.rect(a,s,this._config.deviceCellWidth,o-s),this._tmpCtx.clip(c),this._tmpCtx.moveTo(a-this._config.deviceCellWidth/2,r),this._tmpCtx.bezierCurveTo(a-this._config.deviceCellWidth/2,n,a,n,a,r),this._tmpCtx.bezierCurveTo(a,i,l,i,l,r),this._tmpCtx.bezierCurveTo(l,n,h,n,h,r),this._tmpCtx.bezierCurveTo(h,i,h+this._config.deviceCellWidth/2,i,h+this._config.deviceCellWidth/2,r);break;case 4:this._tmpCtx.setLineDash([Math.round(e),Math.round(e)]),this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s);break;case 5:this._tmpCtx.setLineDash([4*this._config.devicePixelRatio,3*this._config.devicePixelRatio]),this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s);break;default:this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s)}this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!F&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==h){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const t=this._tmpCtx.measureText(h);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in t&&t.actualBoundingBoxDescent>0){this._tmpCtx.save();const t=new Path2D;t.rect(i,s-Math.ceil(e/2),this._config.deviceCellWidth*B,o-s+Math.ceil(e/2)),this._tmpCtx.clip(t),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(h,P,P+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(x){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(P,P+t),this._tmpCtx.lineTo(P+this._config.deviceCharWidth*B,P+t),this._tmpCtx.stroke()}if(F||this._tmpCtx.fillText(h,P,P+this._config.deviceCharHeight),"_"===h&&!this._config.allowTransparency){let e=C(this._tmpCtx.getImageData(P,P,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I);if(e)for(let t=1;t<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(h,P,P+this._config.deviceCharHeight-t),e=C(this._tmpCtx.getImageData(P,P,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I),e);t++);}if(L){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),t=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(P,P+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.lineTo(P+this._config.deviceCharWidth*B,P+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.stroke()}this._tmpCtx.restore();const O=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let $;if($=this._config.allowTransparency?function(e){for(let t=0;t<e.data.length;t+=4)if(e.data[t+3]>0)return!1;return!0}(O):C(O,y,D,I),$)return g;const k=this._findGlyphBoundingBox(O,this._workBoundingBox,l,T,F,P);let U,N;for(;;){if(0===this._activePages.length){const e=this._createNewPage();U=e,N=e.currentRow,N.height=k.size.y;break}U=this._activePages[this._activePages.length-1],N=U.currentRow;for(const e of this._activePages)k.size.y<=e.currentRow.height&&(U=e,N=e.currentRow);for(let e=this._activePages.length-1;e>=0;e--)for(const t of this._activePages[e].fixedRows)t.height<=N.height&&k.size.y<=t.height&&(U=this._activePages[e],N=t);if(N.y+k.size.y>=U.canvas.height||N.height>k.size.y+2){let e=!1;if(U.currentRow.y+U.currentRow.height+k.size.y>=U.canvas.height){let t;for(const e of this._activePages)if(e.currentRow.y+e.currentRow.height+k.size.y<e.canvas.height){t=e;break}if(t)U=t;else if(f.maxAtlasPages&&this._pages.length>=f.maxAtlasPages&&N.y+k.size.y<=U.canvas.height&&N.height>=k.size.y&&N.x+k.size.x<=U.canvas.width)e=!0;else{const t=this._createNewPage();U=t,N=t.currentRow,N.height=k.size.y,e=!0}}e||(U.currentRow.height>0&&U.fixedRows.push(U.currentRow),N={x:0,y:U.currentRow.y+U.currentRow.height,height:k.size.y},U.fixedRows.push(N),U.currentRow={x:0,y:N.y+N.height,height:0})}if(N.x+k.size.x<=U.canvas.width)break;N===U.currentRow?(N.x=0,N.y+=N.height,N.height=0):U.fixedRows.splice(U.fixedRows.indexOf(N),1)}return k.texturePage=this._pages.indexOf(U),k.texturePosition.x=N.x,k.texturePosition.y=N.y,k.texturePositionClipSpace.x=N.x/U.canvas.width,k.texturePositionClipSpace.y=N.y/U.canvas.height,k.sizeClipSpace.x/=U.canvas.width,k.sizeClipSpace.y/=U.canvas.height,N.height=Math.max(N.height,k.size.y),N.x+=k.size.x,U.ctx.putImageData(O,k.texturePosition.x-this._workBoundingBox.left,k.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,k.size.x,k.size.y),U.addGlyph(k),U.version++,k}_findGlyphBoundingBox(e,t,i,s,r,o){t.top=0;const n=s?this._config.deviceCellHeight:this._tmpCanvas.height,a=s?this._config.deviceCellWidth:i;let h=!1;for(let i=0;i<n;i++){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.top=i,h=!0;break}}if(h)break}t.left=0,h=!1;for(let i=0;i<o+a;i++){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.left=i,h=!0;break}}if(h)break}t.right=a,h=!1;for(let i=o+a-1;i>=o;i--){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.right=i,h=!0;break}}if(h)break}t.bottom=n,h=!1;for(let i=n-1;i>=0;i--){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.bottom=i,h=!0;break}}if(h)break}return{texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},size:{x:t.right-t.left+1,y:t.bottom-t.top+1},sizeClipSpace:{x:t.right-t.left+1,y:t.bottom-t.top+1},offset:{x:-t.left+o+(s||r?Math.floor((this._config.deviceCellWidth-this._config.deviceCharWidth)/2):0),y:-t.top+o+(s||r?1===this._config.lineHeight?0:Math.round((this._config.deviceCellHeight-this._config.deviceCharHeight)/2):0)}}}}t.TextureAtlas=f,s([u.traceCall],f.prototype,"_drawToCache",null);class p{get percentageUsed(){return this._usedPixels/(this.canvas.width*this.canvas.height)}get glyphs(){return this._glyphs}addGlyph(e){this._glyphs.push(e),this._usedPixels+=e.size.x*e.size.y}constructor(e,t,i){if(this._usedPixels=0,this._glyphs=[],this.version=0,this.currentRow={x:0,y:0,height:0},this.fixedRows=[],i)for(const e of i)this._glyphs.push(...e.glyphs),this._usedPixels+=e._usedPixels;this.canvas=m(e,t,t),this.ctx=(0,n.throwIfFalsy)(this.canvas.getContext("2d",{alpha:!0}))}clear(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.currentRow.x=0,this.currentRow.y=0,this.currentRow.height=0,this.fixedRows.length=0,this.version++}}function C(e,t,i,s){const r=t.rgba>>>24,o=t.rgba>>>16&255,n=t.rgba>>>8&255,a=i.rgba>>>24,h=i.rgba>>>16&255,l=i.rgba>>>8&255,c=Math.floor((Math.abs(r-a)+Math.abs(o-h)+Math.abs(n-l))/12);let d=!0;for(let t=0;t<e.data.length;t+=4)e.data[t]===r&&e.data[t+1]===o&&e.data[t+2]===n||s&&Math.abs(e.data[t]-r)+Math.abs(e.data[t+1]-o)+Math.abs(e.data[t+2]-n)<c?e.data[t+3]=0:d=!1;return d}function m(e,t,i){const s=e.createElement("canvas");return s.width=t,s.height=i,s}},160:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(399);let r=0,o=0,n=0,a=0;var h,l,c,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function g(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${u(e)}${u(t)}${u(i)}${u(s)}`:`#${u(e)}${u(t)}${u(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,o,n]=_.toChannels(e.rgba),{css:h.toCss(r,o,n,a),rgba:h.toRgba(r,o,n,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=c+Math.round((i-c)*a),o=d+Math.round((s-d)*a),n=_+Math.round((l-_)*a),{css:h.toCss(r,o,n),rgba:h.toRgba(r,o,n)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return _.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,o,n]=_.toChannels(t),{css:h.toCss(r,o,n),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(l||(t.color=l={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),o=parseInt(e.slice(2,3).repeat(2),16),n=parseInt(e.slice(3,4).repeat(2),16),_.toColor(r,o,n);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),o=parseInt(e.slice(2,3).repeat(2),16),n=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),_.toColor(r,o,n,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),o=parseInt(s[2]),n=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),_.toColor(r,o,n,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,o,n,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,o,n,a),css:e}}}(c||(t.css=c={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));for(;l<i&&(n>0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));for(;l<i&&(n<255||a<255||h<255);)n=Math.min(255,n+Math.ceil(.1*(255-n))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}e.ensureContrastRatio=function(e,s,r){const o=d.relativeLuminance(e>>8),n=d.relativeLuminance(s>>8);if(g(o,n)<r){if(n<o){const n=t(e,s,r),a=g(o,d.relativeLuminance(n>>8));if(a<r){const t=i(e,s,r);return a>g(o,d.relativeLuminance(t>>8))?n:t}return n}const a=i(e,s,r),h=g(o,d.relativeLuminance(a>>8));if(h<r){const i=t(e,s,r);return h>g(o,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i,s){return{css:h.toCss(e,t,i,s),rgba:h.toRgba(e,t,i,s)}}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=g},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))}},859:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},485:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){var r;return null===(r=this._data.get(e,t))||void 0===r?void 0:r.get(i,s)}clear(){this._data.clear()}}},399:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"==typeof navigator;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},385:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(399);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class o extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=o,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:o,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},147:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},782:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(133),r=i(855),o=i(147);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=n},855:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},133:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let o=r;o<i;++o){const r=e.charCodeAt(o);if(55296<=r&&r<=56319){if(++o>=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a=0,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=63&this.interim[++n])&&n<4;)r<<=6,r|=o;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=h-n;for(;l<c;){if(l>=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===h?r<128?l--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d<i;){for(;!(!(d<c)||128&(s=e[d])||128&(r=e[d+1])||128&(o=e[d+2])||128&(n=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=o,t[a++]=n,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&o,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,h<65536||h>1114111)continue;t[a++]=h}}return a}}},776:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const o=i(859),n=i(97),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h,l=t.LogService=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.TRACE&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.trace.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}debug(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.DEBUG&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.debug.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}info(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.INFO&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.info.bind(this._optionsService.options.logger))&&void 0!==s?s:console.info,e,t)}warn(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.WARN&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.warn.bind(this._optionsService.options.logger))&&void 0!==s?s:console.warn,e,t)}error(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.ERROR&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.error.bind(this._optionsService.options.logger))&&void 0!==s?s:console.error,e,t)}};t.LogService=l=s([r(0,n.IOptionsService)],l),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==n.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},726:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,o){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,o)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},97:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(726);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.WebglAddon=void 0;const t=i(345),r=i(859),o=i(399),n=i(666),a=i(776);class h extends r.Disposable{constructor(e){if(o.isSafari&&(0,o.getSafariVersion)()<16)throw new Error("Webgl2 is only supported on Safari 16 and above");super(),this._preserveDrawingBuffer=e,this._onChangeTextureAtlas=this.register(new t.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new t.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new t.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this.register(new t.EventEmitter),this.onContextLoss=this._onContextLoss.event}activate(e){const i=e._core;if(!e.element)return void this.register(i.onWillOpen((()=>this.activate(e))));this._terminal=e;const s=i.coreService,o=i.optionsService,h=i,l=h._renderService,c=h._characterJoinerService,d=h._charSizeService,_=h._coreBrowserService,u=h._decorationService,g=h._logService,v=h._themeService;(0,a.setTraceLogger)(g),this._renderer=this.register(new n.WebglRenderer(e,c,d,_,s,u,o,v,this._preserveDrawingBuffer)),this.register((0,t.forwardEvent)(this._renderer.onContextLoss,this._onContextLoss)),this.register((0,t.forwardEvent)(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this.register((0,t.forwardEvent)(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this.register((0,t.forwardEvent)(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),l.setRenderer(this._renderer),this.register((0,r.toDisposable)((()=>{const t=this._terminal._core._renderService;t.setRenderer(this._terminal._core._createRenderer()),t.handleResize(e.cols,e.rows)})))}get textureAtlas(){var e;return null===(e=this._renderer)||void 0===e?void 0:e.textureAtlas}clearTextureAtlas(){var e;null===(e=this._renderer)||void 0===e||e.clearTextureAtlas()}}e.WebglAddon=h})(),s})()));
+//# sourceMappingURL=xterm-addon-webgl.js.map
\ No newline at end of file
diff --git a/src/www/xterm-addon-webgl.js.map b/src/www/xterm-addon-webgl.js.map
new file mode 100644 (file)
index 0000000..76b373b
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"xterm-addon-webgl.js","mappings":"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","sources":["webpack://WebglAddon/webpack/universalModuleDefinition","webpack://WebglAddon/./src/GlyphRenderer.ts","webpack://WebglAddon/./src/RectangleRenderer.ts","webpack://WebglAddon/./src/RenderModel.ts","webpack://WebglAddon/./src/WebglRenderer.ts","webpack://WebglAddon/./src/WebglUtils.ts","webpack://WebglAddon/./src/renderLayer/BaseRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/LinkRenderLayer.ts","webpack://WebglAddon/../../src/browser/Lifecycle.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CellColorResolver.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CharAtlasCache.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CharAtlasUtils.ts","webpack://WebglAddon/../../src/browser/renderer/shared/Constants.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CursorBlinkStateManager.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CustomGlyphs.ts","webpack://WebglAddon/../../src/browser/renderer/shared/DevicePixelObserver.ts","webpack://WebglAddon/../../src/browser/renderer/shared/RendererUtils.ts","webpack://WebglAddon/../../src/browser/renderer/shared/SelectionRenderModel.ts","webpack://WebglAddon/../../src/browser/renderer/shared/TextureAtlas.ts","webpack://WebglAddon/../../src/common/Color.ts","webpack://WebglAddon/../../src/common/EventEmitter.ts","webpack://WebglAddon/../../src/common/Lifecycle.ts","webpack://WebglAddon/../../src/common/MultiKeyMap.ts","webpack://WebglAddon/../../src/common/Platform.ts","webpack://WebglAddon/../../src/common/TaskQueue.ts","webpack://WebglAddon/../../src/common/buffer/AttributeData.ts","webpack://WebglAddon/../../src/common/buffer/CellData.ts","webpack://WebglAddon/../../src/common/buffer/Constants.ts","webpack://WebglAddon/../../src/common/input/TextDecoder.ts","webpack://WebglAddon/../../src/common/services/LogService.ts","webpack://WebglAddon/../../src/common/services/ServiceRegistry.ts","webpack://WebglAddon/../../src/common/services/Services.ts","webpack://WebglAddon/webpack/bootstrap","webpack://WebglAddon/./src/WebglAddon.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 if(typeof exports === 'object')\n\t\texports[\"WebglAddon\"] = factory();\n\telse\n\t\troot[\"WebglAddon\"] = factory();\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { traceCall } from 'common/services/LogService';\nimport { Terminal } from 'xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\n\ninterface IVertices {\n  attributes: Float32Array;\n  /**\n   * These buffers are the ones used to bind to WebGL, the reason there are\n   * multiple is to allow double buffering to work as you cannot modify the\n   * buffer while it's being used by the GPU. Having multiple lets us start\n   * working on the next frame.\n   */\n  attributesBuffers: Float32Array[];\n  count: number;\n}\n\nconst enum VertexAttribLocations {\n  UNIT_QUAD = 0,\n  CELL_POSITION = 1,\n  OFFSET = 2,\n  SIZE = 3,\n  TEXPAGE = 4,\n  TEXCOORD = 5,\n  TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n  vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_texpage = int(a_texpage);\n  v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n  let textureConditionals = '';\n  for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n    textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n  }\n  return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n  if (v_texpage == 0) {\n    outColor = texture(u_texture[0], v_texcoord);\n  } ${textureConditionals}\n}`);\n}\n\nconst INDICES_PER_CELL = 11;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n  private readonly _program: WebGLProgram;\n  private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n  private readonly _projectionLocation: WebGLUniformLocation;\n  private readonly _resolutionLocation: WebGLUniformLocation;\n  private readonly _textureLocation: WebGLUniformLocation;\n  private readonly _atlasTextures: GLTexture[];\n  private readonly _attributesBuffer: WebGLBuffer;\n\n  private _atlas: ITextureAtlas | undefined;\n  private _activeBuffer: number = 0;\n  private readonly _vertices: IVertices = {\n    count: 0,\n    attributes: new Float32Array(0),\n    attributesBuffers: [\n      new Float32Array(0),\n      new Float32Array(0)\n    ]\n  };\n\n  constructor(\n    private readonly _terminal: Terminal,\n    private readonly _gl: IWebGL2RenderingContext,\n    private _dimensions: IRenderDimensions\n  ) {\n    super();\n\n    const gl = this._gl;\n\n    if (TextureAtlas.maxAtlasPages === undefined) {\n      // Typically 8 or 16\n      TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n      // Almost all clients will support >= 4096\n      TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n    }\n\n    this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages)));\n    this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n    // Uniform locations\n    this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n    this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n    this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n    // Create and set the vertex array object\n    this._vertexArrayObject = gl.createVertexArray();\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Setup a_unitquad, this defines the 4 vertices of a rectangle\n    const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n    const unitQuadVerticesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n    gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n    // Setup the unit quad element array buffer, this points to indices in\n    // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n    // triangle strip\n    const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n    const elementIndicesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n    // Setup attributes\n    this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n    this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n    gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, BYTES_PER_CELL, 0);\n    gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n    gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n    // Setup static uniforms\n    gl.useProgram(this._program);\n    const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n    for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n      textureUnits[i] = i;\n    }\n    gl.uniform1iv(this._textureLocation, textureUnits);\n    gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n    // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n    // is ever drawn it will show characters as red rectangles.\n    this._atlasTextures = [];\n    for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n      const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n      this.register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n      gl.activeTexture(gl.TEXTURE0 + i);\n      gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n      this._atlasTextures[i] = glTexture;\n    }\n\n    // Allow drawing of transparent texture\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    // Set viewport\n    this.handleResize();\n  }\n\n  public beginFrame(): boolean {\n    return this._atlas ? this._atlas.beginFrame() : true;\n  }\n\n  @traceCall\n  public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number): void {\n    // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n    // should not instantiate any variables unless a new glyph is drawn to the cache where the\n    // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for\n    // each glyph.\n    this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg);\n  }\n\n  private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number): void {\n    $i = (y * this._terminal.cols + x) * INDICES_PER_CELL;\n\n    // Exit early if this is a null character, allow space character to continue as it may have\n    // underline/strikethrough styles\n    if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n      array.fill(0, $i, $i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n      return;\n    }\n\n    if (!this._atlas) {\n      return;\n    }\n\n    // Get the glyph\n    if (chars && chars.length > 1) {\n      $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false);\n    } else {\n      $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false);\n    }\n\n    $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n    if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n      $clippedPixels = $glyph.offset.x - $leftCellPadding;\n      // a_origin\n      array[$i    ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n      array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n      // a_size\n      array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n      array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n      // a_texpage\n      array[$i + 4] = $glyph.texturePage;\n      // a_texcoord\n      array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n      array[$i + 6] = $glyph.texturePositionClipSpace.y;\n      // a_texsize\n      array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n      array[$i + 8] = $glyph.sizeClipSpace.y;\n    } else {\n      // a_origin\n      array[$i    ] = -$glyph.offset.x + this._dimensions.device.char.left;\n      array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n      // a_size\n      array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n      array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n      // a_texpage\n      array[$i + 4] = $glyph.texturePage;\n      // a_texcoord\n      array[$i + 5] = $glyph.texturePositionClipSpace.x;\n      array[$i + 6] = $glyph.texturePositionClipSpace.y;\n      // a_texsize\n      array[$i + 7] = $glyph.sizeClipSpace.x;\n      array[$i + 8] = $glyph.sizeClipSpace.y;\n    }\n    // a_cellpos only changes on resize\n  }\n\n  public clear(): void {\n    const terminal = this._terminal;\n    const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n\n    // Clear vertices\n    if (this._vertices.count !== newCount) {\n      this._vertices.attributes = new Float32Array(newCount);\n    } else {\n      this._vertices.attributes.fill(0);\n    }\n    let i = 0;\n    for (; i < this._vertices.attributesBuffers.length; i++) {\n      if (this._vertices.count !== newCount) {\n        this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n      } else {\n        this._vertices.attributesBuffers[i].fill(0);\n      }\n    }\n    this._vertices.count = newCount;\n    i = 0;\n    for (let y = 0; y < terminal.rows; y++) {\n      for (let x = 0; x < terminal.cols; x++) {\n        this._vertices.attributes[i + 9] = x / terminal.cols;\n        this._vertices.attributes[i + 10] = y / terminal.rows;\n        i += INDICES_PER_CELL;\n      }\n    }\n  }\n\n  public handleResize(): void {\n    const gl = this._gl;\n    gl.useProgram(this._program);\n    gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n    gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n    this.clear();\n  }\n\n  public render(renderModel: IRenderModel): void {\n    if (!this._atlas) {\n      return;\n    }\n\n    const gl = this._gl;\n\n    gl.useProgram(this._program);\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n    this._activeBuffer = (this._activeBuffer + 1) % 2;\n    const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n    // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n    // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n    // The reasons for this are as follows:\n    // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n    // - To copy either the normal attributes buffer or the selection attributes buffer when there\n    //   is a selection\n    // - So we don't send vertices for all the line-ending whitespace to the GPU\n    let bufferLength = 0;\n    for (let y = 0; y < renderModel.lineLengths.length; y++) {\n      const si = y * this._terminal.cols * INDICES_PER_CELL;\n      const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * INDICES_PER_CELL);\n      activeBuffer.set(sub, bufferLength);\n      bufferLength += sub.length;\n    }\n\n    // Bind the attributes buffer\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n    // Bind the atlas page texture if they have changed\n    for (let i = 0; i < this._atlas.pages.length; i++) {\n      if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n        this._bindAtlasPageTexture(gl, this._atlas, i);\n      }\n    }\n\n    // Draw the viewport\n    gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n  }\n\n  public setAtlas(atlas: ITextureAtlas): void {\n    this._atlas = atlas;\n    for (const glTexture of this._atlasTextures) {\n      glTexture.version = -1;\n    }\n  }\n\n  private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n    gl.activeTexture(gl.TEXTURE0 + i);\n    gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n    gl.generateMipmap(gl.TEXTURE_2D);\n    this._atlasTextures[i].version = atlas.pages[i].version;\n  }\n\n  public setDimensions(dimensions: IRenderDimensions): void {\n    this._dimensions = dimensions;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from 'xterm';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\n\nconst enum VertexAttribLocations {\n  POSITION = 0,\n  SIZE = 1,\n  COLOR = 2,\n  UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n  vec2 zeroToOne = a_position + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n  outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n  public attributes: Float32Array;\n  public count: number;\n\n  constructor() {\n    this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n    this.count = 0;\n  }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n  private _program: WebGLProgram;\n  private _vertexArrayObject: IWebGLVertexArrayObject;\n  private _attributesBuffer: WebGLBuffer;\n  private _projectionLocation: WebGLUniformLocation;\n  private _bgFloat!: Float32Array;\n  private _cursorFloat!: Float32Array;\n\n  private _vertices: Vertices = new Vertices();\n  private _verticesCursor: Vertices = new Vertices();\n\n  constructor(\n    private _terminal: Terminal,\n    private _gl: IWebGL2RenderingContext,\n    private _dimensions: IRenderDimensions,\n    private readonly _themeService: IThemeService\n  ) {\n    super();\n\n    const gl = this._gl;\n\n    this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n    this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n    // Uniform locations\n    this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n    // Create and set the vertex array object\n    this._vertexArrayObject = gl.createVertexArray();\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Setup a_unitquad, this defines the 4 vertices of a rectangle\n    const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n    const unitQuadVerticesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n    gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n    // Setup the unit quad element array buffer, this points to indices in\n    // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n    // triangle strip\n    const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n    const elementIndicesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n    // Setup attributes\n    this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n    this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n    gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n    gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n    gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n    this._updateCachedColors(_themeService.colors);\n    this.register(this._themeService.onChangeColors(e => {\n      this._updateCachedColors(e);\n      this._updateViewportRectangle();\n    }));\n  }\n\n  public renderBackgrounds(): void {\n    this._renderVertices(this._vertices);\n  }\n\n  public renderCursor(): void {\n    this._renderVertices(this._verticesCursor);\n  }\n\n  private _renderVertices(vertices: Vertices): void {\n    const gl = this._gl;\n\n    gl.useProgram(this._program);\n\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n    // Bind attributes buffer and draw\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n    gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n  }\n\n  public handleResize(): void {\n    this._updateViewportRectangle();\n  }\n\n  public setDimensions(dimensions: IRenderDimensions): void {\n    this._dimensions = dimensions;\n  }\n\n  private _updateCachedColors(colors: ReadonlyColorSet): void {\n    this._bgFloat = this._colorToFloat32Array(colors.background);\n    this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n  }\n\n  private _updateViewportRectangle(): void {\n    // Set first rectangle that clears the screen\n    this._addRectangleFloat(\n      this._vertices.attributes,\n      0,\n      0,\n      0,\n      this._terminal.cols * this._dimensions.device.cell.width,\n      this._terminal.rows * this._dimensions.device.cell.height,\n      this._bgFloat\n    );\n  }\n\n  public updateBackgrounds(model: IRenderModel): void {\n    const terminal = this._terminal;\n    const vertices = this._vertices;\n\n    // Declare variable ahead of time to avoid garbage collection\n    let rectangleCount = 1;\n    let y: number;\n    let x: number;\n    let currentStartX: number;\n    let currentBg: number;\n    let currentFg: number;\n    let currentInverse: boolean;\n    let modelIndex: number;\n    let bg: number;\n    let fg: number;\n    let inverse: boolean;\n    let offset: number;\n\n    for (y = 0; y < terminal.rows; y++) {\n      currentStartX = -1;\n      currentBg = 0;\n      currentFg = 0;\n      currentInverse = false;\n      for (x = 0; x < terminal.cols; x++) {\n        modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n        bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n        fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n        inverse = !!(fg & FgFlags.INVERSE);\n        if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n          // A rectangle needs to be drawn if going from non-default to another color\n          if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n            offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n            this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n          }\n          currentStartX = x;\n          currentBg = bg;\n          currentFg = fg;\n          currentInverse = inverse;\n        }\n      }\n      // Finish rectangle if it's still going\n      if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n        offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n        this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n      }\n    }\n    vertices.count = rectangleCount;\n  }\n\n  public updateCursor(model: IRenderModel): void {\n    const vertices = this._verticesCursor;\n    const cursor = model.cursor;\n    if (!cursor || cursor.style === 'block') {\n      vertices.count = 0;\n      return;\n    }\n\n    let offset: number;\n    let rectangleCount = 0;\n\n    if (cursor.style === 'bar' || cursor.style === 'outline') {\n      // Left edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n        this._dimensions.device.cell.height,\n        this._cursorFloat\n      );\n    }\n    if (cursor.style === 'underline' || cursor.style === 'outline') {\n      // Bottom edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n        cursor.width * this._dimensions.device.cell.width,\n        cursor.dpr,\n        this._cursorFloat\n      );\n    }\n    if (cursor.style === 'outline') {\n      // Top edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.width * this._dimensions.device.cell.width,\n        cursor.dpr,\n        this._cursorFloat\n      );\n      // Right edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.dpr,\n        this._dimensions.device.cell.height,\n        this._cursorFloat\n      );\n    }\n\n    vertices.count = rectangleCount;\n  }\n\n  private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n    if (fg & FgFlags.INVERSE) {\n      switch (fg & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n          break;\n        case Attributes.CM_RGB:\n          $rgba = (fg & Attributes.RGB_MASK) << 8;\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          $rgba = this._themeService.colors.foreground.rgba;\n      }\n    } else {\n      switch (bg & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n          break;\n        case Attributes.CM_RGB:\n          $rgba = (bg & Attributes.RGB_MASK) << 8;\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          $rgba = this._themeService.colors.background.rgba;\n      }\n    }\n\n    if (vertices.attributes.length < offset + 4) {\n      vertices.attributes = expandFloat32Array(vertices.attributes, this._terminal.rows * this._terminal.cols * INDICES_PER_RECTANGLE);\n    }\n    $x1 = startX * this._dimensions.device.cell.width;\n    $y1 = y * this._dimensions.device.cell.height;\n    $r = (($rgba >> 24) & 0xFF) / 255;\n    $g = (($rgba >> 16) & 0xFF) / 255;\n    $b = (($rgba >> 8 ) & 0xFF) / 255;\n    $a = 1;\n\n    this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n  }\n\n  private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n    array[offset    ] = x1 / this._dimensions.device.canvas.width;\n    array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n    array[offset + 2] = width / this._dimensions.device.canvas.width;\n    array[offset + 3] = height / this._dimensions.device.canvas.height;\n    array[offset + 4] = r;\n    array[offset + 5] = g;\n    array[offset + 6] = b;\n    array[offset + 7] = a;\n  }\n\n  private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n    array[offset    ] = x1 / this._dimensions.device.canvas.width;\n    array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n    array[offset + 2] = width / this._dimensions.device.canvas.width;\n    array[offset + 3] = height / this._dimensions.device.canvas.height;\n    array[offset + 4] = color[0];\n    array[offset + 5] = color[1];\n    array[offset + 6] = color[2];\n    array[offset + 7] = color[3];\n  }\n\n  private _colorToFloat32Array(color: IColor): Float32Array {\n    return new Float32Array([\n      ((color.rgba >> 24) & 0xFF) / 255,\n      ((color.rgba >> 16) & 0xFF) / 255,\n      ((color.rgba >> 8 ) & 0xFF) / 255,\n      ((color.rgba      ) & 0xFF) / 255\n    ]);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 4;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\nexport const RENDER_MODEL_EXT_OFFSET = 3;\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n  public cells: Uint32Array;\n  public lineLengths: Uint32Array;\n  public selection: ISelectionRenderModel;\n  public cursor?: ICursorRenderModel;\n\n  constructor() {\n    this.cells = new Uint32Array(0);\n    this.lineLengths = new Uint32Array(0);\n    this.selection = createSelectionRenderModel();\n  }\n\n  public resize(cols: number, rows: number): void {\n    const indexCount = cols * rows * RENDER_MODEL_INDICIES_PER_CELL;\n    if (indexCount !== this.cells.length) {\n      this.cells = new Uint32Array(indexCount);\n      this.lineLengths = new Uint32Array(rows);\n    }\n  }\n\n  public clear(): void {\n    this.cells.fill(0, 0);\n    this.lineLengths.fill(0, 0);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from 'browser/renderer/shared/CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache';\nimport { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { CharData, IBufferLine, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { traceCall } from 'common/services/LogService';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel';\nimport { IWebGL2RenderingContext } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n  private _renderLayers: IRenderLayer[];\n  private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();\n  private _charAtlasDisposable = this.register(new MutableDisposable());\n  private _charAtlas: ITextureAtlas | undefined;\n  private _devicePixelRatio: number;\n\n  private _model: RenderModel = new RenderModel();\n  private _workCell: CellData = new CellData();\n  private _cellColorResolver: CellColorResolver;\n\n  private _canvas: HTMLCanvasElement;\n  private _gl: IWebGL2RenderingContext;\n  private _rectangleRenderer: MutableDisposable<RectangleRenderer> = this.register(new MutableDisposable());\n  private _glyphRenderer: MutableDisposable<GlyphRenderer> = this.register(new MutableDisposable());\n\n  public readonly dimensions: IRenderDimensions;\n\n  private _core: ITerminal;\n  private _isAttached: boolean;\n  private _contextRestorationTimeout: number | undefined;\n\n  private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n  private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n  private readonly _onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>());\n  public readonly onRequestRedraw = this._onRequestRedraw.event;\n  private readonly _onContextLoss = this.register(new EventEmitter<void>());\n  public readonly onContextLoss = this._onContextLoss.event;\n\n  constructor(\n    private _terminal: Terminal,\n    private readonly _characterJoinerService: ICharacterJoinerService,\n    private readonly _charSizeService: ICharSizeService,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _coreService: ICoreService,\n    private readonly _decorationService: IDecorationService,\n    private readonly _optionsService: IOptionsService,\n    private readonly _themeService: IThemeService,\n    preserveDrawingBuffer?: boolean\n  ) {\n    super();\n\n    this.register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n    this._cellColorResolver = new CellColorResolver(this._terminal, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n    this._core = (this._terminal as any)._core;\n\n    this._renderLayers = [\n      new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier2, this._coreBrowserService, _optionsService, this._themeService)\n    ];\n    this.dimensions = createRenderDimensions();\n    this._devicePixelRatio = this._coreBrowserService.dpr;\n    this._updateDimensions();\n    this._updateCursorBlink();\n    this.register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n    this._canvas = document.createElement('canvas');\n\n    const contextAttributes = {\n      antialias: false,\n      depth: false,\n      preserveDrawingBuffer\n    };\n    this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n    if (!this._gl) {\n      throw new Error('WebGL2 not supported ' + this._gl);\n    }\n\n    this.register(addDisposableDomListener(this._canvas, 'webglcontextlost', (e) => {\n      console.log('webglcontextlost event received');\n      // Prevent the default behavior in order to enable WebGL context restoration.\n      e.preventDefault();\n      // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n      // If not, dispatch the onContextLoss notification to observers.\n      this._contextRestorationTimeout = setTimeout(() => {\n        this._contextRestorationTimeout = undefined;\n        console.warn('webgl context not restored; firing onContextLoss');\n        this._onContextLoss.fire(e);\n      }, 3000 /* ms */);\n    }));\n    this.register(addDisposableDomListener(this._canvas, 'webglcontextrestored', (e) => {\n      console.warn('webglcontextrestored event received');\n      clearTimeout(this._contextRestorationTimeout);\n      this._contextRestorationTimeout = undefined;\n      // The texture atlas and glyph renderer must be fully reinitialized\n      // because their contents have been lost.\n      removeTerminalFromCache(this._terminal);\n      this._initializeWebGLState();\n      this._requestRedrawViewport();\n    }));\n\n    this.register(observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)));\n\n    this._core.screenElement!.appendChild(this._canvas);\n\n    [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n    this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement!);\n\n    this.register(toDisposable(() => {\n      for (const l of this._renderLayers) {\n        l.dispose();\n      }\n      this._canvas.parentElement?.removeChild(this._canvas);\n      removeTerminalFromCache(this._terminal);\n    }));\n  }\n\n  public get textureAtlas(): HTMLCanvasElement | undefined {\n    return this._charAtlas?.pages[0].canvas;\n  }\n\n  private _handleColorChange(): void {\n    this._refreshCharAtlas();\n\n    // Force a full refresh\n    this._clearModel(true);\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    // If the device pixel ratio changed, the char atlas needs to be regenerated\n    // and the terminal needs to refreshed\n    if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n      this._devicePixelRatio = this._coreBrowserService.dpr;\n      this.handleResize(this._terminal.cols, this._terminal.rows);\n    }\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    // Update character and canvas dimensions\n    this._updateDimensions();\n\n    this._model.resize(this._terminal.cols, this._terminal.rows);\n\n    // Resize all render layers\n    for (const l of this._renderLayers) {\n      l.resize(this._terminal, this.dimensions);\n    }\n\n    // Resize the canvas\n    this._canvas.width = this.dimensions.device.canvas.width;\n    this._canvas.height = this.dimensions.device.canvas.height;\n    this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n    // Resize the screen\n    this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n    this._rectangleRenderer.value?.setDimensions(this.dimensions);\n    this._rectangleRenderer.value?.handleResize();\n    this._glyphRenderer.value?.setDimensions(this.dimensions);\n    this._glyphRenderer.value?.handleResize();\n\n    this._refreshCharAtlas();\n\n    // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n    // so there is no need to clear it again here.\n    this._clearModel(false);\n  }\n\n  public handleCharSizeChanged(): void {\n    this.handleResize(this._terminal.cols, this._terminal.rows);\n  }\n\n  public handleBlur(): void {\n    for (const l of this._renderLayers) {\n      l.handleBlur(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.pause();\n    // Request a redraw for active/inactive selection background\n    this._requestRedrawViewport();\n  }\n\n  public handleFocus(): void {\n    for (const l of this._renderLayers) {\n      l.handleFocus(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.resume();\n    // Request a redraw for active/inactive selection background\n    this._requestRedrawViewport();\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    for (const l of this._renderLayers) {\n      l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n    }\n    this._model.selection.update(this._terminal, start, end, columnSelectMode);\n    this._requestRedrawViewport();\n  }\n\n  public handleCursorMove(): void {\n    for (const l of this._renderLayers) {\n      l.handleCursorMove(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n  }\n\n  private _handleOptionsChanged(): void {\n    this._updateDimensions();\n    this._refreshCharAtlas();\n    this._updateCursorBlink();\n  }\n\n  /**\n   * Initializes members dependent on WebGL context state.\n   */\n  private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n    this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService);\n    this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions);\n\n    // Update dimensions and acquire char atlas\n    this.handleCharSizeChanged();\n\n    return [this._rectangleRenderer.value, this._glyphRenderer.value];\n  }\n\n  /**\n   * Refreshes the char atlas, aquiring a new one if necessary.\n   */\n  private _refreshCharAtlas(): void {\n    if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n      // Mark as not attached so char atlas gets refreshed on next render\n      this._isAttached = false;\n      return;\n    }\n\n    const atlas = acquireTextureAtlas(\n      this._terminal,\n      this._optionsService.rawOptions,\n      this._themeService.colors,\n      this.dimensions.device.cell.width,\n      this.dimensions.device.cell.height,\n      this.dimensions.device.char.width,\n      this.dimensions.device.char.height,\n      this._coreBrowserService.dpr\n    );\n    if (this._charAtlas !== atlas) {\n      this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n      this._charAtlasDisposable.value = getDisposeArrayDisposable([\n        forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n        forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n      ]);\n    }\n    this._charAtlas = atlas;\n    this._charAtlas.warmUp();\n    this._glyphRenderer.value?.setAtlas(this._charAtlas);\n  }\n\n  /**\n   * Clear the model.\n   * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n   * should be true generally to make sure it is in the same state as the model.\n   */\n  private _clearModel(clearGlyphRenderer: boolean): void {\n    this._model.clear();\n    if (clearGlyphRenderer) {\n      this._glyphRenderer.value?.clear();\n    }\n  }\n\n  public clearTextureAtlas(): void {\n    this._charAtlas?.clearTexture();\n    this._clearModel(true);\n    this._requestRedrawViewport();\n  }\n\n  public clear(): void {\n    this._clearModel(true);\n    for (const l of this._renderLayers) {\n      l.reset(this._terminal);\n    }\n\n    this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n    this._updateCursorBlink();\n  }\n\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    return -1;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): boolean {\n    return false;\n  }\n\n  @traceCall\n  public renderRows(start: number, end: number): void {\n    if (!this._isAttached) {\n      if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) {\n        this._updateDimensions();\n        this._refreshCharAtlas();\n        this._isAttached = true;\n      } else {\n        return;\n      }\n    }\n\n    // Update render layers\n    for (const l of this._renderLayers) {\n      l.handleGridChanged(this._terminal, start, end);\n    }\n\n    if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n      return;\n    }\n\n    // Tell renderer the frame is beginning\n    // upon a model clear also refresh the full viewport model\n    // (also triggered by an atlas page merge, part of #4480)\n    if (this._glyphRenderer.value.beginFrame()) {\n      this._clearModel(true);\n      this._updateModel(0, this._terminal.rows - 1);\n    } else {\n      // just update changed lines to draw\n      this._updateModel(start, end);\n    }\n\n    // Render\n    this._rectangleRenderer.value.renderBackgrounds();\n    this._glyphRenderer.value.render(this._model);\n    if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n      this._rectangleRenderer.value.renderCursor();\n    }\n  }\n\n  private _updateCursorBlink(): void {\n    if (this._terminal.options.cursorBlink) {\n      this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n        this._requestRedrawCursor();\n      }, this._coreBrowserService);\n    } else {\n      this._cursorBlinkStateManager.clear();\n    }\n    // Request a refresh from the terminal as management of rendering is being\n    // moved back to the terminal\n    this._requestRedrawCursor();\n  }\n\n  private _updateModel(start: number, end: number): void {\n    const terminal = this._core;\n    let cell: ICellData = this._workCell;\n\n    // Declare variable ahead of time to avoid garbage collection\n    let lastBg: number;\n    let y: number;\n    let row: number;\n    let line: IBufferLine;\n    let joinedRanges: [number, number][];\n    let isJoined: boolean;\n    let lastCharX: number;\n    let range: [number, number];\n    let chars: string;\n    let code: number;\n    let i: number;\n    let x: number;\n    let j: number;\n    start = clamp(start, terminal.rows - 1, 0);\n    end = clamp(end, terminal.rows - 1, 0);\n\n    const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n    // in case cursor.x == cols adjust visual cursor to cols - 1\n    const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n    let lastCursorX = -1;\n    const isCursorVisible =\n      this._coreService.isCursorInitialized &&\n      !this._coreService.isCursorHidden &&\n      (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n    this._model.cursor = undefined;\n    let modelUpdated = false;\n\n    for (y = start; y <= end; y++) {\n      row = y + terminal.buffer.ydisp;\n      line = terminal.buffer.lines.get(row)!;\n      this._model.lineLengths[y] = 0;\n      joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n      for (x = 0; x < terminal.cols; x++) {\n        lastBg = this._cellColorResolver.result.bg;\n        line.loadCell(x, cell);\n\n        if (x === 0) {\n          lastBg = this._cellColorResolver.result.bg;\n        }\n\n        // If true, indicates that the current character(s) to draw were joined.\n        isJoined = false;\n        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        if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n          isJoined = true;\n          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            cell,\n            line!.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\n        chars = cell.getChars();\n        code = cell.getCode();\n        i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n\n        // Load colors/resolve overrides into work colors\n        this._cellColorResolver.resolve(cell, x, row);\n\n        // Override colors for cursor cell\n        if (isCursorVisible && row === cursorY) {\n          if (x === cursorX) {\n            this._model.cursor = {\n              x: cursorX,\n              y: this._terminal.buffer.active.cursorY,\n              width: cell.getWidth(),\n              style: this._coreBrowserService.isFocused ?\n                (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle,\n              cursorWidth: terminal.options.cursorWidth,\n              dpr: this._devicePixelRatio\n            };\n            lastCursorX = cursorX + cell.getWidth() - 1;\n          }\n          if (x >= cursorX && x <= lastCursorX &&\n              ((this._coreBrowserService.isFocused &&\n              (terminal.options.cursorStyle || 'block') === 'block') ||\n              (this._coreBrowserService.isFocused === false &&\n              terminal.options.cursorInactiveStyle === 'block'))) {\n            this._cellColorResolver.result.fg =\n              Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n            this._cellColorResolver.result.bg =\n              Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n          }\n        }\n\n        if (code !== NULL_CELL_CODE) {\n          this._model.lineLengths[y] = x + 1;\n        }\n\n        // Nothing has changed, no updates needed\n        if (this._model.cells[i] === code &&\n            this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg &&\n            this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg &&\n            this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) {\n          continue;\n        }\n\n        modelUpdated = true;\n\n        // Flag combined chars with a bit mask so they're easily identifiable\n        if (chars.length > 1) {\n          code |= COMBINED_CHAR_BIT_MASK;\n        }\n\n        // Cache the results in the model\n        this._model.cells[i] = code;\n        this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n        this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n        this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n        this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg);\n\n        if (isJoined) {\n          // Restore work cell\n          cell = this._workCell;\n\n          // Null out non-first cells\n          for (x++; x < lastCharX; x++) {\n            j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n            this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0);\n            this._model.cells[j] = NULL_CELL_CODE;\n            this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n            this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n            this._model.cells[j + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n          }\n        }\n      }\n    }\n    if (modelUpdated) {\n      this._rectangleRenderer.value!.updateBackgrounds(this._model);\n    }\n    this._rectangleRenderer.value!.updateCursor(this._model);\n  }\n\n  /**\n   * Recalculates the character and canvas dimensions.\n   */\n  private _updateDimensions(): void {\n    // Perform a new measure if the CharMeasure dimensions are not yet available\n    if (!this._charSizeService.width || !this._charSizeService.height) {\n      return;\n    }\n\n    // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n    // in order for the char atlas glyphs to not be blurry.\n    this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n    // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n    // floating point number in order to ensure there is enough space to draw the character to the\n    // cell.\n    this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n    // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n    // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n    // will always be larger than device char height.\n    this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n    // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n    // correctly within the cell.\n    this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n    // Calculate the device cell width, taking the letterSpacing into account.\n    this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n    // Calculate the x offset with a cell that text should draw from in order for it to be centered\n    // correctly within the cell.\n    this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n    // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n    // the canvas\n    this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n    this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n    // The the size of the canvas on the page. It's important that this rounds to nearest integer\n    // and not ceils as browsers often have floating point precision issues where\n    // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n    // it's actually 1.1. Ceiling may causes blurriness as the backing canvas image is 1 pixel too\n    // large for the canvas element size.\n    this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n    this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n    // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n    // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n    // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n    // size on the canvas can differ.\n    this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n    this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n  }\n\n  private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n    if (this._canvas.width === width && this._canvas.height === height) {\n      return;\n    }\n    // While the actual canvas size has changed, keep device canvas dimensions as the value before\n    // the change as it's an exact multiple of the cell sizes.\n    this._canvas.width = width;\n    this._canvas.height = height;\n    this._requestRedrawViewport();\n  }\n\n  private _requestRedrawViewport(): void {\n    this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n  }\n\n  private _requestRedrawCursor(): void {\n    const cursorY = this._terminal.buffer.active.cursorY;\n    this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n  }\n}\n\n// TODO: Share impl with core\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\nfunction clamp(value: number, max: number, min: number = 0): number {\n  return Math.max(Math.min(value, max), min);\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n  2, 0, 0, 0,\n  0, -2, 0, 0,\n  0, 0, 1, 0,\n  -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | undefined {\n  const program = throwIfFalsy(gl.createProgram());\n  gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource)));\n  gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource)));\n  gl.linkProgram(program);\n  const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n  if (success) {\n    return program;\n  }\n\n  console.error(gl.getProgramInfoLog(program));\n  gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n  const shader = throwIfFalsy(gl.createShader(type));\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n  if (success) {\n    return shader;\n  }\n\n  console.error(gl.getShaderInfoLog(shader));\n  gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n  const newLength = Math.min(source.length * 2, max);\n  const newArray = new Float32Array(newLength);\n  for (let i = 0; i < source.length; i++) {\n    newArray[i] = source[i];\n  }\n  return newArray;\n}\n\nexport class GLTexture {\n  public texture: WebGLTexture;\n  public version: number;\n\n  constructor(texture: WebGLTexture) {\n    this.texture = texture;\n    this.version = -1;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache';\nimport { TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { IRenderLayer } from './Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n  private _canvas: HTMLCanvasElement;\n  protected _ctx!: CanvasRenderingContext2D;\n  private _deviceCharWidth: number = 0;\n  private _deviceCharHeight: number = 0;\n  private _deviceCellWidth: number = 0;\n  private _deviceCellHeight: number = 0;\n  private _deviceCharLeft: number = 0;\n  private _deviceCharTop: number = 0;\n\n  protected _charAtlas: ITextureAtlas | undefined;\n\n  constructor(\n    terminal: Terminal,\n    private _container: HTMLElement,\n    id: string,\n    zIndex: number,\n    private _alpha: boolean,\n    protected readonly _coreBrowserService: ICoreBrowserService,\n    protected readonly _optionsService: IOptionsService,\n    protected readonly _themeService: IThemeService\n  ) {\n    super();\n    this._canvas = document.createElement('canvas');\n    this._canvas.classList.add(`xterm-${id}-layer`);\n    this._canvas.style.zIndex = zIndex.toString();\n    this._initCanvas();\n    this._container.appendChild(this._canvas);\n    this.register(this._themeService.onChangeColors(e => {\n      this._refreshCharAtlas(terminal, e);\n      this.reset(terminal);\n    }));\n    this.register(toDisposable(() => {\n      this._canvas.remove();\n    }));\n  }\n\n  private _initCanvas(): void {\n    this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n    // Draw the background if this is an opaque layer\n    if (!this._alpha) {\n      this._clearAll();\n    }\n  }\n\n  public handleBlur(terminal: Terminal): void {}\n  public handleFocus(terminal: Terminal): void {}\n  public handleCursorMove(terminal: Terminal): void {}\n  public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n  public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n  protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n    // Do nothing when alpha doesn't change\n    if (alpha === this._alpha) {\n      return;\n    }\n\n    // Create new canvas and replace old one\n    const oldCanvas = this._canvas;\n    this._alpha = alpha;\n    // Cloning preserves properties\n    this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n    this._initCanvas();\n    this._container.replaceChild(this._canvas, oldCanvas);\n\n    // Regenerate char atlas and force a full redraw\n    this._refreshCharAtlas(terminal, this._themeService.colors);\n    this.handleGridChanged(terminal, 0, terminal.rows - 1);\n  }\n\n  /**\n   * Refreshes the char atlas, aquiring a new one if necessary.\n   * @param terminal The terminal.\n   * @param colorSet The color set to use for the char atlas.\n   */\n  private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n    if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n      return;\n    }\n    this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr);\n    this._charAtlas.warmUp();\n  }\n\n  public resize(terminal: Terminal, dim: IRenderDimensions): void {\n    this._deviceCellWidth = dim.device.cell.width;\n    this._deviceCellHeight = dim.device.cell.height;\n    this._deviceCharWidth = dim.device.char.width;\n    this._deviceCharHeight = dim.device.char.height;\n    this._deviceCharLeft = dim.device.char.left;\n    this._deviceCharTop = dim.device.char.top;\n    this._canvas.width = dim.device.canvas.width;\n    this._canvas.height = dim.device.canvas.height;\n    this._canvas.style.width = `${dim.css.canvas.width}px`;\n    this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n    // Draw the background if this is an opaque layer\n    if (!this._alpha) {\n      this._clearAll();\n    }\n\n    this._refreshCharAtlas(terminal, this._themeService.colors);\n  }\n\n  public abstract reset(terminal: Terminal): void;\n\n  /**\n   * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n   * existing fillStyle on the context.\n   * @param x The column to fill.\n   * @param y The row to fill.\n   */\n  protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n    this._ctx.fillRect(\n      x * this._deviceCellWidth,\n      (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n      width * this._deviceCellWidth,\n      this._coreBrowserService.dpr);\n  }\n\n  /**\n   * Clears the entire canvas.\n   */\n  protected _clearAll(): void {\n    if (this._alpha) {\n      this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n      this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n    }\n  }\n\n  /**\n   * Clears 1+ cells completely.\n   * @param x The column to start at.\n   * @param y The row to start at.\n   * @param width The number of columns to clear.\n   * @param height The number of rows to clear.\n   */\n  protected _clearCells(x: number, y: number, width: number, height: number): void {\n    if (this._alpha) {\n      this._ctx.clearRect(\n        x * this._deviceCellWidth,\n        y * this._deviceCellHeight,\n        width * this._deviceCellWidth,\n        height * this._deviceCellHeight);\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n      this._ctx.fillRect(\n        x * this._deviceCellWidth,\n        y * this._deviceCellHeight,\n        width * this._deviceCellWidth,\n        height * this._deviceCellHeight);\n    }\n  }\n\n  /**\n   * Draws a truecolor character at the cell. The character will be clipped to\n   * ensure that it fits with the cell, including the cell to the right if it's\n   * a wide character. This uses the existing fillStyle on the context.\n   * @param terminal The terminal.\n   * @param cell The cell data for the character to draw.\n   * @param x The column to draw at.\n   * @param y The row to draw at.\n   */\n  protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n    this._ctx.font = this._getFont(terminal, false, false);\n    this._ctx.textBaseline = TEXT_BASELINE;\n    this._clipCell(x, y, cell.getWidth());\n    this._ctx.fillText(\n      cell.getChars(),\n      x * this._deviceCellWidth + this._deviceCharLeft,\n      y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n  }\n\n  /**\n   * Clips a cell to ensure no pixels will be drawn outside of it.\n   * @param x The column to clip.\n   * @param y The row to clip.\n   * @param width The number of columns to clip.\n   */\n  private _clipCell(x: number, y: number, width: number): void {\n    this._ctx.beginPath();\n    this._ctx.rect(\n      x * this._deviceCellWidth,\n      y * this._deviceCellHeight,\n      width * this._deviceCellWidth,\n      this._deviceCellHeight);\n    this._ctx.clip();\n  }\n\n  /**\n   * Gets the current font.\n   * @param terminal The terminal.\n   * @param isBold If we should use the bold fontWeight.\n   */\n  protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n    const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n    const fontStyle = isItalic ? 'italic' : '';\n\n    return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n  }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from 'browser/renderer/shared/CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n  private _state: ILinkifierEvent | undefined;\n\n  constructor(\n    container: HTMLElement,\n    zIndex: number,\n    terminal: Terminal,\n    linkifier2: ILinkifier2,\n    coreBrowserService: ICoreBrowserService,\n    optionsService: IOptionsService,\n    themeService: IThemeService\n  ) {\n    super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n    this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n    this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n  }\n\n  public resize(terminal: Terminal, dim: IRenderDimensions): void {\n    super.resize(terminal, dim);\n    // Resizing the canvas discards the contents of the canvas so clear state\n    this._state = undefined;\n  }\n\n  public reset(terminal: Terminal): void {\n    this._clearCurrentLink();\n  }\n\n  private _clearCurrentLink(): void {\n    if (this._state) {\n      this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n      const middleRowCount = this._state.y2 - this._state.y1 - 1;\n      if (middleRowCount > 0) {\n        this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n      }\n      this._clearCells(0, this._state.y2, this._state.x2, 1);\n      this._state = undefined;\n    }\n  }\n\n  private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n    if (e.fg === INVERTED_DEFAULT_COLOR) {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n    } else if (e.fg !== undefined && is256Color(e.fg)) {\n      // 256 color support\n      this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.foreground.css;\n    }\n\n    if (e.y1 === e.y2) {\n      // Single line link\n      this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n    } else {\n      // Multi-line link\n      this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n      for (let y = e.y1 + 1; y < e.y2; y++) {\n        this._fillBottomLineAtCells(0, y, e.cols);\n      }\n      this._fillBottomLineAtCells(0, e.y2, e.x2);\n    }\n    this._state = e;\n  }\n\n  private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n    this._clearCurrentLink();\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 node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * 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","import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, FgFlags } from 'common/buffer/Constants';\nimport { IDecorationService } from 'common/services/Services';\nimport { ICellData } from 'common/Types';\nimport { Terminal } from 'xterm';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\n\nexport class CellColorResolver {\n  /**\n   * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n   * any other calls will share object.\n   */\n  public readonly result: { fg: number, bg: number, ext: number } = {\n    fg: 0,\n    bg: 0,\n    ext: 0\n  };\n\n  constructor(\n    private readonly _terminal: Terminal,\n    private readonly _selectionRenderModel: ISelectionRenderModel,\n    private readonly _decorationService: IDecorationService,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _themeService: IThemeService\n  ) {\n  }\n\n  /**\n   * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n   * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n   */\n  public resolve(cell: ICellData, x: number, y: number): void {\n    this.result.bg = cell.bg;\n    this.result.fg = cell.fg;\n    this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n    // Get any foreground/background overrides, this happens on the model to avoid spreading\n    // override logic throughout the different sub-renderers\n\n    // Reset overrides work variables\n    $bg = 0;\n    $fg = 0;\n    $hasBg = false;\n    $hasFg = false;\n    $isSelected = false;\n    $colors = this._themeService.colors;\n\n    // Apply decorations on the bottom layer\n    this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n      if (d.backgroundColorRGB) {\n        $bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasBg = true;\n      }\n      if (d.foregroundColorRGB) {\n        $fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    });\n\n    // Apply the selection color if needed\n    $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n    if ($isSelected) {\n      $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & 0xFFFFFF;\n      $hasBg = true;\n      if ($colors.selectionForeground) {\n        $fg = $colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    }\n\n    // Apply decorations on the top layer\n    this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n      if (d.backgroundColorRGB) {\n        $bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasBg = true;\n      }\n      if (d.foregroundColorRGB) {\n        $fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    });\n\n    // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n    // ahead of time in order to use the correct cache key\n    if ($hasBg) {\n      if ($isSelected) {\n        // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n        $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n      } else {\n        // Non-RGB attributes from model + override + force RGB color mode\n        $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n      }\n    }\n    if ($hasFg) {\n      // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n      $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n    }\n\n    // Handle case where inverse was specified by only one of bg override or fg override was set,\n    // resolving the other inverse color and setting the inverse flag if needed.\n    if (this.result.fg & FgFlags.INVERSE) {\n      if ($hasBg && !$hasFg) {\n        // Resolve bg color type (default color has a different meaning in fg vs bg)\n        if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n          $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n        } else {\n          $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n        }\n        $hasFg = true;\n      }\n      if (!$hasBg && $hasFg) {\n        // Resolve bg color type (default color has a different meaning in fg vs bg)\n        if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n          $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n        } else {\n          $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n        }\n        $hasBg = true;\n      }\n    }\n\n    // Release object\n    $colors = undefined;\n\n    // Use the override if it exists\n    this.result.bg = $hasBg ? $bg : this.result.bg;\n    this.result.fg = $hasFg ? $fg : this.result.fg;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { ITerminalOptions, Terminal } from 'xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils';\n\ninterface ITextureAtlasCacheEntry {\n  atlas: ITextureAtlas;\n  config: ICharAtlasConfig;\n  // N.B. This implementation potentially holds onto copies of the terminal forever, so\n  // this may cause memory leaks.\n  ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n  terminal: Terminal,\n  options: Required<ITerminalOptions>,\n  colors: ReadonlyColorSet,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  deviceCharWidth: number,\n  deviceCharHeight: number,\n  devicePixelRatio: number\n): ITextureAtlas {\n  const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio);\n\n  // Check to see if the terminal already owns this config\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const entry = charAtlasCache[i];\n    const ownedByIndex = entry.ownedBy.indexOf(terminal);\n    if (ownedByIndex >= 0) {\n      if (configEquals(entry.config, newConfig)) {\n        return entry.atlas;\n      }\n      // The configs differ, release the terminal from the entry\n      if (entry.ownedBy.length === 1) {\n        entry.atlas.dispose();\n        charAtlasCache.splice(i, 1);\n      } else {\n        entry.ownedBy.splice(ownedByIndex, 1);\n      }\n      break;\n    }\n  }\n\n  // Try match a char atlas from the cache\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const entry = charAtlasCache[i];\n    if (configEquals(entry.config, newConfig)) {\n      // Add the terminal to the cache entry and return\n      entry.ownedBy.push(terminal);\n      return entry.atlas;\n    }\n  }\n\n  const core: ITerminal = (terminal as any)._core;\n  const newEntry: ITextureAtlasCacheEntry = {\n    atlas: new TextureAtlas(document, newConfig, core.unicodeService),\n    config: newConfig,\n    ownedBy: [terminal]\n  };\n  charAtlasCache.push(newEntry);\n  return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n    if (index !== -1) {\n      if (charAtlasCache[i].ownedBy.length === 1) {\n        // Remove the cache entry if it's the only terminal\n        charAtlasCache[i].atlas.dispose();\n        charAtlasCache.splice(i, 1);\n      } else {\n        // Remove the reference from the cache entry\n        charAtlasCache[i].ownedBy.splice(index, 1);\n      }\n      break;\n    }\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from 'xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required<ITerminalOptions>, colors: ReadonlyColorSet, devicePixelRatio: number): ICharAtlasConfig {\n  // null out some fields that don't matter\n  const clonedColors: IColorSet = {\n    foreground: colors.foreground,\n    background: colors.background,\n    cursor: NULL_COLOR,\n    cursorAccent: NULL_COLOR,\n    selectionForeground: NULL_COLOR,\n    selectionBackgroundTransparent: NULL_COLOR,\n    selectionBackgroundOpaque: NULL_COLOR,\n    selectionInactiveBackgroundTransparent: NULL_COLOR,\n    selectionInactiveBackgroundOpaque: NULL_COLOR,\n    // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n    // dynamic character atlas.\n    ansi: colors.ansi.slice(),\n    contrastCache: colors.contrastCache,\n    halfContrastCache: colors.halfContrastCache\n  };\n  return {\n    customGlyphs: options.customGlyphs,\n    devicePixelRatio,\n    letterSpacing: options.letterSpacing,\n    lineHeight: options.lineHeight,\n    deviceCellWidth: deviceCellWidth,\n    deviceCellHeight: deviceCellHeight,\n    deviceCharWidth: deviceCharWidth,\n    deviceCharHeight: deviceCharHeight,\n    fontFamily: options.fontFamily,\n    fontSize: options.fontSize,\n    fontWeight: options.fontWeight,\n    fontWeightBold: options.fontWeightBold,\n    allowTransparency: options.allowTransparency,\n    drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n    minimumContrastRatio: options.minimumContrastRatio,\n    colors: clonedColors\n  };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n  for (let i = 0; i < a.colors.ansi.length; i++) {\n    if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n      return false;\n    }\n  }\n  return a.devicePixelRatio === b.devicePixelRatio &&\n      a.customGlyphs === b.customGlyphs &&\n      a.lineHeight === b.lineHeight &&\n      a.letterSpacing === b.letterSpacing &&\n      a.fontFamily === b.fontFamily &&\n      a.fontSize === b.fontSize &&\n      a.fontWeight === b.fontWeight &&\n      a.fontWeightBold === b.fontWeightBold &&\n      a.allowTransparency === b.allowTransparency &&\n      a.deviceCharWidth === b.deviceCharWidth &&\n      a.deviceCharHeight === b.deviceCharHeight &&\n      a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n      a.minimumContrastRatio === b.minimumContrastRatio &&\n      a.colors.foreground.rgba === b.colors.foreground.rgba &&\n      a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n  return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\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\n// would 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) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorBlinkStateManager {\n  public isCursorVisible: boolean;\n\n  private _animationFrame: number | undefined;\n  private _blinkStartTimeout: number | undefined;\n  private _blinkInterval: number | undefined;\n\n  /**\n   * The time at which the animation frame was restarted, this is used on the\n   * next render to restart the timers so they don't need to restart the timers\n   * multiple times over a short period.\n   */\n  private _animationTimeRestarted: number | undefined;\n\n  constructor(\n    private _renderCallback: () => void,\n    private _coreBrowserService: ICoreBrowserService\n  ) {\n    this.isCursorVisible = true;\n    if (this._coreBrowserService.isFocused) {\n      this._restartInterval();\n    }\n  }\n\n  public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n  public dispose(): void {\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n    if (this._blinkStartTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = undefined;\n    }\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public restartBlinkAnimation(): void {\n    if (this.isPaused) {\n      return;\n    }\n    // Save a timestamp so that the restart can be done on the next interval\n    this._animationTimeRestarted = Date.now();\n    // Force a cursor render to ensure it's visible and in the correct position\n    this.isCursorVisible = true;\n    if (!this._animationFrame) {\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n        this._renderCallback();\n        this._animationFrame = undefined;\n      });\n    }\n  }\n\n  private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n    // Clear any existing interval\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n\n    // Setup the initial timeout which will hide the cursor, this is done before\n    // the regular interval is setup in order to support restarting the blink\n    // animation in a lightweight way (without thrashing clearInterval and\n    // setInterval).\n    this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n      // Check if another animation restart was requested while this was being\n      // started\n      if (this._animationTimeRestarted) {\n        const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n        this._animationTimeRestarted = undefined;\n        if (time > 0) {\n          this._restartInterval(time);\n          return;\n        }\n      }\n\n      // Hide the cursor\n      this.isCursorVisible = false;\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n        this._renderCallback();\n        this._animationFrame = undefined;\n      });\n\n      // Setup the blink interval\n      this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n        // Adjust the animation time if it was restarted\n        if (this._animationTimeRestarted) {\n          // calc time diff\n          // Make restart interval do a setTimeout initially?\n          const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n          this._animationTimeRestarted = undefined;\n          this._restartInterval(time);\n          return;\n        }\n\n        // Invert visibility and render\n        this.isCursorVisible = !this.isCursorVisible;\n        this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n          this._renderCallback();\n          this._animationFrame = undefined;\n        });\n      }, BLINK_INTERVAL);\n    }, timeToStart);\n  }\n\n  public pause(): void {\n    this.isCursorVisible = true;\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n    if (this._blinkStartTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = undefined;\n    }\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public resume(): void {\n    // Clear out any existing timers just in case\n    this.pause();\n\n    this._animationTimeRestarted = undefined;\n    this._restartInterval();\n    this.restartBlinkAnimation();\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IBlockVector {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n  // Block elements (0x2580-0x2590)\n  '▀': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n  '▁': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n  '▂': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n  '▃': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n  '▄': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n  '▅': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n  '▆': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n  '▇': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n  '█': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n  '▉': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n  '▊': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n  '▋': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n  '▌': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n  '▍': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n  '▎': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n  '▏': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n  '▐': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n  // Block elements (0x2594-0x2595)\n  '▔': [{ x: 0, y: 0, w: 8, h: 1 }], // UPPER ONE EIGHTH BLOCK\n  '▕': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n  // Terminal graphic characters (0x2596-0x259F)\n  '▖': [{ x: 0, y: 4, w: 4, h: 4 }],                             // QUADRANT LOWER LEFT\n  '▗': [{ x: 4, y: 4, w: 4, h: 4 }],                             // QUADRANT LOWER RIGHT\n  '▘': [{ x: 0, y: 0, w: 4, h: 4 }],                             // QUADRANT UPPER LEFT\n  '▙': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n  '▚': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n  '▛': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n  '▜': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n  '▝': [{ x: 4, y: 0, w: 4, h: 4 }],                             // QUADRANT UPPER RIGHT\n  '▞': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n  '▟': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n  // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n  '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n  '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n  '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n  '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n  '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n  '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n  // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n  '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n  '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n  '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n  '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n  '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n  '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n  // LEFT AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // LEFT AND UPPER ONE EIGHTH BLOCK\n  '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n  // RIGHT AND UPPER ONE EIGHTH BLOCK\n  '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n  // RIGHT AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // UPPER AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // HORIZONTAL ONE EIGHTH BLOCK-1358\n  '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n  // UPPER ONE QUARTER BLOCK\n  '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n  // UPPER THREE EIGHTHS BLOCK\n  '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n  // UPPER FIVE EIGHTHS BLOCK\n  '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n  // UPPER THREE QUARTERS BLOCK\n  '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n  // UPPER SEVEN EIGHTHS BLOCK\n  '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n  // RIGHT ONE QUARTER BLOCK\n  '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n  // RIGHT THREE EIGHTHS B0OCK\n  '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n  // RIGHT FIVE EIGHTHS BL0CK\n  '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n  // RIGHT THREE QUARTERS 0LOCK\n  '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n  // RIGHT SEVEN EIGHTHS B0OCK\n  '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n  // CHECKER BOARD FILL\n  '\\u{1FB95}': [\n    { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n    { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n    { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n    { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n  ],\n  // INVERSE CHECKER BOARD FILL\n  '\\u{1FB96}': [\n    { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n    { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n    { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n    { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n  ],\n  // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n  '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n  // Shade characters (0x2591-0x2593)\n  '░': [ // LIGHT SHADE (25%)\n    [1, 0, 0, 0],\n    [0, 0, 0, 0],\n    [0, 0, 1, 0],\n    [0, 0, 0, 0]\n  ],\n  '▒': [ // MEDIUM SHADE (50%)\n    [1, 0],\n    [0, 0],\n    [0, 1],\n    [0, 0]\n  ],\n  '▓': [ // DARK SHADE (75%)\n    [0, 1],\n    [1, 1],\n    [1, 0],\n    [1, 1]\n  ]\n};\n\nconst enum Shapes {\n  /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n  /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n  /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n  /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n  /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n  /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n  /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n  /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n  /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n  /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n  /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n  /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n  /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n  /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n  /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n  /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n  /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n  /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n  /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n  /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n  /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n  NORMAL = 1,\n  BOLD = 3\n}\n\n/**\n * @param xp The percentage of 15% of the x axis.\n * @param yp The percentage of 15% of the x axis on the y axis.\n */\ntype DrawFunctionDefinition = (xp: number, yp: number) => string;\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | DrawFunctionDefinition } | undefined } = {\n  // Uniform normal and bold\n  '─': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n  '━': { [Style.BOLD]:   Shapes.LEFT_TO_RIGHT },\n  '│': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n  '┃': { [Style.BOLD]:   Shapes.TOP_TO_BOTTOM },\n  '┌': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n  '┏': { [Style.BOLD]:   Shapes.RIGHT_TO_BOTTOM },\n  '┐': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n  '┓': { [Style.BOLD]:   Shapes.LEFT_TO_BOTTOM },\n  '└': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n  '┗': { [Style.BOLD]:   Shapes.TOP_TO_RIGHT },\n  '┘': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n  '┛': { [Style.BOLD]:   Shapes.TOP_TO_LEFT },\n  '├': { [Style.NORMAL]: Shapes.T_RIGHT },\n  '┣': { [Style.BOLD]:   Shapes.T_RIGHT },\n  '┤': { [Style.NORMAL]: Shapes.T_LEFT },\n  '┫': { [Style.BOLD]:   Shapes.T_LEFT },\n  '┬': { [Style.NORMAL]: Shapes.T_BOTTOM },\n  '┳': { [Style.BOLD]:   Shapes.T_BOTTOM },\n  '┴': { [Style.NORMAL]: Shapes.T_TOP },\n  '┻': { [Style.BOLD]:   Shapes.T_TOP },\n  '┼': { [Style.NORMAL]: Shapes.CROSS },\n  '╋': { [Style.BOLD]:   Shapes.CROSS },\n  '╴': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n  '╸': { [Style.BOLD]:   Shapes.MIDDLE_TO_LEFT },\n  '╵': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n  '╹': { [Style.BOLD]:   Shapes.MIDDLE_TO_TOP },\n  '╶': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n  '╺': { [Style.BOLD]:   Shapes.MIDDLE_TO_RIGHT },\n  '╷': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n  '╻': { [Style.BOLD]:   Shapes.MIDDLE_TO_BOTTOM },\n\n  // Double border\n  '═': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '║': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╒': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n  '╓': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n  '╔': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n  '╕': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n  '╖': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n  '╗': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n  '╘': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n  '╙': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n  '╚': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n  '╛': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n  '╜': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n  '╝': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n  '╞': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n  '╟': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n  '╠': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n  '╡': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n  '╢': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╣': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n  '╤': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n  '╥': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n  '╦': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n  '╧': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '╨': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n  '╩': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n  '╪': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '╫': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╬': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n  // Diagonal\n  '╱': { [Style.NORMAL]: 'M1,0 L0,1' },\n  '╲': { [Style.NORMAL]: 'M0,0 L1,1' },\n  '╳': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n  // Mixed weight\n  '╼': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '╽': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '╾': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '╿': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┍': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┎': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┑': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┒': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┕': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┖': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┙': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┚': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┝': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┞': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┟': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┠': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '┡': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '┢': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '┥': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┦': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┧': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┨': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '┩': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '┪': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '┭': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┮': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┯': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '┰': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┱': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '┲': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '┵': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┶': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┷': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '┸': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┹': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '┺': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '┽': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`,  [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┾': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`,   [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┿': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '╀': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '╁': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`,    [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '╂': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '╃': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '╄': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '╅': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '╆': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '╇': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n  '╈': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n  '╉': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n  '╊': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n  // Dashed\n  '╌': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n  '╍': { [Style.BOLD]:   Shapes.TWO_DASHES_HORIZONTAL },\n  '┄': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n  '┅': { [Style.BOLD]:   Shapes.THREE_DASHES_HORIZONTAL },\n  '┈': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n  '┉': { [Style.BOLD]:   Shapes.FOUR_DASHES_HORIZONTAL },\n  '╎': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n  '╏': { [Style.BOLD]:   Shapes.TWO_DASHES_VERTICAL },\n  '┆': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL  },\n  '┇': { [Style.BOLD]:   Shapes.THREE_DASHES_VERTICAL },\n  '┊': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n  '┋': { [Style.BOLD]:   Shapes.FOUR_DASHES_VERTICAL },\n\n  // Curved\n  '╭': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5` },\n  '╮': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5` },\n  '╯': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5` },\n  '╰': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5` }\n};\n\ninterface IVectorShape {\n  d: string;\n  type: VectorType;\n  leftPadding?: number;\n  rightPadding?: number;\n}\n\nconst enum VectorType {\n  FILL,\n  STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n * visible.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n  // Right triangle solid\n  '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL, rightPadding: 2 },\n  // Right triangle line\n  '\\u{E0B1}': { d: 'M-1,-.5 L1,.5 L-1,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Left triangle solid\n  '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL, leftPadding: 2 },\n  // Left triangle line\n  '\\u{E0B3}': { d: 'M2,-.5 L0,.5 L2,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Right semi-circle solid\n  '\\u{E0B4}': { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: VectorType.FILL, rightPadding: 1 },\n  // Right semi-circle line\n  '\\u{E0B5}': { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: VectorType.STROKE, rightPadding: 1 },\n  // Left semi-circle solid\n  '\\u{E0B6}': { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: VectorType.FILL, leftPadding: 1 },\n  // Left semi-circle line\n  '\\u{E0B7}': { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: VectorType.STROKE, leftPadding: 1 },\n  // Lower left triangle\n  '\\u{E0B8}': { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: VectorType.FILL },\n  // Backslash separator\n  '\\u{E0B9}': { d: 'M-.5,-.5 L1.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Lower right triangle\n  '\\u{E0BA}': { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: VectorType.FILL },\n  // Upper left triangle\n  '\\u{E0BC}': { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: VectorType.FILL },\n  // Forward slash separator\n  '\\u{E0BD}': { d: 'M1.5,-.5 L-.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Upper right triangle\n  '\\u{E0BE}': { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: VectorType.FILL }\n};\n// Forward slash separator redundant\npowerlineDefinitions['\\u{E0BB}'] = powerlineDefinitions['\\u{E0BD}'];\n// Backslash separator redundant\npowerlineDefinitions['\\u{E0BF}'] = powerlineDefinitions['\\u{E0B9}'];\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n  ctx: CanvasRenderingContext2D,\n  c: string,\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  fontSize: number,\n  devicePixelRatio: number\n): boolean {\n  const blockElementDefinition = blockElementDefinitions[c];\n  if (blockElementDefinition) {\n    drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n    return true;\n  }\n\n  const patternDefinition = patternCharacterDefinitions[c];\n  if (patternDefinition) {\n    drawPatternChar(ctx, patternDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n    return true;\n  }\n\n  const boxDrawingDefinition = boxDrawingDefinitions[c];\n  if (boxDrawingDefinition) {\n    drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, devicePixelRatio);\n    return true;\n  }\n\n  const powerlineDefinition = powerlineDefinitions[c];\n  if (powerlineDefinition) {\n    drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, fontSize, devicePixelRatio);\n    return true;\n  }\n\n  return false;\n}\n\nfunction drawBlockElementChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: IBlockVector[],\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number\n): void {\n  for (let i = 0; i < charDefinition.length; i++) {\n    const box = charDefinition[i];\n    const xEighth = deviceCellWidth / 8;\n    const yEighth = deviceCellHeight / 8;\n    ctx.fillRect(\n      xOffset + box.x * xEighth,\n      yOffset + box.y * yEighth,\n      box.w * xEighth,\n      box.h * yEighth\n    );\n  }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: number[][],\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number\n): void {\n  let patternSet = cachedPatterns.get(charDefinition);\n  if (!patternSet) {\n    patternSet = new Map();\n    cachedPatterns.set(charDefinition, patternSet);\n  }\n  const fillStyle = ctx.fillStyle;\n  if (typeof fillStyle !== 'string') {\n    throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n  }\n  let pattern = patternSet.get(fillStyle);\n  if (!pattern) {\n    const width = charDefinition[0].length;\n    const height = charDefinition.length;\n    const tmpCanvas = document.createElement('canvas');\n    tmpCanvas.width = width;\n    tmpCanvas.height = height;\n    const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n    const imageData = new ImageData(width, height);\n\n    // Extract rgba from fillStyle\n    let r: number;\n    let g: number;\n    let b: number;\n    let a: number;\n    if (fillStyle.startsWith('#')) {\n      r = parseInt(fillStyle.slice(1, 3), 16);\n      g = parseInt(fillStyle.slice(3, 5), 16);\n      b = parseInt(fillStyle.slice(5, 7), 16);\n      a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n    } else if (fillStyle.startsWith('rgba')) {\n      ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n    } else {\n      throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n    }\n\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        imageData.data[(y * width + x) * 4    ] = r;\n        imageData.data[(y * width + x) * 4 + 1] = g;\n        imageData.data[(y * width + x) * 4 + 2] = b;\n        imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n      }\n    }\n    tmpCtx.putImageData(imageData, 0, 0);\n    pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n    patternSet.set(fillStyle, pattern);\n  }\n  ctx.fillStyle = pattern;\n  ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles:       ┎┰┒┍┯┑╓╥╖╒╤╕ ┏┳┓┌┲┓┌┬┐┏┱┐\n * ┌─┬─┐ ┏━┳━┓ ╔═╦═╗ ┠╂┨┝┿┥╟╫╢╞╪╡ ┡╇┩├╊┫┢╈┪┣╉┤\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┖┸┚┕┷┙╙╨╜╘╧╛ └┴┘└┺┛┗┻┛┗┹┘\n * ├─┼─┤ ┣━╋━┫ ╠═╬═╣ ┏┱┐┌┲┓┌┬┐┌┬┐ ┏┳┓┌┮┓┌┬┐┏┭┐\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┡╃┤├╄┩├╆┪┢╅┤ ┞╀┦├┾┫┟╁┧┣┽┤\n * └─┴─┘ ┗━┻━┛ ╚═╩═╝ └┴┘└┴┘└┺┛┗┹┘ └┴┘└┶┛┗┻┛┗┵┘\n *\n * Other:\n * ╭─╮ ╲ ╱ ╷╻╎╏┆┇┊┋ ╺╾╴ ╌╌╌ ┄┄┄ ┈┈┈\n * │ │  ╳  ╽╿╎╏┆┇┊┋ ╶╼╸ ╍╍╍ ┅┅┅ ┉┉┉\n * ╰─╯ ╱ ╲ ╹╵╎╏┆┇┊┋\n *\n * All box drawing characters:\n * ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n * ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n * ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n * ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n * ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n * ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n * ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n * ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n *\n * ---\n *\n * Box drawing alignment tests:                                          █\n *                                                                       ▉\n *   ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳\n *   ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳\n *   ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳\n *   ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳\n *   ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎\n *   ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏\n *   ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛           └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  devicePixelRatio: number\n): void {\n  ctx.strokeStyle = ctx.fillStyle;\n  for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n    ctx.beginPath();\n    ctx.lineWidth = devicePixelRatio * Number.parseInt(fontWeight);\n    let actualInstructions: string;\n    if (typeof instructions === 'function') {\n      const xp = .15;\n      const yp = .15 / deviceCellHeight * deviceCellWidth;\n      actualInstructions = instructions(xp, yp);\n    } else {\n      actualInstructions = instructions;\n    }\n    for (const instruction of actualInstructions.split(' ')) {\n      const type = instruction[0];\n      const f = svgToCanvasInstructionMap[type];\n      if (!f) {\n        console.error(`Could not find drawing instructions for \"${type}\"`);\n        continue;\n      }\n      const args: string[] = instruction.substring(1).split(',');\n      if (!args[0] || !args[1]) {\n        continue;\n      }\n      f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio));\n    }\n    ctx.stroke();\n    ctx.closePath();\n  }\n}\n\nfunction drawPowerlineChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: IVectorShape,\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  fontSize: number,\n  devicePixelRatio: number\n): void {\n  // Clip the cell to make sure drawing doesn't occur beyond bounds\n  const clipRegion = new Path2D();\n  clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n  ctx.clip(clipRegion);\n\n  ctx.beginPath();\n  // Scale the stroke with DPR and font size\n  const cssLineWidth = fontSize / 12;\n  ctx.lineWidth = devicePixelRatio * cssLineWidth;\n  for (const instruction of charDefinition.d.split(' ')) {\n    const type = instruction[0];\n    const f = svgToCanvasInstructionMap[type];\n    if (!f) {\n      console.error(`Could not find drawing instructions for \"${type}\"`);\n      continue;\n    }\n    const args: string[] = instruction.substring(1).split(',');\n    if (!args[0] || !args[1]) {\n      continue;\n    }\n    f(ctx, translateArgs(\n      args,\n      deviceCellWidth,\n      deviceCellHeight,\n      xOffset,\n      yOffset,\n      false,\n      devicePixelRatio,\n      (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n      (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n    ));\n  }\n  if (charDefinition.type === VectorType.STROKE) {\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.stroke();\n  } else {\n    ctx.fill();\n  }\n  ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n  return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n  'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n  'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n  'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0): number[] {\n  const result = args.map(e => parseFloat(e) || parseInt(e));\n\n  if (result.length < 2) {\n    throw new Error('Too few arguments for instruction');\n  }\n\n  for (let x = 0; x < result.length; x += 2) {\n    // Translate from 0-1 to 0-cellWidth\n    result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n    // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n    // line at 100% devicePixelRatio\n    if (doClamp && result[x] !== 0) {\n      result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n    }\n    // Apply the cell's offset (ie. x*cellWidth)\n    result[x] += xOffset + (leftPadding * devicePixelRatio);\n  }\n\n  for (let y = 1; y < result.length; y += 2) {\n    // Translate from 0-1 to 0-cellHeight\n    result[y] *= cellHeight;\n    // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n    // line at 100% devicePixelRatio\n    if (doClamp && result[y] !== 0) {\n      result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n    }\n    // Apply the cell's offset (ie. x*cellHeight)\n    result[y] += yOffset;\n  }\n\n  return result;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n  // Observe any resizes to the element and extract the actual pixel size of the element if the\n  // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n  // converting between CSS pixels and device pixels which causes blurry rendering when device\n  // pixel ratio is not a round number.\n  let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n    const entry = entries.find((entry) => entry.target === element);\n    if (!entry) {\n      return;\n    }\n\n    // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n    if (!('devicePixelContentBoxSize' in entry)) {\n      observer?.disconnect();\n      observer = undefined;\n      return;\n    }\n\n    // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n    const width = entry.devicePixelContentBoxSize[0].inlineSize;\n    const height = entry.devicePixelContentBoxSize[0].blockSize;\n    if (width > 0 && height > 0) {\n      callback(width, height);\n    }\n  });\n  try {\n    observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n  } catch {\n    observer.disconnect();\n    observer = undefined;\n  }\n  return toDisposable(() => observer?.disconnect());\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\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\nexport function createRenderDimensions(): IRenderDimensions {\n  return {\n    css: {\n      canvas: createDimension(),\n      cell: createDimension()\n    },\n    device: {\n      canvas: createDimension(),\n      cell: createDimension(),\n      char: {\n        width: 0,\n        height: 0,\n        left: 0,\n        top: 0\n      }\n    }\n  };\n}\n\nfunction createDimension(): IDimensions {\n  return {\n    width: 0,\n    height: 0\n  };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from 'xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n  public hasSelection!: boolean;\n  public columnSelectMode!: boolean;\n  public viewportStartRow!: number;\n  public viewportEndRow!: number;\n  public viewportCappedStartRow!: number;\n  public viewportCappedEndRow!: number;\n  public startCol!: number;\n  public endCol!: number;\n  public selectionStart: [number, number] | undefined;\n  public selectionEnd: [number, number] | undefined;\n\n  constructor() {\n    this.clear();\n  }\n\n  public clear(): void {\n    this.hasSelection = false;\n    this.columnSelectMode = false;\n    this.viewportStartRow = 0;\n    this.viewportEndRow = 0;\n    this.viewportCappedStartRow = 0;\n    this.viewportCappedEndRow = 0;\n    this.startCol = 0;\n    this.endCol = 0;\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n  }\n\n  public update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n    this.selectionStart = start;\n    this.selectionEnd = end;\n    // Selection does not exist\n    if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n      this.clear();\n      return;\n    }\n\n    // Translate from buffer position to viewport position\n    const viewportStartRow = start[1] - terminal.buffer.active.viewportY;\n    const viewportEndRow = end[1] - terminal.buffer.active.viewportY;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n      this.clear();\n      return;\n    }\n\n    this.hasSelection = true;\n    this.columnSelectMode = columnSelectMode;\n    this.viewportStartRow = viewportStartRow;\n    this.viewportEndRow = viewportEndRow;\n    this.viewportCappedStartRow = viewportCappedStartRow;\n    this.viewportCappedEndRow = viewportCappedEndRow;\n    this.startCol = start[0];\n    this.endCol = end[0];\n  }\n\n  public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n    if (!this.hasSelection) {\n      return false;\n    }\n    y -= terminal.buffer.active.viewportY;\n    if (this.columnSelectMode) {\n      if (this.startCol <= this.endCol) {\n        return x >= this.startCol && y >= this.viewportCappedStartRow &&\n          x < this.endCol && y <= this.viewportCappedEndRow;\n      }\n      return x < this.startCol && y >= this.viewportCappedStartRow &&\n        x >= this.endCol && y <= this.viewportCappedEndRow;\n    }\n    return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n      (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n  }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n  return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';\nimport { excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_COLOR, color, rgba } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { traceCall } from 'common/services/LogService';\nimport { IUnicodeService } from 'common/services/Services';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n  texturePage: 0,\n  texturePosition: { x: 0, y: 0 },\n  texturePositionClipSpace: { x: 0, y: 0 },\n  offset: { x: 0, y: 0 },\n  size: { x: 0, y: 0 },\n  sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n  /**\n   * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n   * page pack as tightly as possible, but more pages would end up being created as a result.\n   */\n  ROW_PIXEL_THRESHOLD = 2,\n  /**\n   * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n   * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n   * 4096 squared image takes up 16MB of GPU memory.\n   */\n  FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n  x: number;\n  y: number;\n  height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n  private _didWarmUp: boolean = false;\n\n  private _cacheMap: FourKeyMap<number, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n  private _cacheMapCombined: FourKeyMap<string, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n\n  // The texture that the atlas is drawn to\n  private _pages: AtlasPage[] = [];\n  public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n  // The set of atlas pages that can be written to\n  private _activePages: AtlasPage[] = [];\n\n  private _tmpCanvas: HTMLCanvasElement;\n  // A temporary context that glyphs are drawn to before being transfered to the atlas.\n  private _tmpCtx: CanvasRenderingContext2D;\n\n  private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n  private _workAttributeData: AttributeData = new AttributeData();\n\n  private _textureSize: number = 512;\n\n  public static maxAtlasPages: number | undefined;\n  public static maxTextureSize: number | undefined;\n\n  private readonly _onAddTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n  constructor(\n    private readonly _document: Document,\n    private readonly _config: ICharAtlasConfig,\n    private readonly _unicodeService: IUnicodeService\n  ) {\n    this._createNewPage();\n    this._tmpCanvas = createCanvas(\n      _document,\n      this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n      this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n    );\n    this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n      alpha: this._config.allowTransparency,\n      willReadFrequently: true\n    }));\n  }\n\n  public dispose(): void {\n    for (const page of this.pages) {\n      page.canvas.remove();\n    }\n    this._onAddTextureAtlasCanvas.dispose();\n  }\n\n  public warmUp(): void {\n    if (!this._didWarmUp) {\n      this._doWarmUp();\n      this._didWarmUp = true;\n    }\n  }\n\n  private _doWarmUp(): void {\n    // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n    const queue = new IdleTaskQueue();\n    for (let i = 33; i < 126; i++) {\n      queue.enqueue(() => {\n        if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n          const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT);\n          this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n        }\n      });\n    }\n  }\n\n  private _requestClearModel = false;\n  public beginFrame(): boolean {\n    return this._requestClearModel;\n  }\n\n  public clearTexture(): void {\n    if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n      return;\n    }\n    for (const page of this._pages) {\n      page.clear();\n    }\n    this._cacheMap.clear();\n    this._cacheMapCombined.clear();\n    this._didWarmUp = false;\n  }\n\n  private _createNewPage(): AtlasPage {\n    // Try merge the set of the 4 most used pages of the largest size. This is is deferred to a\n    // microtask to ensure it does not interrupt textures that will be rendered in the current\n    // animation frame which would result in blank rendered areas. This is actually not that\n    // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n    if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n      // Find the set of the largest 4 images, below the maximum size, with the highest\n      // percentages used\n      const pagesBySize = this._pages.filter(e => {\n        return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n      }).sort((a, b) => {\n        if (b.canvas.width !== a.canvas.width) {\n          return b.canvas.width - a.canvas.width;\n        }\n        return b.percentageUsed - a.percentageUsed;\n      });\n      let sameSizeI = -1;\n      let size = 0;\n      for (let i = 0; i < pagesBySize.length; i++) {\n        if (pagesBySize[i].canvas.width !== size) {\n          sameSizeI = i;\n          size = pagesBySize[i].canvas.width;\n        } else if (i - sameSizeI === 3) {\n          break;\n        }\n      }\n\n      // Gather details of the merge\n      const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n      const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a > b ? 1 : -1);\n      const mergedPageIndex = this.pages.length - mergingPages.length;\n\n      // Merge into the new page\n      const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n      mergedPage.version++;\n\n      // Delete the pages, shifting glyph texture pages as needed\n      for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n        this._deletePage(sortedMergingPagesIndexes[i]);\n      }\n\n      // Add the new merged page to the end\n      this.pages.push(mergedPage);\n\n      // Request the model to be cleared to refresh all texture pages.\n      this._requestClearModel = true;\n      this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n    }\n\n    // All new atlas pages are created small as they are highly dynamic\n    const newPage = new AtlasPage(this._document, this._textureSize);\n    this._pages.push(newPage);\n    this._activePages.push(newPage);\n    this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n    return newPage;\n  }\n\n  private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n    const mergedSize = mergingPages[0].canvas.width * 2;\n    const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n    for (const [i, p] of mergingPages.entries()) {\n      const xOffset = i * p.canvas.width % mergedSize;\n      const yOffset = Math.floor(i / 2) * p.canvas.height;\n      mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n      for (const g of p.glyphs) {\n        g.texturePage = mergedPageIndex;\n        g.sizeClipSpace.x = g.size.x / mergedSize;\n        g.sizeClipSpace.y = g.size.y / mergedSize;\n        g.texturePosition.x += xOffset;\n        g.texturePosition.y += yOffset;\n        g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n        g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n      }\n\n      this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n      // Remove the merging page from active pages if it was there\n      const index = this._activePages.indexOf(p);\n      if (index !== -1) {\n        this._activePages.splice(index, 1);\n      }\n    }\n    return mergedPage;\n  }\n\n  private _deletePage(pageIndex: number): void {\n    this._pages.splice(pageIndex, 1);\n    for (let j = pageIndex; j < this._pages.length; j++) {\n      const adjustingPage = this._pages[j];\n      for (const g of adjustingPage.glyphs) {\n        g.texturePage--;\n      }\n      adjustingPage.version++;\n    }\n  }\n\n  public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n    return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight);\n  }\n\n  public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n    return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight);\n  }\n\n  /**\n   * Gets the glyphs texture coords, drawing the texture if it's not already\n   */\n  private _getFromCacheMap(\n    cacheMap: FourKeyMap<string | number, number, number, number, IRasterizedGlyph>,\n    key: string | number,\n    bg: number,\n    fg: number,\n    ext: number,\n    restrictToCellHeight: boolean = false\n  ): IRasterizedGlyph {\n    $glyph = cacheMap.get(key, bg, fg, ext);\n    if (!$glyph) {\n      $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight);\n      cacheMap.set(key, bg, fg, ext, $glyph);\n    }\n    return $glyph;\n  }\n\n  private _getColorFromAnsiIndex(idx: number): IColor {\n    if (idx >= this._config.colors.ansi.length) {\n      throw new Error('No color found for idx ' + idx);\n    }\n    return this._config.colors.ansi[idx];\n  }\n\n  private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n    if (this._config.allowTransparency) {\n      // The background color might have some transparency, so we need to render it as fully\n      // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n      // around the anti-aliased edges of the glyph, and it would look too dark.\n      return NULL_COLOR;\n    }\n\n    let result: IColor;\n    switch (bgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        result = this._getColorFromAnsiIndex(bgColor);\n        break;\n      case Attributes.CM_RGB:\n        const arr = AttributeData.toColorRGB(bgColor);\n        // TODO: This object creation is slow\n        result = rgba.toColor(arr[0], arr[1], arr[2]);\n        break;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          result = color.opaque(this._config.colors.foreground);\n        } else {\n          result = this._config.colors.background;\n        }\n        break;\n    }\n\n    return result;\n  }\n\n  private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n    const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, false, bold, dim, excludeFromContrastRatioDemands);\n    if (minimumContrastColor) {\n      return minimumContrastColor;\n    }\n\n    let result: IColor;\n    switch (fgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n          fgColor += 8;\n        }\n        result = this._getColorFromAnsiIndex(fgColor);\n        break;\n      case Attributes.CM_RGB:\n        const arr = AttributeData.toColorRGB(fgColor);\n        result = rgba.toColor(arr[0], arr[1], arr[2]);\n        break;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          result = this._config.colors.background;\n        } else {\n          result = this._config.colors.foreground;\n        }\n    }\n\n    // Always use an opaque color regardless of allowTransparency\n    if (this._config.allowTransparency) {\n      result = color.opaque(result);\n    }\n\n    // Apply dim to the color, opacity is fine to use for the foreground color\n    if (dim) {\n      result = color.multiplyOpacity(result, DIM_OPACITY);\n    }\n\n    return result;\n  }\n\n  private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n    switch (bgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        return this._getColorFromAnsiIndex(bgColor).rgba;\n      case Attributes.CM_RGB:\n        return bgColor << 8;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          return this._config.colors.foreground.rgba;\n        }\n        return this._config.colors.background.rgba;\n    }\n  }\n\n  private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n    switch (fgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n          fgColor += 8;\n        }\n        return this._getColorFromAnsiIndex(fgColor).rgba;\n      case Attributes.CM_RGB:\n        return fgColor << 8;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          return this._config.colors.background.rgba;\n        }\n        return this._config.colors.foreground.rgba;\n    }\n  }\n\n  private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n    if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n      return undefined;\n    }\n\n    // Try get from cache first\n    const cache = this._getContrastCache(dim);\n    const adjustedColor = cache.getColor(bg, fg);\n    if (adjustedColor !== undefined) {\n      return adjustedColor || undefined;\n    }\n\n    const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n    const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n    // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n    // non-dim cells\n    const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n    if (!result) {\n      cache.setColor(bg, fg, null);\n      return undefined;\n    }\n\n    const color = rgba.toColor(\n      (result >> 24) & 0xFF,\n      (result >> 16) & 0xFF,\n      (result >> 8) & 0xFF\n    );\n    cache.setColor(bg, fg, color);\n\n    return color;\n  }\n\n  private _getContrastCache(dim: boolean): IColorContrastCache {\n    if (dim) {\n      return this._config.colors.halfContrastCache;\n    }\n    return this._config.colors.contrastCache;\n  }\n\n  @traceCall\n  private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph {\n    const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n    // Uncomment for debugging\n    // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n    // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n    // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n    // giant ligatures (eg. =====>) don't impact overall performance.\n    const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._textureSize);\n    if (this._tmpCanvas.width < allowedWidth) {\n      this._tmpCanvas.width = allowedWidth;\n    }\n    // Include line height when drawing glyphs\n    const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n    if (this._tmpCanvas.height < allowedHeight) {\n      this._tmpCanvas.height = allowedHeight;\n    }\n    this._tmpCtx.save();\n\n    this._workAttributeData.fg = fg;\n    this._workAttributeData.bg = bg;\n    this._workAttributeData.extended.ext = ext;\n\n    const invisible = !!this._workAttributeData.isInvisible();\n    if (invisible) {\n      return NULL_RASTERIZED_GLYPH;\n    }\n\n    const bold = !!this._workAttributeData.isBold();\n    const inverse = !!this._workAttributeData.isInverse();\n    const dim = !!this._workAttributeData.isDim();\n    const italic = !!this._workAttributeData.isItalic();\n    const underline = !!this._workAttributeData.isUnderline();\n    const strikethrough = !!this._workAttributeData.isStrikethrough();\n    const overline = !!this._workAttributeData.isOverline();\n    let fgColor = this._workAttributeData.getFgColor();\n    let fgColorMode = this._workAttributeData.getFgColorMode();\n    let bgColor = this._workAttributeData.getBgColor();\n    let bgColorMode = this._workAttributeData.getBgColorMode();\n    if (inverse) {\n      const temp = fgColor;\n      fgColor = bgColor;\n      bgColor = temp;\n      const temp2 = fgColorMode;\n      fgColorMode = bgColorMode;\n      bgColorMode = temp2;\n    }\n\n    // draw the background\n    const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n    // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n    // regardless of transparency in backgroundColor\n    this._tmpCtx.globalCompositeOperation = 'copy';\n    this._tmpCtx.fillStyle = backgroundColor.css;\n    this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n    this._tmpCtx.globalCompositeOperation = 'source-over';\n\n    // draw the foreground/glyph\n    const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n    const fontStyle = italic ? 'italic' : '';\n    this._tmpCtx.font =\n      `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n    this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n    const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n    const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n    const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, excludeFromContrastRatioDemands(chars.charCodeAt(0)));\n    this._tmpCtx.fillStyle = foregroundColor.css;\n\n    // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n    const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n    // Draw custom characters if applicable\n    let customGlyph = false;\n    if (this._config.customGlyphs !== false) {\n      customGlyph = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio);\n    }\n\n    // Whether to clear pixels based on a threshold difference between the glyph color and the\n    // background color. This should be disabled when the glyph contains multiple colors such as\n    // underline colors to prevent important colors could get cleared.\n    let enableClearThresholdCheck = !powerlineGlyph;\n\n    let chWidth: number;\n    if (typeof codeOrChars === 'number') {\n      chWidth = this._unicodeService.wcwidth(codeOrChars);\n    } else {\n      chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n    }\n\n    // Draw underline\n    if (underline) {\n      this._tmpCtx.save();\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n      // When the line width is odd, draw at a 0.5 position\n      const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n      this._tmpCtx.lineWidth = lineWidth;\n\n      // Underline color\n      if (this._workAttributeData.isUnderlineColorDefault()) {\n        this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      } else if (this._workAttributeData.isUnderlineColorRGB()) {\n        enableClearThresholdCheck = false;\n        this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n      } else {\n        enableClearThresholdCheck = false;\n        let fg = this._workAttributeData.getUnderlineColor();\n        if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n          fg += 8;\n        }\n        this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n      }\n\n      // Underline style/stroke\n      this._tmpCtx.beginPath();\n      const xLeft = padding;\n      const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n      const yMid = yTop + lineWidth;\n      const yBot = yTop + lineWidth * 2;\n\n      for (let i = 0; i < chWidth; i++) {\n        this._tmpCtx.save();\n        const xChLeft = xLeft + i * this._config.deviceCellWidth;\n        const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n        const xChMid = xChLeft + this._config.deviceCellWidth / 2;\n        switch (this._workAttributeData.extended.underlineStyle) {\n          case UnderlineStyle.DOUBLE:\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            this._tmpCtx.moveTo(xChLeft, yBot);\n            this._tmpCtx.lineTo(xChRight, yBot);\n            break;\n          case UnderlineStyle.CURLY:\n            // Choose the bezier top and bottom based on the device pixel ratio, the curly line is\n            // made taller when the line width is  as otherwise it's not very clear otherwise.\n            const yCurlyBot = lineWidth <= 1 ? yBot : Math.ceil(padding + this._config.deviceCharHeight - lineWidth / 2) - yOffset;\n            const yCurlyTop = lineWidth <= 1 ? yTop : Math.ceil(padding + this._config.deviceCharHeight + lineWidth / 2) - yOffset;\n            // Clip the left and right edges of the underline such that it can be drawn just outside\n            // the edge of the cell to ensure a continuous stroke when there are multiple underlined\n            // glyphs adjacent to one another.\n            const clipRegion = new Path2D();\n            clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n            this._tmpCtx.clip(clipRegion);\n            // Start 1/2 cell before and end 1/2 cells after to ensure a smooth curve with other\n            // cells\n            this._tmpCtx.moveTo(xChLeft - this._config.deviceCellWidth / 2, yMid);\n            this._tmpCtx.bezierCurveTo(\n              xChLeft - this._config.deviceCellWidth / 2, yCurlyTop,\n              xChLeft, yCurlyTop,\n              xChLeft, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChLeft, yCurlyBot,\n              xChMid, yCurlyBot,\n              xChMid, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChMid, yCurlyTop,\n              xChRight, yCurlyTop,\n              xChRight, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChRight, yCurlyBot,\n              xChRight + this._config.deviceCellWidth / 2, yCurlyBot,\n              xChRight + this._config.deviceCellWidth / 2, yMid\n            );\n            break;\n          case UnderlineStyle.DOTTED:\n            this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n          case UnderlineStyle.DASHED:\n            this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]);\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n          case UnderlineStyle.SINGLE:\n          default:\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n        }\n        this._tmpCtx.stroke();\n        this._tmpCtx.restore();\n      }\n      this._tmpCtx.restore();\n\n      // Draw stroke in the background color for non custom characters in order to give an outline\n      // between the text and the underline. Only do this when font size is >= 12 as the underline\n      // looks odd when the font size is too small\n      if (!customGlyph && this._config.fontSize >= 12) {\n        // This only works when transparency is disabled because it's not clear how to clear stroked\n        // text\n        if (!this._config.allowTransparency && chars !== ' ') {\n          // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n          // baseline\n          this._tmpCtx.save();\n          this._tmpCtx.textBaseline = 'alphabetic';\n          const metrics = this._tmpCtx.measureText(chars);\n          this._tmpCtx.restore();\n          if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n            // This translates to 1/2 the line width in either direction\n            this._tmpCtx.save();\n            // Clip the region to only draw in valid pixels near the underline to avoid a slight\n            // outline around the whole glyph, as well as additional pixels in the glyph at the top\n            // which would increase GPU memory demands\n            const clipRegion = new Path2D();\n            clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n            this._tmpCtx.clip(clipRegion);\n            this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n            this._tmpCtx.strokeStyle = backgroundColor.css;\n            this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n            this._tmpCtx.restore();\n          }\n        }\n      }\n    }\n\n    // Overline\n    if (overline) {\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n      const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n      this._tmpCtx.lineWidth = lineWidth;\n      this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      this._tmpCtx.beginPath();\n      this._tmpCtx.moveTo(padding, padding + yOffset);\n      this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n      this._tmpCtx.stroke();\n    }\n\n    // Draw the character\n    if (!customGlyph) {\n      this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n    }\n\n    // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n    // even on the bottom row, try for a maximum of 5 pixels.\n    if (chars === '_' && !this._config.allowTransparency) {\n      let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n      if (isBeyondCellBounds) {\n        for (let offset = 1; offset <= 5; offset++) {\n          this._tmpCtx.save();\n          this._tmpCtx.fillStyle = backgroundColor.css;\n          this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n          this._tmpCtx.restore();\n          this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n          isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n          if (!isBeyondCellBounds) {\n            break;\n          }\n        }\n      }\n    }\n\n    // Draw strokethrough\n    if (strikethrough) {\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n      const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n      this._tmpCtx.lineWidth = lineWidth;\n      this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      this._tmpCtx.beginPath();\n      this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n      this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n      this._tmpCtx.stroke();\n    }\n\n    this._tmpCtx.restore();\n\n    // clear the background from the character to avoid issues with drawing over the previous\n    // character if it extends past it's bounds\n    const imageData = this._tmpCtx.getImageData(\n      0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n    );\n\n    // Clear out the background color and determine if the glyph is empty.\n    let isEmpty: boolean;\n    if (!this._config.allowTransparency) {\n      isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n    } else {\n      isEmpty = checkCompletelyTransparent(imageData);\n    }\n\n    // Handle empty glyphs\n    if (isEmpty) {\n      return NULL_RASTERIZED_GLYPH;\n    }\n\n    const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n    // Find the best atlas row to use\n    let activePage: AtlasPage;\n    let activeRow: ICharAtlasActiveRow;\n    while (true) {\n      // If there are no active pages (the last smallest 4 were merged), create a new one\n      if (this._activePages.length === 0) {\n        const newPage = this._createNewPage();\n        activePage = newPage;\n        activeRow = newPage.currentRow;\n        activeRow.height = rasterizedGlyph.size.y;\n        break;\n      }\n\n      // Get the best current row from all active pages\n      activePage = this._activePages[this._activePages.length - 1];\n      activeRow = activePage.currentRow;\n      for (const p of this._activePages) {\n        if (rasterizedGlyph.size.y <= p.currentRow.height) {\n          activePage = p;\n          activeRow = p.currentRow;\n        }\n      }\n\n      // TODO: This algorithm could be simplified:\n      // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n      // - Keep track of current/fixed rows in a Map\n\n      // Replace the best current row with a fixed row if there is one at least as good as the\n      // current row. Search in reverse to prioritize filling in older pages.\n      for (let i = this._activePages.length - 1; i >= 0; i--) {\n        for (const row of this._activePages[i].fixedRows) {\n          if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n            activePage = this._activePages[i];\n            activeRow = row;\n          }\n        }\n      }\n\n      // Create a new page if too much vertical space would be wasted or there is not enough room\n      // left in the page. The previous active row will become fixed in the process as it now has a\n      // fixed height\n      if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n        // Create the new fixed height row, creating a new page if there isn't enough room on the\n        // current page\n        let wasPageAndRowFound = false;\n        if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n          // Find the first page with room to create the new row on\n          let candidatePage: AtlasPage | undefined;\n          for (const p of this._activePages) {\n            if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n              candidatePage = p;\n              break;\n            }\n          }\n          if (candidatePage) {\n            activePage = candidatePage;\n          } else {\n            // Before creating a new atlas page that would trigger a page merge, check if the\n            // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n            // improve texture utilization by using the available space before the page is merged\n            // and becomes static.\n            if (\n              TextureAtlas.maxAtlasPages &&\n              this._pages.length >= TextureAtlas.maxAtlasPages &&\n              activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n              activeRow.height >= rasterizedGlyph.size.y &&\n              activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n            ) {\n              // activePage and activeRow is already valid\n              wasPageAndRowFound = true;\n            } else {\n              // Create a new page if there is no room\n              const newPage = this._createNewPage();\n              activePage = newPage;\n              activeRow = newPage.currentRow;\n              activeRow.height = rasterizedGlyph.size.y;\n              wasPageAndRowFound = true;\n            }\n          }\n        }\n        if (!wasPageAndRowFound) {\n          // Fix the current row as the new row is being added below\n          if (activePage.currentRow.height > 0) {\n            activePage.fixedRows.push(activePage.currentRow);\n          }\n          activeRow = {\n            x: 0,\n            y: activePage.currentRow.y + activePage.currentRow.height,\n            height: rasterizedGlyph.size.y\n          };\n          activePage.fixedRows.push(activeRow);\n\n          // Create the new current row below the new fixed height row\n          activePage.currentRow = {\n            x: 0,\n            y: activeRow.y + activeRow.height,\n            height: 0\n          };\n        }\n        // TODO: Remove pages from _activePages when all rows are filled\n      }\n\n      // Exit the loop if there is enough room in the row\n      if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n        break;\n      }\n\n      // If there is not enough room in the current row, finish it and try again\n      if (activeRow === activePage.currentRow) {\n        activeRow.x = 0;\n        activeRow.y += activeRow.height;\n        activeRow.height = 0;\n      } else {\n        activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n      }\n    }\n\n    // Record texture position\n    rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n    rasterizedGlyph.texturePosition.x = activeRow.x;\n    rasterizedGlyph.texturePosition.y = activeRow.y;\n    rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n    rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n    // Fix the clipspace position as pages may be of differing size\n    rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n    rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n    // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n    // height\n    activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n    activeRow.x += rasterizedGlyph.size.x;\n\n    // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n    activePage.ctx.putImageData(\n      imageData,\n      rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n      rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n      this._workBoundingBox.left,\n      this._workBoundingBox.top,\n      rasterizedGlyph.size.x,\n      rasterizedGlyph.size.y\n    );\n    activePage.addGlyph(rasterizedGlyph);\n    activePage.version++;\n\n    return rasterizedGlyph;\n  }\n\n  /**\n   * Given an ImageData object, find the bounding box of the non-transparent\n   * portion of the texture and return an IRasterizedGlyph with these\n   * dimensions.\n   * @param imageData The image data to read.\n   * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n   */\n  private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n    boundingBox.top = 0;\n    const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n    const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n    let found = false;\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.top = y;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.left = 0;\n    found = false;\n    for (let x = 0; x < padding + width; x++) {\n      for (let y = 0; y < height; y++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.left = x;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.right = width;\n    found = false;\n    for (let x = padding + width - 1; x >= padding; x--) {\n      for (let y = 0; y < height; y++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.right = x;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.bottom = height;\n    found = false;\n    for (let y = height - 1; y >= 0; y--) {\n      for (let x = 0; x < width; x++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.bottom = y;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    return {\n      texturePage: 0,\n      texturePosition: { x: 0, y: 0 },\n      texturePositionClipSpace: { x: 0, y: 0 },\n      size: {\n        x: boundingBox.right - boundingBox.left + 1,\n        y: boundingBox.bottom - boundingBox.top + 1\n      },\n      sizeClipSpace: {\n        x: (boundingBox.right - boundingBox.left + 1),\n        y: (boundingBox.bottom - boundingBox.top + 1)\n      },\n      offset: {\n        x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n        y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n      }\n    };\n  }\n}\n\nclass AtlasPage {\n  public readonly canvas: HTMLCanvasElement;\n  public readonly ctx: CanvasRenderingContext2D;\n\n  private _usedPixels: number = 0;\n  public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n  private readonly _glyphs: IRasterizedGlyph[] = [];\n  public get glyphs(): ReadonlyArray<IRasterizedGlyph> { return this._glyphs; }\n  public addGlyph(glyph: IRasterizedGlyph): void {\n    this._glyphs.push(glyph);\n    this._usedPixels += glyph.size.x * glyph.size.y;\n  }\n\n  /**\n   * Used to check whether the canvas of the atlas page has changed.\n   */\n  public version = 0;\n\n  // Texture atlas current positioning data. The texture packing strategy used is to fill from\n  // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n  // row's height, the following happens:\n  //\n  // - The current row becomes the fixed height row A\n  // - A new fixed height row B the exact size of the glyph is created below the current row\n  // - A new dynamic height current row is created below B\n  //\n  // This strategy does a good job preventing space being wasted for very short glyphs such as\n  // underscores, hyphens etc. or those with underlines rendered.\n  public currentRow: ICharAtlasActiveRow = {\n    x: 0,\n    y: 0,\n    height: 0\n  };\n  public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n  constructor(\n    document: Document,\n    size: number,\n    sourcePages?: AtlasPage[]\n  ) {\n    if (sourcePages) {\n      for (const p of sourcePages) {\n        this._glyphs.push(...p.glyphs);\n        this._usedPixels += p._usedPixels;\n      }\n    }\n    this.canvas = createCanvas(document, size, size);\n    // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n    // It might also contain some characters with transparent backgrounds if allowTransparency is\n    // set.\n    this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n  }\n\n  public clear(): void {\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n    this.currentRow.x = 0;\n    this.currentRow.y = 0;\n    this.currentRow.height = 0;\n    this.fixedRows.length = 0;\n    this.version++;\n  }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n  // Get color channels\n  const r = bg.rgba >>> 24;\n  const g = bg.rgba >>> 16 & 0xFF;\n  const b = bg.rgba >>> 8 & 0xFF;\n  const fgR = fg.rgba >>> 24;\n  const fgG = fg.rgba >>> 16 & 0xFF;\n  const fgB = fg.rgba >>> 8 & 0xFF;\n\n  // Calculate a threshold that when below a color will be treated as transpart when the sum of\n  // channel value differs. This helps improve rendering when glyphs overlap with others. This\n  // threshold is calculated relative to the difference between the background and foreground to\n  // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n  // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n  // were covered (fg=#8ae234, bg=#c4a000).\n  const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n  // Set alpha channel of relevent pixels to 0\n  let isEmpty = true;\n  for (let offset = 0; offset < imageData.data.length; offset += 4) {\n    // Check exact match\n    if (imageData.data[offset] === r &&\n        imageData.data[offset + 1] === g &&\n        imageData.data[offset + 2] === b) {\n      imageData.data[offset + 3] = 0;\n    } else {\n      // Check the threshold based difference\n      if (enableThresholdCheck &&\n          (Math.abs(imageData.data[offset] - r) +\n          Math.abs(imageData.data[offset + 1] - g) +\n          Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n        imageData.data[offset + 3] = 0;\n      } else {\n        isEmpty = false;\n      }\n    }\n  }\n\n  return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n  for (let offset = 0; offset < imageData.data.length; offset += 4) {\n    if (imageData.data[offset + 3] > 0) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n  const canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  return canvas;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n  css: '#00000000',\n  rgba: 0\n};\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    $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    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $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    [$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    $a = Math.round(opacity * 0xFF);\n    [$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    $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',\n * '#rrggbbaa').\n */\nexport namespace css {\n  let $ctx: CanvasRenderingContext2D | undefined;\n  let $litmusColor: CanvasGradient | undefined;\n  if (!isNode) {\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext('2d', {\n      willReadFrequently: true\n    });\n    if (ctx) {\n      $ctx = ctx;\n      $ctx.globalCompositeOperation = 'copy';\n      $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n    }\n  }\n\n  /**\n   * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n   * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n   *\n   * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n   * environment.\n   */\n  export function toColor(css: string): IColor {\n    // Formats: #rgb[a] and #rrggbb[aa]\n    if (css.match(/#[\\da-f]{3,8}/i)) {\n      switch (css.length) {\n        case 4: { // #rgb\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          return rgba.toColor($r, $g, $b);\n        }\n        case 5: { // #rgba\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          $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\n    // Formats: rgb() or rgba()\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) {\n      $r = parseInt(rgbaMatch[1]);\n      $g = parseInt(rgbaMatch[2]);\n      $b = parseInt(rgbaMatch[3]);\n      $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n      return rgba.toColor($r, $g, $b, $a);\n    }\n\n    // Validate the context is available for canvas-based color parsing\n    if (!$ctx || !$litmusColor) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Validate the color using canvas fillStyle\n    // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n    $ctx.fillStyle = $litmusColor;\n    $ctx.fillStyle = css;\n    if (typeof $ctx.fillStyle !== 'string') {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    $ctx.fillRect(0, 0, 1, 1);\n    [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n    // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n    if ($a !== 0xFF) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n    // format\n    // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n    return {\n      rgba: channels.toRgba($r, $g, $b, $a),\n      css\n    };\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) 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    this.clearListeners();\n    this._disposed = true;\n  }\n\n  public clearListeners(): void {\n    if (this._listeners) {\n      this._listeners.length = 0;\n    }\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) 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  /**\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\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n  private _value?: T;\n  private _isDisposed = false;\n\n  /**\n   * Gets the value if it exists.\n   */\n  public get value(): T | undefined {\n    return this._isDisposed ? undefined : this._value;\n  }\n\n  /**\n   * Sets the value, disposing of the old value if it exists.\n   */\n  public set value(value: T | undefined) {\n    if (this._isDisposed || value === this._value) {\n      return;\n    }\n    this._value?.dispose();\n    this._value = value;\n  }\n\n  /**\n   * Resets the stored value and disposes of the previously stored value.\n   */\n  public clear(): void {\n    this.value = undefined;\n  }\n\n  public dispose(): void {\n    this._isDisposed = true;\n    this._value?.dispose();\n    this._value = undefined;\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\nexport const 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);\nexport function getSafariVersion(): number {\n  if (!isSafari) {\n    return 0;\n  }\n  const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n  if (majorVersion === null || majorVersion.length < 2) {\n    return 0;\n  }\n  return parseInt(majorVersion[1]);\n}\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// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n  /**\n   * Adds a task to the queue which will run in a future idle callback.\n   * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n   * should split their work into smaller pieces and return `true` to get\n   * called again until the work is done (on falsy return value).\n   */\n  enqueue(task: () => boolean | void): void;\n\n  /**\n   * Flushes the queue, running all remaining tasks synchronously.\n   */\n  flush(): void;\n\n  /**\n   * Clears any remaining tasks from the queue, these will not be run.\n   */\n  clear(): void;\n}\n\ninterface ITaskDeadline {\n  timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n  private _tasks: (() => boolean | void)[] = [];\n  private _idleCallback?: number;\n  private _i = 0;\n\n  protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n  protected abstract _cancelCallback(identifier: number): void;\n\n  public enqueue(task: () => boolean | void): void {\n    this._tasks.push(task);\n    this._start();\n  }\n\n  public flush(): void {\n    while (this._i < this._tasks.length) {\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n    }\n    this.clear();\n  }\n\n  public clear(): void {\n    if (this._idleCallback) {\n      this._cancelCallback(this._idleCallback);\n      this._idleCallback = undefined;\n    }\n    this._i = 0;\n    this._tasks.length = 0;\n  }\n\n  private _start(): void {\n    if (!this._idleCallback) {\n      this._idleCallback = this._requestCallback(this._process.bind(this));\n    }\n  }\n\n  private _process(deadline: ITaskDeadline): void {\n    this._idleCallback = undefined;\n    let taskDuration = 0;\n    let longestTask = 0;\n    let lastDeadlineRemaining = deadline.timeRemaining();\n    let deadlineRemaining = 0;\n    while (this._i < this._tasks.length) {\n      taskDuration = Date.now();\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n      // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n      // this is not an issue here as a clock change during a short running task is very unlikely\n      // in case it still happened and leads to negative duration, simply assume 1 msec\n      taskDuration = Math.max(1, Date.now() - taskDuration);\n      longestTask = Math.max(taskDuration, longestTask);\n      // Guess the following task will take a similar time to the longest task in this batch, allow\n      // additional room to try avoid exceeding the deadline\n      deadlineRemaining = deadline.timeRemaining();\n      if (longestTask * 1.5 > deadlineRemaining) {\n        // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n        // task should be split into sub-tasks to ensure the UI remains responsive.\n        if (lastDeadlineRemaining - taskDuration < -20) {\n          console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n        }\n        this._start();\n        return;\n      }\n      lastDeadlineRemaining = deadlineRemaining;\n    }\n    this.clear();\n  }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n  protected _requestCallback(callback: CallbackWithDeadline): number {\n    return setTimeout(() => callback(this._createDeadline(16)));\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    clearTimeout(identifier);\n  }\n\n  private _createDeadline(duration: number): ITaskDeadline {\n    const end = Date.now() + duration;\n    return {\n      timeRemaining: () => Math.max(0, end - Date.now())\n    };\n  }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n  protected _requestCallback(callback: IdleRequestCallback): number {\n    return requestIdleCallback(callback);\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    cancelIdleCallback(identifier);\n  }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n  private _queue: ITaskQueue;\n\n  constructor() {\n    this._queue = new IdleTaskQueue();\n  }\n\n  public set(task: () => boolean | void): void {\n    this._queue.clear();\n    this._queue.enqueue(task);\n  }\n\n  public flush(): void {\n    this._queue.flush();\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  public isOverline(): number      { return this.bg & BgFlags.OVERLINE; }\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) 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 = 0;\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  OVERLINE = 0x40000000\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) 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\n      // pair 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 */\n\nimport { Disposable } from 'common/Lifecycle';\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  trace: LogLevelEnum.TRACE,\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 extends Disposable implements ILogService {\n  public serviceBrand: any;\n\n  private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n  public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._updateLogLevel();\n    this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n    // For trace logging, assume the latest created log service is valid\n    traceLogger = this;\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, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n  }\n\n  public trace(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.TRACE) {\n      this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.DEBUG) {\n      this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.INFO) {\n      this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n    }\n  }\n\n  public warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.WARN) {\n      this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n    }\n  }\n\n  public error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.ERROR) {\n      this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n    }\n  }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n  traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n  if (typeof descriptor.value !== 'function') {\n    throw new Error('not supported');\n  }\n  const fnKey = 'value';\n  const fn = descriptor.value;\n  descriptor[fnKey] = function (...args: any[]) {\n    // Early exit\n    if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n      return fn.apply(this, args);\n    }\n\n    traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n    const result = fn.apply(this, args);\n    traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n    return result;\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 { 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, CursorInactiveStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } 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  scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): 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  readonly onRequestScrollToBottom: IEvent<void>;\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 wasUserInput 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 if option scrollOnUserInput is true.\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 interface IServiceIdentifier<T> {\n  (...args: any[]): void;\n  type: T;\n}\n\nexport interface IBrandedService {\n  serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n  : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\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  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: undefined;\n\n  readonly logLevel: LogLevelEnum;\n\n  trace(message: any, ...optionalParams: any[]): void;\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\n  /**\n   * Options as exposed through the public API, this property uses getters and setters with\n   * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n   * all internal usage for performance reasons.\n   */\n  readonly options: Required<ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when any option changes.\n   */\n  readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when a specific option changes, this is a convenience method that is\n   * preferred over {@link onOptionChange} when only a single option is being listened to.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n  /**\n   * Adds an event listener for when a set of specific options change, this is a convenience method\n   * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n   * handled the same way.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | '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  cursorInactiveStyle?: CursorInactiveStyle;\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  ignoreBracketedPasteMode?: boolean;\n  letterSpacing?: number;\n  lineHeight?: number;\n  linkHandler?: ILinkHandler | null;\n  logLevel?: LogLevel;\n  logger?: ILogger | null;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\n  minimumContrastRatio?: number;\n  rightClickSelectsWord?: boolean;\n  rows?: number;\n  screenReaderMode?: boolean;\n  scrollback?: number;\n  scrollOnUserInput?: boolean;\n  scrollSensitivity?: number;\n  smoothScrollDuration?: number;\n  tabStopWidth?: number;\n  theme?: ITheme;\n  windowsMode?: boolean;\n  windowsPty?: IWindowsPty;\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","// 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) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { ITerminalAddon, Terminal } from 'xterm';\nimport { WebglRenderer } from './WebglRenderer';\nimport { setTraceLogger } from 'common/services/LogService';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon {\n  private _terminal?: Terminal;\n  private _renderer?: WebglRenderer;\n\n  private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n  private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n  private readonly _onContextLoss = this.register(new EventEmitter<void>());\n  public readonly onContextLoss = this._onContextLoss.event;\n\n  constructor(\n    private _preserveDrawingBuffer?: boolean\n  ) {\n    if (isSafari && getSafariVersion() < 16) {\n      throw new Error('Webgl2 is only supported on Safari 16 and above');\n    }\n    super();\n  }\n\n  public activate(terminal: Terminal): void {\n    const core = (terminal as any)._core as ITerminal;\n    if (!terminal.element) {\n      this.register(core.onWillOpen(() => this.activate(terminal)));\n      return;\n    }\n\n    this._terminal = terminal;\n    const coreService: ICoreService = core.coreService;\n    const optionsService: IOptionsService = core.optionsService;\n\n    const unsafeCore = core as any;\n    const renderService: IRenderService = unsafeCore._renderService;\n    const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n    const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n    const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n    const decorationService: IDecorationService = unsafeCore._decorationService;\n    const logService: ILogService = unsafeCore._logService;\n    const themeService: IThemeService = unsafeCore._themeService;\n\n    // Set trace logger just in case it hasn't been yet which could happen when the addon is\n    // bundled separately to the core module\n    setTraceLogger(logService);\n\n    this._renderer = this.register(new WebglRenderer(\n      terminal,\n      characterJoinerService,\n      charSizeService,\n      coreBrowserService,\n      coreService,\n      decorationService,\n      optionsService,\n      themeService,\n      this._preserveDrawingBuffer\n    ));\n    this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss));\n    this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n    this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n    this.register(forwardEvent(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n    renderService.setRenderer(this._renderer);\n\n    this.register(toDisposable(() => {\n      const renderService: IRenderService = (this._terminal as any)._core._renderService;\n      renderService.setRenderer((this._terminal as any)._core._createRenderer());\n      renderService.handleResize(terminal.cols, terminal.rows);\n    }));\n  }\n\n  public get textureAtlas(): HTMLCanvasElement | undefined {\n    return this._renderer?.textureAtlas;\n  }\n\n  public clearTextureAtlas(): void {\n    this._renderer?.clearTextureAtlas();\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","self","INDICES_PER_CELL","BYTES_PER_CELL","Float32Array","BYTES_PER_ELEMENT","$glyph","$i","$leftCellPadding","$clippedPixels","GlyphRenderer","Disposable","constructor","_terminal","_gl","_dimensions","super","_activeBuffer","_vertices","count","attributes","attributesBuffers","gl","this","undefined","TextureAtlas","maxAtlasPages","Math","min","throwIfFalsy","getParameter","MAX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","_program","createProgram","maxFragmentShaderTextureUnits","textureConditionals","i","createFragmentShaderSource","register","toDisposable","deleteProgram","_projectionLocation","getUniformLocation","_resolutionLocation","_textureLocation","_vertexArrayObject","createVertexArray","bindVertexArray","unitQuadVertices","unitQuadVerticesBuffer","createBuffer","deleteBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","unitQuadElementIndices","Uint8Array","elementIndicesBuffer","ELEMENT_ARRAY_BUFFER","_attributesBuffer","vertexAttribDivisor","useProgram","textureUnits","Int32Array","uniform1iv","uniformMatrix4fv","PROJECTION_MATRIX","_atlasTextures","glTexture","GLTexture","createTexture","deleteTexture","texture","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","RGBA","UNSIGNED_BYTE","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","handleResize","beginFrame","_atlas","updateCell","x","y","code","bg","fg","ext","chars","lastBg","_updateCell","array","cols","NULL_CELL_CODE","length","getRasterizedGlyphCombinedChar","getRasterizedGlyph","floor","device","cell","width","char","offset","left","top","size","canvas","height","texturePage","texturePositionClipSpace","pages","sizeClipSpace","fill","clear","terminal","newCount","rows","viewport","uniform2f","render","renderModel","activeBuffer","bufferLength","lineLengths","si","sub","subarray","set","STREAM_DRAW","version","_bindAtlasPageTexture","drawElementsInstanced","TRIANGLE_STRIP","setAtlas","atlas","generateMipmap","setDimensions","dimensions","traceCall","BYTES_PER_RECTANGLE","Vertices","$rgba","$x1","$y1","$r","$g","$b","$a","RectangleRenderer","_themeService","_verticesCursor","_updateCachedColors","colors","onChangeColors","e","_updateViewportRectangle","renderBackgrounds","_renderVertices","renderCursor","vertices","DYNAMIC_DRAW","_bgFloat","_colorToFloat32Array","background","_cursorFloat","cursor","_addRectangleFloat","updateBackgrounds","model","currentStartX","currentBg","currentFg","currentInverse","modelIndex","inverse","rectangleCount","RENDER_MODEL_INDICIES_PER_CELL","cells","RENDER_MODEL_BG_OFFSET","RENDER_MODEL_FG_OFFSET","_updateRectangle","updateCursor","style","dpr","cursorWidth","startX","endX","ansi","rgba","foreground","expandFloat32Array","_addRectangle","x1","y1","r","g","b","a","color","RENDER_MODEL_EXT_OFFSET","COMBINED_CHAR_BIT_MASK","Uint32Array","selection","createSelectionRenderModel","resize","indexCount","WebglRenderer","_characterJoinerService","_charSizeService","_coreBrowserService","_coreService","_decorationService","_optionsService","preserveDrawingBuffer","_cursorBlinkStateManager","MutableDisposable","_charAtlasDisposable","_model","RenderModel","_workCell","CellData","_rectangleRenderer","_glyphRenderer","_onChangeTextureAtlas","EventEmitter","onChangeTextureAtlas","event","_onAddTextureAtlasCanvas","onAddTextureAtlasCanvas","_onRemoveTextureAtlasCanvas","onRemoveTextureAtlasCanvas","_onRequestRedraw","onRequestRedraw","_onContextLoss","onContextLoss","_handleColorChange","_cellColorResolver","CellColorResolver","_core","_renderLayers","LinkRenderLayer","screenElement","linkifier2","createRenderDimensions","_devicePixelRatio","_updateDimensions","_updateCursorBlink","onOptionChange","_handleOptionsChanged","_canvas","document","createElement","contextAttributes","antialias","depth","getContext","Error","addDisposableDomListener","console","log","preventDefault","_contextRestorationTimeout","setTimeout","warn","fire","clearTimeout","removeTerminalFromCache","_initializeWebGLState","_requestRedrawViewport","observeDevicePixelDimensions","window","w","h","_setCanvasDevicePixelDimensions","appendChild","value","_isAttached","body","contains","l","dispose","parentElement","removeChild","textureAtlas","_charAtlas","_refreshCharAtlas","_clearModel","handleDevicePixelRatioChange","css","handleCharSizeChanged","handleBlur","pause","handleFocus","resume","handleSelectionChanged","start","end","columnSelectMode","update","handleCursorMove","restartBlinkAnimation","acquireTextureAtlas","rawOptions","getDisposeArrayDisposable","forwardEvent","warmUp","clearGlyphRenderer","clearTextureAtlas","clearTexture","reset","registerCharacterJoiner","handler","deregisterCharacterJoiner","joinerId","renderRows","handleGridChanged","_updateModel","isCursorVisible","options","cursorBlink","CursorBlinkStateManager","_requestRedrawCursor","row","line","joinedRanges","isJoined","lastCharX","range","j","clamp","cursorY","buffer","active","baseY","cursorX","lastCursorX","isCursorInitialized","isCursorHidden","modelUpdated","ydisp","lines","get","getJoinedCharacters","result","loadCell","shift","JoinedCellData","translateToString","getChars","getCode","resolve","getWidth","isFocused","cursorStyle","cursorInactiveStyle","cursorAccent","NULL_CELL_CHAR","ceil","lineHeight","round","letterSpacing","AttributeData","firstCell","content","combinedData","_width","isCombined","setFromCharData","getAsCharData","max","createShader","type","source","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","error","getShaderInfoLog","deleteShader","vertexSource","fragmentSource","program","attachShader","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","newLength","newArray","BaseRenderLayer","_container","id","zIndex","_alpha","_deviceCharWidth","_deviceCharHeight","_deviceCellWidth","_deviceCellHeight","_deviceCharLeft","_deviceCharTop","classList","add","toString","_initCanvas","remove","_ctx","alpha","_clearAll","startRow","endRow","_setTransparency","oldCanvas","cloneNode","replaceChild","colorSet","dim","_fillBottomLineAtCells","fillRect","clearRect","fillStyle","_clearCells","_fillCharTrueColor","font","_getFont","textBaseline","TEXT_BASELINE","_clipCell","fillText","beginPath","rect","clip","isBold","isItalic","fontWeightBold","fontWeight","fontSize","fontFamily","container","coreBrowserService","optionsService","themeService","onShowLinkUnderline","_handleShowLinkUnderline","onHideLinkUnderline","_handleHideLinkUnderline","_state","_clearCurrentLink","middleRowCount","y2","x2","INVERTED_DEFAULT_COLOR","is256Color","node","addEventListener","disposed","removeEventListener","$colors","$fg","$bg","$hasFg","$hasBg","$isSelected","_selectionRenderModel","extended","forEachDecorationAtCell","d","backgroundColorRGB","foregroundColorRGB","isCellSelected","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","selectionForeground","charAtlasCache","deviceCellWidth","deviceCellHeight","deviceCharWidth","deviceCharHeight","devicePixelRatio","newConfig","generateConfig","entry","ownedByIndex","ownedBy","indexOf","configEquals","config","splice","push","core","newEntry","unicodeService","index","clonedColors","NULL_COLOR","selectionBackgroundTransparent","selectionInactiveBackgroundTransparent","slice","contrastCache","halfContrastCache","customGlyphs","allowTransparency","drawBoldTextInBrightColors","minimumContrastRatio","colorCode","DIM_OPACITY","isFirefox","isLegacyEdge","_renderCallback","_restartInterval","isPaused","_blinkStartTimeout","_blinkInterval","clearInterval","_animationFrame","cancelAnimationFrame","_animationTimeRestarted","Date","now","requestAnimationFrame","timeToStart","BLINK_INTERVAL","time","setInterval","blockElementDefinitions","patternCharacterDefinitions","boxDrawingDefinitions","xp","yp","powerlineDefinitions","rightPadding","leftPadding","ctx","c","xOffset","yOffset","blockElementDefinition","charDefinition","box","xEighth","yEighth","drawBlockElementChar","patternDefinition","patternSet","cachedPatterns","Map","pattern","tmpCanvas","tmpCtx","imageData","ImageData","startsWith","parseInt","substring","split","map","parseFloat","data","putImageData","createPattern","drawPatternChar","boxDrawingDefinition","strokeStyle","instructions","Object","entries","actualInstructions","lineWidth","Number","instruction","f","svgToCanvasInstructionMap","args","translateArgs","stroke","closePath","drawBoxDrawingChar","powerlineDefinition","clipRegion","Path2D","cssLineWidth","drawPowerlineChar","bezierCurveTo","lineTo","moveTo","cellWidth","cellHeight","doClamp","element","parentWindow","callback","observer","ResizeObserver","find","target","disconnect","devicePixelContentBoxSize","inlineSize","blockSize","observe","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","SelectionRenderModel","hasSelection","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startCol","endCol","selectionStart","selectionEnd","viewportY","NULL_RASTERIZED_GLYPH","texturePosition","_pages","_document","_config","_unicodeService","_didWarmUp","_cacheMap","FourKeyMap","_cacheMapCombined","_activePages","_workBoundingBox","bottom","right","_workAttributeData","_textureSize","_requestClearModel","_createNewPage","_tmpCanvas","createCanvas","TMP_CANVAS_GLYPH_PADDING","_tmpCtx","willReadFrequently","page","_doWarmUp","queue","IdleTaskQueue","enqueue","DEFAULT_COLOR","DEFAULT_EXT","rasterizedGlyph","_drawToCache","currentRow","pagesBySize","filter","sort","percentageUsed","sameSizeI","mergingPages","sortedMergingPagesIndexes","glyphs","mergedPageIndex","mergedPage","_mergePages","_deletePage","newPage","AtlasPage","mergedSize","p","drawImage","pageIndex","adjustingPage","restrictToCellHeight","_getFromCacheMap","cacheMap","key","_getColorFromAnsiIndex","idx","_getBackgroundColor","bgColorMode","bgColor","arr","toColorRGB","toColor","opaque","_getForegroundColor","fgColorMode","fgColor","bold","excludeFromContrastRatioDemands","minimumContrastColor","_getMinimumContrastColor","multiplyOpacity","_resolveBackgroundRgba","_resolveForegroundRgba","cache","_getContrastCache","adjustedColor","getColor","bgRgba","fgRgba","ensureContrastRatio","setColor","codeOrChars","String","fromCharCode","allowedWidth","allowedHeight","save","isInvisible","isInverse","isDim","italic","underline","isUnderline","strikethrough","isStrikethrough","overline","isOverline","getFgColor","getFgColorMode","getBgColor","getBgColorMode","temp","temp2","backgroundColor","globalCompositeOperation","fontStyle","powerlineGlyph","charCodeAt","restrictedPowerlineGlyph","isRestrictedPowerlineGlyph","foregroundColor","padding","customGlyph","tryDrawCustomChar","chWidth","enableClearThresholdCheck","wcwidth","getStringCellWidth","isUnderlineColorDefault","isUnderlineColorRGB","getUnderlineColor","join","xLeft","yTop","yMid","yBot","xChLeft","xChRight","xChMid","underlineStyle","yCurlyBot","yCurlyTop","setLineDash","restore","metrics","measureText","actualBoundingBoxDescent","strokeText","isBeyondCellBounds","clearColor","getImageData","isEmpty","checkCompletelyTransparent","_findGlyphBoundingBox","activePage","activeRow","fixedRows","wasPageAndRowFound","candidatePage","addGlyph","boundingBox","restrictedGlyph","found","alphaOffset","_usedPixels","_glyphs","glyph","sourcePages","enableThresholdCheck","fgR","fgG","fgB","threshold","abs","channels","rgb","toPaddedHex","s","contrastRatio","l1","l2","toCss","toRgba","opacity","toChannels","blend","bgR","bgG","bgB","isOpaque","ratio","rgbaColor","factor","$ctx","$litmusColor","isNode","createLinearGradient","match","repeat","rgbaMatch","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","_listeners","_disposed","_event","listener","arg1","arg2","call","clearListeners","from","to","disposeArray","disposables","_disposables","_isDisposed","unregister","_value","TwoKeyMap","_data","first","second","third","fourth","navigator","userAgent","platform","includes","isSafari","test","majorVersion","isMac","isIpad","isIphone","isWindows","isLinux","isChromeOS","TaskQueue","_tasks","_i","task","_start","flush","_idleCallback","_cancelCallback","_requestCallback","_process","bind","deadline","taskDuration","longestTask","lastDeadlineRemaining","timeRemaining","deadlineRemaining","PriorityTaskQueue","_createDeadline","identifier","duration","requestIdleCallback","cancelIdleCallback","_queue","ExtendedAttrs","fromColorRGB","clone","newObj","hasExtendedAttrs","isBlink","isProtected","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","updateExtended","underlineColor","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","_urlId","_ext","urlId","fromCharData","obj","stringFromCodePoint","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","DEFAULT_ATTR","CHAR_DATA_CODE_INDEX","NULL_CELL_WIDTH","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","_interim","decode","input","startPos","interim","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","missing","fourStop","optionsKeyToLogLevel","trace","LogLevelEnum","TRACE","debug","DEBUG","info","INFO","WARN","ERROR","off","OFF","traceLogger","LogService","logLevel","_logLevel","_updateLogLevel","onSpecificOptionChange","_evalLazyOptionalParams","optionalParams","_log","message","logger","IOptionsService","_target","descriptor","fn","apply","name","JSON","stringify","DI_TARGET","DI_DEPENDENCIES","serviceRegistry","ctor","has","decorator","arguments","storeServiceDependency","IBufferService","createDecorator","ICoreMouseService","ICoreService","ICharsetService","IInstantiationService","ILogService","IOscLinkService","IUnicodeService","IDecorationService","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","WebglAddon","_preserveDrawingBuffer","getSafariVersion","activate","onWillOpen","coreService","unsafeCore","renderService","_renderService","characterJoinerService","charSizeService","decorationService","logService","_logService","setTraceLogger","_renderer","setRenderer","_createRenderer"],"sourceRoot":""}
\ No newline at end of file