mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
* fix: render Kitty Unicode placeholder images with bounded ownership * Make image repaint checks independent of display profile and shell output * Capture repaint diagnostics only after the pixel assertion fails
1446 lines
1.6 MiB
Plaintext
1446 lines
1.6 MiB
Plaintext
diff --git a/lib/addon-image.js b/lib/addon-image.js
|
||
index fe7c072fd19308c1134b40f36eab8242b627b5e4..5f9f16d2aba20ef675885f32a51a773ef932c94f 100644
|
||
--- a/lib/addon-image.js
|
||
+++ b/lib/addon-image.js
|
||
@@ -1,3 +1,3 @@
|
||
/*! For license information please see addon-image.js.LICENSE.txt */
|
||
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ImageAddon=t():e.ImageAddon=t()}(globalThis,()=>(()=>{"use strict";var e={939(e,t){function i(e){return 255&e}function A(e){return e>>>8&255}function s(e){return e>>>16&255}function r(e,t,i,A=255){return((255&A)<<24|(255&i)<<16|(255&t)<<8|255&e)>>>0}function o(e,t,i){return Math.max(e,Math.min(i,t))}function n(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),6*i<1?t+6*(e-t)*i:2*i<1?e:3*i<2?t+(e-t)*(4-6*i):t}function a(e,t,i){return(4278190080|Math.round(i/100*255)<<16|Math.round(t/100*255)<<8|Math.round(e/100*255))>>>0}Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_FOREGROUND=t.DEFAULT_BACKGROUND=t.PALETTE_ANSI_256=t.PALETTE_VT340_GREY=t.PALETTE_VT340_COLOR=t.normalizeHLS=t.normalizeRGB=t.nearestColorIndex=t.fromRGBA8888=t.toRGBA8888=t.alpha=t.blue=t.green=t.red=t.BIG_ENDIAN=void 0,t.BIG_ENDIAN=255===new Uint8Array(new Uint32Array([4278190080]).buffer)[0],t.BIG_ENDIAN&&console.warn("BE platform detected. This version of node-sixel works only on LE properly."),t.red=i,t.green=A,t.blue=s,t.alpha=function(e){return e>>>24&255},t.toRGBA8888=r,t.fromRGBA8888=function(e){return[255&e,e>>8&255,e>>16&255,e>>>24]},t.nearestColorIndex=function(e,t){const r=i(e),o=A(e),n=s(e);let a=Number.MAX_SAFE_INTEGER,h=-1;for(let e=0;e<t.length;++e){const i=r-t[e][0],A=o-t[e][1],s=n-t[e][2],g=i*i+A*A+s*s;if(!g)return e;g<a&&(a=g,h=e)}return h},t.normalizeRGB=a,t.normalizeHLS=function(e,t,i){return function(e,t,i){if(!i){const e=Math.round(255*t);return r(e,e,e)}const A=t<.5?t*(1+i):t+i-t*i,s=2*t-A;return r(o(0,255,Math.round(255*n(A,s,e+1/3))),o(0,255,Math.round(255*n(A,s,e))),o(0,255,Math.round(255*n(A,s,e-1/3))))}((e+240)/360,t/100,i/100)},t.PALETTE_VT340_COLOR=new Uint32Array([a(0,0,0),a(20,20,80),a(80,13,13),a(20,80,20),a(80,20,80),a(20,80,80),a(80,80,20),a(53,53,53),a(26,26,26),a(33,33,60),a(60,26,26),a(33,60,33),a(60,33,60),a(33,60,60),a(60,60,33),a(80,80,80)]),t.PALETTE_VT340_GREY=new Uint32Array([a(0,0,0),a(13,13,13),a(26,26,26),a(40,40,40),a(6,6,6),a(20,20,20),a(33,33,33),a(46,46,46),a(0,0,0),a(13,13,13),a(26,26,26),a(40,40,40),a(6,6,6),a(20,20,20),a(33,33,33),a(46,46,46)]),t.PALETTE_ANSI_256=(()=>{const e=[r(0,0,0),r(205,0,0),r(0,205,0),r(205,205,0),r(0,0,238),r(205,0,205),r(0,250,205),r(229,229,229),r(127,127,127),r(255,0,0),r(0,255,0),r(255,255,0),r(92,92,255),r(255,0,255),r(0,255,255),r(255,255,255)],t=[0,95,135,175,215,255];for(let i=0;i<6;++i)for(let A=0;A<6;++A)for(let s=0;s<6;++s)e.push(r(t[i],t[A],t[s]));for(let t=8;t<=238;t+=10)e.push(r(t,t,t));return new Uint32Array(e)})(),t.DEFAULT_BACKGROUND=r(0,0,0,255),t.DEFAULT_FOREGROUND=r(255,255,255,255)},591(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.decodeAsync=t.decode=t.Decoder=t.DecoderAsync=void 0;const A=i(939),s=i(199),r=function(e){if("undefined"!=typeof Buffer)return Buffer.from(e,"base64");const t=atob(e),i=new Uint8Array(t.length);for(let e=0;e<i.length;++e)i[e]=t.charCodeAt(e);return i}(s.LIMITS.BYTES);let o;const n=new Uint32Array;class a{constructor(){this.bandHandler=e=>1,this.modeHandler=e=>1}handle_band(e){return this.bandHandler(e)}mode_parsed(e){return this.modeHandler(e)}}const h={memoryLimit:134217728,sixelColor:A.DEFAULT_FOREGROUND,fillColor:A.DEFAULT_BACKGROUND,palette:A.PALETTE_VT340_COLOR,paletteLimit:s.LIMITS.PALETTE_SIZE,truncate:!0};function g(e){const t=new a,i={env:{handle_band:t.handle_band.bind(t),mode_parsed:t.mode_parsed.bind(t)}};return WebAssembly.instantiate(o||r,i).then(i=>(o=o||i.module,new d(e,i.instance||i,t)))}t.DecoderAsync=g;class d{constructor(e,t,i){if(this._PIXEL_OFFSET=s.LIMITS.MAX_WIDTH+4,this._canvas=n,this._bandWidths=[],this._maxWidth=0,this._minWidth=s.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0,this._opts=Object.assign({},h,e),this._opts.paletteLimit>s.LIMITS.PALETTE_SIZE)throw new Error(`DecoderOptions.paletteLimit must not exceed ${s.LIMITS.PALETTE_SIZE}`);if(t)i.bandHandler=this._handle_band.bind(this),i.modeHandler=this._initCanvas.bind(this);else{const e=o||(o=new WebAssembly.Module(r));t=new WebAssembly.Instance(e,{env:{handle_band:this._handle_band.bind(this),mode_parsed:this._initCanvas.bind(this)}})}this._instance=t,this._wasm=this._instance.exports,this._chunk=new Uint8Array(this._wasm.memory.buffer,this._wasm.get_chunk_address(),s.LIMITS.CHUNK_SIZE),this._states=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_state_address(),12),this._palette=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_palette_address(),s.LIMITS.PALETTE_SIZE),this._palette.set(this._opts.palette),this._pSrc=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_p0_address()),this._wasm.init(A.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}get _fillColor(){return this._states[0]}get _truncate(){return this._states[8]}get _rasterWidth(){return this._states[6]}get _rasterHeight(){return this._states[7]}get _width(){return this._states[2]?this._states[2]-4:0}get _height(){return this._states[3]}get _level(){return this._states[9]}get _mode(){return this._states[10]}get _paletteLimit(){return this._states[11]}_initCanvas(e){if(2===e){const e=this.width*this.height;if(e>this._canvas.length){if(this._opts.memoryLimit&&4*e>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(e)}this._maxWidth=this._width}else if(1===e)if(2===this._level){const e=Math.min(this._rasterWidth,s.LIMITS.MAX_WIDTH)*this._rasterHeight;if(e>this._canvas.length){if(this._opts.memoryLimit&&4*e>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(e)}}else this._canvas.length<65536&&(this._canvas=new Uint32Array(65536));return 0}_realloc(e,t){const i=e+t;if(i>this._canvas.length){if(this._opts.memoryLimit&&4*i>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");const e=new Uint32Array(65536*Math.ceil(i/65536));e.set(this._canvas),this._canvas=e}}_handle_band(e){const t=this._PIXEL_OFFSET;let i=this._lastOffset;if(2===this._mode){let A=this.height-this._currentHeight,s=0;for(;s<6&&A>0;)this._canvas.set(this._pSrc.subarray(t*s,t*s+e),i+e*s),s++,A--;this._lastOffset+=e*s,this._currentHeight+=s}else if(1===this._mode){this._realloc(i,6*e),this._maxWidth=Math.max(this._maxWidth,e),this._minWidth=Math.min(this._minWidth,e);for(let A=0;A<6;++A)this._canvas.set(this._pSrc.subarray(t*A,t*A+e),i+e*A);this._bandWidths.push(e),this._lastOffset+=6*e,this._currentHeight+=6}return 0}get width(){return 1!==this._mode?this._width:Math.max(this._maxWidth,this._wasm.current_width())}get height(){return 1!==this._mode?this._height:this._wasm.current_width()?6*this._bandWidths.length+this._wasm.current_height():6*this._bandWidths.length}get palette(){return this._palette.subarray(0,this._paletteLimit)}get memoryUsage(){return this._canvas.byteLength+this._wasm.memory.buffer.byteLength+8*this._bandWidths.length}get properties(){return{width:this.width,height:this.height,mode:this._mode,level:this._level,truncate:!!this._truncate,paletteLimit:this._paletteLimit,fillColor:this._fillColor,memUsage:this.memoryUsage,rasterAttributes:{numerator:this._states[4],denominator:this._states[5],width:this._rasterWidth,height:this._rasterHeight}}}init(e=this._opts.fillColor,t=this._opts.palette,i=this._opts.paletteLimit,A=this._opts.truncate){this._wasm.init(this._opts.sixelColor,e,i,A?1:0),t&&this._palette.set(t.subarray(0,s.LIMITS.PALETTE_SIZE)),this._bandWidths.length=0,this._maxWidth=0,this._minWidth=s.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0}decode(e,t=0,i=e.length){let A=t;for(;A<i;){const t=Math.min(i-A,s.LIMITS.CHUNK_SIZE);this._chunk.set(e.subarray(A,A+=t)),this._wasm.decode(0,t)}}decodeString(e,t=0,i=e.length){let A=t;for(;A<i;){const t=Math.min(i-A,s.LIMITS.CHUNK_SIZE);for(let i=0,s=A;i<t;++i,++s)this._chunk[i]=e.charCodeAt(s);A+=t,this._wasm.decode(0,t)}}get data32(){if(0===this._mode||!this.width||!this.height)return n;const e=this._wasm.current_width();if(2===this._mode){let t=this.height-this._currentHeight;if(t>0){const i=this._PIXEL_OFFSET;let A=this._lastOffset,s=0;for(;s<6&&t>0;)this._canvas.set(this._pSrc.subarray(i*s,i*s+e),A+e*s),s++,t--;t&&this._canvas.fill(this._fillColor,A+e*s)}return this._canvas.subarray(0,this.width*this.height)}if(1===this._mode){if(this._minWidth===this._maxWidth){let t=!1;if(e)if(e!==this._minWidth)t=!0;else{const t=this._PIXEL_OFFSET;let i=this._lastOffset;this._realloc(i,6*e);for(let A=0;A<6;++A)this._canvas.set(this._pSrc.subarray(t*A,t*A+e),i+e*A)}if(!t)return this._canvas.subarray(0,this.width*this.height)}const t=new Uint32Array(this.width*this.height);t.fill(this._fillColor);let i=0,A=0;for(let e=0;e<this._bandWidths.length;++e){const s=this._bandWidths[e];for(let e=0;e<6;++e)t.set(this._canvas.subarray(A,A+=s),i),i+=this.width}if(e){const A=this._PIXEL_OFFSET,s=this._wasm.current_height();for(let r=0;r<s;++r)t.set(this._pSrc.subarray(A*r,A*r+e),i+this.width*r)}return t}return n}get data8(){return new Uint8ClampedArray(this.data32.buffer,0,this.width*this.height*4)}release(){this._canvas=n,this._bandWidths.length=0,this._maxWidth=0,this._minWidth=s.LIMITS.MAX_WIDTH,this._wasm.init(A.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}}t.Decoder=d,t.decode=function(e,t){const i=new d(t);return i.init(),"string"==typeof e?i.decodeString(e):i.decode(e),{width:i.width,height:i.height,data32:i.data32,data8:i.data8}},t.decodeAsync=async function(e,t){const i=await g(t);return i.init(),"string"==typeof e?i.decodeString(e):i.decode(e),{width:i.width,height:i.height,data32:i.data32,data8:i.data8}}},199(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LIMITS=void 0,t.LIMITS={CHUNK_SIZE:16384,PALETTE_SIZE:4096,MAX_WIDTH:16384,BYTES:"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AEHAiwIgADcDAEG4iwIgADcDAEGwiwIgADcDAEGoiwIgADcDAEGgiwIgADcDAEGYiwIgADcDAEGQiwIgADcDAEGIiwIgADcDAEGAiwIgADcDAEH4igIgADcDAEHwigIgADcDAEHoigIgADcDAEHgigIgADcDAEHYigIgADcDAEHQigIgADcDAEHIigIgADcDAEHAigIgADcDAEG4igIgADcDAEGwigIgADcDAEGoigIgADcDAEGgigIgADcDAEGYigIgADcDAEGQigIgADcDAEGIigIgADcDAEGAigIgADcDAEH4iQIgADcDAEHwiQIgADcDAEHoiQIgADcDAEHgiQIgADcDAEHYiQIgADcDAEHQiQIgADcDAEHIiQIgADcDAEHAiQIgADcDAEG4iQIgADcDAEGwiQIgADcDAEGoCCgCACIEQf8AakGAAW0hCAJAIARBgQFIDQBBASEBIAhBAiAIQQJKG0EBayICQQFxIQMgBEGBAk4EQCACQX5xIQIDQCABQQl0IgdBEHJBoIkCakGwiQJBgAT8CgAAIAdBsI0CakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsLIANFDQAgAUEJdEEQckGgiQJqQbCJAkGABPwKAAALAkAgBEEBSA0AIAhBASAIQQFKGyIDQQFxIQUCQCADQQFrIgdFBEBBACEBDAELIANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQbCJBmpBsIkCQYAE/AoAACAGQZAEckGwiQZqQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACwsgBQRAIAFBCXRBEHJBsIkGakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEFIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiBkEQckHAiQpqQbCJAkGABPwKAAAgBkGQBHJBwIkKakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAFBEAgAUECdEHAiQpqQbCJAkGABPwKAAALIARBAUgNACADQQFxIQUgBwR/IANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQdCJDmpBsIkCQYAE/AoAACAGQZAEckHQiQ5qQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACyABQQd0QQRyBUEECyEBIAUEQCABQQJ0QdCJ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"}},414(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EventUtils=t.Emitter=void 0;const A=i(426);var s;t.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(e,t,i)=>{if(this._disposed)return(0,A.toDisposable)(()=>{});const s={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(s);const r=(0,A.toDisposable)(()=>{const e=this._listeners.indexOf(s);-1!==e&&(this._listeners=this._listeners.slice(),this._listeners.splice(e,1))});return i&&(Array.isArray(i)?i.push(r):i.add(r)),r}),this._event}fire(e){if(this._disposed||!this._listeners.length)return;if(1===this._listeners.length)return void this._listeners[0].fn.call(this._listeners[0].thisArgs,e);const t=this._listeners;for(let i=0,A=t.length;i<A;++i)t[i].fn.call(t[i].thisArgs,e)}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},function(e){e.forward=function(e,t){return e(e=>t.fire(e))},e.map=function(e,t){return(i,A,s)=>e(e=>i.call(A,t(e)),void 0,s)},e.any=function(...e){return(t,i,s)=>{const r=new A.DisposableStore;for(const A of e)r.add(A(e=>t.call(i,e)));return s&&(Array.isArray(s)?s.push(r):s.add(r)),r}},e.runAndSubscribe=function(e,t,i){return t(i),e(e=>t(e))}}(s||(t.EventUtils=s={}))},426(e,t){function i(e){return{dispose:e}}function A(e){if(!e)return e;if(Array.isArray(e)){for(const t of e)t.dispose();return[]}return e.dispose(),e}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=t.DisposableStore=void 0,t.toDisposable=i,t.dispose=A,t.combinedDisposable=function(...e){return i(()=>A(e))};class s{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(const e of this._disposables)e.dispose();this._disposables.clear()}}t.DisposableStore=s;class r{constructor(){this._store=new s}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}}t.Disposable=r,r.None=Object.freeze({dispose(){}}),t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}}},917(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 A}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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}t.AttributeData=i;class A{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}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new A(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId&&void 0===this.payload}}t.ExtendedAttrs=A},721(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const A=i(348),s=i(564),r=i(917);class o extends r.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new r.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;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,A.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[s.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[s.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[s.CHAR_DATA_CHAR_INDEX].length){const i=e[s.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const A=e[s.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=A&&A<=57343?this.content=1024*(i-55296)+A-56320+65536|e[s.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[s.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[s.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[s.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[s.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor())return!1;if(this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor())return!1;if(this.isInverse()!==e.isInverse())return!1;if(this.isBold()!==e.isBold())return!1;if(this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;const t=this.isUnderlineColorDefault(),i=e.isUnderlineColorDefault();if(!t||!i){if(t!==i)return!1;if(this.getUnderlineColor()!==e.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==e.getUnderlineColorMode())return!1}}return this.isOverline()===e.isOverline()&&this.isBlink()===e.isBlink()&&this.isInvisible()===e.isInvisible()&&this.isItalic()===e.isItalic()&&this.isDim()===e.isDim()&&this.isStrikethrough()===e.isStrikethrough()}}t.CellData=o},564(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=t.DEFAULT_COLOR<<9|256,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},348(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=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 A="";for(let s=t;s<i;++s){let t=e[s];t>65535?(t-=65536,A+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):A+=String.fromCharCode(t)}return A},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let A=0,s=0;if(this._interim){const i=e.charCodeAt(s++);56320<=i&&i<=57343?t[A++]=1024*(this._interim-55296)+i-56320+65536:(t[A++]=this._interim,t[A++]=i),this._interim=0}for(let r=s;r<i;++r){const s=e.charCodeAt(r);if(55296<=s&&s<=56319){if(++r>=i)return this._interim=s,A;const o=e.charCodeAt(r);56320<=o&&o<=57343?t[A++]=1024*(s-55296)+o-56320+65536:(t[A++]=s,t[A++]=o);continue}65279!==s&&(t[A++]=s)}return A}},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 A,s,r,o,n,a=0,h=0;if(this.interim[0]){let A=!1,s=this.interim[0];s&=192==(224&s)?31:224==(240&s)?15:7;let r,o=0;for(;(r=this.interim[++o])&&o<4;)s<<=6,s|=63&r;const n=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,g=n-o;for(;h<g;){if(h>=i)return 0;if(r=e[h++],128!=(192&r)){h--,A=!0;break}this.interim[o++]=r,s<<=6,s|=63&r}A||(2===n?s<128?h--:t[a++]=s:3===n?s<2048||s>=55296&&s<=57343||65279===s||(t[a++]=s):s<65536||s>1114111||(t[a++]=s)),this.interim.fill(0)}const g=i-4;let d=h;for(;d<i;){for(;!(!(d<g)||128&(A=e[d])||128&(s=e[d+1])||128&(r=e[d+2])||128&(o=e[d+3]));)t[a++]=A,t[a++]=s,t[a++]=r,t[a++]=o,d+=4;if(A=e[d++],A<128)t[a++]=A;else if(192==(224&A)){if(d>=i)return this.interim[0]=A,a;if(s=e[d++],128!=(192&s)){d--;continue}if(n=(31&A)<<6|63&s,n<128){d--;continue}t[a++]=n}else if(224==(240&A)){if(d>=i)return this.interim[0]=A,a;if(s=e[d++],128!=(192&s)){d--;continue}if(d>=i)return this.interim[0]=A,this.interim[1]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(n=(15&A)<<12|(63&s)<<6|63&r,n<2048||n>=55296&&n<=57343||65279===n)continue;t[a++]=n}else if(240==(248&A)){if(d>=i)return this.interim[0]=A,a;if(s=e[d++],128!=(192&s)){d--;continue}if(d>=i)return this.interim[0]=A,this.interim[1]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=A,this.interim[1]=s,this.interim[2]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(n=(7&A)<<18|(63&s)<<12|(63&r)<<6|63&o,n<65536||n>1114111)continue;t[a++]=n}}return a}}},795(e,t,i){var A=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.IIPHandler=void 0;const s=i(463),r=i(699),o=A(i(669)),n=A(i(61)),a=i(389),h=i(462),g={type:0,name:"Unnamed file",size:0,width:"auto",height:"auto",preserveAspectRatio:1,inline:0};t.IIPHandler=class{constructor(e,t,i,A){this._opts=e,this._renderer=t,this._storage=i,this._coreTerminal=A,this._aborted=!1,this._hp=new a.HeaderParser,this._header=g,this._isMultipart=!1,this._abortMulti=!1;const s=Math.ceil(4*this._opts.iipSizeLimit/3),r=Math.min(1048576,s);this._dec=new o.default(4194304,s,r),this._qoiDec=new n.default(4194304)}reset(){this._hp.reset(),this._dec.release(),this._qoiDec.release()}start(){this._aborted=!1,this._hp.reset()}put(e,t,i){if(!this._aborted)if(4===this._hp.state)0!==this._dec.put(e.subarray(t,i))&&(this._dec.release(),this._aborted=!0);else{const A=this._hp.parse(e,t,i);if(-1===A)return void(this._aborted=!0);if(A>0){if(1===this._hp.fields.type){if(this._isMultipart&&(this._isMultipart=!1,this._abortMulti=!1,this._dec.release()),this._header=Object.assign({},g,this._hp.fields),!this._header.inline)return void(this._aborted=!0);this._dec.init()}else if(this._abortMulti)return void(this._aborted=!0);0!==this._dec.put(e.subarray(A,i))&&(this._dec.release(),this._aborted=!0,this._isMultipart&&(this._abortMulti=!0))}}}end(e){var t,i,A;if(this._aborted)return!0;if(4!==this._hp.state&&this._hp.end())return!0;const o=this._hp.fields.type;if(3===o)return!0;if(5===o){let e=r.CELL_SIZE_DEFAULT.width,i=r.CELL_SIZE_DEFAULT.height;this._renderer.dimensions&&(e=this._renderer.dimensions.css.canvas.width/this._coreTerminal.cols,i=this._renderer.dimensions.css.canvas.height/this._coreTerminal.rows);const s=null!==(A=null===(t=this._coreTerminal._core._coreBrowserService)||void 0===t?void 0:t.dpr)&&void 0!==A?A:1,o=`]1337;ReportCellSize=${i.toFixed(3)};${e.toFixed(3)};${s.toFixed(3)}\\`;return this._coreTerminal.input(o,!1),!0}if(2===o)return this._header=Object.assign({},g,this._hp.fields),this._isMultipart=!0,this._abortMulti=!1,this._dec.release(),this._dec.init(),!0;if(4===o){if(!this._isMultipart)return!0;if(this._isMultipart=!1,this._abortMulti||2!==this._header.type)return!0}let n,a,d=0,l=0,I=h.UNSUPPORTED_TYPE;if((n=e)&&((n=!this._dec.end())?(I=(0,h.imageType)(this._dec.data8),(n="unsupported"!==I.mime)?(d=I.width,l=I.height,(n=d&&l&&d*l<this._opts.pixelLimit)?([d,l]=this._resize(d,l).map(Math.floor),n=d&&l&&d*l<this._opts.pixelLimit):console.warn(`IIP: image dimension issue ${I.width}x${I.height}`)):console.warn("IIP: unsupported image type")):console.warn("IIP: error during BASE64 decoding")),!n)return this._dec.release(),!0;if("image/qoi"===I.mime){const e=this._qoiDec.decode(this._dec.data8);if(a=new ImageData(new Uint8ClampedArray(e.buffer,e.byteOffset,e.byteLength),this._qoiDec.width,this._qoiDec.height),this._qoiDec.release(),d===this._qoiDec.width&&l===this._qoiDec.height){this._dec.release();const e=s.ImageRenderer.createCanvas(void 0,this._qoiDec.width,this._qoiDec.height);return null===(i=e.getContext("2d"))||void 0===i||i.putImageData(a,0,0),this._storage.addImage(e),!0}}else a=new Blob([this._dec.data8],{type:I.mime});return this._dec.release(),createImageBitmap(a,{resizeWidth:d,resizeHeight:l}).then(e=>(this._storage.addImage(e),!0)).catch(e=>(console.warn(`IIP: decoding error ${I.mime} ${I.width}x${I.height}`,e),!0))}_resize(e,t){var i,A,s,o;const n=(null===(i=this._renderer.dimensions)||void 0===i?void 0:i.css.cell.width)||r.CELL_SIZE_DEFAULT.width,a=(null===(A=this._renderer.dimensions)||void 0===A?void 0:A.css.cell.height)||r.CELL_SIZE_DEFAULT.height,h=(null===(s=this._renderer.dimensions)||void 0===s?void 0:s.css.canvas.width)||n*this._coreTerminal.cols,g=(null===(o=this._renderer.dimensions)||void 0===o?void 0:o.css.canvas.height)||a*this._coreTerminal.rows,d=this._dim(this._header.width,h,n),l=this._dim(this._header.height,g,a);if(!d&&!l){const i=h/e,A=(g-a)/t,s=Math.min(i,A);return s<1?[e*s,t*s]:[e,t]}return d?!this._header.preserveAspectRatio&&d&&l?[d,l]:[d,t*d/e]:[e*l/t,l]}_dim(e,t,i){return"auto"===e?0:e.endsWith("%")?parseInt(e.slice(0,-1),10)*t/100:e.endsWith("px")?parseInt(e.slice(0,-2),10):parseInt(e,10)*i}}},389(e,t){function i(e){let t="";for(let i=0;i<e.length;++i)t+=String.fromCharCode(e[i]);return t}function A(e){let t=0;for(let i=0;i<e.length;++i){if(e[i]<48||e[i]>57)throw new Error("illegal char");t=10*t+e[i]-48}return t}function s(e){const t=i(e);if(!t.match(/^((auto)|(\d+?((px)|(%)){0,1}))$/))throw new Error("illegal size");return t}Object.defineProperty(t,"__esModule",{value:!0}),t.HeaderParser=void 0;const r={inline:A,size:A,name:function(e){if("undefined"!=typeof Buffer)return Buffer.from(i(e),"base64").toString();const t=atob(i(e)),A=new Uint8Array(t.length);for(let e=0;e<A.length;++e)A[e]=t.charCodeAt(e);return(new TextDecoder).decode(A)},width:s,height:s,preserveAspectRatio:A},o=[70,105,108,101],n=[77,117,108,116,105,112,97,114,116,70,105,108,101],a=[70,105,108,101,80,97,114,116],h=[70,105,108,101,69,110,100],g=[82,101,112,111,114,116,67,101,108,108,83,105,122,101],d=1024;t.HeaderParser=class{constructor(){this.state=0,this._buffer=new Uint32Array(d),this._position=0,this._key="",this.fields={}}reset(){this._buffer.fill(0),this.state=0,this._position=0,this.fields={},this._key=""}end(){if(0===this.state){if(this._position===h.length){for(let e=0;e<h.length;++e)if(this._buffer[e]!==h[e])return this._a();return this.fields.type=4,this.state=4,0}if(this._position===g.length){for(let e=0;e<g.length;++e)if(this._buffer[e]!==g[e])return this._a();return this.fields.type=5,this.state=4,0}return this._a()}return 4===this.state?0:3===this.state&&2===this.fields.type&&this._storeValue(this._position)?(this.state=4,0):this._a()}parse(e,t,i){let A=this.state,s=this._position;const r=this._buffer;if(1===A||4===A)return-1;if(0===A&&s>14)return-1;for(let h=t;h<i;++h){const t=e[h];switch(t){case 59:if(!this._storeValue(s))return this._a();A=2,s=0;break;case 61:if(0===A){if(70===r[0]){let e=0;for(;e<o.length;++e)if(r[e]!==o[e])return this._a();if(this.fields.type=1,s===a.length){for(;e<a.length;++e)if(r[e]!==a[e])return this._a();return this.fields.type=3,this.state=4,h+1}}else{if(77!==r[0])return this._a();for(let e=0;e<n.length;++e)if(r[e]!==n[e])return this._a();this.fields.type=2}A=2,s=0}else if(2===A){if(!this._storeKey(s))return this._a();A=3,s=0}else if(3===A){if(s>=d)return this._a();r[s++]=t}break;case 58:return 3!==A||this._storeValue(s)?(this.state=4,h+1):this._a();default:if(s>=d)return this._a();r[s++]=t}}return this.state=A,this._position=s,-2}_a(){return this.fields.type=0,this.state=1,-1}_storeKey(e){const t=i(this._buffer.subarray(0,e));return!!t&&(this._key=t,this.fields[t]=null,!0)}_storeValue(e){if(this._key){try{const t=this._buffer.slice(0,e);this.fields[this._key]=r[this._key]?r[this._key](t):t}catch(e){return!1}return!0}return!1}}},649(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.IIPImageStorage=void 0,t.IIPImageStorage=class{constructor(e){this._storage=e,this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"}}addImage(e){this._storage.addImage(e,this._addImageOpts)}}},462(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.UNSUPPORTED_TYPE=void 0,t.imageType=function(e){if(e.length<32)return t.UNSUPPORTED_TYPE;const i=new Uint32Array(e.buffer,e.byteOffset,8);if(1196314761===i[0]&&169478669===i[1]&&1380206665===i[3])return{mime:"image/png",width:e[16]<<24|e[17]<<16|e[18]<<8|e[19],height:e[20]<<24|e[21]<<16|e[22]<<8|e[23]};if(255===e[0]&&216===e[1]&&255===e[2]){const[t,i]=function(e){const t=e.length;let i=4,A=e[i]<<8|e[i+1];for(;;){if(i+=A,i>=t)return[0,0];if(255!==e[i])return[0,0];if(192===e[i+1]||194===e[i+1])return i+8<t?[e[i+7]<<8|e[i+8],e[i+5]<<8|e[i+6]]:[0,0];i+=2,A=e[i]<<8|e[i+1]}}(e);return{mime:"image/jpeg",width:t,height:i}}if(944130375===i[0]&&(55===e[4]||57===e[4])&&97===e[5])return{mime:"image/gif",width:e[7]<<8|e[6],height:e[9]<<8|e[8]};if(1718185841===i[0])return{mime:"image/qoi",width:e[4]<<24|e[5]<<16|e[6]<<8|e[7],height:e[8]<<24|e[9]<<16|e[10]<<8|e[11]};if(1179011410===i[0]&&1346520407===i[2]&&3690582==(16777215&i[3])){switch(e[15]){case 88:return{mime:"image/webp",width:1+(e[24]|e[25]<<8|e[26]<<16),height:1+(e[27]|e[28]<<8|e[29]<<16)};case 76:if(47!==e[20])return t.UNSUPPORTED_TYPE;const i=e[21]|e[22]<<8|e[23]<<16|e[24]<<24;return{mime:"image/webp",width:1+(16383&i),height:1+(i>>>14&16383)};case 32:return 157!==e[23]||1!==e[24]||42!==e[25]?t.UNSUPPORTED_TYPE:{mime:"image/webp",width:16383&(e[26]|e[27]<<8),height:16383&(e[28]|e[29]<<8)}}return t.UNSUPPORTED_TYPE}if(1887007846===i[1]&&(1718187617===i[2]||1936291425===i[2])){let i=-1;const A=Math.min(e.length-16,1024);for(let t=8;t<A;t++)if(105===e[t]&&115===e[t+1]&&112===e[t+2]&&101===e[t+3]){i=t;break}if(-1!==i){const t=e[i+8]<<24|e[i+9]<<16|e[i+10]<<8|e[i+11],A=e[i+12]<<24|e[i+13]<<16|e[i+14]<<8|e[i+15];if(t>0&&A>0)return{mime:"image/avif",width:t,height:A}}return t.UNSUPPORTED_TYPE}return t.UNSUPPORTED_TYPE},t.UNSUPPORTED_TYPE={mime:"unsupported",width:0,height:0}},463(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ImageRenderer=void 0;const A=i(939),s=i(426);class r extends s.Disposable{get canvas(){var e;return null===(e=this._layers.get("top"))||void 0===e?void 0:e.canvas}static createCanvas(e,t,i){const A=(null!=e?e:document).createElement("canvas");return A.width=0|t,A.height=0|i,A}static createImageData(e,t,i,A){if("function"!=typeof ImageData){const s=e.createImageData(t,i);return A&&s.data.set(new Uint8ClampedArray(A,0,t*i*4)),s}return A?new ImageData(new Uint8ClampedArray(A,0,t*i*4),t,i):new ImageData(t,i)}static createImageBitmap(e){return"function"!=typeof createImageBitmap?Promise.resolve(void 0):createImageBitmap(e)}constructor(e){super(),this._terminal=e,this._layers=new Map,this._optionsRefresh=this._register(new s.MutableDisposable),this._oldOpen=this._terminal._core.open,this._terminal._core.open=e=>{var t;null===(t=this._oldOpen)||void 0===t||t.call(this._terminal._core,e),this._open()},this._terminal._core.screenElement&&this._open(),this._optionsRefresh.value=this._terminal._core.optionsService.onOptionChange(e=>{var t;"fontSize"===e&&(this.rescaleCanvas(),null===(t=this._renderService)||void 0===t||t.refreshRows(0,this._terminal.rows))}),this._register((0,s.toDisposable)(()=>{var e;this.removeLayerFromDom(),this.removeLayerFromDom("bottom"),this._terminal._core&&this._oldOpen&&(this._terminal._core.open=this._oldOpen,this._oldOpen=void 0),this._renderService&&this._oldSetRenderer&&(this._renderService.setRenderer=this._oldSetRenderer,this._oldSetRenderer=void 0),this._renderService=void 0,this._layers.clear(),null===(e=this._placeholderBitmap)||void 0===e||e.close(),this._placeholderBitmap=void 0,this._placeholder=void 0}))}showPlaceholder(e){var t,i;e?this._placeholder||-1===this.cellSize.height||this._createPlaceHolder(Math.max(this.cellSize.height+1,24)):(null===(t=this._placeholderBitmap)||void 0===t||t.close(),this._placeholderBitmap=void 0,this._placeholder=void 0),null===(i=this._renderService)||void 0===i||i.refreshRows(0,this._terminal.rows)}get dimensions(){return this._terminal.dimensions}get cellSize(){var e,t;return{width:(null===(e=this.dimensions)||void 0===e?void 0:e.css.cell.width)||-1,height:(null===(t=this.dimensions)||void 0===t?void 0:t.css.cell.height)||-1}}clearLines(e,t,i){var A,s,r,o,n;const a=e*((null===(A=this.dimensions)||void 0===A?void 0:A.css.cell.height)||0),h=(null===(s=this.dimensions)||void 0===s?void 0:s.css.canvas.width)||0,g=(t+1-e)*((null===(r=this.dimensions)||void 0===r?void 0:r.css.cell.height)||0);i&&"top"!==i||null===(o=this._layers.get("top"))||void 0===o||o.clearRect(0,a,h,g),i&&"bottom"!==i||null===(n=this._layers.get("bottom"))||void 0===n||n.clearRect(0,a,h,g)}clearAll(e){if(!e||"top"===e){const e=this._layers.get("top");null==e||e.clearRect(0,0,e.canvas.width,e.canvas.height)}if(!e||"bottom"===e){const e=this._layers.get("bottom");null==e||e.clearRect(0,0,e.canvas.width,e.canvas.height)}}draw(e,t,i,A,s=1){const r=this._layers.get(e.layer);if(!r)return;const{width:o,height:n}=this.cellSize;if(-1===o||-1===n)return;this._rescaleImage(e,o,n);const a=e.actual,h=Math.ceil(a.width/o),g=t%h*o,d=Math.floor(t/h)*n,l=i*o,I=A*n,c=s*o+g>a.width?a.width-g:s*o,_=d+n>a.height?a.height-d:n;r.drawImage(a,Math.floor(g),Math.floor(d),Math.ceil(c),Math.ceil(_),Math.floor(l),Math.floor(I),Math.ceil(c),Math.ceil(_))}extractTile(e,t){const{width:i,height:A}=this.cellSize;if(-1===i||-1===A)return;this._rescaleImage(e,i,A);const s=e.actual,o=Math.ceil(s.width/i),n=t%o*i,a=Math.floor(t/o)*A,h=i+n>s.width?s.width-n:i,g=a+A>s.height?s.height-a:A,d=r.createCanvas(this.document,h,g),l=d.getContext("2d");return l?(l.drawImage(s,Math.floor(n),Math.floor(a),Math.floor(h),Math.floor(g),0,0,Math.floor(h),Math.floor(g)),d):void 0}drawPlaceholder(e,t,i=1){var A;const s=this._layers.get("top");if(s){const{width:r,height:o}=this.cellSize;if(-1===r||-1===o)return;if(this._placeholder?o>=this._placeholder.height&&this._createPlaceHolder(o+1):this._createPlaceHolder(Math.max(o+1,24)),!this._placeholder)return;s.drawImage(null!==(A=this._placeholderBitmap)&&void 0!==A?A:this._placeholder,e*r,t*o%2?0:1,r*i,o,e*r,t*o,r*i,o)}}rescaleCanvas(){var e,t;const i=(null===(e=this.dimensions)||void 0===e?void 0:e.css.canvas.width)||0,A=(null===(t=this.dimensions)||void 0===t?void 0:t.css.canvas.height)||0;for(const e of this._layers.values())e.canvas.width===i&&e.canvas.height===A||(e.canvas.width=i,e.canvas.height=A)}_rescaleImage(e,t,i){if(t===e.actualCellSize.width&&i===e.actualCellSize.height)return;const{width:A,height:s}=e.origCellSize;if(t===A&&i===s)return e.actual=e.orig,e.actualCellSize.width=A,void(e.actualCellSize.height=s);const o=r.createCanvas(this.document,Math.ceil(e.orig.width*t/A),Math.ceil(e.orig.height*i/s)),n=o.getContext("2d");n&&(n.drawImage(e.orig,0,0,o.width,o.height),e.actual=o,e.actualCellSize.width=t,e.actualCellSize.height=i)}_open(){this._renderService=this._terminal._core._renderService,this._oldSetRenderer=this._renderService.setRenderer.bind(this._renderService),this._renderService.setRenderer=e=>{var t;for(const e of[...this._layers.keys()])this.removeLayerFromDom(e);null===(t=this._oldSetRenderer)||void 0===t||t.call(this._renderService,e)}}insertLayerToDom(e="top"){var t,i;if(!this.document||!this._terminal._core.screenElement)return void console.warn("image addon: cannot insert output canvas to DOM, missing document or screenElement");if(this._layers.has(e))return;const A=r.createCanvas(this.document,(null===(t=this.dimensions)||void 0===t?void 0:t.css.canvas.width)||0,(null===(i=this.dimensions)||void 0===i?void 0:i.css.canvas.height)||0);A.classList.add(`xterm-image-layer-${e}`);const s=this._terminal._core.screenElement;s.style.isolation="isolate","bottom"===e?(A.style.zIndex="-1",s.insertBefore(A,s.firstChild)):(A.style.zIndex="0",s.appendChild(A));const o=A.getContext("2d",{alpha:!0});o?(this._layers.set(e,o),this.clearAll(e)):A.remove()}removeLayerFromDom(e="top"){const t=this._layers.get(e);t&&(t.canvas.remove(),this._layers.delete(e))}hasLayer(e){return this._layers.has(e)}_createPlaceHolder(e=24){var t;null===(t=this._placeholderBitmap)||void 0===t||t.close(),this._placeholderBitmap=void 0;const i=32,s=r.createCanvas(this.document,i,e),o=s.getContext("2d",{alpha:!1});if(!o)return;const n=r.createImageData(o,i,e),a=new Uint32Array(n.data.buffer),h=(0,A.toRGBA8888)(0,0,0),g=(0,A.toRGBA8888)(255,255,255);a.fill(h);for(let t=0;t<e;++t){const e=t%2,A=t*i;for(let t=0;t<i;t+=2)a[A+t+e]=g}o.putImageData(n,0,0);const d=screen.width+i-1&-32||4096;this._placeholder=r.createCanvas(this.document,d,e);const l=this._placeholder.getContext("2d",{alpha:!1});if(l){for(let e=0;e<d;e+=i)l.drawImage(s,e,0);r.createImageBitmap(this._placeholder).then(e=>this._placeholderBitmap=e)}else this._placeholder=void 0}get document(){var e;return null===(e=this._terminal._core._coreBrowserService)||void 0===e?void 0:e.window.document}}t.ImageRenderer=r},699(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ImageStorage=t.CELL_SIZE_DEFAULT=void 0;const A=i(463),s=i(721);t.CELL_SIZE_DEFAULT={width:7,height:14};class r{constructor(e=-1,t=-1){this.imageId=e,this.tileId=t}}t.ImageStorage=class{constructor(e,t,i){this._terminal=e,this._renderer=t,this._opts=i,this._images=new Map,this._lastId=0,this._lowestId=0,this._fullyCleared=!1,this._needsFullClear=!1,this._pixelLimit=25e5,this._workCell=new s.CellData;try{this.setLimit(this._opts.storageLimit)}catch(e){e instanceof Error&&console.error(e.message),console.warn(`storageLimit is set to ${this.getLimit()} MB`)}this._viewportMetrics={cols:this._terminal.cols,rows:this._terminal.rows}}dispose(){this.reset()}reset(){var e;for(const t of this._images.values())null===(e=t.marker)||void 0===e||e.dispose();this._images.clear(),this._renderer.clearAll()}getLimit(){return 4*this._pixelLimit/1e6}setLimit(e){if(e<.5||e>1e3)throw RangeError("invalid storageLimit, should be at least 0.5 MB and not exceed 1G");this._pixelLimit=e/4*1e6>>>0,this._evictOldest(0)}getUsage(){return 4*this._getStoredPixels()/1e6}_getStoredPixels(){let e=0;for(const t of this._images.values())t.orig&&(e+=t.orig.width*t.orig.height,t.actual&&t.actual!==t.orig&&(e+=t.actual.width*t.actual.height));return e}_delImg(e){var t;const i=this._images.get(e);i&&(this._images.delete(e),window.ImageBitmap&&i.orig instanceof ImageBitmap&&i.orig.close(),null===(t=this.onImageDeleted)||void 0===t||t.call(this,e))}wipeAlternate(){var e;const t=[];for(const[i,A]of this._images.entries())"alternate"===A.bufferType&&(null===(e=A.marker)||void 0===e||e.dispose(),t.push(i));for(const e of t)this._delImg(e);this._needsFullClear=!0,this._fullyCleared=!1}deleteImage(e){var t;const i=this._images.get(e);i&&(null===(t=i.marker)||void 0===t||t.dispose(),this._delImg(e))}addImage(e,i){var A,s;this._evictOldest(e.width*e.height);let r=this._renderer.cellSize;-1!==r.width&&-1!==r.height||(r=t.CELL_SIZE_DEFAULT);const o=Math.ceil(e.width/r.width),n=Math.ceil(e.height/r.height),a=++this._lastId,h=this._terminal._core.buffer,g=this._terminal.cols,d=this._terminal.rows,l=h.x,I=h.y;let c=l,_=0;i.scrolling||(h.x=0,h.y=0,c=0),this._terminal._core._inputHandler._dirtyRowTracker.markDirty(h.y);for(let e=0;e<n;++e){const t=h.lines.get(h.y+h.ybase);for(let i=0;i<o&&!(c+i>=g);++i)this._writeToCell(t,c+i,a,e*o+i),_++;if(i.scrolling)e<n-1&&this._terminal._core._inputHandler.lineFeed();else if(++h.y>=d)break;h.x=c}this._terminal._core._inputHandler._dirtyRowTracker.markDirty(h.y),i.scrolling?"iip"===i.cursorPos?h.x=Math.min(c+o,g):h.x=c:(h.x=l,h.y=I);const C=[];for(const[e,t]of this._images.entries())t.tileCount<1&&(null===(A=t.marker)||void 0===A||A.dispose(),C.push(e));for(const e of C)this._delImg(e);const B=this._terminal.registerMarker(0);null==B||B.onDispose(()=>{this._images.get(a)&&this._delImg(a)}),"alternate"===this._terminal.buffer.active.type&&this._evictOnAlternate();const Q={orig:e,origCellSize:r,actual:e,actualCellSize:Object.assign({},r),marker:B||void 0,tileCount:_,bufferType:this._terminal.buffer.active.type,layer:i.layer,zIndex:i.zIndex};return this._images.set(a,Q),null===(s=this.onImageAdded)||void 0===s||s.call(this),a}render(e){var t,i;let A=!1,s=!1;for(const e of this._images.values())if("bottom"===e.layer?s=!0:A=!0,A&&s)break;if(A&&!this._renderer.hasLayer("top")&&(this._renderer.insertLayerToDom("top"),!this._renderer.hasLayer("top")))return;if(s&&!this._renderer.hasLayer("bottom")&&this._renderer.insertLayerToDom("bottom"),this._renderer.rescaleCanvas(),!this._images.size)return this._fullyCleared||(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1),this._renderer.hasLayer("top")&&this._renderer.removeLayerFromDom("top"),void(this._renderer.hasLayer("bottom")&&this._renderer.removeLayerFromDom("bottom"));!A&&this._renderer.hasLayer("top")&&(this._renderer.clearAll("top"),this._renderer.removeLayerFromDom("top")),!s&&this._renderer.hasLayer("bottom")&&(this._renderer.clearAll("bottom"),this._renderer.removeLayerFromDom("bottom")),this._needsFullClear&&(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1);const{start:o,end:n}=e,a=this._terminal._core.buffer,h=this._terminal._core.cols;this._renderer.clearLines(o,n);const g=[],d=[];for(let e=o;e<=n;++e){const A=a.lines.get(e+a.ydisp);if(!A)return;for(let s=0;s<h;++s){const o=null===(t=A.getExtended(s))||void 0===t?void 0:t.payload;if(o instanceof r){const t=o.imageId;if(void 0===t||-1===t)continue;const n=this._images.get(t);if(-1!==o.tileId){const a=o.tileId,l=s;let I=1;for(;++s<h;){const e=null===(i=A.getExtended(s))||void 0===i?void 0:i.payload;if(!(e instanceof r)||e.imageId!==t||e.tileId!==a+I)break;I++}s--,n?n.actual&&g.push({imgSpec:n,tileId:a,col:l,row:e,count:I}):this._opts.showPlaceholder&&d.push({col:l,row:e,count:I}),this._fullyCleared=!1}}}}g.sort((e,t)=>e.imgSpec.zIndex-t.imgSpec.zIndex);for(const e of d)this._renderer.drawPlaceholder(e.col,e.row,e.count);for(const e of g)this._renderer.draw(e.imgSpec,e.tileId,e.col,e.row,e.count)}viewportResize(e){var t,i;if(!this._images.size)return void(this._viewportMetrics=e);if(this._viewportMetrics.cols>=e.cols)return void(this._viewportMetrics=e);const A=this._terminal._core.buffer,s=A.lines.length,o=this._viewportMetrics.cols-1;for(let n=0;n<s;++n){const s=A.lines.get(n),a=null===(t=s.getExtended(o))||void 0===t?void 0:t.payload;if(a instanceof r){const t=a.imageId;if(void 0===t||-1===t)continue;const A=this._images.get(t);if(!A)continue;const r=Math.ceil(((null===(i=A.actual)||void 0===i?void 0:i.width)||0)/A.actualCellSize.width);if(a.tileId%r+1>=r)continue;let n=!1;for(let t=o+1;t>e.cols;++t)if(s.hasContent(t)){n=!0;break}if(n)continue;const h=Math.min(e.cols,r-a.tileId%r+o);let g=a.tileId;for(let e=o+1;e<h;++e)this._writeToCell(s,e,t,++g),A.tileCount++}}this._viewportMetrics=e}getImageAtBufferCell(e,t){var i,s,o;const n=this._terminal._core.buffer.lines.get(t);if(n){const t=null===(i=n.getExtended(e))||void 0===i?void 0:i.payload;if(t instanceof r&&t.imageId&&-1!==t.imageId){const e=null===(s=this._images.get(t.imageId))||void 0===s?void 0:s.orig;if(window.ImageBitmap&&e instanceof ImageBitmap){const t=A.ImageRenderer.createCanvas(window.document,e.width,e.height);return null===(o=t.getContext("2d"))||void 0===o||o.drawImage(e,0,0,e.width,e.height),t}return e}}}extractTileAtBufferCell(e,t){var i;const A=this._terminal._core.buffer.lines.get(t);if(A){const t=null===(i=A.getExtended(e))||void 0===i?void 0:i.payload;if(t instanceof r&&t.imageId&&-1!==t.imageId&&-1!==t.tileId){const e=this._images.get(t.imageId);if(e)return this._renderer.extractTile(e,t.tileId)}}}_evictOldest(e){var t;const i=this._getStoredPixels();let A=i;for(;this._pixelLimit<A+e&&this._images.size;){const e=this._images.get(++this._lowestId);e&&e.orig&&(A-=e.orig.width*e.orig.height,e.actual&&e.orig!==e.actual&&(A-=e.actual.width*e.actual.height),null===(t=e.marker)||void 0===t||t.dispose(),this._delImg(this._lowestId))}return i-A}_writeToCell(e,t,i,A){const s=this._workCell;if(e.loadCell(t,s),this._workCell.hasExtendedAttrs()){const e=s.extended.payload;if(e instanceof r){const t=this._images.get(e.imageId);return t&&t.tileCount--,e.imageId=i,void(e.tileId=A)}}const o=s.extended.clone();o.payload=new r(i,A),s.extended=o,s.updateExtended(),e.setCell(t,s)}_evictOnAlternate(){var e,t;for(const e of this._images.values())"alternate"===e.bufferType&&(e.tileCount=0);const i=this._terminal._core.buffer;for(let t=0;t<this._terminal.rows;++t){const A=i.lines.get(t);if(A)for(let t=0;t<this._terminal.cols;++t){const i=null===(e=A.getExtended(t))||void 0===e?void 0:e.payload;if(i instanceof r){const e=this._images.get(i.imageId);e&&e.tileCount++}}}const A=[];for(const[e,i]of this._images.entries())"alternate"!==i.bufferType||i.tileCount||(null===(t=i.marker)||void 0===t||t.dispose(),A.push(e));for(const e of A)this._delImg(e)}}},566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SixelHandler=void 0;const A=i(939),s=i(463),r=i(591),o=A.PALETTE_ANSI_256;function n(e){return A.BIG_ENDIAN?e:(255&e)<<24|(e>>>8&255)<<16|(e>>>16&255)<<8|e>>>24&255}o.set(A.PALETTE_VT340_COLOR),t.SixelHandler=class{constructor(e,t,i){this._opts=e,this._storage=t,this._coreTerminal=i,this._size=0,this._aborted=!1,(0,r.DecoderAsync)({memoryLimit:4*this._opts.pixelLimit,palette:o,paletteLimit:this._opts.sixelPaletteLimit}).then(e=>this._dec=e)}reset(){this._dec&&(this._dec.release(),this._dec._palette.fill(0),this._dec.init(0,o,this._opts.sixelPaletteLimit))}hook(e){var t;if(this._size=0,this._aborted=!1,this._dec){const i=1===e.params[1]?0:function(e,t){let i=0;if(!t)return i;if(e.isInverse())if(e.isFgDefault())i=n(t.foreground.rgba);else if(e.isFgRGB()){const t=e.constructor.toColorRGB(e.getFgColor());i=(0,A.toRGBA8888)(...t)}else i=n(t.ansi[e.getFgColor()].rgba);else if(e.isBgDefault())i=n(t.background.rgba);else if(e.isBgRGB()){const t=e.constructor.toColorRGB(e.getBgColor());i=(0,A.toRGBA8888)(...t)}else i=n(t.ansi[e.getBgColor()].rgba);return i}(this._coreTerminal._core._inputHandler._curAttrData,null===(t=this._coreTerminal._core._themeService)||void 0===t?void 0:t.colors);this._dec.init(i,null,this._opts.sixelPaletteLimit)}}put(e,t,i){if(!this._aborted&&this._dec){if(this._size+=i-t,this._size>this._opts.sixelSizeLimit)return console.warn("SIXEL: too much data, aborting"),this._aborted=!0,void this._dec.release();try{this._dec.decode(e,t,i)}catch(e){console.warn(`SIXEL: error while decoding image - ${e}`),this._aborted=!0,this._dec.release()}}}unhook(e){var t;if(this._aborted||!e||!this._dec)return!0;const i=this._dec.width,A=this._dec.height;if(!i||!A)return A&&this._storage.advanceCursor(A),!0;const r=s.ImageRenderer.createCanvas(void 0,i,A);return null===(t=r.getContext("2d"))||void 0===t||t.putImageData(new ImageData(this._dec.data8,i,A),0,0),this._dec.memoryUsage>4194304&&this._dec.release(),this._storage.addImage(r),!0}}},994(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SixelImageStorage=void 0;const A=i(699);t.SixelImageStorage=class{constructor(e,t,i,A){this._storage=e,this._opts=t,this._renderer=i,this._terminal=A,this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"vt340"}}addImage(e){this._addImageOpts.scrolling=this._opts.sixelScrolling,this._storage.addImage(e,this._addImageOpts)}advanceCursor(e){if(this._opts.sixelScrolling){let t=this._renderer.cellSize;-1!==t.width&&-1!==t.height||(t=A.CELL_SIZE_DEFAULT);const i=Math.ceil(e/t.height);for(let e=1;e<i;++e)this._terminal._core._inputHandler.lineFeed()}}}},23(e,t,i){var A=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.KittyGraphicsHandler=void 0;const s=i(463),r=i(699),o=A(i(669)),n=i(470);t.KittyGraphicsHandler=class{constructor(e,t,i,A){this._opts=e,this._renderer=t,this._kittyStorage=i,this._coreTerminal=A,this._aborted=!1,this._decodeError=!1,this._activeDecoder=null,this._inControlData=!0,this._controlData=new Uint32Array(512),this._controlLength=0,this._encodedSizeLimit=0,this._totalEncodedSize=0,this._parsedCommand=null,this._pendingTransmissions=new Map,this._maxEncodedBytes=Math.ceil(4*this._opts.kittySizeLimit/3),this._initialEncodedBytes=Math.min(4194304,this._maxEncodedBytes)}reset(){this._cleanupAllPending(),this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),this._kittyStorage.reset()}dispose(){this.reset()}_removePendingEntry(e){this._pendingTransmissions.delete(e),this._lastPendingKey===e&&(this._lastPendingKey=void 0)}_cleanupAllPending(){for(const e of this._pendingTransmissions.values())e.decoder.release();this._pendingTransmissions.clear(),this._lastPendingKey=void 0}start(){this._aborted=!1,this._decodeError=!1,this._inControlData=!0,this._controlLength=0,this._parsedCommand=null,this._encodedSizeLimit=this._maxEncodedBytes,this._totalEncodedSize=0,this._activeDecoder=null}put(e,t,i){var A;if(!this._aborted)if(this._inControlData){let s=i;for(let A=t;A<i;A++)if(59===e[A]){this._inControlData=!1,s=A;break}const r=s-t;if(this._controlLength+r>512)return void(this._aborted=!0);if(this._controlData.set(e.subarray(t,s),this._controlLength),this._controlLength+=r,!this._inControlData){if(this._parsedCommand=(0,n.parseKittyCommand)(this._parseControlDataString()),void 0!==this._parsedCommand.id&&void 0!==this._parsedCommand.imageNumber)return this._sendResponse(this._parsedCommand.id,"EINVAL:cannot specify both i and I keys",null!==(A=this._parsedCommand.quiet)&&void 0!==A?A:0),void(this._aborted=!0);if("d"===this._parsedCommand.action)return;const t=s+1;t<i&&this._streamPayload(e,t,i)}}else this._streamPayload(e,t,i)}_streamPayload(e,t,i){var A,s,r,n,a;if(this._aborted)return;const h=null!==(r=null!==(s=null===(A=this._parsedCommand)||void 0===A?void 0:A.id)&&void 0!==s?s:this._lastPendingKey)&&void 0!==r?r:0,g=this._pendingTransmissions.get(h),d=null!==(n=null==g?void 0:g.totalEncodedSize)&&void 0!==n?n:0;if(this._totalEncodedSize+=i-t,d+this._totalEncodedSize>this._encodedSizeLimit){const e=null!==(a=this._activeDecoder)&&void 0!==a?a:null==g?void 0:g.decoder;return e&&e.release(),this._activeDecoder=null,g&&this._removePendingEntry(h),void(this._aborted=!0)}this._decodeError||((null==g?void 0:g.decoder)&&!this._activeDecoder&&(this._activeDecoder=g.decoder),this._activeDecoder||(this._activeDecoder=new o.default(4194304,this._maxEncodedBytes,this._initialEncodedBytes),this._activeDecoder.init()),0!==this._activeDecoder.put(e.subarray(t,i))&&(this._activeDecoder.release(),this._activeDecoder=null,this._decodeError=!0,g&&this._removePendingEntry(h)))}end(e){var t,i;if(this._aborted||!e)return this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),!0;if(this._inControlData)return this._handleNoPayloadCommand();const A=this._parsedCommand;if("d"===A.action)return this._handleDelete(A);const s=null!==(i=null!==(t=A.id)&&void 0!==t?t:this._lastPendingKey)&&void 0!==i?i:0,r=1===A.more,o=this._pendingTransmissions.get(s);if(r)return this._activeDecoder&&(o?(o.totalEncodedSize+=this._totalEncodedSize,o.decodeError=o.decodeError||this._decodeError):this._pendingTransmissions.set(s,{cmd:Object.assign({},A),decoder:this._activeDecoder,totalEncodedSize:this._totalEncodedSize,decodeError:this._decodeError}),this._lastPendingKey=s,this._activeDecoder=null),!0;o&&(this._lastPendingKey=void 0);let n=this._decodeError,a=A,h=this._activeDecoder;o&&(a=o.cmd,h=o.decoder,n=n||o.decodeError,this._pendingTransmissions.delete(s));let g=new Uint8Array(0);h&&(0!==h.end()&&(n=!0),g=h.data8),this._activeDecoder=null;const d=this._handleCommandWithBytesAndCmd(a,g,n);return h&&h.release(),d}_parseControlDataString(){let e="";for(let t=0;t<this._controlLength;t++)e+=String.fromCodePoint(this._controlData[t]);return e}_handleNoPayloadCommand(){var e,t,i,A,s;const r=(0,n.parseKittyCommand)(this._parseControlDataString());if(void 0!==r.id&&void 0!==r.imageNumber)return this._sendResponse(r.id,"EINVAL:cannot specify both i and I keys",null!==(e=r.quiet)&&void 0!==e?e:0),!0;switch(null!==(t=r.action)&&void 0!==t?t:"t"){case"d":return this._handleDelete(r);case"q":return this._sendResponse(null!==(i=r.id)&&void 0!==i?i:0,"OK",null!==(A=r.quiet)&&void 0!==A?A:0),!0;case"p":return this._handlePlacement(r);default:return void 0!==r.id&&this._sendResponse(r.id,"EINVAL:unsupported action",null!==(s=r.quiet)&&void 0!==s?s:0),!0}}_handleCommandWithBytesAndCmd(e,t,i){var A,s,r,o,n;switch(null!==(A=e.action)&&void 0!==A?A:"t"){case"t":{const A=this._handleTransmit(e,t,i);return"d"===(null!==(s=e.transmission)&&void 0!==s?s:"d")&&void 0!==e.id&&(i?this._sendResponse(e.id,"EINVAL:invalid base64 data",null!==(r=e.quiet)&&void 0!==r?r:0):t.length>0&&this._sendResponse(e.id,"OK",null!==(o=e.quiet)&&void 0!==o?o:0)),A}case"T":return this._handleTransmitDisplay(e,t,i);case"q":return this._handleQuery(e,t,i);case"p":return this._handlePlacement(e);default:return void 0!==e.id&&this._sendResponse(e.id,"EINVAL:unsupported action",null!==(n=e.quiet)&&void 0!==n?n:0),!0}}_handlePlacement(e){var t;if(void 0===e.id)return!0;const i=e.id,A=this._kittyStorage.getImage(i);return A?this._displayImage(A,e).then(t=>{var A;return this._sendResponse(i,t?"OK":"EINVAL:image rendering failed",null!==(A=e.quiet)&&void 0!==A?A:0,e.placementId),!0}):(this._sendResponse(i,"ENOENT:image not found",null!==(t=e.quiet)&&void 0!==t?t:0,e.placementId),!0)}_handleTransmit(e,t,i){var A,s,r,o,n,a;return"d"!==(null!==(A=e.transmission)&&void 0!==A?A:"d")?(void 0!==e.id&&this._sendResponse(e.id,"EINVAL:unsupported transmission medium",null!==(s=e.quiet)&&void 0!==s?s:0),!0):(i||0===t.length||this._kittyStorage.storeImage(e.id,{data:new Blob([t]),width:null!==(r=e.width)&&void 0!==r?r:0,height:null!==(o=e.height)&&void 0!==o?o:0,format:null!==(n=e.format)&&void 0!==n?n:32,compression:null!==(a=e.compression)&&void 0!==a?a:""}),!0)}_handleTransmitDisplay(e,t,i){var A,s;if(i)return void 0!==e.id&&this._sendResponse(e.id,"EINVAL:invalid base64 data",null!==(A=e.quiet)&&void 0!==A?A:0),!0;this._handleTransmit(e,t,i);const r=null!==(s=e.id)&&void 0!==s?s:this._kittyStorage.lastImageId,o=this._kittyStorage.getImage(r);if(o){const t=this._displayImage(o,e);return void 0!==e.id?t.then(t=>{var i;return this._sendResponse(r,t?"OK":"EINVAL:image rendering failed",null!==(i=e.quiet)&&void 0!==i?i:0),!0}):t.then(()=>!0)}return!0}_handleQuery(e,t,i){var A,s,r,o,n,a;const h=null!==(A=e.id)&&void 0!==A?A:0,g=null!==(s=e.quiet)&&void 0!==s?s:0;if("d"!==(null!==(r=e.transmission)&&void 0!==r?r:"d"))return this._sendResponse(h,"EINVAL:unsupported transmission medium",g),!0;if(i)return this._sendResponse(h,"EINVAL:invalid base64 data",g),!0;if(0===t.length)return this._sendResponse(h,"OK",g),!0;const d=null!==(o=e.format)&&void 0!==o?o:32;if(100===d)this._sendResponse(h,"OK",g);else{const i=null!==(n=e.width)&&void 0!==n?n:0,A=null!==(a=e.height)&&void 0!==a?a:0;if(!i||!A)return this._sendResponse(h,"EINVAL:width and height required for raw pixel data",g),!0;const s=i*A*(32===d?4:3);if(t.length<s)return this._sendResponse(h,"EINVAL:insufficient pixel data",g),!0;this._sendResponse(h,"OK",g)}return!0}_handleDelete(e){var t;switch(null!==(t=e.deleteSelector)&&void 0!==t?t:"a"){case"a":case"A":this._cleanupAllPending(),this._kittyStorage.deleteAll();break;case"i":case"I":if(void 0!==e.id){const t=this._pendingTransmissions.get(e.id);t&&t.decoder.release(),this._removePendingEntry(e.id),this._kittyStorage.deleteById(e.id)}}return!0}_sendResponse(e,t,i,A){const s="OK"===t;if(s&&i>=1)return;if(!s&&i>=2)return;const r=`_Gi=${e}${A?`,p=${A}`:""};${t}\\`;this._coreTerminal._core.coreService.triggerDataEvent(r)}_displayImage(e,t){return this._decodeAndDisplay(e,t).then(()=>!0).catch(()=>!1)}async _decodeAndDisplay(e,t){var i,A,o,n,a,h,g;let d=await this._createBitmap(e);try{const l=Math.max(0,null!==(o=t.x)&&void 0!==o?o:0),I=Math.max(0,null!==(n=t.y)&&void 0!==n?n:0),c=t.sourceWidth||d.width-l,_=t.sourceHeight||d.height-I,C=Math.max(0,d.width-l),B=Math.max(0,d.height-I),Q=Math.max(0,Math.min(c,C)),u=Math.max(0,Math.min(_,B));if(0===Q||0===u)throw new Error("invalid source rectangle");if(0!==l||0!==I||Q!==d.width||u!==d.height){const e=await createImageBitmap(d,l,I,Q,u);d.close(),d=e}const m=(null===(i=this._renderer.dimensions)||void 0===i?void 0:i.css.cell.width)||r.CELL_SIZE_DEFAULT.width,E=(null===(A=this._renderer.dimensions)||void 0===A?void 0:A.css.cell.height)||r.CELL_SIZE_DEFAULT.height;let f,D;void 0!==t.columns&&void 0!==t.rows?(f=t.columns,D=t.rows):void 0!==t.columns?(f=t.columns,D=Math.max(1,Math.ceil(d.height/d.width*(f*m)/E))):void 0!==t.rows?(D=t.rows,f=Math.max(1,Math.ceil(d.width/d.height*(D*E)/m))):(f=Math.ceil(d.width/m),D=Math.ceil(d.height/E));let p=d.width,w=d.height;if(void 0===t.columns&&void 0===t.rows||(p=Math.round(f*m),w=Math.round(D*E)),p*w>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");const y=this._coreTerminal._core.buffer,v=y.x,k=y.y,M=y.ybase,b=void 0!==t.zIndex&&t.zIndex<0?"bottom":"top";if(p!==d.width||w!==d.height){const e=await createImageBitmap(d,{resizeWidth:p,resizeHeight:w});d.close(),d=e}const L=Math.min(Math.max(0,null!==(a=t.xOffset)&&void 0!==a?a:0),m-1),S=Math.min(Math.max(0,null!==(h=t.yOffset)&&void 0!==h?h:0),E-1);if(0!==L||0!==S){const e=void 0!==t.columns?Math.round(f*m):d.width+L,i=void 0!==t.rows?Math.round(D*E):d.height+S,A=s.ImageRenderer.createCanvas(window.document,e,i),r=A.getContext("2d");if(!r)throw new Error("Failed to create offset canvas context");r.drawImage(d,L,S);const o=await createImageBitmap(A);if(A.width=A.height=0,d.close(),d=o,p=d.width,w=d.height,p*w>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");void 0===t.columns&&(f=Math.ceil(d.width/m)),void 0===t.rows&&(D=Math.ceil(d.height/E))}const N=null!==(g=t.zIndex)&&void 0!==g?g:0;if(this._kittyStorage.addImage(e.id,d,!0,b,N),d=void 0,1===t.cursorMovement){const e=y.ybase-M;y.x=v,y.y=Math.max(k-e,0)}else y.x=Math.min(v+f,this._coreTerminal.cols)}catch(e){throw null==d||d.close(),e}}async _createBitmap(e){let t=new Uint8Array(await e.data.arrayBuffer());if("z"===e.compression&&(t=await this._decompressZlib(t)),100===e.format){const e=new Blob([t],{type:"image/png"});if(!window.createImageBitmap){const t=URL.createObjectURL(e),i=new Image;return new Promise((e,A)=>{i.addEventListener("load",()=>{var r;URL.revokeObjectURL(t);const o=s.ImageRenderer.createCanvas(window.document,i.width,i.height);null===(r=o.getContext("2d"))||void 0===r||r.drawImage(i,0,0),createImageBitmap(o).then(e).catch(A)}),i.addEventListener("error",()=>{URL.revokeObjectURL(t),A(new Error("Failed to load image"))}),i.src=t})}return createImageBitmap(e)}const i=e.width,A=e.height;if(!i||!A)throw new Error("Width and height required for raw pixel data");const r=i*A*(32===e.format?4:3);if(t.length<r)throw new Error("Insufficient pixel data");const o=i*A;if(32===e.format)return createImageBitmap(new ImageData(new Uint8ClampedArray(t.buffer,t.byteOffset,4*o),i,A));const n=new Uint8ClampedArray(4*o),a=new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),h=new Uint32Array(n.buffer),g=-4&o;let d=0,l=0;for(let e=0;e<g;e+=4){const e=a[d++],t=a[d++],i=a[d++];h[l++]=4278190080|e,h[l++]=4278190080|e>>>24|t<<8,h[l++]=4278190080|t>>>16|i<<16,h[l++]=4278190080|i>>>8}let I=3*g,c=4*g;for(let e=g;e<o;e++)n[c]=t[I],n[c+1]=t[I+1],n[c+2]=t[I+2],n[c+3]=255,I+=3,c+=4;return createImageBitmap(new ImageData(n,i,A))}async _decompressZlib(e){try{return await this._decompress(e,"deflate")}catch(t){return await this._decompress(e,"deflate-raw")}}async _decompress(e,t){const i=new DecompressionStream(t),A=i.writable.getWriter();A.write(e),A.close();const s=[],r=i.readable.getReader();for(;;){const{done:e,value:t}=await r.read();if(e)break;s.push(t)}const o=s.reduce((e,t)=>e+t.length,0),n=new Uint8Array(o);let a=0;for(const e of s)n.set(e,a),a+=e.length;return n}get images(){return this._kittyStorage.images}get _kittyIdToStorageId(){return this._kittyStorage.kittyIdToStorageId}get pendingTransmissions(){return this._pendingTransmissions}}},470(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.parseKittyCommand=function(e){const t={},i=e.split(",");for(const e of i){const i=e.indexOf("=");if(-1===i)continue;const A=e.substring(0,i),s=e.substring(i+1);if("a"===A){t.action=s;continue}if("o"===A){t.compression=s;continue}if("t"===A){t.transmission=s;continue}if("d"===A){t.deleteSelector=s;continue}const r=parseInt(s,10);switch(A){case"f":t.format=r;break;case"i":t.id=r;break;case"I":t.imageNumber=r;break;case"s":t.width=r;break;case"v":t.height=r;break;case"x":t.x=r;break;case"y":t.y=r;break;case"w":t.sourceWidth=r;break;case"h":t.sourceHeight=r;break;case"X":t.xOffset=r;break;case"Y":t.yOffset=r;break;case"c":t.columns=r;break;case"r":t.rows=r;break;case"m":t.more=r;break;case"q":t.quiet=r;break;case"C":t.cursorMovement=r;break;case"z":t.zIndex=r;break;case"p":t.placementId=r}}return t}},235(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.KittyImageStorage=void 0;class i{constructor(e){this._storage=e,this._nextImageId=1,this._images=new Map,this._kittyIdToStorageId=new Map,this._storageIdToKittyId=new Map,this._handleStorageImageDeleted=e=>{const t=this._storageIdToKittyId.get(e);void 0!==t&&(this._kittyIdToStorageId.delete(t),this._storageIdToKittyId.delete(e),this._images.delete(t))},this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"},this._previousOnImageDeleted=this._storage.onImageDeleted,this._wrappedOnImageDeleted=e=>{var t;null===(t=this._previousOnImageDeleted)||void 0===t||t.call(this,e),this._handleStorageImageDeleted(e)},this._storage.onImageDeleted=this._wrappedOnImageDeleted}reset(){this._nextImageId=1,this._images.clear(),this._kittyIdToStorageId.clear(),this._storageIdToKittyId.clear()}dispose(){this.reset(),this._storage.onImageDeleted===this._wrappedOnImageDeleted&&(this._storage.onImageDeleted=this._previousOnImageDeleted)}storeImage(e,t){const A=null!=e?e:this._nextImageId++,s=this._kittyIdToStorageId.get(A);return void 0!==s&&(this._storage.deleteImage(s),this._kittyIdToStorageId.delete(A),this._storageIdToKittyId.delete(s)),!this._images.has(A)&&this._images.size>=i._maxStoredImages&&this._evictUndisplayedImages(),this._images.set(A,Object.assign(Object.assign({},t),{id:A})),A}addImage(e,t,i,A,s){const r=this._kittyIdToStorageId.get(e);void 0!==r&&this._storageIdToKittyId.delete(r),this._addImageOpts.scrolling=i,this._addImageOpts.layer=A,this._addImageOpts.zIndex=s;const o=this._storage.addImage(t,this._addImageOpts);this._kittyIdToStorageId.set(e,o),this._storageIdToKittyId.set(o,e)}getImage(e){return this._images.get(e)}deleteById(e){this._images.delete(e);const t=this._kittyIdToStorageId.get(e);void 0!==t&&(this._storage.deleteImage(t),this._kittyIdToStorageId.delete(e),this._storageIdToKittyId.delete(t))}deleteAll(){this._images.clear();for(const e of this._kittyIdToStorageId.values())this._storage.deleteImage(e);this._kittyIdToStorageId.clear(),this._storageIdToKittyId.clear()}get images(){return this._images}get kittyIdToStorageId(){return this._kittyIdToStorageId}get lastImageId(){return this._nextImageId-1}_evictUndisplayedImages(){for(const[e]of this._images){if(this._images.size<=i._maxStoredImages/2)break;this._kittyIdToStorageId.has(e)||this._images.delete(e)}}}t.KittyImageStorage=i,i._maxStoredImages=256},669(e,t,i){Object.defineProperty(t,"__esModule",{value:!0});const A=(0,i(552).InWasm)({s:1,t:0,d:"AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML"}),s=new Uint8Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").map(e=>e.charCodeAt(0))),r=new Uint32Array(1024);r.fill(4278190080);for(let e=0;e<s.length;++e)r[s[e]]=e<<2;for(let e=0;e<s.length;++e)r[256+s[e]]=e>>4|(e<<4&255)<<8;for(let e=0;e<s.length;++e)r[512+s[e]]=e>>2<<8|(e<<6&255)<<16;for(let e=0;e<s.length;++e)r[768+s[e]]=e<<16;const o=new Uint8Array(0);t.default=class{constructor(e,t,i){if(this._inst=null,this._ended=!0,this._bytes=0,this.keepSize=null!=e?e:1048576,this.maxBytes=null!=t?t:4294901760,this._bytes=null!=i?i:32768,this._bytes>this.maxBytes||this.maxBytes>4294901760)throw new Error("invalid byte settings")}get data8(){return this._inst?this._d.subarray(0,this._m32[1282]):o}release(){this._inst&&(this._bytes>this.keepSize?this._inst=this._m32=this._d=this._mem=null:(this._m32[1280]=0,this._m32[1281]=0,this._m32[1282]=0))}init(e,t){if(this.maxBytes=null!=e?e:this.maxBytes,this._bytes=null!=t?t:Math.min(this._bytes,this.maxBytes),this._bytes>this.maxBytes||this.maxBytes>4294901760)throw Error("invalid byte settings");let i=this._m32;const s=this._bytes+5152;this._inst?this._mem.buffer.byteLength<s&&(this._mem.grow(Math.ceil((s-this._mem.buffer.byteLength)/65536)),i=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)):(this._mem=new WebAssembly.Memory({initial:Math.ceil(s/65536)}),this._inst=A({env:{memory:this._mem}}),i=new Uint32Array(this._mem.buffer,0),i.set(r,256),this._d=new Uint8Array(this._mem.buffer,5152)),i[1280]=0,i[1281]=0,i[1282]=0,this._m32=i,this._ended=!1}_realloc(e){const t=this._m32[1280]+e;if(this._bytes<t){if(t>this.maxBytes)return-3;let e=this._bytes;for(;(e*=2)<t;);if(e=Math.min(e,this.maxBytes),e<t)return-3;if(e+5152>this._mem.buffer.byteLength){const t=Math.ceil((e+5152-this._mem.buffer.byteLength)/65536);this._mem.grow(t),this._m32=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)}this._bytes=e}return 0}put(e){if(!this._inst||this._ended)return-2;if(this._realloc(e.length))return-3;const t=this._m32;return this._d.set(e,t[1280]),t[1280]+=e.length,t[1280]-t[1281]>=131072?this._inst.exports.dec():0}end(){return this._ended=!0,this._inst?this._inst.exports.end():-2}get loadedBytes(){return this._inst?this._m32[1280]:0}get freeBytes(){return this._inst?this.maxBytes-this._m32[1280]:0}}},61(e,t,i){Object.defineProperty(t,"__esModule",{value:!0});const A=(0,i(552).InWasm)({s:1,t:0,d:"AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=="});t.default=class{constructor(e){this.keepSize=e,this.width=0,this.height=0}decode(e){this.width=e[4]<<24|e[5]<<16|e[6]<<8|e[7],this.height=e[8]<<24|e[9]<<16|e[10]<<8|e[11];const t=this.width*this.height,i=4*t,s=e.length,r=Math.max(i,s)+(Math.min(i,s)>>1)+4096;this._inst?this._mem.buffer.byteLength<r&&(this._mem.grow(Math.ceil((r-this._mem.buffer.byteLength)/65536)),this._d=null):(this._mem=new WebAssembly.Memory({initial:Math.ceil(r/65536)}),this._inst=A({env:{memory:this._mem}})),this._d||(this._d=new Uint8Array(this._mem.buffer));const o=this._mem.buffer.byteLength-s&-256;return this._d.set(e,o),this._inst.exports.dec(o,s,t),this._d.subarray(1024,1024+i)}release(){this._inst&&this._mem.buffer.byteLength>this.keepSize&&(this._inst=this._d=this._mem=null)}}},552(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.InWasm=function(e){if(e.d){const{t,s:A,d:s}=e;let r,o;const n=WebAssembly;return 0===t?A?e=>new n.Instance(o||(o=new n.Module(r||(r=i(s)))),e):e=>o?n.instantiate(o,e):n.instantiate(r||(r=i(s)),e).then(e=>(o=e.module)&&e.instance):1===t?A?()=>o||(o=new n.Module(r||(r=i(s)))):()=>o?Promise.resolve(o):n.compile(r||(r=i(s))).then(e=>o=e):A?()=>r||(r=i(s)):()=>Promise.resolve(r||(r=i(s)))}if("undefined"==typeof _wasmCtx)throw new Error('must run "inwasm"');_wasmCtx.add(e)};let i=e=>{if(Uint8Array.fromBase64)return Uint8Array.fromBase64(e);if("undefined"!=typeof Buffer)return Buffer.from(e,"base64");const t=atob(e),i=new Uint8Array(t.length);for(let e=0;e<i.length;++e)i[e]=t.charCodeAt(e);return i}}},t={};function i(A){var s=t[A];if(void 0!==s)return s.exports;var r=t[A]={exports:{}};return e[A].call(r.exports,r,r.exports,i),r.exports}var A={};return(()=>{var e=A;Object.defineProperty(e,"__esModule",{value:!0}),e.ImageAddon=void 0;const t=i(414),s=i(795),r=i(463),o=i(699),n=i(23),a=i(235),h=i(566),g=i(994),d=i(649),l={enableSizeReports:!0,pixelLimit:16777216,sixelSupport:!0,sixelScrolling:!0,sixelPaletteLimit:4096,sixelSizeLimit:33554432,storageLimit:128,showPlaceholder:!0,iipSupport:!0,iipSizeLimit:33554432,kittySupport:!0,kittySizeLimit:33554432};e.ImageAddon=class{constructor(e){this._disposables=[],this._handlers=new Map,this._onImageAdded=new t.Emitter,this.onImageAdded=this._onImageAdded.event,this._opts=Object.assign({},l,e),this._defaultOpts=Object.assign({},l,e)}dispose(){for(const e of this._disposables)e.dispose();this._disposables.length=0,this._handlers.clear(),this._onImageAdded.dispose()}_disposeLater(...e){for(const t of e)this._disposables.push(t)}activate(e){var t;if(this._terminal=e,this._renderer=new r.ImageRenderer(e),this._storage=new o.ImageStorage(e,this._renderer,this._opts),this._storage.onImageAdded=()=>this._onImageAdded.fire(),this._opts.enableSizeReports){const i=null!==(t=e.options.windowOptions)&&void 0!==t?t:{};i.getWinSizePixels=!0,i.getCellSizePixels=!0,i.getWinSizeChars=!0,e.options.windowOptions=i}if(this._disposeLater(this._renderer,this._storage,e.parser.registerCsiHandler({prefix:"?",final:"h"},e=>this._decset(e)),e.parser.registerCsiHandler({prefix:"?",final:"l"},e=>this._decrst(e)),e.parser.registerCsiHandler({final:"c"},e=>this._da1(e)),e.parser.registerCsiHandler({prefix:"?",final:"S"},e=>this._xtermGraphicsAttributes(e)),e.onRender(e=>{var t;return null===(t=this._storage)||void 0===t?void 0:t.render(e)}),e.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>this.reset()),e.parser.registerEscHandler({final:"c"},()=>this.reset()),e._core._inputHandler.onRequestReset(()=>this.reset()),e.buffer.onBufferChange(()=>{var e;return null===(e=this._storage)||void 0===e?void 0:e.wipeAlternate()}),e.onResize(e=>{var t;return null===(t=this._storage)||void 0===t?void 0:t.viewportResize(e)})),this._opts.sixelSupport){const t=new g.SixelImageStorage(this._storage,this._opts,this._renderer,e),i=new h.SixelHandler(this._opts,t,e);this._handlers.set("sixel",i),this._disposeLater(e._core._inputHandler._parser.registerDcsHandler({final:"q"},i))}if(this._opts.iipSupport){const t=new d.IIPImageStorage(this._storage),i=new s.IIPHandler(this._opts,this._renderer,t,e);this._handlers.set("iip",i),this._disposeLater(e._core._inputHandler._parser.registerOscHandler(1337,i))}if(this._opts.kittySupport){const t=new a.KittyImageStorage(this._storage),i=new n.KittyGraphicsHandler(this._opts,this._renderer,t,e);this._handlers.set("kitty",i),this._disposeLater(t,i,e._core._inputHandler._parser.registerApcHandler({final:"G"},i))}}reset(){var e;this._opts.sixelScrolling=this._defaultOpts.sixelScrolling,this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,null===(e=this._storage)||void 0===e||e.reset();for(const e of this._handlers.values())e.reset();return!1}get storageLimit(){var e;return(null===(e=this._storage)||void 0===e?void 0:e.getLimit())||-1}set storageLimit(e){var t;null===(t=this._storage)||void 0===t||t.setLimit(e),this._opts.storageLimit=e}get storageUsage(){return this._storage?this._storage.getUsage():-1}get showPlaceholder(){return this._opts.showPlaceholder}set showPlaceholder(e){var t;this._opts.showPlaceholder=e,null===(t=this._renderer)||void 0===t||t.showPlaceholder(e)}getImageAtBufferCell(e,t){var i;return null===(i=this._storage)||void 0===i?void 0:i.getImageAtBufferCell(e,t)}extractTileAtBufferCell(e,t){var i;return null===(i=this._storage)||void 0===i?void 0:i.extractTileAtBufferCell(e,t)}_report(e){var t;null===(t=this._terminal)||void 0===t||t._core.input(e,!1)}_decset(e){for(let t=0;t<e.length;++t)80===e[t]&&(this._opts.sixelScrolling=!1);return!1}_decrst(e){for(let t=0;t<e.length;++t)80===e[t]&&(this._opts.sixelScrolling=!0);return!1}_da1(e){return!!e[0]||!!this._opts.sixelSupport&&(this._report("[?62;4;9;22c"),!0)}_xtermGraphicsAttributes(e){var t,i,A,s,r,n;if(e.length<2)return!0;if(1===e[0])switch(e[1]){case 1:return this._report(`[?${e[0]};0;${this._opts.sixelPaletteLimit}S`),!0;case 2:this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,this._report(`[?${e[0]};0;${this._opts.sixelPaletteLimit}S`);for(const e of this._handlers.values())e.reset();return!0;case 3:return e.length>2&&!(e[2]instanceof Array)&&e[2]<=4096?(this._opts.sixelPaletteLimit=e[2],this._report(`[?${e[0]};0;${this._opts.sixelPaletteLimit}S`)):this._report(`[?${e[0]};2S`),!0;case 4:return this._report(`[?${e[0]};0;4096S`),!0;default:return this._report(`[?${e[0]};2S`),!0}if(2===e[0])switch(e[1]){case 1:let a=null===(i=null===(t=this._renderer)||void 0===t?void 0:t.dimensions)||void 0===i?void 0:i.css.canvas.width,h=null===(s=null===(A=this._renderer)||void 0===A?void 0:A.dimensions)||void 0===s?void 0:s.css.canvas.height;if(!a||!h){const e=o.CELL_SIZE_DEFAULT;a=((null===(r=this._terminal)||void 0===r?void 0:r.cols)||80)*e.width,h=((null===(n=this._terminal)||void 0===n?void 0:n.rows)||24)*e.height}if(a*h<this._opts.pixelLimit)this._report(`[?${e[0]};0;${a.toFixed(0)};${h.toFixed(0)}S`);else{const t=Math.floor(Math.sqrt(this._opts.pixelLimit));this._report(`[?${e[0]};0;${t};${t}S`)}return!0;case 4:const g=Math.floor(Math.sqrt(this._opts.pixelLimit));return this._report(`[?${e[0]};0;${g};${g}S`),!0;default:return this._report(`[?${e[0]};2S`),!0}return this._report(`[?${e[0]};1S`),!0}}})(),A})());
|
||
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ImageAddon=t():e.ImageAddon=t()}(globalThis,()=>(()=>{"use strict";var e={939(e,t){function i(e){return 255&e}function s(e){return e>>>8&255}function A(e){return e>>>16&255}function r(e,t,i,s=255){return((255&s)<<24|(255&i)<<16|(255&t)<<8|255&e)>>>0}function o(e,t,i){return Math.max(e,Math.min(i,t))}function n(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),6*i<1?t+6*(e-t)*i:2*i<1?e:3*i<2?t+(e-t)*(4-6*i):t}function a(e,t,i){return(4278190080|Math.round(i/100*255)<<16|Math.round(t/100*255)<<8|Math.round(e/100*255))>>>0}Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_FOREGROUND=t.DEFAULT_BACKGROUND=t.PALETTE_ANSI_256=t.PALETTE_VT340_GREY=t.PALETTE_VT340_COLOR=t.normalizeHLS=t.normalizeRGB=t.nearestColorIndex=t.fromRGBA8888=t.toRGBA8888=t.alpha=t.blue=t.green=t.red=t.BIG_ENDIAN=void 0,t.BIG_ENDIAN=255===new Uint8Array(new Uint32Array([4278190080]).buffer)[0],t.BIG_ENDIAN&&console.warn("BE platform detected. This version of node-sixel works only on LE properly."),t.red=i,t.green=s,t.blue=A,t.alpha=function(e){return e>>>24&255},t.toRGBA8888=r,t.fromRGBA8888=function(e){return[255&e,e>>8&255,e>>16&255,e>>>24]},t.nearestColorIndex=function(e,t){const r=i(e),o=s(e),n=A(e);let a=Number.MAX_SAFE_INTEGER,h=-1;for(let e=0;e<t.length;++e){const i=r-t[e][0],s=o-t[e][1],A=n-t[e][2],l=i*i+s*s+A*A;if(!l)return e;l<a&&(a=l,h=e)}return h},t.normalizeRGB=a,t.normalizeHLS=function(e,t,i){return function(e,t,i){if(!i){const e=Math.round(255*t);return r(e,e,e)}const s=t<.5?t*(1+i):t+i-t*i,A=2*t-s;return r(o(0,255,Math.round(255*n(s,A,e+1/3))),o(0,255,Math.round(255*n(s,A,e))),o(0,255,Math.round(255*n(s,A,e-1/3))))}((e+240)/360,t/100,i/100)},t.PALETTE_VT340_COLOR=new Uint32Array([a(0,0,0),a(20,20,80),a(80,13,13),a(20,80,20),a(80,20,80),a(20,80,80),a(80,80,20),a(53,53,53),a(26,26,26),a(33,33,60),a(60,26,26),a(33,60,33),a(60,33,60),a(33,60,60),a(60,60,33),a(80,80,80)]),t.PALETTE_VT340_GREY=new Uint32Array([a(0,0,0),a(13,13,13),a(26,26,26),a(40,40,40),a(6,6,6),a(20,20,20),a(33,33,33),a(46,46,46),a(0,0,0),a(13,13,13),a(26,26,26),a(40,40,40),a(6,6,6),a(20,20,20),a(33,33,33),a(46,46,46)]),t.PALETTE_ANSI_256=(()=>{const e=[r(0,0,0),r(205,0,0),r(0,205,0),r(205,205,0),r(0,0,238),r(205,0,205),r(0,250,205),r(229,229,229),r(127,127,127),r(255,0,0),r(0,255,0),r(255,255,0),r(92,92,255),r(255,0,255),r(0,255,255),r(255,255,255)],t=[0,95,135,175,215,255];for(let i=0;i<6;++i)for(let s=0;s<6;++s)for(let A=0;A<6;++A)e.push(r(t[i],t[s],t[A]));for(let t=8;t<=238;t+=10)e.push(r(t,t,t));return new Uint32Array(e)})(),t.DEFAULT_BACKGROUND=r(0,0,0,255),t.DEFAULT_FOREGROUND=r(255,255,255,255)},591(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.decodeAsync=t.decode=t.Decoder=t.DecoderAsync=void 0;const s=i(939),A=i(199),r=function(e){if("undefined"!=typeof Buffer)return Buffer.from(e,"base64");const t=atob(e),i=new Uint8Array(t.length);for(let e=0;e<i.length;++e)i[e]=t.charCodeAt(e);return i}(A.LIMITS.BYTES);let o;const n=new Uint32Array;class a{constructor(){this.bandHandler=e=>1,this.modeHandler=e=>1}handle_band(e){return this.bandHandler(e)}mode_parsed(e){return this.modeHandler(e)}}const h={memoryLimit:134217728,sixelColor:s.DEFAULT_FOREGROUND,fillColor:s.DEFAULT_BACKGROUND,palette:s.PALETTE_VT340_COLOR,paletteLimit:A.LIMITS.PALETTE_SIZE,truncate:!0};function l(e){const t=new a,i={env:{handle_band:t.handle_band.bind(t),mode_parsed:t.mode_parsed.bind(t)}};return WebAssembly.instantiate(o||r,i).then(i=>(o=o||i.module,new d(e,i.instance||i,t)))}t.DecoderAsync=l;class d{constructor(e,t,i){if(this._PIXEL_OFFSET=A.LIMITS.MAX_WIDTH+4,this._canvas=n,this._bandWidths=[],this._maxWidth=0,this._minWidth=A.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0,this._opts=Object.assign({},h,e),this._opts.paletteLimit>A.LIMITS.PALETTE_SIZE)throw new Error(`DecoderOptions.paletteLimit must not exceed ${A.LIMITS.PALETTE_SIZE}`);if(t)i.bandHandler=this._handle_band.bind(this),i.modeHandler=this._initCanvas.bind(this);else{const e=o||(o=new WebAssembly.Module(r));t=new WebAssembly.Instance(e,{env:{handle_band:this._handle_band.bind(this),mode_parsed:this._initCanvas.bind(this)}})}this._instance=t,this._wasm=this._instance.exports,this._chunk=new Uint8Array(this._wasm.memory.buffer,this._wasm.get_chunk_address(),A.LIMITS.CHUNK_SIZE),this._states=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_state_address(),12),this._palette=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_palette_address(),A.LIMITS.PALETTE_SIZE),this._palette.set(this._opts.palette),this._pSrc=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_p0_address()),this._wasm.init(s.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}get _fillColor(){return this._states[0]}get _truncate(){return this._states[8]}get _rasterWidth(){return this._states[6]}get _rasterHeight(){return this._states[7]}get _width(){return this._states[2]?this._states[2]-4:0}get _height(){return this._states[3]}get _level(){return this._states[9]}get _mode(){return this._states[10]}get _paletteLimit(){return this._states[11]}_initCanvas(e){if(2===e){const e=this.width*this.height;if(e>this._canvas.length){if(this._opts.memoryLimit&&4*e>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(e)}this._maxWidth=this._width}else if(1===e)if(2===this._level){const e=Math.min(this._rasterWidth,A.LIMITS.MAX_WIDTH)*this._rasterHeight;if(e>this._canvas.length){if(this._opts.memoryLimit&&4*e>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(e)}}else this._canvas.length<65536&&(this._canvas=new Uint32Array(65536));return 0}_realloc(e,t){const i=e+t;if(i>this._canvas.length){if(this._opts.memoryLimit&&4*i>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");const e=new Uint32Array(65536*Math.ceil(i/65536));e.set(this._canvas),this._canvas=e}}_handle_band(e){const t=this._PIXEL_OFFSET;let i=this._lastOffset;if(2===this._mode){let s=this.height-this._currentHeight,A=0;for(;A<6&&s>0;)this._canvas.set(this._pSrc.subarray(t*A,t*A+e),i+e*A),A++,s--;this._lastOffset+=e*A,this._currentHeight+=A}else if(1===this._mode){this._realloc(i,6*e),this._maxWidth=Math.max(this._maxWidth,e),this._minWidth=Math.min(this._minWidth,e);for(let s=0;s<6;++s)this._canvas.set(this._pSrc.subarray(t*s,t*s+e),i+e*s);this._bandWidths.push(e),this._lastOffset+=6*e,this._currentHeight+=6}return 0}get width(){return 1!==this._mode?this._width:Math.max(this._maxWidth,this._wasm.current_width())}get height(){return 1!==this._mode?this._height:this._wasm.current_width()?6*this._bandWidths.length+this._wasm.current_height():6*this._bandWidths.length}get palette(){return this._palette.subarray(0,this._paletteLimit)}get memoryUsage(){return this._canvas.byteLength+this._wasm.memory.buffer.byteLength+8*this._bandWidths.length}get properties(){return{width:this.width,height:this.height,mode:this._mode,level:this._level,truncate:!!this._truncate,paletteLimit:this._paletteLimit,fillColor:this._fillColor,memUsage:this.memoryUsage,rasterAttributes:{numerator:this._states[4],denominator:this._states[5],width:this._rasterWidth,height:this._rasterHeight}}}init(e=this._opts.fillColor,t=this._opts.palette,i=this._opts.paletteLimit,s=this._opts.truncate){this._wasm.init(this._opts.sixelColor,e,i,s?1:0),t&&this._palette.set(t.subarray(0,A.LIMITS.PALETTE_SIZE)),this._bandWidths.length=0,this._maxWidth=0,this._minWidth=A.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0}decode(e,t=0,i=e.length){let s=t;for(;s<i;){const t=Math.min(i-s,A.LIMITS.CHUNK_SIZE);this._chunk.set(e.subarray(s,s+=t)),this._wasm.decode(0,t)}}decodeString(e,t=0,i=e.length){let s=t;for(;s<i;){const t=Math.min(i-s,A.LIMITS.CHUNK_SIZE);for(let i=0,A=s;i<t;++i,++A)this._chunk[i]=e.charCodeAt(A);s+=t,this._wasm.decode(0,t)}}get data32(){if(0===this._mode||!this.width||!this.height)return n;const e=this._wasm.current_width();if(2===this._mode){let t=this.height-this._currentHeight;if(t>0){const i=this._PIXEL_OFFSET;let s=this._lastOffset,A=0;for(;A<6&&t>0;)this._canvas.set(this._pSrc.subarray(i*A,i*A+e),s+e*A),A++,t--;t&&this._canvas.fill(this._fillColor,s+e*A)}return this._canvas.subarray(0,this.width*this.height)}if(1===this._mode){if(this._minWidth===this._maxWidth){let t=!1;if(e)if(e!==this._minWidth)t=!0;else{const t=this._PIXEL_OFFSET;let i=this._lastOffset;this._realloc(i,6*e);for(let s=0;s<6;++s)this._canvas.set(this._pSrc.subarray(t*s,t*s+e),i+e*s)}if(!t)return this._canvas.subarray(0,this.width*this.height)}const t=new Uint32Array(this.width*this.height);t.fill(this._fillColor);let i=0,s=0;for(let e=0;e<this._bandWidths.length;++e){const A=this._bandWidths[e];for(let e=0;e<6;++e)t.set(this._canvas.subarray(s,s+=A),i),i+=this.width}if(e){const s=this._PIXEL_OFFSET,A=this._wasm.current_height();for(let r=0;r<A;++r)t.set(this._pSrc.subarray(s*r,s*r+e),i+this.width*r)}return t}return n}get data8(){return new Uint8ClampedArray(this.data32.buffer,0,this.width*this.height*4)}release(){this._canvas=n,this._bandWidths.length=0,this._maxWidth=0,this._minWidth=A.LIMITS.MAX_WIDTH,this._wasm.init(s.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}}t.Decoder=d,t.decode=function(e,t){const i=new d(t);return i.init(),"string"==typeof e?i.decodeString(e):i.decode(e),{width:i.width,height:i.height,data32:i.data32,data8:i.data8}},t.decodeAsync=async function(e,t){const i=await l(t);return i.init(),"string"==typeof e?i.decodeString(e):i.decode(e),{width:i.width,height:i.height,data32:i.data32,data8:i.data8}}},199(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LIMITS=void 0,t.LIMITS={CHUNK_SIZE:16384,PALETTE_SIZE:4096,MAX_WIDTH:16384,BYTES:"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AEHAiwIgADcDAEG4iwIgADcDAEGwiwIgADcDAEGoiwIgADcDAEGgiwIgADcDAEGYiwIgADcDAEGQiwIgADcDAEGIiwIgADcDAEGAiwIgADcDAEH4igIgADcDAEHwigIgADcDAEHoigIgADcDAEHgigIgADcDAEHYigIgADcDAEHQigIgADcDAEHIigIgADcDAEHAigIgADcDAEG4igIgADcDAEGwigIgADcDAEGoigIgADcDAEGgigIgADcDAEGYigIgADcDAEGQigIgADcDAEGIigIgADcDAEGAigIgADcDAEH4iQIgADcDAEHwiQIgADcDAEHoiQIgADcDAEHgiQIgADcDAEHYiQIgADcDAEHQiQIgADcDAEHIiQIgADcDAEHAiQIgADcDAEG4iQIgADcDAEGwiQIgADcDAEGoCCgCACIEQf8AakGAAW0hCAJAIARBgQFIDQBBASEBIAhBAiAIQQJKG0EBayICQQFxIQMgBEGBAk4EQCACQX5xIQIDQCABQQl0IgdBEHJBoIkCakGwiQJBgAT8CgAAIAdBsI0CakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsLIANFDQAgAUEJdEEQckGgiQJqQbCJAkGABPwKAAALAkAgBEEBSA0AIAhBASAIQQFKGyIDQQFxIQUCQCADQQFrIgdFBEBBACEBDAELIANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQbCJBmpBsIkCQYAE/AoAACAGQZAEckGwiQZqQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACwsgBQRAIAFBCXRBEHJBsIkGakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEFIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiBkEQckHAiQpqQbCJAkGABPwKAAAgBkGQBHJBwIkKakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAFBEAgAUECdEHAiQpqQbCJAkGABPwKAAALIARBAUgNACADQQFxIQUgBwR/IANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQdCJDmpBsIkCQYAE/AoAACAGQZAEckHQiQ5qQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACyABQQd0QQRyBUEECyEBIAUEQCABQQJ0QdCJ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"}},578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.IntervalTimer=t.MicrotaskTimer=t.TimeoutTimer=void 0,t.timeout=function(e){return new Promise(t=>setTimeout(t,e))},t.disposableTimeout=function(e,t=0,i){const A=setTimeout(()=>{e(),i&&r.dispose()},t),r=(0,s.toDisposable)(()=>{clearTimeout(A)});return i?.add(r),r};const s=i(426);t.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,e()},t)}setIfNotSet(e,t){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,e()},t))}},t.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(e){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,e())}))}},t.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(e,t,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{e()},t);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},414(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EventUtils=t.Emitter=void 0;const s=i(426);var A;t.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(e,t,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const A={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(A);const r=(0,s.toDisposable)(()=>{const e=this._listeners.indexOf(A);-1!==e&&(this._listeners=this._listeners.slice(),this._listeners.splice(e,1))});return i&&(Array.isArray(i)?i.push(r):i.add(r)),r}),this._event}fire(e){if(this._disposed||!this._listeners.length)return;if(1===this._listeners.length)return void this._listeners[0].fn.call(this._listeners[0].thisArgs,e);const t=this._listeners;for(let i=0,s=t.length;i<s;++i)t[i].fn.call(t[i].thisArgs,e)}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},function(e){e.forward=function(e,t){return e(e=>t.fire(e))},e.map=function(e,t){return(i,s,A)=>e(e=>i.call(s,t(e)),void 0,A)},e.any=function(...e){return(t,i,A)=>{const r=new s.DisposableStore;for(const s of e)r.add(s(e=>t.call(i,e)));return A&&(Array.isArray(A)?A.push(r):A.add(r)),r}},e.runAndSubscribe=function(e,t,i){return t(i),e(e=>t(e))}}(A||(t.EventUtils=A={}))},426(e,t){function i(e){return{dispose:e}}function s(e){if(!e)return e;if(Array.isArray(e)){for(const t of e)t.dispose();return[]}return e.dispose(),e}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=t.DisposableStore=void 0,t.toDisposable=i,t.dispose=s,t.combinedDisposable=function(...e){return i(()=>s(e))};class A{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(const e of this._disposables)e.dispose();this._disposables.clear()}}t.DisposableStore=A;class r{constructor(){this._store=new A}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}}t.Disposable=r,r.None=Object.freeze({dispose(){}}),t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}}},917(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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}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}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}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&&void 0===this.payload}}t.ExtendedAttrs=s},721(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(348),A=i(564),r=i(917);class o extends r.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new r.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;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[A.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[A.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[A.CHAR_DATA_CHAR_INDEX].length){const i=e[A.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[A.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[A.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[A.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[A.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[A.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[A.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor())return!1;if(this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor())return!1;if(this.isInverse()!==e.isInverse())return!1;if(this.isBold()!==e.isBold())return!1;if(this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;const t=this.isUnderlineColorDefault(),i=e.isUnderlineColorDefault();if(!t||!i){if(t!==i)return!1;if(this.getUnderlineColor()!==e.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==e.getUnderlineColorMode())return!1}}return this.isOverline()===e.isOverline()&&this.isBlink()===e.isBlink()&&this.isInvisible()===e.isInvisible()&&this.isItalic()===e.isItalic()&&this.isDim()===e.isDim()&&this.isStrikethrough()===e.isStrikethrough()}}t.CellData=o},564(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=t.DEFAULT_COLOR<<9|256,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},348(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=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 A=t;A<i;++A){let t=e[A];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,A=0;if(this._interim){const i=e.charCodeAt(A++);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 r=A;r<i;++r){const A=e.charCodeAt(r);if(55296<=A&&A<=56319){if(++r>=i)return this._interim=A,s;const o=e.charCodeAt(r);56320<=o&&o<=57343?t[s++]=1024*(A-55296)+o-56320+65536:(t[s++]=A,t[s++]=o);continue}65279!==A&&(t[s++]=A)}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,A,r,o,n,a=0,h=0;if(this.interim[0]){let s=!1,A=this.interim[0];A&=192==(224&A)?31:224==(240&A)?15:7;let r,o=0;for(;(r=this.interim[++o])&&o<4;)A<<=6,A|=63&r;const n=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=n-o;for(;h<l;){if(h>=i)return 0;if(r=e[h++],128!=(192&r)){h--,s=!0;break}this.interim[o++]=r,A<<=6,A|=63&r}s||(2===n?A<128?h--:t[a++]=A:3===n?A<2048||A>=55296&&A<=57343||65279===A||(t[a++]=A):A<65536||A>1114111||(t[a++]=A)),this.interim.fill(0)}const l=i-4;let d=h;for(;d<i;){for(;!(!(d<l)||128&(s=e[d])||128&(A=e[d+1])||128&(r=e[d+2])||128&(o=e[d+3]));)t[a++]=s,t[a++]=A,t[a++]=r,t[a++]=o,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(A=e[d++],128!=(192&A)){d--;continue}if(n=(31&s)<<6|63&A,n<128){d--;continue}t[a++]=n}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(A=e[d++],128!=(192&A)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=A,a;if(r=e[d++],128!=(192&r)){d--;continue}if(n=(15&s)<<12|(63&A)<<6|63&r,n<2048||n>=55296&&n<=57343||65279===n)continue;t[a++]=n}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(A=e[d++],128!=(192&A)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=A,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=A,this.interim[2]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(n=(7&s)<<18|(63&A)<<12|(63&r)<<6|63&o,n<65536||n>1114111)continue;t[a++]=n}}return a}}},795(e,t,i){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.IIPHandler=void 0;const A=i(463),r=i(699),o=s(i(669)),n=s(i(61)),a=i(389),h=i(462),l={type:0,name:"Unnamed file",size:0,width:"auto",height:"auto",preserveAspectRatio:1,inline:0};t.IIPHandler=class{constructor(e,t,i,s){this._opts=e,this._renderer=t,this._storage=i,this._coreTerminal=s,this._generation=0,this._aborted=!1,this._hp=new a.HeaderParser,this._header=l,this._isMultipart=!1,this._abortMulti=!1;const A=Math.ceil(4*this._opts.iipSizeLimit/3),r=Math.min(1048576,A);this._dec=new o.default(0,A,r),this._qoiDec=new n.default(0)}reset(){this._generation++,this._hp.reset(),this._dec.release(),this._qoiDec.release()}start(){this._aborted=!1,this._hp.reset()}put(e,t,i){if(!this._aborted)if(4===this._hp.state)0!==this._dec.put(e.subarray(t,i))&&(this._dec.release(),this._aborted=!0);else{const s=this._hp.parse(e,t,i);if(-1===s)return void(this._aborted=!0);if(s>0){if(1===this._hp.fields.type){if(this._isMultipart&&(this._isMultipart=!1,this._abortMulti=!1,this._dec.release()),this._header=Object.assign({},l,this._hp.fields),!this._header.inline)return void(this._aborted=!0);if(!this._initDecoder())return void(this._aborted=!0)}else if(this._abortMulti)return void(this._aborted=!0);0!==this._dec.put(e.subarray(s,i))&&(this._dec.release(),this._aborted=!0,this._isMultipart&&(this._abortMulti=!0))}}}end(e){var t,i,s;if(this._aborted)return!0;if(4!==this._hp.state&&this._hp.end())return!0;const o=this._hp.fields.type;if(3===o)return!0;if(5===o){let e=r.CELL_SIZE_DEFAULT.width,i=r.CELL_SIZE_DEFAULT.height;this._renderer.dimensions&&(e=this._renderer.dimensions.css.canvas.width/this._coreTerminal.cols,i=this._renderer.dimensions.css.canvas.height/this._coreTerminal.rows);const A=null!==(s=null===(t=this._coreTerminal._core._coreBrowserService)||void 0===t?void 0:t.dpr)&&void 0!==s?s:1,o=`]1337;ReportCellSize=${i.toFixed(3)};${e.toFixed(3)};${A.toFixed(3)}\\`;return this._coreTerminal.input(o,!1),!0}if(2===o)return this._header=Object.assign({},l,this._hp.fields),this._isMultipart=!0,this._abortMulti=!1,this._dec.release(),this._initDecoder()||(this._abortMulti=!0),!0;if(4===o){if(!this._isMultipart)return!0;if(this._isMultipart=!1,this._abortMulti||2!==this._header.type)return!0}let n,a,d=0,g=0,c=h.UNSUPPORTED_TYPE;if((n=e)&&((n=!this._dec.end())?(c=(0,h.imageType)(this._dec.data8),(n="unsupported"!==c.mime)?(d=c.width,g=c.height,(n=d&&g&&d*g<this._opts.pixelLimit)?([d,g]=this._resize(d,g).map(Math.floor),n=d&&g&&d*g<this._opts.pixelLimit):console.warn(`IIP: image dimension issue ${c.width}x${c.height}`)):console.warn("IIP: unsupported image type")):console.warn("IIP: error during BASE64 decoding")),!n)return this._dec.release(),!0;if("image/qoi"===c.mime){let e;try{e=this._qoiDec.decode(this._dec.data8)}catch(e){return console.warn("IIP: could not decode QOI image",e),this._dec.release(),this._qoiDec.release(),!0}if(a=new ImageData(new Uint8ClampedArray(e.buffer,e.byteOffset,e.byteLength),this._qoiDec.width,this._qoiDec.height),this._qoiDec.release(),d===this._qoiDec.width&&g===this._qoiDec.height){this._dec.release();const e=A.ImageRenderer.createCanvas(void 0,this._qoiDec.width,this._qoiDec.height);return null===(i=e.getContext("2d"))||void 0===i||i.putImageData(a,0,0),this._storage.addImage(e),!0}}else a=new Blob([this._dec.data8],{type:c.mime});this._dec.release();const I=this._generation;return createImageBitmap(a,{resizeWidth:d,resizeHeight:g}).then(e=>I!==this._generation?(e.close(),!0):(this._storage.addImage(e),!0)).catch(e=>(console.warn(`IIP: decoding error ${c.mime} ${c.width}x${c.height}`,e),!0))}_initDecoder(){try{return this._dec.init(),!0}catch(e){return console.warn("IIP: could not allocate decoder",e),this._dec.release(),!1}}_resize(e,t){var i,s,A,o;const n=(null===(i=this._renderer.dimensions)||void 0===i?void 0:i.css.cell.width)||r.CELL_SIZE_DEFAULT.width,a=(null===(s=this._renderer.dimensions)||void 0===s?void 0:s.css.cell.height)||r.CELL_SIZE_DEFAULT.height,h=(null===(A=this._renderer.dimensions)||void 0===A?void 0:A.css.canvas.width)||n*this._coreTerminal.cols,l=(null===(o=this._renderer.dimensions)||void 0===o?void 0:o.css.canvas.height)||a*this._coreTerminal.rows,d=this._dim(this._header.width,h,n),g=this._dim(this._header.height,l,a);if(!d&&!g){const i=h/e,s=(l-a)/t,A=Math.min(i,s);return A<1?[e*A,t*A]:[e,t]}return d?!this._header.preserveAspectRatio&&d&&g?[d,g]:[d,t*d/e]:[e*g/t,g]}_dim(e,t,i){return"auto"===e?0:e.endsWith("%")?parseInt(e.slice(0,-1),10)*t/100:e.endsWith("px")?parseInt(e.slice(0,-2),10):parseInt(e,10)*i}}},389(e,t){function i(e){let t="";for(let i=0;i<e.length;++i)t+=String.fromCharCode(e[i]);return t}function s(e){let t=0;for(let i=0;i<e.length;++i){if(e[i]<48||e[i]>57)throw new Error("illegal char");t=10*t+e[i]-48}return t}function A(e){const t=i(e);if(!t.match(/^((auto)|(\d+?((px)|(%)){0,1}))$/))throw new Error("illegal size");return t}Object.defineProperty(t,"__esModule",{value:!0}),t.HeaderParser=void 0;const r={inline:s,size:s,name:function(e){if("undefined"!=typeof Buffer)return Buffer.from(i(e),"base64").toString();const t=atob(i(e)),s=new Uint8Array(t.length);for(let e=0;e<s.length;++e)s[e]=t.charCodeAt(e);return(new TextDecoder).decode(s)},width:A,height:A,preserveAspectRatio:s},o=[70,105,108,101],n=[77,117,108,116,105,112,97,114,116,70,105,108,101],a=[70,105,108,101,80,97,114,116],h=[70,105,108,101,69,110,100],l=[82,101,112,111,114,116,67,101,108,108,83,105,122,101],d=1024;t.HeaderParser=class{constructor(){this.state=0,this._buffer=new Uint32Array(d),this._position=0,this._key="",this.fields={}}reset(){this._buffer.fill(0),this.state=0,this._position=0,this.fields={},this._key=""}end(){if(0===this.state){if(this._position===h.length){for(let e=0;e<h.length;++e)if(this._buffer[e]!==h[e])return this._a();return this.fields.type=4,this.state=4,0}if(this._position===l.length){for(let e=0;e<l.length;++e)if(this._buffer[e]!==l[e])return this._a();return this.fields.type=5,this.state=4,0}return this._a()}return 4===this.state?0:3===this.state&&2===this.fields.type&&this._storeValue(this._position)?(this.state=4,0):this._a()}parse(e,t,i){let s=this.state,A=this._position;const r=this._buffer;if(1===s||4===s)return-1;if(0===s&&A>14)return-1;for(let h=t;h<i;++h){const t=e[h];switch(t){case 59:if(!this._storeValue(A))return this._a();s=2,A=0;break;case 61:if(0===s){if(70===r[0]){let e=0;for(;e<o.length;++e)if(r[e]!==o[e])return this._a();if(this.fields.type=1,A===a.length){for(;e<a.length;++e)if(r[e]!==a[e])return this._a();return this.fields.type=3,this.state=4,h+1}}else{if(77!==r[0])return this._a();for(let e=0;e<n.length;++e)if(r[e]!==n[e])return this._a();this.fields.type=2}s=2,A=0}else if(2===s){if(!this._storeKey(A))return this._a();s=3,A=0}else if(3===s){if(A>=d)return this._a();r[A++]=t}break;case 58:return 3!==s||this._storeValue(A)?(this.state=4,h+1):this._a();default:if(A>=d)return this._a();r[A++]=t}}return this.state=s,this._position=A,-2}_a(){return this.fields.type=0,this.state=1,-1}_storeKey(e){const t=i(this._buffer.subarray(0,e));return!!t&&(this._key=t,this.fields[t]=null,!0)}_storeValue(e){if(this._key){try{const t=this._buffer.slice(0,e);this.fields[this._key]=r[this._key]?r[this._key](t):t}catch(e){return!1}return!0}return!1}}},649(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.IIPImageStorage=void 0,t.IIPImageStorage=class{constructor(e){this._storage=e,this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"}}addImage(e){this._storage.addImage(e,this._addImageOpts)}}},462(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.UNSUPPORTED_TYPE=void 0,t.imageType=function(e){if(e.length<32)return t.UNSUPPORTED_TYPE;const i=new Uint32Array(e.buffer,e.byteOffset,8);if(1196314761===i[0]&&169478669===i[1]&&1380206665===i[3])return{mime:"image/png",width:e[16]<<24|e[17]<<16|e[18]<<8|e[19],height:e[20]<<24|e[21]<<16|e[22]<<8|e[23]};if(255===e[0]&&216===e[1]&&255===e[2]){const[t,i]=function(e){const t=e.length;let i=4,s=e[i]<<8|e[i+1];for(;;){if(i+=s,i>=t)return[0,0];if(255!==e[i])return[0,0];if(192===e[i+1]||194===e[i+1])return i+8<t?[e[i+7]<<8|e[i+8],e[i+5]<<8|e[i+6]]:[0,0];i+=2,s=e[i]<<8|e[i+1]}}(e);return{mime:"image/jpeg",width:t,height:i}}if(944130375===i[0]&&(55===e[4]||57===e[4])&&97===e[5])return{mime:"image/gif",width:e[7]<<8|e[6],height:e[9]<<8|e[8]};if(1718185841===i[0])return{mime:"image/qoi",width:e[4]<<24|e[5]<<16|e[6]<<8|e[7],height:e[8]<<24|e[9]<<16|e[10]<<8|e[11]};if(1179011410===i[0]&&1346520407===i[2]&&3690582==(16777215&i[3])){switch(e[15]){case 88:return{mime:"image/webp",width:1+(e[24]|e[25]<<8|e[26]<<16),height:1+(e[27]|e[28]<<8|e[29]<<16)};case 76:if(47!==e[20])return t.UNSUPPORTED_TYPE;const i=e[21]|e[22]<<8|e[23]<<16|e[24]<<24;return{mime:"image/webp",width:1+(16383&i),height:1+(i>>>14&16383)};case 32:return 157!==e[23]||1!==e[24]||42!==e[25]?t.UNSUPPORTED_TYPE:{mime:"image/webp",width:16383&(e[26]|e[27]<<8),height:16383&(e[28]|e[29]<<8)}}return t.UNSUPPORTED_TYPE}if(1887007846===i[1]&&(1718187617===i[2]||1936291425===i[2])){let i=-1;const s=Math.min(e.length-16,1024);for(let t=8;t<s;t++)if(105===e[t]&&115===e[t+1]&&112===e[t+2]&&101===e[t+3]){i=t;break}if(-1!==i){const t=e[i+8]<<24|e[i+9]<<16|e[i+10]<<8|e[i+11],s=e[i+12]<<24|e[i+13]<<16|e[i+14]<<8|e[i+15];if(t>0&&s>0)return{mime:"image/avif",width:t,height:s}}return t.UNSUPPORTED_TYPE}return t.UNSUPPORTED_TYPE},t.UNSUPPORTED_TYPE={mime:"unsupported",width:0,height:0}},463(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ImageRenderer=void 0;const s=i(939),A=i(426);class r extends A.Disposable{get canvas(){var e;return null===(e=this._layers.get("top"))||void 0===e?void 0:e.canvas}static createCanvas(e,t,i){const s=(null!=e?e:document).createElement("canvas");return s.width=0|t,s.height=0|i,s}static createImageData(e,t,i,s){if("function"!=typeof ImageData){const A=e.createImageData(t,i);return s&&A.data.set(new Uint8ClampedArray(s,0,t*i*4)),A}return s?new ImageData(new Uint8ClampedArray(s,0,t*i*4),t,i):new ImageData(t,i)}static createImageBitmap(e){return"function"!=typeof createImageBitmap?Promise.resolve(void 0):createImageBitmap(e)}constructor(e){super(),this._terminal=e,this._layers=new Map,this._optionsRefresh=this._register(new A.MutableDisposable),this._oldOpen=this._terminal._core.open,this._terminal._core.open=e=>{var t;null===(t=this._oldOpen)||void 0===t||t.call(this._terminal._core,e),this._open()},this._terminal._core.screenElement&&this._open(),this._optionsRefresh.value=this._terminal._core.optionsService.onOptionChange(e=>{var t;"fontSize"===e&&(this.rescaleCanvas(),null===(t=this._renderService)||void 0===t||t.refreshRows(0,this._terminal.rows))}),this._register((0,A.toDisposable)(()=>{var e;this.removeLayerFromDom(),this.removeLayerFromDom("bottom"),this._terminal._core&&this._oldOpen&&(this._terminal._core.open=this._oldOpen,this._oldOpen=void 0),this._renderService&&this._oldSetRenderer&&(this._renderService.setRenderer=this._oldSetRenderer,this._oldSetRenderer=void 0),this._renderService=void 0,this._layers.clear(),null===(e=this._placeholderBitmap)||void 0===e||e.close(),this._placeholderBitmap=void 0,this._placeholder=void 0}))}showPlaceholder(e){var t,i;e?this._placeholder||-1===this.cellSize.height||this._createPlaceHolder(Math.max(this.cellSize.height+1,24)):(null===(t=this._placeholderBitmap)||void 0===t||t.close(),this._placeholderBitmap=void 0,this._placeholder=void 0),null===(i=this._renderService)||void 0===i||i.refreshRows(0,this._terminal.rows)}get dimensions(){return this._terminal.dimensions}get cellSize(){var e,t;return{width:(null===(e=this.dimensions)||void 0===e?void 0:e.css.cell.width)||-1,height:(null===(t=this.dimensions)||void 0===t?void 0:t.css.cell.height)||-1}}refreshAll(){var e;null===(e=this._renderService)||void 0===e||e.refreshRows(0,this._terminal.rows-1)}clearLines(e,t,i){var s,A,r,o,n;const a=e*((null===(s=this.dimensions)||void 0===s?void 0:s.css.cell.height)||0),h=(null===(A=this.dimensions)||void 0===A?void 0:A.css.canvas.width)||0,l=(t+1-e)*((null===(r=this.dimensions)||void 0===r?void 0:r.css.cell.height)||0);i&&"top"!==i||null===(o=this._layers.get("top"))||void 0===o||o.clearRect(0,a,h,l),i&&"bottom"!==i||null===(n=this._layers.get("bottom"))||void 0===n||n.clearRect(0,a,h,l)}clearAll(e){if(!e||"top"===e){const e=this._layers.get("top");null==e||e.clearRect(0,0,e.canvas.width,e.canvas.height)}if(!e||"bottom"===e){const e=this._layers.get("bottom");null==e||e.clearRect(0,0,e.canvas.width,e.canvas.height)}}draw(e,t,i,s,A=1){const r=this._layers.get(e.layer);if(!r)return;const{width:o,height:n}=this.cellSize;if(-1===o||-1===n)return;this._rescaleImage(e,o,n);const a=e.actual,{width:h,height:l}=e.actualCellSize,d=Math.ceil(a.width/h),g=t%d*h,c=Math.floor(t/d)*l,I=i*o,_=s*n,C=A*h+g>a.width?a.width-g:A*h,u=c+l>a.height?a.height-c:l;r.drawImage(a,Math.floor(g),Math.floor(c),Math.ceil(C),Math.ceil(u),Math.floor(I),Math.floor(_),Math.ceil(C*o/h),Math.ceil(u*n/l))}drawCellImage(e,t,i,s,A,r,o,n){const a=this._layers.get(e.layer);if(!a)return;const{width:h,height:l}=this.cellSize;if(-1===h||-1===l)return;const d=e.orig;if(!d)return;const g=t*h,c=i*l,I=d.width*c>d.height*g,_=I?g/Math.max(1,d.width):c/Math.max(1,d.height);let C=o*h,u=n*l,m=r*h,B=l,Q=(A*h-(I?0:(g-d.width*_)/2))/_,E=(s*l-(I?(c-d.height*_)/2:0))/_,f=m/_,p=B/_;if(Q<0){const e=-Q*_;C+=e,m-=e,f+=Q,Q=0}if(E<0){const e=-E*_;u+=e,B-=e,p+=E,E=0}Q+f>d.width&&(f=d.width-Q,m=f*_),E+p>d.height&&(p=d.height-E,B=p*_),f<=0||p<=0||m<=0||B<=0||a.drawImage(d,Q,E,f,p,C,u,m,B)}extractTile(e,t){const{width:i,height:s}=this.cellSize;if(-1===i||-1===s)return;this._rescaleImage(e,i,s);const A=e.actual,{width:o,height:n}=e.actualCellSize,a=Math.ceil(A.width/o),h=t%a*o,l=Math.floor(t/a)*n,d=o+h>A.width?A.width-h:o,g=l+n>A.height?A.height-l:n,c=r.createCanvas(this.document,Math.ceil(d*i/o),Math.ceil(g*s/n)),I=c.getContext("2d");return I?(I.drawImage(A,Math.floor(h),Math.floor(l),Math.floor(d),Math.floor(g),0,0,c.width,c.height),c):void 0}drawPlaceholder(e,t,i=1){var s;const A=this._layers.get("top");if(A){const{width:r,height:o}=this.cellSize;if(-1===r||-1===o)return;if(this._placeholder?o>=this._placeholder.height&&this._createPlaceHolder(o+1):this._createPlaceHolder(Math.max(o+1,24)),!this._placeholder)return;A.drawImage(null!==(s=this._placeholderBitmap)&&void 0!==s?s:this._placeholder,e*r,t*o%2?0:1,r*i,o,e*r,t*o,r*i,o)}}rescaleCanvas(){var e,t;const i=(null===(e=this.dimensions)||void 0===e?void 0:e.css.canvas.width)||0,s=(null===(t=this.dimensions)||void 0===t?void 0:t.css.canvas.height)||0;for(const e of this._layers.values())e.canvas.width===i&&e.canvas.height===s||(e.canvas.width=i,e.canvas.height=s)}_rescaleImage(e,t,i){if(t===e.actualCellSize.width&&i===e.actualCellSize.height)return;const{width:s,height:A}=e.origCellSize;if(t===s&&i===A)return e.actual=e.orig,e.actualCellSize.width=s,void(e.actualCellSize.height=A);const o=Math.ceil(e.orig.width*t/s),n=Math.ceil(e.orig.height*i/A);if(o*n>e.orig.width*e.orig.height)return e.actual=e.orig,e.actualCellSize.width=s,void(e.actualCellSize.height=A);const a=r.createCanvas(this.document,o,n),h=a.getContext("2d");h&&(h.drawImage(e.orig,0,0,a.width,a.height),e.actual=a,e.actualCellSize.width=t,e.actualCellSize.height=i)}_open(){this._renderService=this._terminal._core._renderService,this._oldSetRenderer=this._renderService.setRenderer.bind(this._renderService),this._renderService.setRenderer=e=>{var t;for(const e of[...this._layers.keys()])this.removeLayerFromDom(e);null===(t=this._oldSetRenderer)||void 0===t||t.call(this._renderService,e)}}insertLayerToDom(e="top"){var t,i;if(!this.document||!this._terminal._core.screenElement)return void console.warn("image addon: cannot insert output canvas to DOM, missing document or screenElement");if(this._layers.has(e))return;const s=r.createCanvas(this.document,(null===(t=this.dimensions)||void 0===t?void 0:t.css.canvas.width)||0,(null===(i=this.dimensions)||void 0===i?void 0:i.css.canvas.height)||0);s.classList.add(`xterm-image-layer-${e}`);const A=this._terminal._core.screenElement;A.style.isolation="isolate","bottom"===e?(s.style.zIndex="-1",A.insertBefore(s,A.firstChild)):(s.style.zIndex="0",A.appendChild(s));const o=s.getContext("2d",{alpha:!0});o?(this._layers.set(e,o),this.clearAll(e)):s.remove()}removeLayerFromDom(e="top"){const t=this._layers.get(e);t&&(t.canvas.remove(),this._layers.delete(e))}hasLayer(e){return this._layers.has(e)}_createPlaceHolder(e=24){var t;null===(t=this._placeholderBitmap)||void 0===t||t.close(),this._placeholderBitmap=void 0;const i=32,A=r.createCanvas(this.document,i,e),o=A.getContext("2d",{alpha:!1});if(!o)return;const n=r.createImageData(o,i,e),a=new Uint32Array(n.data.buffer),h=(0,s.toRGBA8888)(0,0,0),l=(0,s.toRGBA8888)(255,255,255);a.fill(h);for(let t=0;t<e;++t){const e=t%2,s=t*i;for(let t=0;t<i;t+=2)a[s+t+e]=l}o.putImageData(n,0,0);const d=screen.width+i-1&-32||4096;this._placeholder=r.createCanvas(this.document,d,e);const g=this._placeholder.getContext("2d",{alpha:!1});if(!g)return void(this._placeholder=void 0);for(let e=0;e<d;e+=i)g.drawImage(A,e,0);const c=this._placeholder;r.createImageBitmap(c).then(e=>{this._placeholder!==c?null==e||e.close():this._placeholderBitmap=e}).catch(()=>{})}get document(){var e;return null===(e=this._terminal._core._coreBrowserService)||void 0===e?void 0:e.window.document}}t.ImageRenderer=r},699(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ImageStorage=t.CELL_SIZE_DEFAULT=void 0;const s=i(463),A=i(721);t.CELL_SIZE_DEFAULT={width:7,height:14};class r{constructor(e=-1,t=-1){this.imageId=e,this.tileId=t}}t.ImageStorage=class{constructor(e,t,i){this._terminal=e,this._renderer=t,this._opts=i,this._images=new Map,this._lastId=0,this._lowestId=0,this._fullyCleared=!1,this._needsFullClear=!1,this._pixelLimit=25e5,this._workCell=new A.CellData;try{this.setLimit(this._opts.storageLimit)}catch(e){e instanceof Error&&console.error(e.message),console.warn(`storageLimit is set to ${this.getLimit()} MB`)}this._viewportMetrics={cols:this._terminal.cols,rows:this._terminal.rows}}dispose(){this.reset()}reset(){for(const e of[...this._images.keys()])this.deleteImage(e);this._renderer.clearAll()}getLimit(){return 4*this._pixelLimit/1e6}setLimit(e){if(e<.5||e>1e3)throw RangeError("invalid storageLimit, should be at least 0.5 MB and not exceed 1G");this._pixelLimit=e/4*1e6>>>0,this._evictOldest(0)}getUsage(){return 4*this._getStoredPixels()/1e6}_getStoredPixels(){let e=0;for(const t of this._images.values())t.orig&&(e+=t.orig.width*t.orig.height,t.actual&&t.actual!==t.orig&&(e+=t.actual.width*t.actual.height));return e}_delImg(e){var t;const i=this._images.get(e);i&&(this._images.delete(e),window.ImageBitmap&&i.orig instanceof ImageBitmap&&i.orig.close(),null===(t=this.onImageDeleted)||void 0===t||t.call(this,e),this._renderer.refreshAll())}wipeAlternate(){var e;const t=[];for(const[i,s]of this._images.entries())"alternate"===s.bufferType&&(null===(e=s.marker)||void 0===e||e.dispose(),t.push(i));for(const e of t)this._delImg(e);this._needsFullClear=!0,this._fullyCleared=!1}deleteImage(e){var t;const i=this._images.get(e);i&&(null===(t=i.marker)||void 0===t||t.dispose(),this._delImg(e))}addUnplacedImage(e,i){var s;this._evictOldest(e.width*e.height);let A=this._renderer.cellSize;-1!==A.width&&-1!==A.height||(A=t.CELL_SIZE_DEFAULT);const r=++this._lastId;return this._images.set(r,{orig:e,origCellSize:A,actual:e,actualCellSize:Object.assign({},A),marker:void 0,tileCount:0,virtual:!0,bufferType:this._terminal.buffer.active.type,layer:i.layer,zIndex:i.zIndex}),null===(s=this.onImageAdded)||void 0===s||s.call(this),r}getImageSpec(e){return this._images.get(e)}addImage(e,i){var s,A;this._evictOldest(e.width*e.height);let r=this._renderer.cellSize;-1!==r.width&&-1!==r.height||(r=t.CELL_SIZE_DEFAULT);const o=Math.ceil(e.width/r.width),n=Math.ceil(e.height/r.height),a=++this._lastId,h=this._terminal._core.buffer,l=this._terminal.cols,d=this._terminal.rows,g=h.x,c=h.y;let I=g,_=0;i.scrolling||(h.x=0,h.y=0,I=0),this._terminal._core._inputHandler._dirtyRowTracker.markDirty(h.y);for(let e=0;e<n;++e){const t=h.lines.get(h.y+h.ybase);for(let i=0;i<o&&!(I+i>=l);++i)this._writeToCell(t,I+i,a,e*o+i),_++;if(i.scrolling)e<n-1&&this._terminal._core._inputHandler.lineFeed();else if(++h.y>=d)break;h.x=I}this._terminal._core._inputHandler._dirtyRowTracker.markDirty(h.y),i.scrolling?"iip"===i.cursorPos?h.x=Math.min(I+o,l):h.x=I:(h.x=g,h.y=c);const C=[];for(const[e,t]of this._images.entries())t.tileCount<1&&!t.virtual&&(null===(s=t.marker)||void 0===s||s.dispose(),C.push(e));for(const e of C)this._delImg(e);const u=this._terminal.registerMarker(0);null==u||u.onDispose(()=>{this._images.get(a)&&this._delImg(a)}),"alternate"===this._terminal.buffer.active.type&&this._evictOnAlternate();const m={orig:e,origCellSize:r,actual:e,actualCellSize:Object.assign({},r),marker:u||void 0,tileCount:_,bufferType:this._terminal.buffer.active.type,layer:i.layer,zIndex:i.zIndex};return this._images.set(a,m),null===(A=this.onImageAdded)||void 0===A||A.call(this),a}render(e){var t,i,s;let A=!1,o=!1;for(const e of this._images.values())if("bottom"===e.layer?o=!0:A=!0,A&&o)break;if(A&&!this._renderer.hasLayer("top")&&(this._renderer.insertLayerToDom("top"),!this._renderer.hasLayer("top")))return;if(o&&!this._renderer.hasLayer("bottom")&&this._renderer.insertLayerToDom("bottom"),this._renderer.rescaleCanvas(),!this._images.size)return this._fullyCleared||(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1),this._renderer.hasLayer("top")&&this._renderer.removeLayerFromDom("top"),void(this._renderer.hasLayer("bottom")&&this._renderer.removeLayerFromDom("bottom"));!A&&this._renderer.hasLayer("top")&&(this._renderer.clearAll("top"),this._renderer.removeLayerFromDom("top")),!o&&this._renderer.hasLayer("bottom")&&(this._renderer.clearAll("bottom"),this._renderer.removeLayerFromDom("bottom")),this._needsFullClear&&(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1);const{start:n,end:a}=e,h=this._terminal._core.buffer,l=this._terminal._core.cols;this._renderer.clearLines(n,a);const d=[],g=[];for(let e=n;e<=a;++e){const A=h.lines.get(e+h.ydisp);if(!A)return;null===(t=this.onRenderLine)||void 0===t||t.call(this,A,e,l);for(let t=0;t<l;++t){const o=null===(i=A.getExtended(t))||void 0===i?void 0:i.payload;if(o instanceof r){const i=o.imageId;if(void 0===i||-1===i)continue;const n=this._images.get(i);if(-1!==o.tileId){const a=o.tileId,h=t;let c=1;for(;++t<l;){const e=null===(s=A.getExtended(t))||void 0===s?void 0:s.payload;if(!(e instanceof r)||e.imageId!==i||e.tileId!==a+c)break;c++}t--,n?n.actual&&d.push({imgSpec:n,tileId:a,col:h,row:e,count:c}):this._opts.showPlaceholder&&g.push({col:h,row:e,count:c}),this._fullyCleared=!1}}}}d.sort((e,t)=>e.imgSpec.zIndex-t.imgSpec.zIndex);for(const e of g)this._renderer.drawPlaceholder(e.col,e.row,e.count);for(const e of d)this._renderer.draw(e.imgSpec,e.tileId,e.col,e.row,e.count)}viewportResize(e){var t,i;if(!this._images.size)return void(this._viewportMetrics=e);if(this._viewportMetrics.cols>=e.cols)return void(this._viewportMetrics=e);const s=this._terminal._core.buffer,A=s.lines.length,o=this._viewportMetrics.cols-1;for(let n=0;n<A;++n){const A=s.lines.get(n),a=null===(t=A.getExtended(o))||void 0===t?void 0:t.payload;if(a instanceof r){const t=a.imageId;if(void 0===t||-1===t)continue;const s=this._images.get(t);if(!s)continue;const r=Math.ceil(((null===(i=s.actual)||void 0===i?void 0:i.width)||0)/s.actualCellSize.width);if(a.tileId%r+1>=r)continue;let n=!1;for(let t=o+1;t>e.cols;++t)if(A.hasContent(t)){n=!0;break}if(n)continue;const h=Math.min(e.cols,r-a.tileId%r+o);let l=a.tileId;for(let e=o+1;e<h;++e)this._writeToCell(A,e,t,++l),s.tileCount++}}this._viewportMetrics=e}getImageAtBufferCell(e,t){var i,A,o;const n=this._terminal._core.buffer.lines.get(t);if(n){const t=null===(i=n.getExtended(e))||void 0===i?void 0:i.payload;if(t instanceof r&&t.imageId&&-1!==t.imageId){const e=null===(A=this._images.get(t.imageId))||void 0===A?void 0:A.orig;if(window.ImageBitmap&&e instanceof ImageBitmap){const t=s.ImageRenderer.createCanvas(window.document,e.width,e.height);return null===(o=t.getContext("2d"))||void 0===o||o.drawImage(e,0,0,e.width,e.height),t}return e}}}extractTileAtBufferCell(e,t){var i;const s=this._terminal._core.buffer.lines.get(t);if(s){const t=null===(i=s.getExtended(e))||void 0===i?void 0:i.payload;if(t instanceof r&&t.imageId&&-1!==t.imageId&&-1!==t.tileId){const e=this._images.get(t.imageId);if(e)return this._renderer.extractTile(e,t.tileId)}}}_evictOldest(e){var t;const i=this._getStoredPixels();let s=i;for(;this._pixelLimit<s+e&&this._images.size;){const e=this._images.get(++this._lowestId);e&&e.orig&&(s-=e.orig.width*e.orig.height,e.actual&&e.orig!==e.actual&&(s-=e.actual.width*e.actual.height),null===(t=e.marker)||void 0===t||t.dispose(),this._delImg(this._lowestId))}return i-s}_writeToCell(e,t,i,s){const A=this._workCell;if(e.loadCell(t,A),this._workCell.hasExtendedAttrs()){const e=A.extended.payload;if(e instanceof r){const t=this._images.get(e.imageId);return t&&t.tileCount--,e.imageId=i,void(e.tileId=s)}}const o=A.extended.clone();o.payload=new r(i,s),A.extended=o,A.updateExtended(),e.setCell(t,A)}_evictOnAlternate(){var e,t;for(const e of this._images.values())"alternate"===e.bufferType&&(e.tileCount=0);const i=this._terminal._core.buffer;for(let t=0;t<this._terminal.rows;++t){const s=i.lines.get(t);if(s)for(let t=0;t<this._terminal.cols;++t){const i=null===(e=s.getExtended(t))||void 0===e?void 0:e.payload;if(i instanceof r){const e=this._images.get(i.imageId);e&&e.tileCount++}}}const s=[];for(const[e,i]of this._images.entries())"alternate"!==i.bufferType||i.tileCount||i.virtual||(null===(t=i.marker)||void 0===t||t.dispose(),s.push(e));for(const e of s)this._delImg(e)}}},566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SixelHandler=void 0;const s=i(939),A=i(463),r=i(591),o=i(199),n=s.PALETTE_ANSI_256;n.set(s.PALETTE_VT340_COLOR);const a=new Map;let h=!1;function l(e,t){var i;e.memoryUsage>4194304&&e.release();const s=null!==(i=a.get(t))&&void 0!==i?i:[];s.length<2&&(s.push(e),a.set(t,s))}function d(e){return s.BIG_ENDIAN?e:(255&e)<<24|(e>>>8&255)<<16|(e>>>16&255)<<8|e>>>24&255}t.SixelHandler=class{constructor(e,t,i){var s;this._opts=e,this._storage=t,this._coreTerminal=i,this._size=0,this._aborted=!1,this._decMemoryLimit=0,this._palette=new Uint32Array(o.LIMITS.PALETTE_SIZE),this._palette.set(n),s=4*this._opts.pixelLimit,h||(h=!0,(0,r.DecoderAsync)({memoryLimit:s,palette:n}).then(e=>l(e,s),()=>{h=!1}))}reset(){this._returnDecoder(),this._palette.fill(0),this._palette.set(n)}hook(e){var t;this._size=0,this._aborted=!1,this._returnDecoder();const i=4*this._opts.pixelLimit;try{this._dec=function(e){var t,i;return null!==(i=null===(t=a.get(e))||void 0===t?void 0:t.pop())&&void 0!==i?i:new r.Decoder({memoryLimit:e,palette:n})}(i)}catch(e){return console.warn(`SIXEL: could not allocate decoder - ${e}`),void(this._aborted=!0)}this._decMemoryLimit=i;const A=1===e.params[1]?0:function(e,t){let i=0;if(!t)return i;if(e.isInverse())if(e.isFgDefault())i=d(t.foreground.rgba);else if(e.isFgRGB()){const t=e.constructor.toColorRGB(e.getFgColor());i=(0,s.toRGBA8888)(...t)}else i=d(t.ansi[e.getFgColor()].rgba);else if(e.isBgDefault())i=d(t.background.rgba);else if(e.isBgRGB()){const t=e.constructor.toColorRGB(e.getBgColor());i=(0,s.toRGBA8888)(...t)}else i=d(t.ansi[e.getBgColor()].rgba);return i}(this._coreTerminal._core._inputHandler._curAttrData,null===(t=this._coreTerminal._core._themeService)||void 0===t?void 0:t.colors);this._dec.init(A,this._palette,this._opts.sixelPaletteLimit)}_returnDecoder(){const e=this._dec;e&&(this._dec=void 0,this._palette.set(e.palette),l(e,this._decMemoryLimit))}put(e,t,i){if(!this._aborted&&this._dec){if(this._size+=i-t,this._size>this._opts.sixelSizeLimit)return console.warn("SIXEL: too much data, aborting"),this._aborted=!0,void this._dec.release();try{this._dec.decode(e,t,i)}catch(e){console.warn(`SIXEL: error while decoding image - ${e}`),this._aborted=!0,this._dec.release()}}}unhook(e){try{return this._unhook(e)}finally{this._returnDecoder()}}_unhook(e){var t;if(this._aborted||!e||!this._dec)return!0;const i=this._dec.width,s=this._dec.height;if(!i||!s)return s&&this._storage.advanceCursor(s),!0;const r=A.ImageRenderer.createCanvas(void 0,i,s);return null===(t=r.getContext("2d"))||void 0===t||t.putImageData(new ImageData(this._dec.data8,i,s),0,0),this._storage.addImage(r),!0}}},994(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SixelImageStorage=void 0;const s=i(699);t.SixelImageStorage=class{constructor(e,t,i,s){this._storage=e,this._opts=t,this._renderer=i,this._terminal=s,this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"vt340"}}addImage(e){this._addImageOpts.scrolling=this._opts.sixelScrolling,this._storage.addImage(e,this._addImageOpts)}advanceCursor(e){if(this._opts.sixelScrolling){let t=this._renderer.cellSize;-1!==t.width&&-1!==t.height||(t=s.CELL_SIZE_DEFAULT);const i=Math.ceil(e/t.height);for(let e=1;e<i;++e)this._terminal._core._inputHandler.lineFeed()}}}},23(e,t,i){var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.KittyGraphicsHandler=void 0;const A=i(463),r=i(699),o=i(462),n=s(i(669)),a=i(470);t.KittyGraphicsHandler=class{constructor(e,t,i,s){this._opts=e,this._renderer=t,this._kittyStorage=i,this._coreTerminal=s,this._aborted=!1,this._generation=0,this._decodeError=!1,this._activeDecoder=null,this._inControlData=!0,this._controlData=new Uint32Array(512),this._controlLength=0,this._encodedSizeLimit=0,this._totalEncodedSize=0,this._parsedCommand=null,this._pendingTransmissions=new Map,this._maxEncodedBytes=Math.ceil(4*this._opts.kittySizeLimit/3),this._initialEncodedBytes=Math.min(4194304,this._maxEncodedBytes)}reset(){this._generation++,this._cleanupAllPending(),this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),this._kittyStorage.reset()}dispose(){this.reset()}_removePendingEntry(e){this._pendingTransmissions.delete(e),this._lastPendingKey===e&&(this._lastPendingKey=void 0)}_cleanupAllPending(){for(const e of this._pendingTransmissions.values())e.decoder.release();this._pendingTransmissions.clear(),this._lastPendingKey=void 0}start(){this._aborted=!1,this._decodeError=!1,this._inControlData=!0,this._controlLength=0,this._parsedCommand=null,this._encodedSizeLimit=this._maxEncodedBytes,this._totalEncodedSize=0,this._activeDecoder=null}put(e,t,i){var s;if(!this._aborted)if(this._inControlData){let A=i;for(let s=t;s<i;s++)if(59===e[s]){this._inControlData=!1,A=s;break}const r=A-t;if(this._controlLength+r>512)return void(this._aborted=!0);if(this._controlData.set(e.subarray(t,A),this._controlLength),this._controlLength+=r,!this._inControlData){if(this._parsedCommand=(0,a.parseKittyCommand)(this._parseControlDataString()),void 0!==this._parsedCommand.id&&void 0!==this._parsedCommand.imageNumber)return this._sendResponse(this._parsedCommand.id,"EINVAL:cannot specify both i and I keys",null!==(s=this._parsedCommand.quiet)&&void 0!==s?s:0),void(this._aborted=!0);if("d"===this._parsedCommand.action)return;const t=A+1;t<i&&this._streamPayload(e,t,i)}}else this._streamPayload(e,t,i)}_streamPayload(e,t,i){var s,A,r,o,a,h,l,d,g,c;if(this._aborted)return;const I=null!==(a=null!==(o=null===(s=this._parsedCommand)||void 0===s?void 0:s.id)&&void 0!==o?o:this._lastPendingKey)&&void 0!==a?a:0,_=this._pendingTransmissions.get(I),C=null!==(h=null==_?void 0:_.totalEncodedSize)&&void 0!==h?h:0;if(this._totalEncodedSize+=i-t,C+this._totalEncodedSize>this._encodedSizeLimit){const e=null!==(l=this._activeDecoder)&&void 0!==l?l:null==_?void 0:_.decoder;return e&&e.release(),this._activeDecoder=null,_&&this._removePendingEntry(I),void(this._aborted=!0)}if(!this._decodeError){if((null==_?void 0:_.decoder)&&!this._activeDecoder&&(this._activeDecoder=_.decoder),!this._activeDecoder){const e=this._maxEncodedBytes+131072;if(e>1e6*this._opts.storageLimit)return this._aborted=!0,void(void 0!==(null===(A=this._parsedCommand)||void 0===A?void 0:A.id)&&this._sendResponse(this._parsedCommand.id,"ENOMEM:pending image budget exceeded",null!==(d=this._parsedCommand.quiet)&&void 0!==d?d:0));const t=Math.max(1,Math.floor(1e6*this._opts.storageLimit/e));for(;this._pendingTransmissions.size>=t;){const e=this._pendingTransmissions.entries().next().value;if(!e)break;e[1].decoder.release(),this._removePendingEntry(e[0]),void 0!==e[1].cmd.id&&this._sendResponse(e[1].cmd.id,"ENOMEM:pending image budget exceeded",null!==(g=e[1].cmd.quiet)&&void 0!==g?g:0)}const i=new n.default(4194304,this._maxEncodedBytes,this._initialEncodedBytes);try{i.init()}catch(e){return console.warn("KITTY: could not allocate decoder",e),this._aborted=!0,void(void 0!==(null===(r=this._parsedCommand)||void 0===r?void 0:r.id)&&this._sendResponse(this._parsedCommand.id,"ENOMEM:could not allocate decoder",null!==(c=this._parsedCommand.quiet)&&void 0!==c?c:0))}this._activeDecoder=i}0!==this._activeDecoder.put(e.subarray(t,i))&&(this._activeDecoder.release(),this._activeDecoder=null,this._decodeError=!0,_&&this._removePendingEntry(I))}}end(e){var t,i;if(this._aborted||!e)return this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),!0;if(this._inControlData)return this._handleNoPayloadCommand();const s=this._parsedCommand;if("d"===s.action)return this._handleDelete(s);const A=null!==(i=null!==(t=s.id)&&void 0!==t?t:this._lastPendingKey)&&void 0!==i?i:0,r=1===s.more,o=this._pendingTransmissions.get(A);if(r)return this._activeDecoder&&(o?(o.totalEncodedSize+=this._totalEncodedSize,o.decodeError=o.decodeError||this._decodeError):this._pendingTransmissions.set(A,{cmd:Object.assign({},s),decoder:this._activeDecoder,totalEncodedSize:this._totalEncodedSize,decodeError:this._decodeError}),this._lastPendingKey=A,this._activeDecoder=null),!0;o&&(this._lastPendingKey=void 0);let n=this._decodeError,a=s,h=this._activeDecoder;o&&(a=o.cmd,h=o.decoder,n=n||o.decodeError,this._pendingTransmissions.delete(A));let l=new Uint8Array(0);h&&(0!==h.end()&&(n=!0),l=h.data8),this._activeDecoder=null;const d=this._handleCommandWithBytesAndCmd(a,l,n);return h&&h.release(),d}_parseControlDataString(){let e="";for(let t=0;t<this._controlLength;t++)e+=String.fromCodePoint(this._controlData[t]);return e}_handleNoPayloadCommand(){var e,t,i,s,A;const r=(0,a.parseKittyCommand)(this._parseControlDataString());if(void 0!==r.id&&void 0!==r.imageNumber)return this._sendResponse(r.id,"EINVAL:cannot specify both i and I keys",null!==(e=r.quiet)&&void 0!==e?e:0),!0;switch(null!==(t=r.action)&&void 0!==t?t:"t"){case"d":return this._handleDelete(r);case"q":return this._sendResponse(null!==(i=r.id)&&void 0!==i?i:0,"OK",null!==(s=r.quiet)&&void 0!==s?s:0),!0;case"p":return this._handlePlacement(r);default:return void 0!==r.id&&this._sendResponse(r.id,"EINVAL:unsupported action",null!==(A=r.quiet)&&void 0!==A?A:0),!0}}_handleCommandWithBytesAndCmd(e,t,i){var s,A,r,o,n;switch(null!==(s=e.action)&&void 0!==s?s:"t"){case"t":{const s=this._handleTransmit(e,t,i);return"d"===(null!==(A=e.transmission)&&void 0!==A?A:"d")&&void 0!==e.id&&(i?this._sendResponse(e.id,"EINVAL:invalid base64 data",null!==(r=e.quiet)&&void 0!==r?r:0):t.length>0&&this._sendResponse(e.id,"OK",null!==(o=e.quiet)&&void 0!==o?o:0)),s}case"T":return this._handleTransmitDisplay(e,t,i);case"q":return this._handleQuery(e,t,i);case"p":return this._handlePlacement(e);default:return void 0!==e.id&&this._sendResponse(e.id,"EINVAL:unsupported action",null!==(n=e.quiet)&&void 0!==n?n:0),!0}}_handlePlacement(e){var t;if(void 0===e.id)return!0;const i=e.id,s=this._kittyStorage.getImage(i);return s?(1===e.unicodePlaceholder?this._placeVirtual(s,e):this._displayImage(s,e)).then(t=>{var s;return this._sendResponse(i,t?"OK":"EINVAL:image rendering failed",null!==(s=e.quiet)&&void 0!==s?s:0,e.placementId),!0}):(this._sendResponse(i,"ENOENT:image not found",null!==(t=e.quiet)&&void 0!==t?t:0,e.placementId),!0)}_handleTransmit(e,t,i,s=!1){var A,r,o,n,a,h;return"d"!==(null!==(A=e.transmission)&&void 0!==A?A:"d")?(void 0!==e.id&&this._sendResponse(e.id,"EINVAL:unsupported transmission medium",null!==(r=e.quiet)&&void 0!==r?r:0),!0):(i||0===t.length||this._kittyStorage.storeImage(e.id,{data:new Blob([t]),width:null!==(o=e.width)&&void 0!==o?o:0,height:null!==(n=e.height)&&void 0!==n?n:0,format:null!==(a=e.format)&&void 0!==a?a:32,compression:null!==(h=e.compression)&&void 0!==h?h:""},s),!0)}_handleTransmitDisplay(e,t,i){var s,A;if(i)return void 0!==e.id&&this._sendResponse(e.id,"EINVAL:invalid base64 data",null!==(s=e.quiet)&&void 0!==s?s:0),!0;const r=1===e.unicodePlaceholder;this._handleTransmit(e,t,i,r);const o=null!==(A=e.id)&&void 0!==A?A:this._kittyStorage.lastImageId,n=this._kittyStorage.getImage(o);if(n){const t=r?this._placeVirtual(n,e,!0):this._displayImage(n,e);return void 0!==e.id?t.then(t=>{var i;return this._sendResponse(o,t?"OK":"EINVAL:image rendering failed",null!==(i=e.quiet)&&void 0!==i?i:0),!0}):t.then(()=>!0)}return!0}_handleQuery(e,t,i){var s,A,r,o,n,a;const h=null!==(s=e.id)&&void 0!==s?s:0,l=null!==(A=e.quiet)&&void 0!==A?A:0;if("d"!==(null!==(r=e.transmission)&&void 0!==r?r:"d"))return this._sendResponse(h,"EINVAL:unsupported transmission medium",l),!0;if(i)return this._sendResponse(h,"EINVAL:invalid base64 data",l),!0;if(0===t.length)return this._sendResponse(h,"OK",l),!0;const d=null!==(o=e.format)&&void 0!==o?o:32;if(100===d)this._sendResponse(h,"OK",l);else{const i=null!==(n=e.width)&&void 0!==n?n:0,s=null!==(a=e.height)&&void 0!==a?a:0;if(!i||!s)return this._sendResponse(h,"EINVAL:width and height required for raw pixel data",l),!0;const A=i*s*(32===d?4:3);if(t.length<A)return this._sendResponse(h,"EINVAL:insufficient pixel data",l),!0;this._sendResponse(h,"OK",l)}return!0}_handleDelete(e){var t;const i=null!==(t=e.deleteSelector)&&void 0!==t?t:"a";switch(i){case"a":this._kittyStorage.deletePhysicalPlacements();break;case"A":this._cleanupAllPending(),this._kittyStorage.deleteAll(!0);break;case"i":case"I":if(void 0!==e.id)if("I"===i){const t=this._pendingTransmissions.get(e.id);null==t||t.decoder.release(),this._removePendingEntry(e.id),this._kittyStorage.deleteById(e.id,e.placementId)}else this._kittyStorage.deletePlacementsById(e.id,e.placementId)}return!0}_sendResponse(e,t,i,s){const A="OK"===t;if(A&&i>=1)return;if(!A&&i>=2)return;const r=`_Gi=${e}${s?`,p=${s}`:""};${t}\\`;this._coreTerminal._core.coreService.triggerDataEvent(r)}_displayImage(e,t){return this._decodeAndDisplay(e,t).then(()=>!0).catch(()=>!1)}async _decodeAndDisplay(e,t){var i,s,o,n,a;const h=this._generation;let l=await this._createBitmap(e);try{if(h!==this._generation)throw new Error("image decode canceled");const d=this._cropImage(l,t);l=d instanceof Promise?await d:d;const g=(null===(i=this._renderer.dimensions)||void 0===i?void 0:i.css.cell.width)||r.CELL_SIZE_DEFAULT.width,c=(null===(s=this._renderer.dimensions)||void 0===s?void 0:s.css.cell.height)||r.CELL_SIZE_DEFAULT.height;let{cols:I,rows:_}=this._placementGrid(l,t,g,c),C=l.width,u=l.height;if(void 0===t.columns&&void 0===t.rows||(C=Math.round(I*g),u=Math.round(_*c)),C*u>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");const m=this._coreTerminal._core.buffer,B=m.x,Q=m.y,E=m.ybase,f=void 0!==t.zIndex&&t.zIndex<0?"bottom":"top";if(C!==l.width||u!==l.height){const e=await createImageBitmap(l,{resizeWidth:C,resizeHeight:u});l.close(),l=e}const p=Math.min(Math.max(0,null!==(o=t.xOffset)&&void 0!==o?o:0),g-1),w=Math.min(Math.max(0,null!==(n=t.yOffset)&&void 0!==n?n:0),c-1);if(0!==p||0!==w){const e=void 0!==t.columns?Math.round(I*g):l.width+p,i=void 0!==t.rows?Math.round(_*c):l.height+w,s=A.ImageRenderer.createCanvas(window.document,e,i),r=s.getContext("2d");if(!r)throw new Error("Failed to create offset canvas context");r.drawImage(l,p,w);const o=await createImageBitmap(s);if(s.width=s.height=0,l.close(),l=o,C=l.width,u=l.height,C*u>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");void 0===t.columns&&(I=Math.ceil(l.width/g)),void 0===t.rows&&(_=Math.ceil(l.height/c))}if(h!==this._generation)throw new Error("image decode canceled");const D=null!==(a=t.zIndex)&&void 0!==a?a:0;if(this._kittyStorage.addImage(e.id,l,!0,f,D),l=void 0,1===t.cursorMovement){const e=m.ybase-E;m.x=B,m.y=Math.max(Q-e,0)}else m.x=Math.min(B+I,this._coreTerminal.cols)}catch(e){throw null==l||l.close(),e}}_cropImage(e,t){var i,s;const A=Math.max(0,null!==(i=t.x)&&void 0!==i?i:0),r=Math.max(0,null!==(s=t.y)&&void 0!==s?s:0),o=t.sourceWidth||e.width-A,n=t.sourceHeight||e.height-r,a=Math.max(0,e.width-A),h=Math.max(0,e.height-r),l=Math.max(0,Math.min(o,a)),d=Math.max(0,Math.min(n,h));if(0===l||0===d)throw new Error("invalid source rectangle");return 0!==A||0!==r||l!==e.width||d!==e.height?createImageBitmap(e,A,r,l,d).then(t=>(e.close(),t)):e}_placementGrid(e,t,i,s){return void 0!==t.columns&&void 0!==t.rows?{cols:t.columns,rows:t.rows}:void 0!==t.columns?{cols:t.columns,rows:Math.max(1,Math.ceil(e.height/e.width*(t.columns*i)/s))}:void 0!==t.rows?{cols:Math.max(1,Math.ceil(e.width/e.height*(t.rows*s)/i)),rows:t.rows}:{cols:Math.ceil(e.width/i),rows:Math.ceil(e.height/s)}}async _placeVirtual(e,t,i=!1){var s,A,o,n;const a=this._generation,h=()=>a===this._generation&&this._kittyStorage.getImage(e.id)===e;let l;try{if(l=await this._createBitmap(e),!h())throw new Error("image decode canceled");const a=this._cropImage(l,t);l=a instanceof Promise?await a:a;const d=(null===(s=this._renderer.dimensions)||void 0===s?void 0:s.css.cell.width)||r.CELL_SIZE_DEFAULT.width,g=(null===(A=this._renderer.dimensions)||void 0===A?void 0:A.css.cell.height)||r.CELL_SIZE_DEFAULT.height,{cols:c,rows:I}=this._placementGrid(l,t,d,g);if(l.width*l.height>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");if(!h())throw new Error("image decode canceled");return this._kittyStorage.addVirtualPlacement(e.id,null!==(o=t.placementId)&&void 0!==o?o:0,l,c,I),l=void 0,i&&this._kittyStorage.discardVirtualPlacements(e.id,null!==(n=t.placementId)&&void 0!==n?n:0),!0}catch(t){return null==l||l.close(),i&&h()&&this._kittyStorage.discardVirtualPlacements(e.id),!1}}async _createBitmap(e){let t=new Uint8Array(await e.data.arrayBuffer());if("z"===e.compression&&(t=await this._decompressZlib(t)),100===e.format){const e=(0,o.imageType)(t);if("image/png"!==e.mime||!(e.width>0)||!(e.height>0)||e.width*e.height>this._opts.pixelLimit)throw new RangeError("PNG exceeds pixel limit or has invalid dimensions");const i=new Blob([t],{type:"image/png"});if(!window.createImageBitmap){const e=URL.createObjectURL(i),t=new Image;return new Promise((i,s)=>{t.addEventListener("load",()=>{var r;URL.revokeObjectURL(e);const o=A.ImageRenderer.createCanvas(window.document,t.width,t.height);null===(r=o.getContext("2d"))||void 0===r||r.drawImage(t,0,0),createImageBitmap(o).then(i).catch(s)}),t.addEventListener("error",()=>{URL.revokeObjectURL(e),s(new Error("Failed to load image"))}),t.src=e})}return createImageBitmap(i)}const i=e.width,s=e.height;if(!i||!s)throw new Error("Width and height required for raw pixel data");const r=i*s*(32===e.format?4:3);if(t.length<r)throw new Error("Insufficient pixel data");const n=i*s;if(32===e.format)return createImageBitmap(new ImageData(new Uint8ClampedArray(t.buffer,t.byteOffset,4*n),i,s));const a=new Uint8ClampedArray(4*n),h=new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),l=new Uint32Array(a.buffer),d=-4&n;let g=0,c=0;for(let e=0;e<d;e+=4){const e=h[g++],t=h[g++],i=h[g++];l[c++]=4278190080|e,l[c++]=4278190080|e>>>24|t<<8,l[c++]=4278190080|t>>>16|i<<16,l[c++]=4278190080|i>>>8}let I=3*d,_=4*d;for(let e=d;e<n;e++)a[_]=t[I],a[_+1]=t[I+1],a[_+2]=t[I+2],a[_+3]=255,I+=3,_+=4;return createImageBitmap(new ImageData(a,i,s))}async _decompressZlib(e){try{return await this._decompress(e,"deflate")}catch(t){if(t instanceof RangeError)throw t;return await this._decompress(e,"deflate-raw")}}async _decompress(e,t){const i=Math.min(this._opts.kittySizeLimit,4*this._opts.pixelLimit,1e6*this._opts.storageLimit);let s=0;const A=new ReadableStream({pull(t){if(s>=e.length)return void t.close();const i=Math.min(s+4096,e.length);t.enqueue(new Uint8Array(e.subarray(s,i))),s=i}}).pipeThrough(new DecompressionStream(t)).getReader(),r=[];let o=0;try{for(;;){const{done:e,value:t}=await A.read();if(e)break;if(o+=t.byteLength,o>i)throw await A.cancel().catch(()=>{}),new RangeError("decompressed image exceeds byte limit");r.push(t)}}finally{A.releaseLock()}const n=new Uint8Array(o);let a=0;for(const e of r)n.set(e,a),a+=e.length;return n}get images(){return this._kittyStorage.images}get _kittyIdToStorageId(){return this._kittyStorage.kittyIdToStorageId}get pendingTransmissions(){return this._pendingTransmissions}}},470(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.PLACEHOLDER_DIACRITICS=t.PLACEHOLDER_CHAR=void 0,t.parseKittyCommand=function(e){const t={},i=e.split(",");for(const e of i){const i=e.indexOf("=");if(-1===i)continue;const s=e.substring(0,i),A=e.substring(i+1);if("a"===s){t.action=A;continue}if("o"===s){t.compression=A;continue}if("t"===s){t.transmission=A;continue}if("d"===s){t.deleteSelector=A;continue}const r=parseInt(A,10);switch(s){case"f":t.format=r;break;case"i":t.id=r;break;case"I":t.imageNumber=r;break;case"s":t.width=r;break;case"v":t.height=r;break;case"x":t.x=r;break;case"y":t.y=r;break;case"w":t.sourceWidth=r;break;case"h":t.sourceHeight=r;break;case"X":t.xOffset=r;break;case"Y":t.yOffset=r;break;case"c":t.columns=r;break;case"r":t.rows=r;break;case"m":t.more=r;break;case"q":t.quiet=r;break;case"C":t.cursorMovement=r;break;case"z":t.zIndex=r;break;case"p":t.placementId=r;break;case"U":t.unicodePlaceholder=r}}return t},t.decodePlaceholderLocation=function(e){const[,t,i,A]=e;return{row:s(t),column:s(i),highByte:s(A)}},t.PLACEHOLDER_CHAR=1109742,t.PLACEHOLDER_DIACRITICS=[773,781,782,784,786,829,830,831,838,842,843,844,848,849,850,855,859,867,868,869,870,871,872,873,874,875,876,877,878,879,1155,1156,1157,1158,1159,1426,1427,1428,1429,1431,1432,1433,1436,1437,1438,1439,1440,1441,1448,1449,1451,1452,1455,1476,1552,1553,1554,1555,1556,1557,1558,1559,1623,1624,1625,1626,1627,1629,1630,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1764,1767,1768,1771,1772,1840,1842,1843,1845,1846,1850,1853,1855,1856,1857,1859,1861,1863,1865,1866,2027,2028,2029,2030,2031,2032,2033,2035,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2385,2387,2388,3970,3971,3974,3975,4957,4958,4959,6109,6458,6679,6773,6774,6775,6776,6777,6778,6779,6780,7019,7021,7022,7023,7024,7025,7026,7027,7376,7377,7378,7386,7387,7392,7616,7617,7619,7620,7621,7622,7623,7624,7625,7627,7628,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7678,8400,8401,8404,8405,8406,8407,8411,8412,8417,8423,8425,8432,11503,11504,11505,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,42607,42620,42621,42736,42737,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43696,43698,43699,43703,43704,43710,43711,43713,65056,65057,65058,65059,65060,65061,65062,68111,68152,119173,119174,119175,119176,119177,119210,119211,119212,119213,119362,119363,119364];const i=new Map;for(let e=0;e<t.PLACEHOLDER_DIACRITICS.length;++e)i.set(t.PLACEHOLDER_DIACRITICS[e],e+1);function s(e){var t,s;return void 0===e?0:null!==(s=i.get(null!==(t=e.codePointAt(0))&&void 0!==t?t:-1))&&void 0!==s?s:-1}},235(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.KittyImageStorage=void 0;const s=i(721),A=i(470);class r{constructor(e,t){this._storage=e,this._renderer=t,this._nextImageId=1,this._images=new Map,this._kittyIdToStorageId=new Map,this._storageIdToKittyId=new Map,this._virtualPlacements=new Map,this._virtualStorageIds=new Map,this._handleStorageImageDeleted=e=>{const t=this._virtualStorageIds.get(e);if(t){this._virtualStorageIds.delete(e);const i=this._virtualPlacements.get(t.kittyId);null==i||i.delete(t.placementId),(null==i?void 0:i.size)||this._virtualPlacements.delete(t.kittyId)}const i=this._storageIdToKittyId.get(e);void 0!==i&&(this._kittyIdToStorageId.delete(i),this._storageIdToKittyId.delete(e))},this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"},this._renderPlaceholderLine=(e,t,i)=>{if(0===this._virtualPlacements.size)return;let s,A=0;for(let r=0;r<=i;++r){const o=r<i?this._placeholderCell(e,r):void 0;!(A>0&&void 0!==o&&void 0!==s&&o.imageId===s.imageId&&o.placementId===s.placementId)||0!==o.location.row&&o.location.row!==s.location.row||0!==o.location.column&&o.location.column!==s.location.column+1||0!==o.location.highByte&&o.location.highByte!==s.location.highByte?(A>0&&void 0!==s&&this._drawPlaceholderRun(s,r-A,A,t),A=0,void 0!==o&&(A=1,o.location.row||(o.location.row=1),o.location.column||(o.location.column=1),o.location.highByte||(o.location.highByte=1))):(A++,o.location.row=Math.max(s.location.row,1),o.location.column=s.location.column+1,o.location.highByte=Math.max(s.location.highByte,1)),s=null!=o?o:s}},this._previousOnImageDeleted=this._storage.onImageDeleted,this._wrappedOnImageDeleted=e=>{var t;null===(t=this._previousOnImageDeleted)||void 0===t||t.call(this,e),this._handleStorageImageDeleted(e)},this._storage.onImageDeleted=this._wrappedOnImageDeleted,this._storage.onRenderLine=this._renderPlaceholderLine}hidePlaceholderGlyphs(e){const t=e._core.buffer;let i;const r=e.buffer.active.viewportY;for(let o=r;o<r+e.rows;++o){const r=t.lines.get(o);if(r)for(let t=0;t<e.cols;++t)1073741824&r.getFg(t)||(r.getCodePoint(t)===A.PLACEHOLDER_CHAR||r.isCombined(t)&&r.getString(t).codePointAt(0)===A.PLACEHOLDER_CHAR)&&(null!=i||(i=new s.CellData),r.loadCell(t,i),i.fg|=1073741824,r.setCell(t,i))}}reset(){this._nextImageId=1,this._images.clear(),this._kittyIdToStorageId.clear(),this._storageIdToKittyId.clear(),this._virtualPlacements.clear(),this._virtualStorageIds.clear()}dispose(){this.reset(),this._storage.onImageDeleted===this._wrappedOnImageDeleted&&(this._storage.onImageDeleted=this._previousOnImageDeleted),this._storage.onRenderLine===this._renderPlaceholderLine&&(this._storage.onRenderLine=void 0)}storeImage(e,t,i=!1){const s=null!=e?e:this._nextImageId++;i||this._deleteVirtualPlacements(s);const A=this._kittyIdToStorageId.get(s);void 0!==A&&(this._storage.deleteImage(A),this._kittyIdToStorageId.delete(s),this._storageIdToKittyId.delete(A)),!this._images.has(s)&&this._images.size>=r._maxStoredImages&&this._evictUndisplayedImages();const o=1e6*this._storage.getLimit();this._images.delete(s);let n=0;for(const e of this._images.values())n+=e.data.size;for(const e of[!1,!0])for(const[i,s]of this._images){if(n+t.data.size<=o)break;(this._kittyIdToStorageId.has(i)||this._virtualPlacements.has(i))===e&&(n-=s.data.size,this.deleteById(i))}return this._images.set(s,Object.assign(Object.assign({},t),{id:s})),s}addImage(e,t,i,s,A){const r=this._kittyIdToStorageId.get(e);void 0!==r&&this._storageIdToKittyId.delete(r),this._addImageOpts.scrolling=i,this._addImageOpts.layer=s,this._addImageOpts.zIndex=A;const o=this._storage.addImage(t,this._addImageOpts);this._kittyIdToStorageId.set(e,o),this._storageIdToKittyId.set(o,e)}getImage(e){return this._images.get(e)}addVirtualPlacement(e,t,i,s,A){var o;const n=null===(o=this._virtualPlacements.get(e))||void 0===o?void 0:o.get(t);if(i.width*i.height*4>1e6*this._storage.getLimit())throw new Error("virtual image exceeds storage limit");if(!n&&this._virtualStorageIds.size>=r._maxStoredImages)throw new Error("virtual placement limit exceeded");n&&this._storage.deleteImage(n.storageId);const a=this._storage.addUnplacedImage(i,{scrolling:!1,layer:"top",zIndex:0,cursorPos:"iip"});let h=this._virtualPlacements.get(e);h||(h=new Map,this._virtualPlacements.set(e,h)),h.set(t,{placementId:t,storageId:a,cols:s,rows:A}),this._virtualStorageIds.set(a,{kittyId:e,placementId:t}),this._renderer.refreshAll()}_virtualPlacementFor(e,t){const i=this._virtualPlacements.get(e);return 0===t?null==i?void 0:i.values().next().value:null==i?void 0:i.get(t)}discardVirtualPlacements(e,t){this._deleteVirtualPlacements(e,void 0,t)}_deleteVirtualPlacements(e,t,i){const s=this._virtualPlacements.get(e);if(s)for(const e of[...s.values()])void 0!==t&&t!==e.placementId||e.placementId===i||this._storage.deleteImage(e.storageId)}deletePlacementsById(e,t){if(this._deleteVirtualPlacements(e,t),void 0!==t)return;const i=this._kittyIdToStorageId.get(e);void 0!==i&&(this._kittyIdToStorageId.delete(e),this._storageIdToKittyId.delete(i),this._storage.deleteImage(i))}deleteById(e,t){this.deletePlacementsById(e,t),this._virtualPlacements.has(e)||this._kittyIdToStorageId.has(e)||this._images.delete(e)}deletePhysicalPlacements(){for(const[e,t]of[...this._kittyIdToStorageId])this._kittyIdToStorageId.delete(e),this._storageIdToKittyId.delete(t),this._storage.deleteImage(t)}deleteAll(e=!1){e&&this.deletePhysicalPlacements();for(const t of[...this._images.keys()])e&&this._virtualPlacements.has(t)||this.deleteById(t)}get images(){return this._images}get kittyIdToStorageId(){return this._kittyIdToStorageId}get lastImageId(){return this._nextImageId-1}_evictUndisplayedImages(){for(const[e]of this._images){if(this._images.size<=r._maxStoredImages/2)break;this._kittyIdToStorageId.has(e)||this._virtualPlacements.has(e)||(this._images.delete(e),this._virtualPlacements.delete(e))}}_placeholderCell(e,t){var i,s;if(!e.isCombined(t)&&e.getCodePoint(t)!==A.PLACEHOLDER_CHAR)return;const r=e.getString(t);if(r.codePointAt(0)!==A.PLACEHOLDER_CHAR)return;const o=e.getFg(t),n=50331648&o,a=50331648===n?16777215&o:0===n?0:255&o;if(0===n)return;let h=0;const l=null!==(s=null===(i=e.getExtended(t))||void 0===i?void 0:i.underlineColor)&&void 0!==s?s:0;if(l>0){const e=50331648&l;h=50331648===e?16777215&l:0===e?0:255&l}const d=(0,A.decodePlaceholderLocation)(r);return d.row<0||d.column<0||d.highByte<0||d.highByte>256?void 0:{imageId:a,placementId:h,location:d}}_drawPlaceholderRun(e,t,i,s){const A=(e.imageId|e.location.highByte-1<<24)>>>0,r=this._virtualPlacementFor(A,e.placementId),o=r&&this._storage.getImageSpec(r.storageId),n=e.location.row-1,a=e.location.column-i;if(!r||!o||n<0||n>=r.rows||a<0)return;const h=Math.min(i,r.cols-a);h<=0||this._renderer.drawCellImage(o,r.cols,r.rows,n,a,h,t,s)}}t.KittyImageStorage=r,r._maxStoredImages=256},669(e,t,i){Object.defineProperty(t,"__esModule",{value:!0});const s=(0,i(552).InWasm)({s:1,t:0,d:"AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML"}),A=new Uint8Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").map(e=>e.charCodeAt(0))),r=new Uint32Array(1024);r.fill(4278190080);for(let e=0;e<A.length;++e)r[A[e]]=e<<2;for(let e=0;e<A.length;++e)r[256+A[e]]=e>>4|(e<<4&255)<<8;for(let e=0;e<A.length;++e)r[512+A[e]]=e>>2<<8|(e<<6&255)<<16;for(let e=0;e<A.length;++e)r[768+A[e]]=e<<16;const o=new Uint8Array(0);t.default=class{constructor(e,t,i){if(this._inst=null,this._ended=!0,this._bytes=0,this.keepSize=null!=e?e:1048576,this.maxBytes=null!=t?t:4294901760,this._bytes=null!=i?i:32768,this._bytes>this.maxBytes||this.maxBytes>4294901760)throw new Error("invalid byte settings")}get data8(){return this._inst?this._d.subarray(0,this._m32[1282]):o}release(){this._inst&&(this._bytes>this.keepSize?this._inst=this._m32=this._d=this._mem=null:(this._m32[1280]=0,this._m32[1281]=0,this._m32[1282]=0))}init(e,t){if(this.maxBytes=null!=e?e:this.maxBytes,this._bytes=null!=t?t:Math.min(this._bytes,this.maxBytes),this._bytes>this.maxBytes||this.maxBytes>4294901760)throw Error("invalid byte settings");let i=this._m32;const A=this._bytes+5152;this._inst?this._mem.buffer.byteLength<A&&(this._mem.grow(Math.ceil((A-this._mem.buffer.byteLength)/65536)),i=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)):(this._mem=new WebAssembly.Memory({initial:Math.ceil(A/65536)}),this._inst=s({env:{memory:this._mem}}),i=new Uint32Array(this._mem.buffer,0),i.set(r,256),this._d=new Uint8Array(this._mem.buffer,5152)),i[1280]=0,i[1281]=0,i[1282]=0,this._m32=i,this._ended=!1}_realloc(e){const t=this._m32[1280]+e;if(this._bytes<t){if(t>this.maxBytes)return-3;let e=this._bytes;for(;(e*=2)<t;);if(e=Math.min(e,this.maxBytes),e<t)return-3;if(e+5152>this._mem.buffer.byteLength){const t=Math.ceil((e+5152-this._mem.buffer.byteLength)/65536);this._mem.grow(t),this._m32=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)}this._bytes=e}return 0}put(e){if(!this._inst||this._ended)return-2;if(this._realloc(e.length))return-3;const t=this._m32;return this._d.set(e,t[1280]),t[1280]+=e.length,t[1280]-t[1281]>=131072?this._inst.exports.dec():0}end(){return this._ended=!0,this._inst?this._inst.exports.end():-2}get loadedBytes(){return this._inst?this._m32[1280]:0}get freeBytes(){return this._inst?this.maxBytes-this._m32[1280]:0}}},61(e,t,i){Object.defineProperty(t,"__esModule",{value:!0});const s=(0,i(552).InWasm)({s:1,t:0,d:"AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=="});t.default=class{constructor(e){this.keepSize=e,this.width=0,this.height=0}decode(e){this.width=e[4]<<24|e[5]<<16|e[6]<<8|e[7],this.height=e[8]<<24|e[9]<<16|e[10]<<8|e[11];const t=this.width*this.height,i=4*t,A=e.length,r=Math.max(i,A)+(Math.min(i,A)>>1)+4096;this._inst?this._mem.buffer.byteLength<r&&(this._mem.grow(Math.ceil((r-this._mem.buffer.byteLength)/65536)),this._d=null):(this._mem=new WebAssembly.Memory({initial:Math.ceil(r/65536)}),this._inst=s({env:{memory:this._mem}})),this._d||(this._d=new Uint8Array(this._mem.buffer));const o=this._mem.buffer.byteLength-A&-256;return this._d.set(e,o),this._inst.exports.dec(o,A,t),this._d.subarray(1024,1024+i)}release(){this._inst&&this._mem.buffer.byteLength>this.keepSize&&(this._inst=this._d=this._mem=null)}}},552(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.InWasm=function(e){if(e.d){const{t,s,d:A}=e;let r,o;const n=WebAssembly;return 0===t?s?e=>new n.Instance(o||(o=new n.Module(r||(r=i(A)))),e):e=>o?n.instantiate(o,e):n.instantiate(r||(r=i(A)),e).then(e=>(o=e.module)&&e.instance):1===t?s?()=>o||(o=new n.Module(r||(r=i(A)))):()=>o?Promise.resolve(o):n.compile(r||(r=i(A))).then(e=>o=e):s?()=>r||(r=i(A)):()=>Promise.resolve(r||(r=i(A)))}if("undefined"==typeof _wasmCtx)throw new Error('must run "inwasm"');_wasmCtx.add(e)};let i=e=>{if(Uint8Array.fromBase64)return Uint8Array.fromBase64(e);if("undefined"!=typeof Buffer)return Buffer.from(e,"base64");const t=atob(e),i=new Uint8Array(t.length);for(let e=0;e<i.length;++e)i[e]=t.charCodeAt(e);return i}}},t={};function i(s){var A=t[s];if(void 0!==A)return A.exports;var r=t[s]={exports:{}};return e[s].call(r.exports,r,r.exports,i),r.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.ImageAddon=void 0;const t=i(414),A=i(578),r=i(795),o=i(463),n=i(699),a=i(23),h=i(235),l=i(566),d=i(994),g=i(649),c={enableSizeReports:!0,pixelLimit:16777216,sixelSupport:!0,sixelScrolling:!0,sixelPaletteLimit:4096,sixelSizeLimit:33554432,storageLimit:128,showPlaceholder:!0,iipSupport:!0,iipSizeLimit:33554432,kittySupport:!0,kittySizeLimit:33554432};e.ImageAddon=class{constructor(e){this._disposables=[],this._handlers=new Map,this._onImageAdded=new t.Emitter,this.onImageAdded=this._onImageAdded.event,this._opts=Object.assign({},c,e),this._defaultOpts=Object.assign({},c,e)}dispose(){for(const e of this._handlers.values())e.reset();for(const e of this._disposables)e.dispose();this._disposables.length=0,this._handlers.clear(),this._onImageAdded.dispose()}_disposeLater(...e){for(const t of e)this._disposables.push(t)}activate(e){var t;if(this._terminal=e,this._renderer=new o.ImageRenderer(e),this._storage=new n.ImageStorage(e,this._renderer,this._opts),this._storage.onImageAdded=()=>this._onImageAdded.fire(),this._opts.enableSizeReports){const i=null!==(t=e.options.windowOptions)&&void 0!==t?t:{};i.getWinSizePixels=!0,i.getCellSizePixels=!0,i.getWinSizeChars=!0,e.options.windowOptions=i}if(this._disposeLater(this._renderer,this._storage,e.parser.registerCsiHandler({prefix:"?",final:"h"},e=>this._decset(e)),e.parser.registerCsiHandler({prefix:"?",final:"l"},e=>this._decrst(e)),e.parser.registerCsiHandler({final:"c"},e=>this._da1(e)),e.parser.registerCsiHandler({prefix:"?",final:"S"},e=>this._xtermGraphicsAttributes(e)),e.onRender(e=>{var t;return null===(t=this._storage)||void 0===t?void 0:t.render(e)}),e.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>this.reset()),e.parser.registerEscHandler({final:"c"},()=>this.reset()),e._core._inputHandler.onRequestReset(()=>this.reset()),e.buffer.onBufferChange(()=>{var e;return null===(e=this._storage)||void 0===e?void 0:e.wipeAlternate()}),e.onResize(e=>{var t;return null===(t=this._storage)||void 0===t?void 0:t.viewportResize(e)})),this._opts.sixelSupport){const t=new d.SixelImageStorage(this._storage,this._opts,this._renderer,e),i=new l.SixelHandler(this._opts,t,e);this._handlers.set("sixel",i),this._disposeLater(e._core._inputHandler._parser.registerDcsHandler({final:"q"},i))}if(this._opts.iipSupport){const t=new g.IIPImageStorage(this._storage),i=new r.IIPHandler(this._opts,this._renderer,t,e);this._handlers.set("iip",i),this._disposeLater(e._core._inputHandler._parser.registerOscHandler(1337,i))}if(this._opts.kittySupport){const t=new h.KittyImageStorage(this._storage,this._renderer),i=new a.KittyGraphicsHandler(this._opts,this._renderer,t,e);this._handlers.set("kitty",i);const s=new A.MicrotaskTimer,r=()=>t.hidePlaceholderGlyphs(e);this._disposeLater(t,i,s,e.onWriteParsed(()=>{s.cancel(),r()}),e.onScroll(()=>s.set(r)),e.onResize(r),e._core._inputHandler._parser.registerApcHandler({final:"G"},i)),r()}}reset(){var e;this._opts.sixelScrolling=this._defaultOpts.sixelScrolling,this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,null===(e=this._storage)||void 0===e||e.reset();for(const e of this._handlers.values())e.reset();return!1}get storageLimit(){var e;return(null===(e=this._storage)||void 0===e?void 0:e.getLimit())||-1}set storageLimit(e){var t;null===(t=this._storage)||void 0===t||t.setLimit(e),this._opts.storageLimit=e}get storageUsage(){return this._storage?this._storage.getUsage():-1}get showPlaceholder(){return this._opts.showPlaceholder}set showPlaceholder(e){var t;this._opts.showPlaceholder=e,null===(t=this._renderer)||void 0===t||t.showPlaceholder(e)}getImageAtBufferCell(e,t){var i;return null===(i=this._storage)||void 0===i?void 0:i.getImageAtBufferCell(e,t)}extractTileAtBufferCell(e,t){var i;return null===(i=this._storage)||void 0===i?void 0:i.extractTileAtBufferCell(e,t)}_report(e){var t;null===(t=this._terminal)||void 0===t||t._core.input(e,!1)}_decset(e){for(let t=0;t<e.length;++t)80===e[t]&&(this._opts.sixelScrolling=!1);return!1}_decrst(e){for(let t=0;t<e.length;++t)80===e[t]&&(this._opts.sixelScrolling=!0);return!1}_da1(e){return!!e[0]||!!this._opts.sixelSupport&&(this._report("[?62;4;9;22c"),!0)}_xtermGraphicsAttributes(e){var t,i,s,A,r,o;if(e.length<2)return!0;if(1===e[0])switch(e[1]){case 1:return this._report(`[?${e[0]};0;${this._opts.sixelPaletteLimit}S`),!0;case 2:this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,this._report(`[?${e[0]};0;${this._opts.sixelPaletteLimit}S`);for(const e of this._handlers.values())e.reset();return!0;case 3:return e.length>2&&!(e[2]instanceof Array)&&e[2]<=4096?(this._opts.sixelPaletteLimit=e[2],this._report(`[?${e[0]};0;${this._opts.sixelPaletteLimit}S`)):this._report(`[?${e[0]};2S`),!0;case 4:return this._report(`[?${e[0]};0;4096S`),!0;default:return this._report(`[?${e[0]};2S`),!0}if(2===e[0])switch(e[1]){case 1:let a=null===(i=null===(t=this._renderer)||void 0===t?void 0:t.dimensions)||void 0===i?void 0:i.css.canvas.width,h=null===(A=null===(s=this._renderer)||void 0===s?void 0:s.dimensions)||void 0===A?void 0:A.css.canvas.height;if(!a||!h){const e=n.CELL_SIZE_DEFAULT;a=((null===(r=this._terminal)||void 0===r?void 0:r.cols)||80)*e.width,h=((null===(o=this._terminal)||void 0===o?void 0:o.rows)||24)*e.height}if(a*h<this._opts.pixelLimit)this._report(`[?${e[0]};0;${a.toFixed(0)};${h.toFixed(0)}S`);else{const t=Math.floor(Math.sqrt(this._opts.pixelLimit));this._report(`[?${e[0]};0;${t};${t}S`)}return!0;case 4:const l=Math.floor(Math.sqrt(this._opts.pixelLimit));return this._report(`[?${e[0]};0;${l};${l}S`),!0;default:return this._report(`[?${e[0]};2S`),!0}return this._report(`[?${e[0]};1S`),!0}}})(),s})());
|
||
//# sourceMappingURL=addon-image.js.map
|
||
\ No newline at end of file
|
||
diff --git a/lib/addon-image.js.map b/lib/addon-image.js.map
|
||
index e780ba60eb97782feb59c6b33944ace43d3d3027..b5abcdb504e788df7d967a14417d3adfbad70cff 100644
|
||
--- a/lib/addon-image.js.map
|
||
+++ b/lib/addon-image.js.map
|
||
@@ -1 +1 @@
|
||
-{"version":3,"file":"addon-image.js","mappings":"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","sources":["webpack://ImageAddon/webpack/universalModuleDefinition","webpack://ImageAddon/../node_modules/sixel/lib/Colors.js","webpack://ImageAddon/../node_modules/sixel/lib/Decoder.js","webpack://ImageAddon/../node_modules/sixel/lib/wasm.js","webpack://ImageAddon/../src/common/Event.ts","webpack://ImageAddon/../src/common/Lifecycle.ts","webpack://ImageAddon/../src/common/buffer/AttributeData.ts","webpack://ImageAddon/../src/common/buffer/CellData.ts","webpack://ImageAddon/../src/common/buffer/Constants.ts","webpack://ImageAddon/../src/common/input/TextDecoder.ts","webpack://ImageAddon/./src/IIPHandler.ts","webpack://ImageAddon/./src/IIPHeaderParser.ts","webpack://ImageAddon/./src/IIPImageStorage.ts","webpack://ImageAddon/./src/IIPMetrics.ts","webpack://ImageAddon/./src/ImageRenderer.ts","webpack://ImageAddon/./src/ImageStorage.ts","webpack://ImageAddon/./src/SixelHandler.ts","webpack://ImageAddon/./src/SixelImageStorage.ts","webpack://ImageAddon/./src/kitty/KittyGraphicsHandler.ts","webpack://ImageAddon/./src/kitty/KittyGraphicsTypes.ts","webpack://ImageAddon/./src/kitty/KittyImageStorage.ts","webpack://ImageAddon/../node_modules/xterm-wasm-parts/lib/base64/Base64Decoder.wasm.js","webpack://ImageAddon/../node_modules/xterm-wasm-parts/lib/qoi/QoiDecoder.wasm.js","webpack://ImageAddon/javascript/node_modules/inwasm-runtime/lib/index.cjs","webpack://ImageAddon/webpack/bootstrap","webpack://ImageAddon/./src/ImageAddon.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[\"ImageAddon\"] = factory();\n\telse\n\t\troot[\"ImageAddon\"] = factory();\n})(globalThis, () => {\nreturn ","\"use strict\";\n/**\n * Copyright (c) 2019 Joerg Breitbart.\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_FOREGROUND = exports.DEFAULT_BACKGROUND = exports.PALETTE_ANSI_256 = exports.PALETTE_VT340_GREY = exports.PALETTE_VT340_COLOR = exports.normalizeHLS = exports.normalizeRGB = exports.nearestColorIndex = exports.fromRGBA8888 = exports.toRGBA8888 = exports.alpha = exports.blue = exports.green = exports.red = exports.BIG_ENDIAN = void 0;\n// FIXME: cleanup this mess, move things either to decoder/encoder, keep only shared things\n// system endianess\nexports.BIG_ENDIAN = new Uint8Array(new Uint32Array([0xFF000000]).buffer)[0] === 0xFF;\nif (exports.BIG_ENDIAN) {\n console.warn('BE platform detected. This version of node-sixel works only on LE properly.');\n}\n// channel values\nfunction red(n) {\n return n & 0xFF;\n}\nexports.red = red;\nfunction green(n) {\n return (n >>> 8) & 0xFF;\n}\nexports.green = green;\nfunction blue(n) {\n return (n >>> 16) & 0xFF;\n}\nexports.blue = blue;\nfunction alpha(n) {\n return (n >>> 24) & 0xFF;\n}\nexports.alpha = alpha;\n/**\n * Convert RGB channels to native color RGBA8888.\n */\nfunction toRGBA8888(r, g, b, a = 255) {\n return ((a & 0xFF) << 24 | (b & 0xFF) << 16 | (g & 0xFF) << 8 | (r & 0xFF)) >>> 0; // ABGR32\n}\nexports.toRGBA8888 = toRGBA8888;\n/**\n * Convert native color to [r, g, b, a].\n */\nfunction fromRGBA8888(color) {\n return [color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF, color >>> 24];\n}\nexports.fromRGBA8888 = fromRGBA8888;\n/**\n * Get index of nearest color in `palette` for `color`.\n * Uses euclidean distance without any luminescence correction.\n */\nfunction nearestColorIndex(color, palette) {\n const r = red(color);\n const g = green(color);\n const b = blue(color);\n let min = Number.MAX_SAFE_INTEGER;\n let idx = -1;\n // use euclidean distance (manhattan gives very poor results)\n for (let i = 0; i < palette.length; ++i) {\n const dr = r - palette[i][0];\n const dg = g - palette[i][1];\n const db = b - palette[i][2];\n const d = dr * dr + dg * dg + db * db;\n if (!d)\n return i;\n if (d < min) {\n min = d;\n idx = i;\n }\n }\n return idx;\n}\nexports.nearestColorIndex = nearestColorIndex;\n// color conversions\n// HLS taken from: http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl\nfunction clamp(low, high, value) {\n return Math.max(low, Math.min(value, high));\n}\nfunction h2c(t1, t2, c) {\n if (c < 0)\n c += 1;\n if (c > 1)\n c -= 1;\n return c * 6 < 1\n ? t2 + (t1 - t2) * 6 * c\n : c * 2 < 1\n ? t1\n : c * 3 < 2\n ? t2 + (t1 - t2) * (4 - c * 6)\n : t2;\n}\nfunction HLStoRGB(h, l, s) {\n if (!s) {\n const v = Math.round(l * 255);\n return toRGBA8888(v, v, v);\n }\n const t1 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t2 = 2 * l - t1;\n return toRGBA8888(clamp(0, 255, Math.round(h2c(t1, t2, h + 1 / 3) * 255)), clamp(0, 255, Math.round(h2c(t1, t2, h) * 255)), clamp(0, 255, Math.round(h2c(t1, t2, h - 1 / 3) * 255)));\n}\n/**\n * Normalize SIXEL RGB values (percent based, 0-100) to RGBA8888.\n */\nfunction normalizeRGB(r, g, b) {\n return (0xFF000000 | Math.round(b / 100 * 255) << 16 | Math.round(g / 100 * 255) << 8 | Math.round(r / 100 * 255)) >>> 0; // ABGR32\n}\nexports.normalizeRGB = normalizeRGB;\n/**\n * Normalize SIXEL HLS values to RGBA8888. Applies hue correction of +240°.\n */\nfunction normalizeHLS(h, l, s) {\n // Note: hue value is turned by 240° in VT340, all values given as fractions\n return HLStoRGB((h + 240 % 360) / 360, l / 100, s / 100);\n}\nexports.normalizeHLS = normalizeHLS;\n/**\n * default palettes\n */\n// FIXME: move palettes to Decoder.ts\n/**\n * 16 predefined color registers of VT340 (values in %):\n * ```\n * R G B\n * 0 Black 0 0 0\n * 1 Blue 20 20 80\n * 2 Red 80 13 13\n * 3 Green 20 80 20\n * 4 Magenta 80 20 80\n * 5 Cyan 20 80 80\n * 6 Yellow 80 80 20\n * 7 Gray 50% 53 53 53\n * 8 Gray 25% 26 26 26\n * 9 Blue* 33 33 60\n * 10 Red* 60 26 26\n * 11 Green* 33 60 33\n * 12 Magenta* 60 33 60\n * 13 Cyan* 33 60 60\n * 14 Yellow* 60 60 33\n * 15 Gray 75% 80 80 80\n * ```\n * (*) less saturated\n *\n * @see https://vt100.net/docs/vt3xx-gp/chapter2.html#S2.4\n*/\nexports.PALETTE_VT340_COLOR = new Uint32Array([\n normalizeRGB(0, 0, 0),\n normalizeRGB(20, 20, 80),\n normalizeRGB(80, 13, 13),\n normalizeRGB(20, 80, 20),\n normalizeRGB(80, 20, 80),\n normalizeRGB(20, 80, 80),\n normalizeRGB(80, 80, 20),\n normalizeRGB(53, 53, 53),\n normalizeRGB(26, 26, 26),\n normalizeRGB(33, 33, 60),\n normalizeRGB(60, 26, 26),\n normalizeRGB(33, 60, 33),\n normalizeRGB(60, 33, 60),\n normalizeRGB(33, 60, 60),\n normalizeRGB(60, 60, 33),\n normalizeRGB(80, 80, 80)\n]);\n/**\n * 16 predefined monochrome registers of VT340 (values in %):\n * ```\n * R G B\n * 0 Black 0 0 0\n * 1 Gray-2 13 13 13\n * 2 Gray-4 26 26 26\n * 3 Gray-6 40 40 40\n * 4 Gray-1 6 6 6\n * 5 Gray-3 20 20 20\n * 6 Gray-5 33 33 33\n * 7 White 7 46 46 46\n * 8 Black 0 0 0 0\n * 9 Gray-2 13 13 13\n * 10 Gray-4 26 26 26\n * 11 Gray-6 40 40 40\n * 12 Gray-1 6 6 6\n * 13 Gray-3 20 20 20\n * 14 Gray-5 33 33 33\n * 15 White 7 46 46 46\n * ```\n *\n * @see https://vt100.net/docs/vt3xx-gp/chapter2.html#S2.4\n */\nexports.PALETTE_VT340_GREY = new Uint32Array([\n normalizeRGB(0, 0, 0),\n normalizeRGB(13, 13, 13),\n normalizeRGB(26, 26, 26),\n normalizeRGB(40, 40, 40),\n normalizeRGB(6, 6, 6),\n normalizeRGB(20, 20, 20),\n normalizeRGB(33, 33, 33),\n normalizeRGB(46, 46, 46),\n normalizeRGB(0, 0, 0),\n normalizeRGB(13, 13, 13),\n normalizeRGB(26, 26, 26),\n normalizeRGB(40, 40, 40),\n normalizeRGB(6, 6, 6),\n normalizeRGB(20, 20, 20),\n normalizeRGB(33, 33, 33),\n normalizeRGB(46, 46, 46)\n]);\n/**\n * 256 predefined ANSI colors.\n *\n * @see https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit\n */\nexports.PALETTE_ANSI_256 = (() => {\n // 16 lower colors (taken from xterm)\n const p = [\n toRGBA8888(0, 0, 0),\n toRGBA8888(205, 0, 0),\n toRGBA8888(0, 205, 0),\n toRGBA8888(205, 205, 0),\n toRGBA8888(0, 0, 238),\n toRGBA8888(205, 0, 205),\n toRGBA8888(0, 250, 205),\n toRGBA8888(229, 229, 229),\n toRGBA8888(127, 127, 127),\n toRGBA8888(255, 0, 0),\n toRGBA8888(0, 255, 0),\n toRGBA8888(255, 255, 0),\n toRGBA8888(92, 92, 255),\n toRGBA8888(255, 0, 255),\n toRGBA8888(0, 255, 255),\n toRGBA8888(255, 255, 255),\n ];\n // colors up to 232\n const d = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; ++r) {\n for (let g = 0; g < 6; ++g) {\n for (let b = 0; b < 6; ++b) {\n p.push(toRGBA8888(d[r], d[g], d[b]));\n }\n }\n }\n // grey scale to up 255\n for (let v = 8; v <= 238; v += 10) {\n p.push(toRGBA8888(v, v, v));\n }\n return new Uint32Array(p);\n})();\n/**\n * Background: Black by default.\n * Foreground: White by default.\n *\n * Background color is used whenever a fill color is needed and not explicitly set.\n * Foreground color is used as default initial sixel color.\n */\nexports.DEFAULT_BACKGROUND = toRGBA8888(0, 0, 0, 255);\nexports.DEFAULT_FOREGROUND = toRGBA8888(255, 255, 255, 255);\n//# sourceMappingURL=Colors.js.map","\"use strict\";\n/**\n * Copyright (c) 2021 Joerg Breitbart.\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeAsync = exports.decode = exports.Decoder = exports.DecoderAsync = void 0;\nconst Colors_1 = require(\"./Colors\");\nconst wasm_1 = require(\"./wasm\");\n/* istanbul ignore next */\nfunction decodeBase64(s) {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(s, 'base64');\n }\n const bytestring = atob(s);\n const result = new Uint8Array(bytestring.length);\n for (let i = 0; i < result.length; ++i) {\n result[i] = bytestring.charCodeAt(i);\n }\n return result;\n}\nconst WASM_BYTES = decodeBase64(wasm_1.LIMITS.BYTES);\nlet WASM_MODULE;\n// empty canvas\nconst NULL_CANVAS = new Uint32Array();\n// proxy for lazy binding of decoder methods to wasm env callbacks\nclass CallbackProxy {\n constructor() {\n this.bandHandler = (width) => 1;\n this.modeHandler = (mode) => 1;\n }\n handle_band(width) {\n return this.bandHandler(width);\n }\n mode_parsed(mode) {\n return this.modeHandler(mode);\n }\n}\n// default decoder options\nconst DEFAULT_OPTIONS = {\n memoryLimit: 2048 * 65536,\n sixelColor: Colors_1.DEFAULT_FOREGROUND,\n fillColor: Colors_1.DEFAULT_BACKGROUND,\n palette: Colors_1.PALETTE_VT340_COLOR,\n paletteLimit: wasm_1.LIMITS.PALETTE_SIZE,\n truncate: true\n};\n/**\n * Create a decoder instance asynchronously.\n * To be used in the browser main thread.\n */\nfunction DecoderAsync(opts) {\n const cbProxy = new CallbackProxy();\n const importObj = {\n env: {\n handle_band: cbProxy.handle_band.bind(cbProxy),\n mode_parsed: cbProxy.mode_parsed.bind(cbProxy)\n }\n };\n return WebAssembly.instantiate(WASM_MODULE || WASM_BYTES, importObj)\n .then((inst) => {\n WASM_MODULE = WASM_MODULE || inst.module;\n return new Decoder(opts, inst.instance || inst, cbProxy);\n });\n}\nexports.DecoderAsync = DecoderAsync;\n/**\n * Decoder - web assembly based sixel stream decoder.\n *\n * Usage pattern:\n * - call `init` to initialize decoder for new image\n * - feed data chunks to `decode` or `decodeString`\n * - grab pixels from `data32`\n * - optional: call `release` to free memory (e.g. after big images)\n * - start over with next image by calling `init`\n *\n * Properties:\n * - max width of 2^14 - 4 pixels (compile time setting in wasm)\n * - no explicit height limit (only limited by memory)\n * - max 4096 colors palette (compile time setting in wasm)\n *\n * Explanation operation modes:\n * - M1 Mode chosen for level 1 images (no raster attributes),\n * or for level 2 images with `truncate=false`.\n * - M2 Mode chosen for level 2 images with `truncate=true` (default).\n * While this mode is not fully spec conform (decoder not expected to truncate),\n * it is what spec conform encoders should create (should not excess raster).\n * This mode has several advantages:\n * - ~15% faster decoding speed\n * - image dimensions can be evaluated early without processing the whole data\n * - faster pixel access in `data32` (precalulated)\n * - image height is not reported as multiple of 6 pixels\n * - M0 Undecided mode state after `init`.\n * The level of an image is determined during early decoding based on the fact,\n * whether the data contains valid raster attributes before any sixel data.\n * Until then the mode of an image is marked as M0, meaning the real operation mode\n * could not be decided yet.\n */\nclass Decoder {\n /**\n * Synchonous ctor. Can be called from nodejs or a webworker context.\n * For instantiation in the browser main thread use `WasmDecoderAsync` instead.\n */\n constructor(opts, _instance, _cbProxy) {\n this._PIXEL_OFFSET = wasm_1.LIMITS.MAX_WIDTH + 4;\n this._canvas = NULL_CANVAS;\n this._bandWidths = [];\n this._maxWidth = 0;\n this._minWidth = wasm_1.LIMITS.MAX_WIDTH;\n this._lastOffset = 0;\n this._currentHeight = 0;\n this._opts = Object.assign({}, DEFAULT_OPTIONS, opts);\n if (this._opts.paletteLimit > wasm_1.LIMITS.PALETTE_SIZE) {\n throw new Error(`DecoderOptions.paletteLimit must not exceed ${wasm_1.LIMITS.PALETTE_SIZE}`);\n }\n if (!_instance) {\n const module = WASM_MODULE || (WASM_MODULE = new WebAssembly.Module(WASM_BYTES));\n _instance = new WebAssembly.Instance(module, {\n env: {\n handle_band: this._handle_band.bind(this),\n mode_parsed: this._initCanvas.bind(this)\n }\n });\n }\n else {\n _cbProxy.bandHandler = this._handle_band.bind(this);\n _cbProxy.modeHandler = this._initCanvas.bind(this);\n }\n this._instance = _instance;\n this._wasm = this._instance.exports;\n this._chunk = new Uint8Array(this._wasm.memory.buffer, this._wasm.get_chunk_address(), wasm_1.LIMITS.CHUNK_SIZE);\n this._states = new Uint32Array(this._wasm.memory.buffer, this._wasm.get_state_address(), 12);\n this._palette = new Uint32Array(this._wasm.memory.buffer, this._wasm.get_palette_address(), wasm_1.LIMITS.PALETTE_SIZE);\n this._palette.set(this._opts.palette);\n this._pSrc = new Uint32Array(this._wasm.memory.buffer, this._wasm.get_p0_address());\n this._wasm.init(Colors_1.DEFAULT_FOREGROUND, 0, this._opts.paletteLimit, 0);\n }\n // some readonly parser states for internal usage\n get _fillColor() { return this._states[0]; }\n get _truncate() { return this._states[8]; }\n get _rasterWidth() { return this._states[6]; }\n get _rasterHeight() { return this._states[7]; }\n get _width() { return this._states[2] ? this._states[2] - 4 : 0; }\n get _height() { return this._states[3]; }\n get _level() { return this._states[9]; }\n get _mode() { return this._states[10]; }\n get _paletteLimit() { return this._states[11]; }\n _initCanvas(mode) {\n if (mode === 2 /* M2 */) {\n const pixels = this.width * this.height;\n if (pixels > this._canvas.length) {\n if (this._opts.memoryLimit && pixels * 4 > this._opts.memoryLimit) {\n this.release();\n throw new Error('image exceeds memory limit');\n }\n this._canvas = new Uint32Array(pixels);\n }\n this._maxWidth = this._width;\n }\n else if (mode === 1 /* M1 */) {\n if (this._level === 2) {\n // got raster attributes, use them as initial size hint\n const pixels = Math.min(this._rasterWidth, wasm_1.LIMITS.MAX_WIDTH) * this._rasterHeight;\n if (pixels > this._canvas.length) {\n if (this._opts.memoryLimit && pixels * 4 > this._opts.memoryLimit) {\n this.release();\n throw new Error('image exceeds memory limit');\n }\n this._canvas = new Uint32Array(pixels);\n }\n }\n else {\n // else fallback to generic resizing, starting with 256*256 pixels\n if (this._canvas.length < 65536) {\n this._canvas = new Uint32Array(65536);\n }\n }\n }\n return 0; // 0 - continue, 1 - abort right away\n }\n _realloc(offset, additionalPixels) {\n const pixels = offset + additionalPixels;\n if (pixels > this._canvas.length) {\n if (this._opts.memoryLimit && pixels * 4 > this._opts.memoryLimit) {\n this.release();\n throw new Error('image exceeds memory limit');\n }\n // extend in 65536 pixel blocks\n const newCanvas = new Uint32Array(Math.ceil(pixels / 65536) * 65536);\n newCanvas.set(this._canvas);\n this._canvas = newCanvas;\n }\n }\n _handle_band(width) {\n const adv = this._PIXEL_OFFSET;\n let offset = this._lastOffset;\n if (this._mode === 2 /* M2 */) {\n let remaining = this.height - this._currentHeight;\n let c = 0;\n while (c < 6 && remaining > 0) {\n this._canvas.set(this._pSrc.subarray(adv * c, adv * c + width), offset + width * c);\n c++;\n remaining--;\n }\n this._lastOffset += width * c;\n this._currentHeight += c;\n }\n else if (this._mode === 1 /* M1 */) {\n this._realloc(offset, width * 6);\n this._maxWidth = Math.max(this._maxWidth, width);\n this._minWidth = Math.min(this._minWidth, width);\n for (let i = 0; i < 6; ++i) {\n this._canvas.set(this._pSrc.subarray(adv * i, adv * i + width), offset + width * i);\n }\n this._bandWidths.push(width);\n this._lastOffset += width * 6;\n this._currentHeight += 6;\n }\n return 0; // 0 - continue, 1 - abort right away\n }\n /**\n * Width of the image data.\n * Returns the rasterWidth in level2/truncating mode,\n * otherwise the max width, that has been seen so far.\n */\n get width() {\n return this._mode !== 1 /* M1 */\n ? this._width\n : Math.max(this._maxWidth, this._wasm.current_width());\n }\n /**\n * Height of the image data.\n * Returns the rasterHeight in level2/truncating mode,\n * otherwise height touched by sixels.\n */\n get height() {\n return this._mode !== 1 /* M1 */\n ? this._height\n : this._wasm.current_width()\n ? this._bandWidths.length * 6 + this._wasm.current_height()\n : this._bandWidths.length * 6;\n }\n /**\n * Get active palette colors as RGBA8888[] (borrowed).\n */\n get palette() {\n return this._palette.subarray(0, this._paletteLimit);\n }\n /**\n * Get the memory used by the decoder.\n *\n * This is a rough estimate accounting the wasm instance memory\n * and pixel buffers held on JS side (real value will be slightly\n * higher due to JS book-keeping).\n * Note that the decoder does not free ressources on its own,\n * call `release` to free excess memory.\n */\n get memoryUsage() {\n return this._canvas.byteLength + this._wasm.memory.buffer.byteLength + 8 * this._bandWidths.length;\n }\n /**\n * Get various properties of the decoder and the current image.\n */\n get properties() {\n return {\n width: this.width,\n height: this.height,\n mode: this._mode,\n level: this._level,\n truncate: !!this._truncate,\n paletteLimit: this._paletteLimit,\n fillColor: this._fillColor,\n memUsage: this.memoryUsage,\n rasterAttributes: {\n numerator: this._states[4],\n denominator: this._states[5],\n width: this._rasterWidth,\n height: this._rasterHeight,\n }\n };\n }\n /**\n * Initialize decoder for next image. Must be called before\n * any calls to `decode` or `decodeString`.\n */\n // FIXME: reorder arguments, better palette handling\n init(fillColor = this._opts.fillColor, palette = this._opts.palette, paletteLimit = this._opts.paletteLimit, truncate = this._opts.truncate) {\n this._wasm.init(this._opts.sixelColor, fillColor, paletteLimit, truncate ? 1 : 0);\n if (palette) {\n this._palette.set(palette.subarray(0, wasm_1.LIMITS.PALETTE_SIZE));\n }\n this._bandWidths.length = 0;\n this._maxWidth = 0;\n this._minWidth = wasm_1.LIMITS.MAX_WIDTH;\n this._lastOffset = 0;\n this._currentHeight = 0;\n }\n /**\n * Decode next chunk of data from start to end index (exclusive).\n * @throws Will throw if the image exceeds the memory limit.\n */\n decode(data, start = 0, end = data.length) {\n let p = start;\n while (p < end) {\n const length = Math.min(end - p, wasm_1.LIMITS.CHUNK_SIZE);\n this._chunk.set(data.subarray(p, p += length));\n this._wasm.decode(0, length);\n }\n }\n /**\n * Decode next chunk of string data from start to end index (exclusive).\n * Note: Decoding from string data is rather slow, use `decode` with byte data instead.\n * @throws Will throw if the image exceeds the memory limit.\n */\n decodeString(data, start = 0, end = data.length) {\n let p = start;\n while (p < end) {\n const length = Math.min(end - p, wasm_1.LIMITS.CHUNK_SIZE);\n for (let i = 0, j = p; i < length; ++i, ++j) {\n this._chunk[i] = data.charCodeAt(j);\n }\n p += length;\n this._wasm.decode(0, length);\n }\n }\n /**\n * Get current pixel data as 32-bit typed array (RGBA8888).\n * Also peeks into pixel data of the current band, that got not pushed yet.\n */\n get data32() {\n if (this._mode === 0 /* M0 */ || !this.width || !this.height) {\n return NULL_CANVAS;\n }\n // get width of pending band to peek into left-over data\n const currentWidth = this._wasm.current_width();\n if (this._mode === 2 /* M2 */) {\n let remaining = this.height - this._currentHeight;\n if (remaining > 0) {\n const adv = this._PIXEL_OFFSET;\n let offset = this._lastOffset;\n let c = 0;\n while (c < 6 && remaining > 0) {\n this._canvas.set(this._pSrc.subarray(adv * c, adv * c + currentWidth), offset + currentWidth * c);\n c++;\n remaining--;\n }\n if (remaining) {\n this._canvas.fill(this._fillColor, offset + currentWidth * c);\n }\n }\n return this._canvas.subarray(0, this.width * this.height);\n }\n if (this._mode === 1 /* M1 */) {\n if (this._minWidth === this._maxWidth) {\n let escape = false;\n if (currentWidth) {\n if (currentWidth !== this._minWidth) {\n escape = true;\n }\n else {\n const adv = this._PIXEL_OFFSET;\n let offset = this._lastOffset;\n this._realloc(offset, currentWidth * 6);\n for (let i = 0; i < 6; ++i) {\n this._canvas.set(this._pSrc.subarray(adv * i, adv * i + currentWidth), offset + currentWidth * i);\n }\n }\n }\n if (!escape) {\n return this._canvas.subarray(0, this.width * this.height);\n }\n }\n // worst case: re-align pixels if we have bands with different width\n // This is somewhat allocation intensive, any way to do that in-place, and just once?\n const final = new Uint32Array(this.width * this.height);\n final.fill(this._fillColor);\n let finalOffset = 0;\n let start = 0;\n for (let i = 0; i < this._bandWidths.length; ++i) {\n const bw = this._bandWidths[i];\n for (let p = 0; p < 6; ++p) {\n final.set(this._canvas.subarray(start, start += bw), finalOffset);\n finalOffset += this.width;\n }\n }\n // also handle left-over pixels of the current band\n if (currentWidth) {\n const adv = this._PIXEL_OFFSET;\n // other than finished bands, this runs only up to currentHeight\n const currentHeight = this._wasm.current_height();\n for (let i = 0; i < currentHeight; ++i) {\n final.set(this._pSrc.subarray(adv * i, adv * i + currentWidth), finalOffset + this.width * i);\n }\n }\n return final;\n }\n // fallthrough for all not handled cases\n return NULL_CANVAS;\n }\n /**\n * Same as `data32`, but returning pixel data as Uint8ClampedArray suitable\n * for direct usage with `ImageData`.\n */\n get data8() {\n return new Uint8ClampedArray(this.data32.buffer, 0, this.width * this.height * 4);\n }\n /**\n * Release image ressources on JS side held by the decoder.\n *\n * The decoder tries to re-use memory ressources of a previous image\n * to lower allocation and GC pressure. Decoding a single big image\n * will grow the memory usage of the decoder permanently.\n * Call `release` to reset the internal buffers and free the memory.\n * Note that this destroys the image data, call it when done processing\n * a rather big image, otherwise it is not needed. Use `memoryUsage`\n * to decide, whether the held memory is still within your limits.\n * This does not affect the wasm module (operates on static memory).\n */\n release() {\n this._canvas = NULL_CANVAS;\n this._bandWidths.length = 0;\n this._maxWidth = 0;\n this._minWidth = wasm_1.LIMITS.MAX_WIDTH;\n // also nullify parser states in wasm to avoid\n // width/height reporting potential out-of-bound values\n this._wasm.init(Colors_1.DEFAULT_FOREGROUND, 0, this._opts.paletteLimit, 0);\n }\n}\nexports.Decoder = Decoder;\n/**\n * Convenient decoding functions for easier usage.\n *\n * These can be used for casual decoding of sixel images,\n * that dont come in as stream chunks.\n * Note that the functions instantiate a stream decoder for every call,\n * which comes with a performance penalty of ~25%.\n */\n/**\n * Decode function with synchronous wasm loading.\n * Can be used in a web worker or in nodejs. Does not work reliable in normal browser context.\n * @throws Will throw if the image exceeds the memory limit.\n */\nfunction decode(data, opts) {\n const dec = new Decoder(opts);\n dec.init();\n typeof data === 'string' ? dec.decodeString(data) : dec.decode(data);\n return {\n width: dec.width,\n height: dec.height,\n data32: dec.data32,\n data8: dec.data8\n };\n}\nexports.decode = decode;\n/**\n * Decode function with asynchronous wasm loading.\n * Use this version in normal browser context.\n * @throws Will throw if the image exceeds the memory limit.\n */\nasync function decodeAsync(data, opts) {\n const dec = await DecoderAsync(opts);\n dec.init();\n typeof data === 'string' ? dec.decodeString(data) : dec.decode(data);\n return {\n width: dec.width,\n height: dec.height,\n data32: dec.data32,\n data8: dec.data8\n };\n}\nexports.decodeAsync = decodeAsync;\n//# sourceMappingURL=Decoder.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LIMITS = void 0;\nexports.LIMITS = {\n CHUNK_SIZE: 16384,\n PALETTE_SIZE: 4096,\n MAX_WIDTH: 16384,\n BYTES: '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AEHAiwIgADcDAEG4iwIgADcDAEGwiwIgADcDAEGoiwIgADcDAEGgiwIgADcDAEGYiwIgADcDAEGQiwIgADcDAEGIiwIgADcDAEGAiwIgADcDAEH4igIgADcDAEHwigIgADcDAEHoigIgADcDAEHgigIgADcDAEHYigIgADcDAEHQigIgADcDAEHIigIgADcDAEHAigIgADcDAEG4igIgADcDAEGwigIgADcDAEGoigIgADcDAEGgigIgADcDAEGYigIgADcDAEGQigIgADcDAEGIigIgADcDAEGAigIgADcDAEH4iQIgADcDAEHwiQIgADcDAEHoiQIgADcDAEHgiQIgADcDAEHYiQIgADcDAEHQiQIgADcDAEHIiQIgADcDAEHAiQIgADcDAEG4iQIgADcDAEGwiQIgADcDAEGoCCgCACIEQf8AakGAAW0hCAJAIARBgQFIDQBBASEBIAhBAiAIQQJKG0EBayICQQFxIQMgBEGBAk4EQCACQX5xIQIDQCABQQl0IgdBEHJBoIkCakGwiQJBgAT8CgAAIAdBsI0CakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsLIANFDQAgAUEJdEEQckGgiQJqQbCJAkGABPwKAAALAkAgBEEBSA0AIAhBASAIQQFKGyIDQQFxIQUCQCADQQFrIgdFBEBBACEBDAELIANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQbCJBmpBsIkCQYAE/AoAACAGQZAEckGwiQZqQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACwsgBQRAIAFBCXRBEHJBsIkGakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEFIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiBkEQckHAiQpqQbCJAkGABPwKAAAgBkGQBHJBwIkKakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAFBEAgAUECdEHAiQpqQbCJAkGABPwKAAALIARBAUgNACADQQFxIQUgBwR/IANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQdCJDmpBsIkCQYAE/AoAACAGQZAEckHQiQ5qQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACyABQQd0QQRyBUEECyEBIAUEQCABQQJ0QdCJDmpBsIkCQYAE/AoAAAsgBEEBSA0AIANBAXEhBSAHBH8gA0H+////B3EhAkEAIQEDQCABQQl0IgZBEHJB4IkSakGwiQJBgAT8CgAAIAZBkARyQeCJEmpBsIkCQYAE/AoAACABQQJqIQEgAkECayICDQALIAFBB3RBBHIFQQQLIQEgBQRAIAFBAnRB4IkSakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEEIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiA0EQckHwiRZqQbCJAkGABPwKAAAgA0GQBHJB8IkWakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAERQ0AIAFBAnRB8IkWakGwiQJBgAT8CgAAC0HUCCAIQQd0QQRyNgIAC58TAgh/AX5B5AgoAgAhA0HgCCgCACECQegIKAIAIQcgAUGQiQFqIglB/wE6AAAgACABSARAIABBkIkBaiEIA0AgAiEEIAhBAWohAQJAIAgtAABB/wBxIgJBMGtBCUsEQCABIQgMAQtB7AgoAgBBAnRB7AhqIgUoAgAhAANAIAUgAiAAQQpsakEwayIANgIAIAEtAAAhAiABQQFqIgghASACQf8AcSICQTBrQQpJDQALCwJAAkACQAJAAkACQAJ/AkAgAkE/ayIAQT9NBEAgBEUNASAEQSFGBEBB8AgoAgAiAUEBIAEbIgQgB2ohAQJAIABFDQAgB0H//wBLDQBBgIABIAdrIAQgAUH//wBLGyEFAkAgAEEBcUUNACAHQQJ0QaCJAmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEECcUUNACAHQQJ0QbCJBmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEEEcUUNACAHQQJ0QcCJCmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEEIcUUNACAHQQJ0QdCJDmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEEQcUUNACAHQQJ0QeCJEmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLIABBIHFFDQAgBUEBayEEIAdBAnRB8IkWaiEAIAVBB3EiAgRAA0AgACADNgIAIABBBGohACAFQQFrIQUgAkEBayICDQALCyAEQQdJDQADQCAAIAM2AhwgACADNgIYIAAgAzYCFCAAIAM2AhAgACADNgIMIAAgAzYCCCAAIAM2AgQgACADNgIAIABBIGohACAFQQhrIgUNAAsLIAhBAWoiBSAILQAAQf8AcSICQT9rIgBBP00NAxoMBAsCQEHsCCgCACIFQQFGBEBB8AgoAgAiAUHMCCgCACIESQ0BIAEgBHAhAQwBC0H4CCgCACEEQfQIKAIAIQECQAJAIAVBBUcNACABQQFHDQAgBEHpAk4NBAwBCyAEQeQASg0DQfwIKAIAQeQASg0DQYAJKAIAQeQASg0DCwJAIAFFDQAgAUECSg0AIARB/AgoAgBBgAkoAgAgAUECdEGICGooAgARAgAhBEHwCCgCACIBQcwIKAIAIgVPBH8gASAFcAUgAQtBAnRBkAlqIAQ2AgALQfAIKAIAIgFBzAgoAgAiBEkNACABIARwIQELIAFBAnRBkAlqKAIAIQMMAQsgAkH9AHFBIUcEQCAHIQEgAiEADAQLIARBI0cNBAJAQewIKAIAIgRBAUYEQEHwCCgCACIBQcwIKAIAIgBJDQEgASAAcCEBDAELQfgIKAIAIQFB9AgoAgAhAAJAAkAgBEEFRw0AIABBAUcNACABQekCSA0BDAcLIAFB5ABKDQZB/AgoAgBB5ABKDQZBgAkoAgBB5ABKDQYLAkAgAEUNACAAQQJKDQAgAUH8CCgCAEGACSgCACAAQQJ0QYgIaigCABECACEAQfAIKAIAIgFBzAgoAgAiBE8EfyABIARwBSABC0ECdEGQCWogADYCAAtB8AgoAgAiAUHMCCgCACIASQ0AIAEgAHAhAQsgAUECdEGQCWooAgAhAwwECyAHIQEgCAshBQNAIAFB//8ATQRAIABBAXEgAWxBAnRBoIkCaiADNgIAIABBAXZBAXEgAWxBAnRBsIkGaiADNgIAIABBAnZBAXEgAWxBAnRBwIkKaiADNgIAIABBA3ZBAXEgAWxBAnRB0IkOaiADNgIAIABBBHZBAXEgAWxBAnRB4IkSaiADNgIAIABBBXYgAWxBAnRB8IkWaiADNgIACyABQQFqIQEgBS0AACEAIAVBAWoiBCEFIABB/wBxIgJBP2siAEHAAEkNAAsgBCEFC0EAIQQgBSEIIAEhByACIQAgAkH9AHFBIUYNAQtBBCEHIAQhAiAAQSRrDgoDAgICAgICAgIBAgtB7AhCATcCAAwCC0GoCCgCAEEEaxAABEBB0AhBATYCAA8LAkBBqAgoAgAiBkEFSA0AQaAIKQMAIQogBkEDa0EBdiIBQQdxIQJBACEAIAFBAWtBB08EQCABQfj///8HcSEFA0AgAEEDdCIBQbCJAmogCjcDACABQQhyQbCJAmogCjcDACABQRByQbCJAmogCjcDACABQRhyQbCJAmogCjcDACABQSByQbCJAmogCjcDACABQShyQbCJAmogCjcDACABQTByQbCJAmogCjcDACABQThyQbCJAmogCjcDACAAQQhqIQAgBUEIayIFDQALCyACRQ0AA0AgAEEDdEGwiQJqIAo3AwAgAEEBaiEAIAJBAWsiAg0ACwtBwIkGQbCJAiAGQQJ0IgD8CgAAQdCJCkGwiQIgAPwKAABB4IkOQbCJAiAA/AoAAEHwiRJBsIkCIAD8CgAAQYCKFkGwiQIgAPwKAAAgBCECDAELAkAgAEE7Rw0AQewIKAIAIgBBB0oNAEHsCCAAQQFqNgIAIABBAnRB8AhqQQA2AgALIAEhBwsgCCAJSQ0ACwtB5AggAzYCAEHgCCACNgIAQegIIAc2AgAL4gcCBX8BfgJAQdAIAn8CQAJAIAAgAU4NACABQZCJAWohBiAAQZCJAWohBQNAIAUtAAAiA0H/AHEhAgJAAkACQAJAAkACQAJAQeAIKAIAIgRBIkcEQCAEDQcgAkEiRgRAQewIQgE3AgBB4AhBIjYCAAwICyACQT9rQcAASQ0GIANBIWsiAkEMTQ0BDAULAkAgAkEwayIEQQlNBEBB7AgoAgBBAnRB7AhqIgIgBCACKAIAQQpsajYCAAwBC0HsCCgCACEEIAJBO0YEQCAEQQdKDQFB7AggBEEBajYCACAEQQJ0QfAIakEANgIADAELIARBBEYEQEHECEECNgIAQbAIQfAIKQMANwMAQbgIQfgIKAIAIgI2AgBBvAhB/AgoAgAiBDYCAEHICEECQQFBwAgoAgAiAxs2AgBBrAggBEEAIAMbNgIAQagIIAJBgIABIAJBgIABSBtBBGpBACADGzYCAEHgCEEANgIADAoLIAJBP2tBwABJDQQLIANBIWsiAkEMTQ0BDAILQQEgAnRBjSBxRQ0DDAQLQQEgAnRBjSBxDQELIANBoQFrIgJBDEsNA0EBIAJ0QY0gcUUNAwtBxAhCgYCAgBA3AgBBsAhB8AgoAgBBAEHsCCgCACICQQBKGzYCAEG0CEH0CCgCAEEAIAJBAUobNgIAQbgIQfgIKAIAQQAgAkECShs2AgBB4AhBADYCAEG8CEEANgIADAQLIANBoQFrIgJBDEsNAUEBIAJ0QY0gcUUNAQtBxAhCgYCAgBA3AgBBsAhCADcDAEG4CEIANwMADAMLIAVBAWoiBSAGSQ0ACwsCQEHICCgCAA4DAwEAAQsCQEGoCCgCACIFQQVIDQBBoAgpAwAhByAFQQNrQQF2IgNBB3EhBEEAIQIgA0EBa0EHTwRAIANB+P///wdxIQYDQCACQQN0IgNBsIkCaiAHNwMAIANBCHJBsIkCaiAHNwMAIANBEHJBsIkCaiAHNwMAIANBGHJBsIkCaiAHNwMAIANBIHJBsIkCaiAHNwMAIANBKHJBsIkCaiAHNwMAIANBMHJBsIkCaiAHNwMAIANBOHJBsIkCaiAHNwMAIAJBCGohAiAGQQhrIgYNAAsLIARFDQADQCACQQN0QbCJAmogBzcDACACQQFqIQIgBEEBayIEDQALC0HAiQZBsIkCIAVBAnQiA/wKAABB0IkKQbCJAiAD/AoAAEHgiQ5BsIkCIAP8CgAAQfCJEkGwiQIgA/wKAABBgIoWQbCJAiAD/AoAAEECDAELEAhByAgoAgALEAEiAjYCACACDQAgACABQcgIKAIAQQJ0QYAIaigCABEBAAsLdABB6AhBBDYCAEHkCCAANgIAQewIQgE3AgBBxAhCADcCAEHACCADNgIAQdwIQgA3AgBBqAhCADcDAEGwCEIANwMAQbgIQgA3AwBBzAggAkGAICACQYAgSRs2AgBBoAggAa1CgYCAgBB+NwMAQdAIQQA2AgALIwBB0AgoAgBFBEAgACABQcgIKAIAQQJ0QYAIaigCABEBAAsLWgECfwJAAkACQEHICCgCAEEBaw4CAAECC0HYCEHoCCgCACIAQdgIKAIAIgEgACABShsiAEGAgAEgAEGAgAFIGyIANgIAIABBBGsPC0GoCCgCAEEEayEACyAAC0IBAX8Cf0EGQdwIKAIAIgBBIHENABpBBSAAQRBxDQAaQQQgAEEIcQ0AGkEDIABBBHENABpBAiAAQQFxIABBAnEbCwu9BQEFfQJ/IAJFBEAgAUH/AWxBMmpB5ABtIgBBCHQgAHIgAEEQdHIMAQsgArJDAADIQpUhBiAAQfABarJDAAC0Q5UhBQJ9IAGyQwAAyEKVIgNDAAAAP10EQCADIAZDAACAP5KUDAELIAYgA0MAAIA/IAaTlJILIQcgAyADkiEGAkAgBUOrqqo+kiIEQwAAAABdBEAgBEMAAIA/kiEEDAELIARDAACAP15FDQAgBEMAAIC/kiEECyAGIAeTIQMgBUMAAAAAXSEAAn8CfSADIAcgA5NDAADAQJQgBJSSIARDq6oqPl0NABogByAEQwAAAD9dDQAaIAMgBEOrqio/XUUNABogAyAHIAOTIARDAADAwJRDAACAQJKUkgtDAAB/Q5RDAAAAP5IiBkMAAIBPXSAGQwAAAABgcQRAIAapDAELQQALIQECQCAABEAgBUMAAIA/kiEEDAELIAUiBEMAAIA/XkUNACAFQwAAgL+SIQQLIAVDq6qqvpIiBUMAAAAAXSECAn8CfSADIAcgA5NDAADAQJQgBJSSIARDq6oqPl0NABogByAEQwAAAD9dDQAaIAMgBEOrqio/XUUNABogAyAHIAOTIARDAADAwJRDAACAQJKUkgtDAAB/Q5RDAAAAP5IiBkMAAIBPXSAGQwAAAABgcQRAIAapDAELQQALIQACQCACBEAgBUMAAIA/kiEFDAELIAVDAACAP15FDQAgBUMAAIC/kiEFCwJAIAVDq6oqPl0EQCADIAcgA5NDAADAQJQgBZSSIQcMAQsgBUMAAAA/XQ0AIAVDq6oqP11FBEAgAyEHDAELIAMgByADkyAFQwAAwMCUQwAAgECSlJIhBwsgAEEIdAJ/IAdDAAB/Q5RDAAAAP5IiBkMAAIBPXSAGQwAAAABgcQRAIAapDAELQQALQRB0ciABcgtBgICAeHILNwAgAEH/AWxBMmpB5ABtIAFB/wFsQTJqQeQAbUEIdHIgAkH/AWxBMmpB5ABtQRB0ckGAgIB4cgsEACMACwYAIAAkAAsQACMAIABrQXBxIgAkACAACwsYAQBBgAgLEQEAAAACAAAAAwAAAAQAAAAF'\n};\n//# sourceMappingURL=wasm.js.map","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent<T> {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter<T> {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent<T> | undefined;\n\n public get event(): IEvent<T> {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward<T>(from: IEvent<T>, to: Emitter<T>): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map<I, O>(event: IEvent<I>, map: (i: I) => O): IEvent<O> {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any<T>(...events: IEvent<T>[]): IEvent<T>;\n export function any(...events: IEvent<any>[]): IEvent<void>;\n export function any<T>(...events: IEvent<T>[]): IEvent<T> {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set<IDisposable>();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add<T extends IDisposable>(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register<T extends IDisposable>(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\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 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 * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './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 public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\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 payload: Object | undefined;\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 public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\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 && this.payload === undefined;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\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 public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\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 alignment.\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.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\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.HAS_CONTENT_MASK)`\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.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\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..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\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;\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]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\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) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IImageAddonOptions, IOscHandler, IResetHandler, ITerminalExt } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { CELL_SIZE_DEFAULT } from './ImageStorage';\nimport Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport QoiDecoder from 'xterm-wasm-parts/lib/qoi/QoiDecoder.wasm';\nimport { HeaderParser, IHeaderFields, HeaderState, SequenceType } from './IIPHeaderParser';\nimport { imageType, UNSUPPORTED_TYPE } from './IIPMetrics';\n\n// Local const enum mirror - esbuild can't inline const enums from external packages\nconst enum DecoderConst {\n // Limit held memory in base64 decoder (encoded bytes).\n KEEP_DATA = 4194304,\n // Initial buffer allocation for the decoder.\n INITIAL_DATA = 1048576,\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n OK = 0\n}\n\n// default IIP header values\nconst DEFAULT_HEADER: IHeaderFields = {\n type: SequenceType.INVALID,\n name: 'Unnamed file',\n size: 0,\n width: 'auto',\n height: 'auto',\n preserveAspectRatio: 1,\n inline: 0\n};\n\n\nexport class IIPHandler implements IOscHandler, IResetHandler {\n private _aborted = false;\n private _hp = new HeaderParser();\n private _header: IHeaderFields = DEFAULT_HEADER;\n private _dec: Base64Decoder;\n private _qoiDec: QoiDecoder;\n private _isMultipart = false;\n private _abortMulti = false;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _storage: IIPImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n const maxEncodedBytes = Math.ceil(this._opts.iipSizeLimit * 4 / 3);\n const initialBytes = Math.min(DecoderConst.INITIAL_DATA, maxEncodedBytes);\n this._dec = new Base64Decoder(DecoderConst.KEEP_DATA, maxEncodedBytes, initialBytes);\n this._qoiDec = new QoiDecoder(DecoderConst.KEEP_DATA);\n }\n\n public reset(): void {\n this._hp.reset();\n this._dec.release();\n this._qoiDec.release();\n }\n\n public start(): void {\n this._aborted = false;\n this._hp.reset();\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (this._hp.state === HeaderState.END) {\n if ((this._dec.put(data.subarray(start, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n }\n } else {\n const dataPos = this._hp.parse(data, start, end);\n if (dataPos === -1) {\n this._aborted = true;\n return;\n }\n if (dataPos > 0) {\n const seqType = this._hp.fields.type;\n if (seqType === SequenceType.FILE) {\n if (this._isMultipart) {\n this._isMultipart = false;\n this._abortMulti = false;\n this._dec.release();\n }\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n if (!this._header.inline) {\n this._aborted = true;\n return;\n }\n this._dec.init();\n } else if (this._abortMulti) {\n this._aborted = true;\n return;\n }\n if ((this._dec.put(data.subarray(dataPos, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n if (this._isMultipart) this._abortMulti = true;\n }\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted) return true;\n\n if (this._hp.state !== HeaderState.END) {\n if (this._hp.end()) return true;\n }\n const seqType = this._hp.fields.type;\n\n if (seqType === SequenceType.FILEPART) return true;\n\n if (seqType === SequenceType.REPORTCELLSIZE) {\n // OSC 1337 ; ReportCellSize=[height];[width];[scale] ST\n let w = CELL_SIZE_DEFAULT.width;\n let h = CELL_SIZE_DEFAULT.height;\n if (this._renderer.dimensions) {\n w = this._renderer.dimensions.css.canvas.width / this._coreTerminal.cols;\n h = this._renderer.dimensions.css.canvas.height / this._coreTerminal.rows;\n }\n const scale = this._coreTerminal._core._coreBrowserService?.dpr ?? 1;\n const report = `\\x1b]1337;ReportCellSize=${h.toFixed(3)};${w.toFixed(3)};${scale.toFixed(3)}\\x1b\\\\`;\n this._coreTerminal.input(report, false);\n return true;\n }\n\n if (seqType === SequenceType.MULTIPARTFILE) {\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n this._isMultipart = true;\n this._abortMulti = false;\n this._dec.release();\n this._dec.init();\n return true;\n }\n\n if (seqType === SequenceType.FILEEND) {\n if (!this._isMultipart) return true;\n this._isMultipart = false;\n if (this._abortMulti || this._header.type !== SequenceType.MULTIPARTFILE) return true;\n }\n\n // fallthrough for SequenceType.FILE & SequenceType.FILEEND\n\n let w = 0;\n let h = 0;\n\n // early exit condition chain\n let cond: number | boolean;\n let metrics = UNSUPPORTED_TYPE;\n if (cond = success) {\n if (cond = !this._dec.end()) {\n metrics = imageType(this._dec.data8);\n if (cond = metrics.mime !== 'unsupported') {\n w = metrics.width;\n h = metrics.height;\n if (cond = w && h && w * h < this._opts.pixelLimit) {\n [w, h] = this._resize(w, h).map(Math.floor);\n cond = w && h && w * h < this._opts.pixelLimit;\n } else {\n console.warn(`IIP: image dimension issue ${metrics.width}x${metrics.height}`);\n }\n } else {\n console.warn('IIP: unsupported image type');\n }\n } else {\n console.warn('IIP: error during BASE64 decoding');\n }\n }\n if (!cond) {\n this._dec.release();\n return true;\n }\n\n let blob: Blob | ImageData;\n if (metrics.mime === 'image/qoi') {\n const data = this._qoiDec.decode(this._dec.data8);\n blob = new ImageData(\n new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength),\n this._qoiDec.width,\n this._qoiDec.height\n );\n this._qoiDec.release();\n if (w === this._qoiDec.width && h === this._qoiDec.height) {\n // use fast-path if we don't need to rescale\n this._dec.release();\n const canvas = ImageRenderer.createCanvas(undefined, this._qoiDec.width, this._qoiDec.height);\n canvas.getContext('2d')?.putImageData(blob, 0, 0);\n this._storage.addImage(canvas);\n return true;\n }\n } else {\n blob = new Blob([this._dec.data8], { type: metrics.mime });\n }\n this._dec.release();\n return createImageBitmap(blob, { resizeWidth: w, resizeHeight: h })\n .then(bm => {\n this._storage.addImage(bm);\n return true;\n })\n .catch(e => {\n console.warn(`IIP: decoding error ${metrics.mime} ${metrics.width}x${metrics.height}`, e);\n return true;\n });\n }\n\n private _resize(w: number, h: number): [number, number] {\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n const width = this._renderer.dimensions?.css.canvas.width || cw * this._coreTerminal.cols;\n const height = this._renderer.dimensions?.css.canvas.height || ch * this._coreTerminal.rows;\n\n const rw = this._dim(this._header.width!, width, cw);\n const rh = this._dim(this._header.height!, height, ch);\n if (!rw && !rh) {\n const wf = width / w; // TODO: should this respect initial cursor offset?\n const hf = (height - ch) / h; // TODO: fix offset issues from float cell height\n const f = Math.min(wf, hf);\n return f < 1 ? [w * f, h * f] : [w, h];\n }\n return !rw\n ? [w * rh / h, rh]\n : this._header.preserveAspectRatio || !rw || !rh\n ? [rw, h * rw / w] : [rw, rh];\n }\n\n private _dim(s: string, total: number, cdim: number): number {\n if (s === 'auto') return 0;\n if (s.endsWith('%')) return parseInt(s.slice(0, -1), 10) * total / 100;\n if (s.endsWith('px')) return parseInt(s.slice(0, -2), 10);\n return parseInt(s, 10) * cdim;\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// eslint-disable-next-line\ndeclare const Buffer: any;\n\nexport const enum HeaderState {\n START = 0,\n ABORT = 1,\n KEY = 2,\n VALUE = 3,\n END = 4\n}\n\nexport const enum SequenceType {\n INVALID = 0,\n FILE = 1,\n MULTIPARTFILE = 2,\n FILEPART = 3,\n FILEEND = 4,\n REPORTCELLSIZE = 5\n}\n\nexport interface IHeaderFields {\n [key: string]: number | string | Uint32Array | null | undefined;\n // sequence type\n type: SequenceType;\n // base-64 encoded filename. Defaults to \"Unnamed file\".\n name: string;\n // File size in bytes. The file transfer will be canceled if this size is exceeded.\n size: number;\n /**\n * Optional width and height to render:\n * - N: N character cells.\n * - Npx: N pixels.\n * - N%: N percent of the session's width or height.\n * - auto: The image's inherent size will be used to determine an appropriate dimension.\n */\n width?: string;\n height?: string;\n // Optional, defaults to 1 respecting aspect ratio (width takes precedence).\n preserveAspectRatio?: number;\n // Optional, defaults to 0. If set to 1, the file will be displayed inline, else downloaded\n // (download not supported).\n inline?: number;\n}\n\n// field value decoders\n\n// ASCII bytes to string\nfunction toStr(data: Uint32Array): string {\n let s = '';\n for (let i = 0; i < data.length; ++i) {\n s += String.fromCharCode(data[i]);\n }\n return s;\n}\n\n// digits to integer\nfunction toInt(data: Uint32Array): number {\n let v = 0;\n for (let i = 0; i < data.length; ++i) {\n if (data[i] < 48 || data[i] > 57) {\n throw new Error('illegal char');\n }\n v = v * 10 + data[i] - 48;\n }\n return v;\n}\n\n// check for correct size entry\nfunction toSize(data: Uint32Array): string {\n const v = toStr(data);\n if (!v.match(/^((auto)|(\\d+?((px)|(%)){0,1}))$/)) {\n throw new Error('illegal size');\n }\n return v;\n}\n\n// name is base64 encoded utf-8\nfunction toName(data: Uint32Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(toStr(data), 'base64').toString();\n }\n const bs = atob(toStr(data));\n const b = new Uint8Array(bs.length);\n for (let i = 0; i < b.length; ++i) {\n b[i] = bs.charCodeAt(i);\n }\n return new TextDecoder().decode(b);\n}\n\nconst DECODERS: {[key: string]: (v: Uint32Array) => number | string} = {\n inline: toInt,\n size: toInt,\n name: toName,\n width: toSize,\n height: toSize,\n preserveAspectRatio: toInt\n};\n\n\n// sequence type markers\n// File\nconst FILE_MARKER = [70, 105, 108, 101];\n// MultipartFile\nconst MULTIPARTFILE_MARKER = [77, 117, 108, 116, 105, 112, 97, 114, 116, 70, 105, 108, 101];\n// FilePart\nconst FILEPART_MARKER = [70, 105, 108, 101, 80, 97, 114, 116];\n// FileEnd\nconst FILEEND_MARKER = [70, 105, 108, 101, 69, 110, 100];\n// ReportCellSize\nconst REPORTCELLSIZE_MARKER = [82, 101, 112, 111, 114, 116, 67, 101, 108, 108, 83, 105, 122, 101];\n\n// max allowed chars for sequence header\nconst MAX_FIELDCHARS = 1024;\n\n\nexport class HeaderParser {\n public state: HeaderState = HeaderState.START;\n private _buffer = new Uint32Array(MAX_FIELDCHARS);\n private _position = 0;\n private _key = '';\n public fields: {[key: string]: number | string | Uint32Array | null | undefined} = {};\n\n public reset(): void {\n this._buffer.fill(0);\n this.state = HeaderState.START;\n this._position = 0;\n this.fields = {};\n this._key = '';\n }\n\n public end(): number {\n if (this.state === HeaderState.START) {\n if (this._position === FILEEND_MARKER.length) {\n for (let k = 0; k < FILEEND_MARKER.length; ++k) {\n if (this._buffer[k] !== FILEEND_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEEND;\n this.state = HeaderState.END;\n return 0;\n }\n if (this._position === REPORTCELLSIZE_MARKER.length) {\n for (let k = 0; k < REPORTCELLSIZE_MARKER.length; ++k) {\n if (this._buffer[k] !== REPORTCELLSIZE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.REPORTCELLSIZE;\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n if (this.state === HeaderState.END) return 0;\n if (this.state === HeaderState.VALUE\n && this.fields.type === SequenceType.MULTIPARTFILE\n ) {\n if (!this._storeValue(this._position)) return this._a();\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n\n public parse(data: Uint32Array, start: number, end: number): number {\n let state = this.state;\n let pos = this._position;\n const buffer = this._buffer;\n if (state === HeaderState.ABORT || state === HeaderState.END) return -1;\n if (state === HeaderState.START && pos > 14) return -1;\n for (let i = start; i < end; ++i) {\n const c = data[i];\n switch (c) {\n case 59: // ;\n if (!this._storeValue(pos)) return this._a();\n state = HeaderState.KEY;\n pos = 0;\n break;\n case 61: // =\n if (state === HeaderState.START) {\n if (buffer[0] === 70) {\n // 'File' or 'FilePart'\n let k = 0;\n for (; k < FILE_MARKER.length; ++k) {\n if (buffer[k] !== FILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILE;\n if (pos === FILEPART_MARKER.length) {\n for (; k < FILEPART_MARKER.length; ++k) {\n if (buffer[k] !== FILEPART_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEPART;\n this.state = HeaderState.END;\n return i + 1;\n }\n } else if (buffer[0] === 77) {\n // 'MultipartFile'\n for (let k = 0; k < MULTIPARTFILE_MARKER.length; ++k) {\n if (buffer[k] !== MULTIPARTFILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.MULTIPARTFILE;\n } else {\n return this._a();\n }\n state = HeaderState.KEY;\n pos = 0;\n } else if (state === HeaderState.KEY) {\n if (!this._storeKey(pos)) return this._a();\n state = HeaderState.VALUE;\n pos = 0;\n } else if (state === HeaderState.VALUE) {\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n break;\n case 58: // :\n if (state === HeaderState.VALUE) {\n if (!this._storeValue(pos)) return this._a();\n }\n this.state = HeaderState.END;\n return i + 1;\n default:\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n }\n this.state = state;\n this._position = pos;\n return -2;\n }\n\n private _a(): number {\n this.fields.type = SequenceType.INVALID;\n this.state = HeaderState.ABORT;\n return -1;\n }\n\n private _storeKey(pos: number): boolean {\n const k = toStr(this._buffer.subarray(0, pos));\n if (k) {\n this._key = k;\n this.fields[k] = null;\n return true;\n }\n return false;\n }\n\n private _storeValue(pos: number): boolean {\n if (this._key) {\n try {\n const v = this._buffer.slice(0, pos);\n this.fields[this._key] = DECODERS[this._key] ? DECODERS[this._key](v) : v;\n } catch {\n return false;\n }\n return true;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAddImageOpts } from './Types';\nimport { ImageStorage } from './ImageStorage';\n\n/**\n * IIP (iTerm Image Protocol) specific image storage controller.\n *\n * Wraps the shared ImageStorage with IIP protocol semantics:\n * - Always uses scrolling mode (cursor advances with image)\n */\nexport class IIPImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n constructor(\n private readonly _storage: ImageStorage\n ) {}\n\n /**\n * Add an IIP image to storage.\n * Always uses scrolling mode — cursor advances past the image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._storage.addImage(img, this._addImageOpts);\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\nexport type ImageType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/qoi' | 'image/webp' | 'image/avif' | 'unsupported' | '';\n\nexport interface IMetrics {\n mime: ImageType;\n width: number;\n height: number;\n}\n\nexport const UNSUPPORTED_TYPE: IMetrics = {\n mime: 'unsupported',\n width: 0,\n height: 0\n};\n\nexport function imageType(d: Uint8Array): IMetrics {\n if (d.length < 32) {\n return UNSUPPORTED_TYPE;\n }\n const d32 = new Uint32Array(d.buffer, d.byteOffset, 8);\n // PNG: 89 50 4E 47 0D 0A 1A 0A (8 first bytes == magic number for PNG)\n // + first chunk must be IHDR\n if (d32[0] === 0x474E5089 && d32[1] === 0x0A1A0A0D && d32[3] === 0x52444849) {\n return {\n mime: 'image/png',\n width: d[16] << 24 | d[17] << 16 | d[18] << 8 | d[19],\n height: d[20] << 24 | d[21] << 16 | d[22] << 8 | d[23]\n };\n }\n // JPEG: FF D8 FF\n if (d[0] === 0xFF && d[1] === 0xD8 && d[2] === 0xFF) {\n const [width, height] = jpgSize(d);\n return { mime: 'image/jpeg', width, height };\n }\n // GIF: GIF87a or GIF89a\n if (d32[0] === 0x38464947 && (d[4] === 0x37 || d[4] === 0x39) && d[5] === 0x61) {\n return {\n mime: 'image/gif',\n width: d[7] << 8 | d[6],\n height: d[9] << 8 | d[8]\n };\n }\n // QOI: qoif\n if (d32[0] === 0x66696F71) {\n return {\n mime: 'image/qoi',\n width: d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7],\n height: d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11]\n };\n }\n // WEBP: RIFF | xxxx | WEBP | VP8x\n if (d32[0] === 0x46464952 && d32[2] === 0x50424557 && (d32[3] & 0xFFFFFF) === 0x385056) {\n switch (d[15]) {\n case 0x58: // Extended WebP VP8X --> \"X\"\n return {\n mime: 'image/webp',\n width: (d[24] | d[25] << 8 | d[26] << 16) + 1,\n height: (d[27] | d[28] << 8 | d[29] << 16) + 1\n };\n case 0x4C: // Lossless WebP VP8L --> \"L\"\n if (d[20] !== 0x2f) return UNSUPPORTED_TYPE;\n const dim = d[21] | d[22] << 8 | d[23] << 16 | d[24] << 24;\n return {\n mime: 'image/webp',\n width: (dim & 0x3FFF) + 1,\n height: (dim >>> 14 & 0x3FFF) + 1\n };\n case 0x20: // Lossy WebP VP8 --> \" \"\n if (d[23] !== 0x9d || d[24] !== 0x01 || d[25] !== 0x2a) return UNSUPPORTED_TYPE;\n return {\n mime: 'image/webp',\n width: (d[26] | d[27] << 8) & 0x3FFF,\n height: (d[28] | d[29] << 8) & 0x3FFF\n };\n }\n return UNSUPPORTED_TYPE;\n }\n // AVIF: Box size | ftyp | avif/avis\n if (d32[1] === 0x70797466 && (d32[2] === 0x66697661 || d32[2] === 0x73697661)) {\n let pos = -1;\n // search for ispe box within first 1024 bytes\n const limit = Math.min(d.length - 16, 1024);\n for (let i = 8; i < limit; i++) {\n // scan for ispe\n if (d[i] === 0x69 && d[i + 1] === 0x73 && d[i + 2] === 0x70 && d[i + 3] === 0x65) {\n pos = i;\n break;\n }\n }\n if (pos !== -1) {\n // dimensions are in BE at +8 (width) at +12 (height)\n const width =\n d[pos + 8] << 24 |\n d[pos + 9] << 16 |\n d[pos + 10] << 8 |\n d[pos + 11];\n const height =\n d[pos + 12] << 24 |\n d[pos + 13] << 16 |\n d[pos + 14] << 8 |\n d[pos + 15];\n if (width > 0 && height > 0) {\n return { mime: 'image/avif', width, height };\n }\n }\n return UNSUPPORTED_TYPE;\n }\n return UNSUPPORTED_TYPE;\n}\n\n\nfunction jpgSize(d: Uint8Array): [number, number] {\n const len = d.length;\n let i = 4;\n let blockLength = d[i] << 8 | d[i + 1];\n while (true) {\n i += blockLength;\n if (i >= len) {\n // exhausted without size info\n return [0, 0];\n }\n if (d[i] !== 0xFF) {\n return [0, 0];\n }\n if (d[i + 1] === 0xC0 || d[i + 1] === 0xC2) {\n if (i + 8 < len) {\n return [\n d[i + 7] << 8 | d[i + 8],\n d[i + 5] << 8 | d[i + 6]\n ];\n }\n return [0, 0];\n }\n i += 2;\n blockLength = d[i] << 8 | d[i + 1];\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toRGBA8888 } from 'sixel/lib/Colors';\nimport { IDisposable } from '@xterm/xterm';\nimport { ICellSize, ImageLayer, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\n\nconst enum Constants {\n PLACEHOLDER_LENGTH = 4096,\n PLACEHOLDER_HEIGHT = 24\n}\n\n/**\n * ImageRenderer - terminal frontend extension:\n * - provide primitives for canvas, ImageData, Bitmap (static)\n * - add canvas layer to DOM (browser only for now)\n * - draw image tiles onRender\n */\nexport class ImageRenderer extends Disposable implements IDisposable {\n /** @deprecated Kept for backward compat — points to top layer canvas. */\n public get canvas(): HTMLCanvasElement | undefined { return this._layers.get('top')?.canvas; }\n private _layers = new Map<ImageLayer, CanvasRenderingContext2D>();\n private _placeholder: HTMLCanvasElement | undefined;\n private _placeholderBitmap: ImageBitmap | undefined;\n private _optionsRefresh = this._register(new MutableDisposable());\n private _oldOpen: ((parent: HTMLElement) => void) | undefined;\n private _renderService: IRenderService | undefined;\n private _oldSetRenderer: ((renderer: any) => void) | undefined;\n\n // drawing primitive - canvas\n public static createCanvas(localDocument: Document | undefined, width: number, height: number): HTMLCanvasElement {\n /**\n * NOTE: We normally dont care, from which document the canvas\n * gets created, so we can fall back to global document,\n * if the terminal has no document associated yet.\n * This way early image loads before calling .open keep working\n * (still discouraged though, as the metrics will be screwed up).\n * Only the DOM output canvas should be on the terminal's document,\n * which gets explicitly checked in `insertLayerToDom`.\n */\n const canvas = (localDocument ?? document).createElement('canvas');\n canvas.width = width | 0;\n canvas.height = height | 0;\n return canvas;\n }\n\n // drawing primitive - ImageData with optional buffer\n public static createImageData(ctx: CanvasRenderingContext2D, width: number, height: number, buffer?: ArrayBuffer): ImageData {\n if (typeof ImageData !== 'function') {\n const imgData = ctx.createImageData(width, height);\n if (buffer) {\n imgData.data.set(new Uint8ClampedArray(buffer, 0, width * height * 4));\n }\n return imgData;\n }\n return buffer\n ? new ImageData(new Uint8ClampedArray(buffer, 0, width * height * 4), width, height)\n : new ImageData(width, height);\n }\n\n // drawing primitive - ImageBitmap\n public static createImageBitmap(img: ImageBitmapSource): Promise<ImageBitmap | undefined> {\n if (typeof createImageBitmap !== 'function') {\n return Promise.resolve(undefined);\n }\n return createImageBitmap(img);\n }\n\n\n constructor(private _terminal: ITerminalExt) {\n super();\n this._oldOpen = this._terminal._core.open;\n this._terminal._core.open = (parent: HTMLElement): void => {\n this._oldOpen?.call(this._terminal._core, parent);\n this._open();\n };\n if (this._terminal._core.screenElement) {\n this._open();\n }\n // hack to spot fontSize changes\n this._optionsRefresh.value = this._terminal._core.optionsService.onOptionChange(option => {\n if (option === 'fontSize') {\n this.rescaleCanvas();\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n });\n this._register(toDisposable(() => {\n this.removeLayerFromDom();\n this.removeLayerFromDom('bottom');\n if (this._terminal._core && this._oldOpen) {\n this._terminal._core.open = this._oldOpen;\n this._oldOpen = undefined;\n }\n if (this._renderService && this._oldSetRenderer) {\n this._renderService.setRenderer = this._oldSetRenderer;\n this._oldSetRenderer = undefined;\n }\n this._renderService = undefined;\n this._layers.clear();\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }));\n }\n\n /**\n * Enable the placeholder.\n */\n public showPlaceholder(value: boolean): void {\n if (value) {\n if (!this._placeholder && this.cellSize.height !== -1) {\n this._createPlaceHolder(Math.max(this.cellSize.height + 1, Constants.PLACEHOLDER_HEIGHT));\n }\n } else {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n\n /**\n * Dimensions of the terminal.\n * Forwarded from internal render service.\n */\n public get dimensions(): IRenderDimensions | undefined {\n return this._terminal.dimensions;\n }\n\n /**\n * Current cell size (float).\n */\n public get cellSize(): ICellSize {\n return {\n width: this.dimensions?.css.cell.width || -1,\n height: this.dimensions?.css.cell.height || -1\n };\n }\n\n /**\n * Clear a region of the image layer canvas.\n */\n public clearLines(start: number, end: number, layer?: ImageLayer): void {\n const y = start * (this.dimensions?.css.cell.height || 0);\n const w = this.dimensions?.css.canvas.width || 0;\n const h = (end + 1 - start) * (this.dimensions?.css.cell.height || 0);\n if (!layer || layer === 'top') {\n this._layers.get('top')?.clearRect(0, y, w, h);\n }\n if (!layer || layer === 'bottom') {\n this._layers.get('bottom')?.clearRect(0, y, w, h);\n }\n }\n\n /**\n * Clear whole image canvas.\n */\n public clearAll(layer?: ImageLayer): void {\n if (!layer || layer === 'top') {\n const ctx = this._layers.get('top');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n if (!layer || layer === 'bottom') {\n const ctx = this._layers.get('bottom');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }\n\n /**\n * Draw neighboring tiles on the image layer canvas.\n */\n public draw(imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get(imgSpec.layer);\n if (!ctx) {\n return;\n }\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const cols = Math.ceil(img.width / width);\n\n const sx = (tileId % cols) * width;\n const sy = Math.floor(tileId / cols) * height;\n const dx = col * width;\n const dy = row * height;\n\n // safari bug: never access image source out of bounds\n const finalWidth = count * width + sx > img.width ? img.width - sx : count * width;\n const finalHeight = sy + height > img.height ? img.height - sy : height;\n\n // Floor all pixel offsets to get stable tile mapping without any overflows.\n // Note: For not pixel perfect aligned cells like in the DOM renderer\n // this will move a tile slightly to the top/left (subpixel range, thus ignore it).\n // FIX #34: avoid striping on displays with pixelDeviceRatio != 1 by ceiling height and width\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.ceil(finalWidth), Math.ceil(finalHeight),\n Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth), Math.ceil(finalHeight)\n );\n }\n\n /**\n * Extract a single tile from an image.\n */\n public extractTile(imgSpec: IImageSpec, tileId: number): HTMLCanvasElement | undefined {\n const { width, height } = this.cellSize;\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const cols = Math.ceil(img.width / width);\n const sx = (tileId % cols) * width;\n const sy = Math.floor(tileId / cols) * height;\n const finalWidth = width + sx > img.width ? img.width - sx : width;\n const finalHeight = sy + height > img.height ? img.height - sy : height;\n\n const canvas = ImageRenderer.createCanvas(this.document, finalWidth, finalHeight);\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.floor(finalWidth), Math.floor(finalHeight),\n 0, 0, Math.floor(finalWidth), Math.floor(finalHeight)\n );\n return canvas;\n }\n }\n\n /**\n * Draw a line with placeholder on the image layer canvas.\n */\n public drawPlaceholder(col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get('top');\n if (ctx) {\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n if (!this._placeholder) {\n this._createPlaceHolder(Math.max(height + 1, Constants.PLACEHOLDER_HEIGHT));\n } else if (height >= this._placeholder!.height) {\n this._createPlaceHolder(height + 1);\n }\n if (!this._placeholder) return;\n ctx.drawImage(\n this._placeholderBitmap ?? this._placeholder!,\n col * width,\n (row * height) % 2 ? 0 : 1, // needs %2 offset correction\n width * count,\n height,\n col * width,\n row * height,\n width * count,\n height\n );\n }\n }\n\n /**\n * Rescale image layer canvas if needed.\n * Checked once from `ImageStorage.render`.\n */\n public rescaleCanvas(): void {\n const w = this.dimensions?.css.canvas.width || 0;\n const h = this.dimensions?.css.canvas.height || 0;\n for (const ctx of this._layers.values()) {\n if (ctx.canvas.width !== w || ctx.canvas.height !== h) {\n ctx.canvas.width = w;\n ctx.canvas.height = h;\n }\n }\n }\n\n /**\n * Rescale image in storage if needed.\n */\n private _rescaleImage(spec: IImageSpec, currentWidth: number, currentHeight: number): void {\n if (currentWidth === spec.actualCellSize.width && currentHeight === spec.actualCellSize.height) {\n return;\n }\n const { width: originalWidth, height: originalHeight } = spec.origCellSize;\n if (currentWidth === originalWidth && currentHeight === originalHeight) {\n spec.actual = spec.orig;\n spec.actualCellSize.width = originalWidth;\n spec.actualCellSize.height = originalHeight;\n return;\n }\n const canvas = ImageRenderer.createCanvas(\n this.document,\n Math.ceil(spec.orig!.width * currentWidth / originalWidth),\n Math.ceil(spec.orig!.height * currentHeight / originalHeight)\n );\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(spec.orig!, 0, 0, canvas.width, canvas.height);\n spec.actual = canvas;\n spec.actualCellSize.width = currentWidth;\n spec.actualCellSize.height = currentHeight;\n }\n }\n\n /**\n * Lazy init for the renderer.\n */\n private _open(): void {\n this._renderService = this._terminal._core._renderService;\n this._oldSetRenderer = this._renderService.setRenderer.bind(this._renderService);\n this._renderService.setRenderer = (renderer: any) => {\n for (const key of [...this._layers.keys()]) {\n this.removeLayerFromDom(key);\n }\n this._oldSetRenderer?.call(this._renderService, renderer);\n };\n }\n\n public insertLayerToDom(layer: ImageLayer = 'top'): void {\n // make sure that the terminal is attached to a document and to DOM\n if (!this.document || !this._terminal._core.screenElement) {\n console.warn('image addon: cannot insert output canvas to DOM, missing document or screenElement');\n return;\n }\n if (this._layers.has(layer)) {\n return;\n }\n const canvas = ImageRenderer.createCanvas(\n this.document, this.dimensions?.css.canvas.width || 0,\n this.dimensions?.css.canvas.height || 0\n );\n canvas.classList.add(`xterm-image-layer-${layer}`);\n const screenElement = this._terminal._core.screenElement;\n // Use isolation to create a stacking context without overriding z-index,\n // which would conflict with integrators (e.g. VS Code) that set their\n // own z-index on the screen element.\n screenElement.style.isolation = 'isolate';\n if (layer === 'bottom') {\n // Use z-index:-1 so it paints behind non-positioned text elements.\n // The screen element needs to be a stacking context (via isolation)\n // to contain the negative z-index, otherwise it would go behind the\n // entire terminal.\n canvas.style.zIndex = '-1';\n screenElement.insertBefore(canvas, screenElement.firstChild);\n } else {\n // Explicit z-index ensures the image canvas reliably stacks above\n // the text layer (DOM renderer rows). z-index: 0 is below the\n // selection overlay (z-index: 1).\n canvas.style.zIndex = '0';\n screenElement.appendChild(canvas);\n }\n const ctx = canvas.getContext('2d', { alpha: true });\n if (!ctx) {\n canvas.remove();\n return;\n }\n this._layers.set(layer, ctx);\n this.clearAll(layer);\n }\n\n public removeLayerFromDom(layer: ImageLayer = 'top'): void {\n const ctx = this._layers.get(layer);\n if (ctx) {\n ctx.canvas.remove();\n this._layers.delete(layer);\n }\n }\n\n public hasLayer(layer: ImageLayer): boolean {\n return this._layers.has(layer);\n }\n\n private _createPlaceHolder(height: number = Constants.PLACEHOLDER_HEIGHT): void {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n\n // create blueprint to fill placeholder with\n const bWidth = 32; // must be 2^n\n const blueprint = ImageRenderer.createCanvas(this.document, bWidth, height);\n const ctx = blueprint.getContext('2d', { alpha: false });\n if (!ctx) return;\n const imgData = ImageRenderer.createImageData(ctx, bWidth, height);\n const d32 = new Uint32Array(imgData.data.buffer);\n const black = toRGBA8888(0, 0, 0);\n const white = toRGBA8888(255, 255, 255);\n d32.fill(black);\n for (let y = 0; y < height; ++y) {\n const shift = y % 2;\n const offset = y * bWidth;\n for (let x = 0; x < bWidth; x += 2) {\n d32[offset + x + shift] = white;\n }\n }\n ctx.putImageData(imgData, 0, 0);\n\n // create placeholder line, width aligned to blueprint width\n const width = (screen.width + bWidth - 1) & ~(bWidth - 1) || Constants.PLACEHOLDER_LENGTH;\n this._placeholder = ImageRenderer.createCanvas(this.document, width, height);\n const ctx2 = this._placeholder.getContext('2d', { alpha: false });\n if (!ctx2) {\n this._placeholder = undefined;\n return;\n }\n for (let i = 0; i < width; i += bWidth) {\n ctx2.drawImage(blueprint, i, 0);\n }\n ImageRenderer.createImageBitmap(this._placeholder).then(bitmap => this._placeholderBitmap = bitmap);\n }\n\n public get document(): Document | undefined {\n return this._terminal._core._coreBrowserService?.window.document;\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { ImageRenderer } from './ImageRenderer';\nimport type {\n ITerminalExt, IImageAddonOptions, IImageSpec, ICellSize, IAddImageOpts\n} from './Types';\nimport type { IBufferLine } from 'common/buffer/Types';\nimport { CellData } from 'common/buffer/CellData';\n\n// fallback default cell size\nexport const CELL_SIZE_DEFAULT: ICellSize = {\n width: 7,\n height: 14\n};\n\nclass ImageTileInfo {\n constructor(\n public imageId = -1,\n public tileId = -1) {\n }\n}\n\n/**\n * ImageStorage - extension of CoreTerminal:\n * - hold image data\n * - write/read image data to/from buffer\n *\n * TODO: image composition for overwrites\n */\nexport class ImageStorage implements IDisposable {\n // storage\n private _images: Map<number, IImageSpec> = new Map();\n // last used id\n private _lastId = 0;\n // last evicted id\n private _lowestId = 0;\n // whether a full clear happened before\n private _fullyCleared = false;\n // whether render should do a full clear\n private _needsFullClear = false;\n // hard limit of stored pixels (fallback limit of 10 MB)\n private _pixelLimit: number = 2500000;\n private _workCell: CellData = new CellData();\n\n private _viewportMetrics: { cols: number, rows: number };\n public onImageAdded: (() => void) | undefined;\n public onImageDeleted: ((storageId: number) => void) | undefined;\n\n constructor(\n private _terminal: ITerminalExt,\n private _renderer: ImageRenderer,\n private _opts: IImageAddonOptions\n ) {\n try {\n this.setLimit(this._opts.storageLimit);\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n }\n console.warn(`storageLimit is set to ${this.getLimit()} MB`);\n }\n this._viewportMetrics = {\n cols: this._terminal.cols,\n rows: this._terminal.rows\n };\n }\n\n public dispose(): void {\n this.reset();\n }\n\n public reset(): void {\n for (const spec of this._images.values()) {\n spec.marker?.dispose();\n }\n // NOTE: marker.dispose above already calls ImageBitmap.close\n // therefore we can just wipe the map here\n this._images.clear();\n this._renderer.clearAll();\n }\n\n public getLimit(): number {\n return this._pixelLimit * 4 / 1000000;\n }\n\n public setLimit(value: number): void {\n if (value < 0.5 || value > 1000) {\n throw RangeError('invalid storageLimit, should be at least 0.5 MB and not exceed 1G');\n }\n this._pixelLimit = (value / 4 * 1000000) >>> 0;\n this._evictOldest(0);\n }\n\n public getUsage(): number {\n return this._getStoredPixels() * 4 / 1000000;\n }\n\n private _getStoredPixels(): number {\n let storedPixels = 0;\n for (const spec of this._images.values()) {\n if (spec.orig) {\n storedPixels += spec.orig.width * spec.orig.height;\n if (spec.actual && spec.actual !== spec.orig) {\n storedPixels += spec.actual.width * spec.actual.height;\n }\n }\n }\n return storedPixels;\n }\n\n private _delImg(id: number): void {\n const spec = this._images.get(id);\n if (!spec) return;\n this._images.delete(id);\n // FIXME: really ugly workaround to get bitmaps deallocated :(\n if (window.ImageBitmap && spec.orig instanceof ImageBitmap) {\n spec.orig.close();\n }\n this.onImageDeleted?.(id);\n }\n\n /**\n * Wipe canvas and images on alternate buffer.\n */\n public wipeAlternate(): void {\n // remove all alternate tagged images\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate') {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n // mark canvas to be wiped on next render\n this._needsFullClear = true;\n this._fullyCleared = false;\n }\n\n /**\n * Delete an image by its internal storage ID.\n * Used by protocols that support explicit deletion (e.g. Kitty a=d).\n */\n public deleteImage(id: number): void {\n const spec = this._images.get(id);\n if (spec) {\n spec.marker?.dispose();\n this._delImg(id);\n }\n }\n\n /**\n * Method to add an image to the storage.\n * @param img - The image to add (canvas or bitmap).\n * @param opts - Options for addImage:\n * - scrolling: When true, cursor advances with the image.\n * When false, image is placed at ORIGIN and cursor does not move.\n * - layer: Which canvas layer to render on ('top' or 'bottom').\n * - zIndex: Z-index for image layering within the same layer.\n * - cursorPos: 'vt340' for bottom-left, 'iip' for bottom.right.\n * @returns The internal image ID assigned to the stored image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {\n // never allow storage to exceed memory limit\n this._evictOldest(img.width * img.height);\n\n // calc rows x cols needed to display the image\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const cols = Math.ceil(img.width / cellSize.width);\n const rows = Math.ceil(img.height / cellSize.height);\n\n const imageId = ++this._lastId;\n\n const buffer = this._terminal._core.buffer;\n const termCols = this._terminal.cols;\n const termRows = this._terminal.rows;\n const originX = buffer.x;\n const originY = buffer.y;\n let offset = originX;\n let tileCount = 0;\n\n if (!opts.scrolling) {\n buffer.x = 0;\n buffer.y = 0;\n offset = 0;\n }\n\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(buffer.y + buffer.ybase)!;\n for (let col = 0; col < cols; ++col) {\n if (offset + col >= termCols) break;\n this._writeToCell(line, offset + col, imageId, row * cols + col);\n tileCount++;\n }\n if (opts.scrolling) {\n if (row < rows - 1) this._terminal._core._inputHandler.lineFeed();\n } else {\n if (++buffer.y >= termRows) break;\n }\n buffer.x = offset;\n }\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n\n // cursor positioning modes\n if (opts.scrolling) {\n if (opts.cursorPos === 'iip') {\n buffer.x = Math.min(offset + cols, termCols);\n } else {\n buffer.x = offset;\n }\n } else {\n buffer.x = originX;\n buffer.y = originY;\n }\n\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.tileCount < 1) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n\n // eviction marker:\n // delete the image when the marker gets disposed\n const endMarker = this._terminal.registerMarker(0);\n endMarker?.onDispose(() => {\n const spec = this._images.get(imageId);\n if (spec) {\n this._delImg(imageId);\n }\n });\n\n // since markers do not work on alternate for some reason,\n // we evict images here manually\n if (this._terminal.buffer.active.type === 'alternate') {\n this._evictOnAlternate();\n }\n\n // create storage entry\n const imgSpec: IImageSpec = {\n orig: img,\n origCellSize: cellSize,\n actual: img,\n actualCellSize: { ...cellSize }, // clone needed, since later modified\n marker: endMarker || undefined,\n tileCount,\n bufferType: this._terminal.buffer.active.type,\n layer: opts.layer,\n zIndex: opts.zIndex\n };\n\n // finally add the image\n this._images.set(imageId, imgSpec);\n this.onImageAdded?.();\n return imageId;\n }\n\n\n /**\n * Render method. Collects buffer information and triggers\n * canvas updates.\n */\n // TODO: Should we move this to the ImageRenderer?\n public render(range: { start: number, end: number }): void {\n // Determine which layers have images\n let hasTopImages = false;\n let hasBottomImages = false;\n for (const spec of this._images.values()) {\n if (spec.layer === 'bottom') {\n hasBottomImages = true;\n } else {\n hasTopImages = true;\n }\n if (hasTopImages && hasBottomImages) break;\n }\n\n // Lazily insert layers that are needed\n if (hasTopImages && !this._renderer.hasLayer('top')) {\n this._renderer.insertLayerToDom('top');\n if (!this._renderer.hasLayer('top')) return;\n }\n if (hasBottomImages && !this._renderer.hasLayer('bottom')) {\n this._renderer.insertLayerToDom('bottom');\n }\n\n // rescale if needed\n this._renderer.rescaleCanvas();\n\n // exit early if we dont have any images to test for\n if (!this._images.size) {\n if (!this._fullyCleared) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n if (this._renderer.hasLayer('top')) {\n this._renderer.removeLayerFromDom('top');\n }\n if (this._renderer.hasLayer('bottom')) {\n this._renderer.removeLayerFromDom('bottom');\n }\n return;\n }\n\n // Remove layers no longer needed\n if (!hasTopImages && this._renderer.hasLayer('top')) {\n this._renderer.clearAll('top');\n this._renderer.removeLayerFromDom('top');\n }\n if (!hasBottomImages && this._renderer.hasLayer('bottom')) {\n this._renderer.clearAll('bottom');\n this._renderer.removeLayerFromDom('bottom');\n }\n\n // buffer switches force a full clear\n if (this._needsFullClear) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n\n const { start, end } = range;\n const buffer = this._terminal._core.buffer;\n const cols = this._terminal._core.cols;\n\n // clear drawing area\n this._renderer.clearLines(start, end);\n\n // Collect draw calls so we can sort by z-index (lower z drawn first).\n const drawCalls: { imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number }[] = [];\n const placeholderCalls: { col: number, row: number, count: number }[] = [];\n\n // walk all cells in viewport and collect tiles found\n for (let row = start; row <= end; ++row) {\n const line = buffer.lines.get(row + buffer.ydisp);\n if (!line) return;\n for (let col = 0; col < cols; ++col) {\n const e = line.getExtended(col)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (e.tileId !== -1) {\n const startTile = e.tileId;\n const startCol = col;\n let count = 1;\n /**\n * merge tiles to the right into a single draw call, if:\n * - not at end of line\n * - cell has same image id\n * - cell has consecutive tile id\n */\n while (++col < cols) {\n const nextE = line.getExtended(col)?.payload;\n if (!(nextE instanceof ImageTileInfo) || nextE.imageId !== imageId || nextE.tileId !== startTile + count) {\n break;\n }\n count++;\n }\n col--;\n if (imgSpec) {\n if (imgSpec.actual) {\n drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count });\n }\n } else if (this._opts.showPlaceholder) {\n placeholderCalls.push({ col: startCol, row, count });\n }\n this._fullyCleared = false;\n }\n }\n }\n }\n\n // Sort by z-index so lower z draws first (higher z renders on top)\n drawCalls.sort((a, b) => a.imgSpec.zIndex - b.imgSpec.zIndex);\n\n // Draw placeholders first (lowest priority)\n for (const call of placeholderCalls) {\n this._renderer.drawPlaceholder(call.col, call.row, call.count);\n }\n\n // Draw images in z-index order\n for (const call of drawCalls) {\n this._renderer.draw(call.imgSpec, call.tileId, call.col, call.row, call.count);\n }\n }\n\n public viewportResize(metrics: { cols: number, rows: number }): void {\n // exit early if we have nothing in storage\n if (!this._images.size) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // handle only viewport width enlargements, exit all other cases\n // TODO: needs patch for tile counter\n if (this._viewportMetrics.cols >= metrics.cols) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // walk scrollbuffer at old col width to find all possible expansion matches\n const buffer = this._terminal._core.buffer;\n const rows = buffer.lines.length;\n const oldCol = this._viewportMetrics.cols - 1;\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(row)!;\n const e = line.getExtended(oldCol)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (!imgSpec) {\n continue;\n }\n // found an image tile at oldCol, check if it qualifies for right exapansion\n const tilesPerRow = Math.ceil((imgSpec.actual?.width || 0) / imgSpec.actualCellSize.width);\n if ((e.tileId % tilesPerRow) + 1 >= tilesPerRow) {\n continue;\n }\n // expand only if right side is empty (nothing got wrapped from below)\n let hasData = false;\n for (let rightCol = oldCol + 1; rightCol > metrics.cols; ++rightCol) {\n if (line.hasContent(rightCol)) {\n hasData = true;\n break;\n }\n }\n if (hasData) {\n continue;\n }\n // do right expansion on terminal buffer\n const end = Math.min(metrics.cols, tilesPerRow - (e.tileId % tilesPerRow) + oldCol);\n let lastTile = e.tileId;\n for (let expandCol = oldCol + 1; expandCol < end; ++expandCol) {\n this._writeToCell(line, expandCol, imageId, ++lastTile);\n imgSpec.tileCount++;\n }\n }\n }\n // store new viewport metrics\n this._viewportMetrics = metrics;\n }\n\n /**\n * Retrieve original canvas at buffer position.\n */\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1) {\n const orig = this._images.get(e.imageId)?.orig;\n if (window.ImageBitmap && orig instanceof ImageBitmap) {\n const canvas = ImageRenderer.createCanvas(window.document, orig.width, orig.height);\n canvas.getContext('2d')?.drawImage(orig, 0, 0, orig.width, orig.height);\n return canvas;\n }\n return orig as HTMLCanvasElement;\n }\n }\n }\n\n /**\n * Extract active single tile at buffer position.\n */\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1 && e.tileId !== -1) {\n const spec = this._images.get(e.imageId);\n if (spec) {\n return this._renderer.extractTile(spec, e.tileId);\n }\n }\n }\n }\n\n // TODO: Do we need some blob offloading tricks here to avoid early eviction?\n // also see https://stackoverflow.com/questions/28307789/is-there-any-limitation-on-javascript-max-blob-size\n private _evictOldest(room: number): number {\n const used = this._getStoredPixels();\n let current = used;\n while (this._pixelLimit < current + room && this._images.size) {\n const spec = this._images.get(++this._lowestId);\n if (spec && spec.orig) {\n current -= spec.orig.width * spec.orig.height;\n if (spec.actual && spec.orig !== spec.actual) {\n current -= spec.actual.width * spec.actual.height;\n }\n spec.marker?.dispose();\n this._delImg(this._lowestId);\n }\n }\n return used - current;\n }\n\n private _writeToCell(line: IBufferLine, x: number, imageId: number, tileId: number): void {\n const workCell = this._workCell;\n line.loadCell(x, workCell);\n if (this._workCell.hasExtendedAttrs()) {\n const old = workCell.extended.payload;\n if (old instanceof ImageTileInfo) {\n // found an old ExtendedAttrsImage, since we know that\n // they are always isolated instances (single cell usage),\n // we can re-use it and just update their id entries\n const oldSpec = this._images.get(old.imageId);\n if (oldSpec) {\n // early eviction for in-viewport overwrites\n oldSpec.tileCount--;\n }\n old.imageId = imageId;\n old.tileId = tileId;\n return;\n }\n }\n // fall-through: always create new ExtendedAttrs entry\n const extattr = workCell.extended.clone();\n extattr.payload = new ImageTileInfo(imageId, tileId);\n workCell.extended = extattr;\n workCell.updateExtended();\n line.setCell(x, workCell);\n }\n\n private _evictOnAlternate(): void {\n // nullify tile count of all images on alternate buffer\n for (const spec of this._images.values()) {\n if (spec.bufferType === 'alternate') {\n spec.tileCount = 0;\n }\n }\n // re-count tiles on whole buffer\n const buffer = this._terminal._core.buffer;\n for (let y = 0; y < this._terminal.rows; ++y) {\n const line = buffer.lines.get(y);\n if (!line) {\n continue;\n }\n for (let x = 0; x < this._terminal.cols; ++x) {\n const payload = line.getExtended(x)?.payload;\n if (payload instanceof ImageTileInfo) {\n const spec = this._images.get(payload.imageId);\n if (spec) {\n spec.tileCount++;\n }\n }\n }\n }\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate' && !spec.tileCount) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n }\n}\n","/**\n * Copyright (c) 2020, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IDcsHandler, IParams, IImageAddonOptions, ITerminalExt, AttributeData, IResetHandler, ReadonlyColorSet } from './Types';\nimport { toRGBA8888, BIG_ENDIAN, PALETTE_ANSI_256, PALETTE_VT340_COLOR } from 'sixel/lib/Colors';\nimport { RGBA8888 } from 'sixel/lib/Types';\nimport { ImageRenderer } from './ImageRenderer';\n\nimport { DecoderAsync, Decoder } from 'sixel/lib/Decoder';\n\n// always free decoder ressources after decoding if it exceeds this limit\nconst MEM_PERMA_LIMIT = 4194304; // 1024 pixels * 1024 pixels * 4 channels = 4MB\n\n// custom default palette: VT340 (lower 16 colors) + ANSI256 (up to 256) + zeroed (up to 4096)\nconst DEFAULT_PALETTE = PALETTE_ANSI_256;\nDEFAULT_PALETTE.set(PALETTE_VT340_COLOR);\n\n\nexport class SixelHandler implements IDcsHandler, IResetHandler {\n private _size = 0;\n private _aborted = false;\n private _dec: Decoder | undefined;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _storage: SixelImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n DecoderAsync({\n memoryLimit: this._opts.pixelLimit * 4,\n palette: DEFAULT_PALETTE,\n paletteLimit: this._opts.sixelPaletteLimit\n }).then(d => this._dec = d);\n }\n\n public reset(): void {\n /**\n * reset sixel decoder to defaults:\n * - release all memory\n * - nullify palette (4096)\n * - apply default palette (256)\n */\n if (this._dec) {\n this._dec.release();\n // FIXME: missing interface on decoder to nullify full palette\n (this._dec as any)._palette.fill(0);\n this._dec.init(0, DEFAULT_PALETTE, this._opts.sixelPaletteLimit);\n }\n }\n\n public hook(params: IParams): void {\n this._size = 0;\n this._aborted = false;\n if (this._dec) {\n const fillColor = params.params[1] === 1 ? 0 : extractActiveBg(\n this._coreTerminal._core._inputHandler._curAttrData,\n this._coreTerminal._core._themeService?.colors);\n this._dec.init(fillColor, null, this._opts.sixelPaletteLimit);\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted || !this._dec) {\n return;\n }\n this._size += end - start;\n if (this._size > this._opts.sixelSizeLimit) {\n console.warn(`SIXEL: too much data, aborting`);\n this._aborted = true;\n this._dec.release();\n return;\n }\n try {\n this._dec.decode(data, start, end);\n } catch (e) {\n console.warn(`SIXEL: error while decoding image - ${e}`);\n this._aborted = true;\n this._dec.release();\n }\n }\n\n public unhook(success: boolean): boolean | Promise<boolean> {\n if (this._aborted || !success || !this._dec) {\n return true;\n }\n\n const width = this._dec.width;\n const height = this._dec.height;\n\n // partial fix for https://github.com/jerch/xterm-addon-image/issues/37\n if (!width || !height) {\n if (height) {\n this._storage.advanceCursor(height);\n }\n return true;\n }\n\n const canvas = ImageRenderer.createCanvas(undefined, width, height);\n canvas.getContext('2d')?.putImageData(new ImageData(this._dec.data8 as Uint8ClampedArray<ArrayBuffer>, width, height), 0, 0);\n if (this._dec.memoryUsage > MEM_PERMA_LIMIT) {\n this._dec.release();\n }\n this._storage.addImage(canvas);\n return true;\n }\n}\n\n\n/**\n * Some helpers to extract current terminal colors.\n */\n\n// get currently active background color from terminal\n// also respect INVERSE setting\nfunction extractActiveBg(attr: AttributeData, colors: ReadonlyColorSet | undefined): RGBA8888 {\n let bg = 0;\n if (!colors) {\n // FIXME: theme service is prolly not available yet,\n // happens if .open() was not called yet (bug in core?)\n return bg;\n }\n if (attr.isInverse()) {\n if (attr.isFgDefault()) {\n bg = convertLe(colors.foreground.rgba);\n } else if (attr.isFgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getFgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getFgColor()].rgba);\n }\n } else {\n if (attr.isBgDefault()) {\n bg = convertLe(colors.background.rgba);\n } else if (attr.isBgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getBgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getBgColor()].rgba);\n }\n }\n return bg;\n}\n\n// rgba values on the color managers are always in BE, thus convert to LE\nfunction convertLe(color: number): RGBA8888 {\n if (BIG_ENDIAN) return color;\n return (color & 0xFF) << 24 | (color >>> 8 & 0xFF) << 16 | (color >>> 16 & 0xFF) << 8 | color >>> 24 & 0xFF;\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { IImageAddonOptions, ITerminalExt, IAddImageOpts } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\n\n/**\n * Sixel-specific image storage controller.\n *\n * Wraps the shared ImageStorage with sixel protocol semantics:\n * - Cursor behavior governed by DECSET 80 (sixelScrolling option)\n * - advanceCursor for empty sixels carrying only height\n */\nexport class SixelImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'vt340' };\n constructor(\n private readonly _storage: ImageStorage,\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _terminal: ITerminalExt\n ) {}\n\n /**\n * Add a sixel image to storage.\n * Cursor behavior depends on the sixelScrolling option (DECSET 80).\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._addImageOpts.scrolling = this._opts.sixelScrolling;\n this._storage.addImage(img, this._addImageOpts);\n }\n\n /**\n * Only advance text cursor.\n * This is an edge case from empty sixels carrying only a height but no pixels.\n * Partially fixes https://github.com/jerch/xterm-addon-image/issues/37.\n */\n public advanceCursor(height: number): void {\n if (this._opts.sixelScrolling) {\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const rows = Math.ceil(height / cellSize.height);\n for (let i = 1; i < rows; ++i) {\n this._terminal._core._inputHandler.lineFeed();\n }\n }\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types';\nimport { ImageRenderer } from '../ImageRenderer';\nimport { CELL_SIZE_DEFAULT } from '../ImageStorage';\nimport { KittyImageStorage } from './KittyImageStorage';\nimport Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport {\n KittyAction,\n KittyFormat,\n KittyCompression,\n IKittyCommand,\n IPendingTransmission,\n IKittyImageData,\n KittyPixelConstants,\n parseKittyCommand\n} from './KittyGraphicsTypes';\n\nconst enum Constants {\n // Memory limit for base64 decoder (4MB, same as IIPHandler)\n DECODER_KEEP_DATA = 4194304,\n DECODER_INITIAL_DATA = 4194304, // 4MB\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n DECODER_OK = 0,\n // Maximum control data size\n MAX_CONTROL_DATA_SIZE = 512,\n // Semicolon codepoint\n SEMICOLON = 0x3B\n}\n\nconst DECODER_OK = Constants.DECODER_OK as unknown as DecodeStatus.OK;\n\n// Kitty graphics protocol handler with streaming base64 decoding.\nexport class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable {\n private _aborted = false;\n private _decodeError = false;\n\n private _activeDecoder: Base64Decoder | null = null;\n private readonly _maxEncodedBytes: number;\n private readonly _initialEncodedBytes: number;\n\n // Streaming related states\n\n // True while receiving control data (before semicolon).\n private _inControlData = true;\n\n // Buffer for control data.\n private _controlData = new Uint32Array(Constants.MAX_CONTROL_DATA_SIZE);\n private _controlLength = 0;\n\n // Pre-calculated encoded size limit\n private _encodedSizeLimit = 0;\n private _totalEncodedSize = 0;\n\n // Parsed command. These are the control data before semicolon.\n private _parsedCommand: IKittyCommand | null = null;\n\n // Storage related states\n\n private _pendingTransmissions: Map<number, IPendingTransmission> = new Map();\n // Tracks the pending key of the most recently started chunked upload.\n // Per spec, subsequent chunks only need m= (and optionally q=), without i=.\n // When a chunk arrives with no i=, this key is used to find the pending upload.\n private _lastPendingKey: number | undefined;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _kittyStorage: KittyImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n // Convert decoded size limit -> max encoded bytes.\n this._maxEncodedBytes = Math.ceil(this._opts.kittySizeLimit * 4 / 3);\n // ensure we preallocate more than configured limit while using 4mb initial size.\n this._initialEncodedBytes = Math.min(Constants.DECODER_INITIAL_DATA, this._maxEncodedBytes);\n }\n\n public reset(): void {\n this._cleanupAllPending();\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n this._kittyStorage.reset();\n }\n\n public dispose(): void {\n this.reset();\n }\n\n private _removePendingEntry(key: number): void {\n this._pendingTransmissions.delete(key);\n if (this._lastPendingKey === key) {\n this._lastPendingKey = undefined;\n }\n }\n\n private _cleanupAllPending(): void {\n for (const pending of this._pendingTransmissions.values()) {\n pending.decoder.release();\n }\n this._pendingTransmissions.clear();\n this._lastPendingKey = undefined;\n }\n\n public start(): void {\n this._aborted = false;\n this._decodeError = false;\n this._inControlData = true;\n this._controlLength = 0;\n this._parsedCommand = null;\n // Pre-calculate encoded limit once: base64 is 4 bytes encoded → 3 bytes decoded\n this._encodedSizeLimit = this._maxEncodedBytes;\n this._totalEncodedSize = 0;\n this._activeDecoder = null;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (!this._inControlData) {\n this._streamPayload(data, start, end);\n } else {\n // Scan for semicolon\n let controlEnd = end;\n for (let i = start; i < end; i++) {\n if (data[i] === Constants.SEMICOLON) {\n this._inControlData = false;\n controlEnd = i;\n break;\n }\n }\n\n // Copy control data\n const copyLength = controlEnd - start;\n if (this._controlLength + copyLength > Constants.MAX_CONTROL_DATA_SIZE) {\n this._aborted = true;\n return;\n }\n this._controlData.set(data.subarray(start, controlEnd), this._controlLength);\n this._controlLength += copyLength;\n\n if (!this._inControlData) {\n // Found semicolon - parse control data early for validation\n this._parsedCommand = parseKittyCommand(this._parseControlDataString());\n\n // Early validation: i+I conflict\n if (this._parsedCommand.id !== undefined && this._parsedCommand.imageNumber !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'EINVAL:cannot specify both i and I keys', this._parsedCommand.quiet ?? 0);\n this._aborted = true;\n return;\n }\n\n // Delete action doesn't need payload - skip streaming\n if (this._parsedCommand.action === KittyAction.DELETE) {\n return;\n }\n\n // Stream remaining as payload\n const payloadStart = controlEnd + 1;\n if (payloadStart < end) {\n this._streamPayload(data, payloadStart, end);\n }\n }\n }\n }\n\n // Stream payload bytes into the base64 decoder.\n private _streamPayload(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n // Check size limit (compare encoded bytes against pre-calculated limit)\n // Include cumulative size from pending transmission for multi-chunk images.\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = this._parsedCommand?.id ?? this._lastPendingKey ?? 0;\n const pending = this._pendingTransmissions.get(pendingKey);\n const previousEncodedSize = pending?.totalEncodedSize ?? 0;\n this._totalEncodedSize += end - start;\n const cumulativeEncodedSize = previousEncodedSize + this._totalEncodedSize;\n if (cumulativeEncodedSize > this._encodedSizeLimit) {\n const decoderToRelease = this._activeDecoder ?? pending?.decoder;\n if (decoderToRelease) {\n decoderToRelease.release();\n }\n this._activeDecoder = null;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n this._aborted = true;\n return;\n }\n\n if (this._decodeError) return;\n\n if (pending?.decoder && !this._activeDecoder) {\n this._activeDecoder = pending.decoder;\n }\n if (!this._activeDecoder) {\n this._activeDecoder = new Base64Decoder(Constants.DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes);\n this._activeDecoder.init();\n }\n\n if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_OK) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n this._decodeError = true;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted || !success) {\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n return true;\n }\n\n // No semicolon = no payload (delete, capability query)\n if (this._inControlData) {\n return this._handleNoPayloadCommand();\n }\n\n // Use command parsed early in put() - i+I already validated there\n const cmd = this._parsedCommand!;\n\n // Delete action was handled by skipping payload - just execute\n if (cmd.action === KittyAction.DELETE) {\n return this._handleDelete(cmd);\n }\n\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = cmd.id ?? this._lastPendingKey ?? 0;\n const isMoreComing = cmd.more === 1;\n const pending = this._pendingTransmissions.get(pendingKey);\n\n if (isMoreComing) {\n if (this._activeDecoder) {\n if (pending) {\n pending.totalEncodedSize += this._totalEncodedSize;\n pending.decodeError = pending.decodeError || this._decodeError;\n } else {\n this._pendingTransmissions.set(pendingKey, {\n cmd: { ...cmd },\n decoder: this._activeDecoder,\n totalEncodedSize: this._totalEncodedSize,\n decodeError: this._decodeError\n });\n }\n this._lastPendingKey = pendingKey;\n this._activeDecoder = null;\n }\n return true;\n }\n\n // Final chunk received — clear the last pending key\n if (pending) {\n this._lastPendingKey = undefined;\n }\n\n let decodeError = this._decodeError;\n let finalCmd = cmd;\n let decoder = this._activeDecoder;\n\n if (pending) {\n finalCmd = pending.cmd;\n decoder = pending.decoder;\n decodeError = decodeError || pending.decodeError;\n this._pendingTransmissions.delete(pendingKey);\n }\n\n let imageBytes = new Uint8Array(0);\n if (decoder) {\n if (decoder.end() !== DECODER_OK) {\n decodeError = true;\n }\n imageBytes = decoder.data8;\n }\n this._activeDecoder = null;\n\n // Handle command first — handlers create Blob/ImageData from imageBytes,\n // which copies the data. Only then is it safe to release the decoder's\n // wasm memory that imageBytes points into.\n const result = this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError);\n if (decoder) {\n decoder.release();\n }\n return result;\n }\n\n // Command handling\n\n private _parseControlDataString(): string {\n let str = '';\n for (let i = 0; i < this._controlLength; i++) {\n str += String.fromCodePoint(this._controlData[i]);\n }\n return str;\n }\n\n private _handleNoPayloadCommand(): boolean | Promise<boolean> {\n const cmd = parseKittyCommand(this._parseControlDataString());\n\n // Per spec: specifying both i and I is an error\n if (cmd.id !== undefined && cmd.imageNumber !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0);\n return true;\n }\n\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.DELETE:\n return this._handleDelete(cmd);\n case KittyAction.QUERY:\n this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0);\n return true;\n case KittyAction.PLACEMENT:\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handleCommandWithBytesAndCmd(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.TRANSMIT: {\n const result = this._handleTransmit(cmd, bytes, decodeError);\n // Only send response when _handleTransmit didn't already respond\n // (it handles unsupported transmission medium responses internally)\n if ((cmd.transmission ?? 'd') === 'd' && cmd.id !== undefined) {\n if (decodeError) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n } else if (bytes.length > 0) {\n this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0);\n }\n }\n return result;\n }\n case KittyAction.TRANSMIT_DISPLAY:\n return this._handleTransmitDisplay(cmd, bytes, decodeError);\n case KittyAction.QUERY:\n return this._handleQuery(cmd, bytes, decodeError);\n case KittyAction.PLACEMENT:\n // a=p ignores any payload — image data was already transmitted\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handlePlacement(cmd: IKittyCommand): boolean | Promise<boolean> {\n if (cmd.id === undefined) {\n return true;\n }\n const id = cmd.id;\n const image = this._kittyStorage.getImage(id);\n if (!image) {\n this._sendResponse(id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId);\n return true;\n }\n const result = this._displayImage(image, cmd);\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId);\n return true;\n });\n }\n\n private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {\n // TODO: Support file-based transmission modes (t=f, t=t, t=s)\n // Currently only supports direct transmission (t=d, the default).\n // - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path.\n // - t=t (temp file): Payload is base64-encoded path in temp directory. Terminal reads, deletes.\n // - t=s: Payload is base64-encoded POSIX shm name. Terminal reads from shared memory.\n // These modes require filesystem/IPC access not available in browsers. For Node.js/Electron:\n // 1. Check cmd.transmission (t key) before treating bytes as image data\n // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents\n // 3. For t=d: treat bytes as image data (current behavior)\n // When implementing, also update _handleQuery to accept these transmission mediums.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported transmission medium', cmd.quiet ?? 0);\n }\n return true;\n }\n\n if (decodeError || bytes.length === 0) return true;\n\n this._kittyStorage.storeImage(cmd.id, {\n data: new Blob([bytes as BlobPart]),\n width: cmd.width ?? 0,\n height: cmd.height ?? 0,\n format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100,\n compression: cmd.compression ?? ''\n });\n return true;\n }\n\n private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n if (decodeError) {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n }\n return true;\n }\n\n this._handleTransmit(cmd, bytes, decodeError);\n\n const id = cmd.id ?? this._kittyStorage.lastImageId;\n const image = this._kittyStorage.getImage(id);\n if (image) {\n const result = this._displayImage(image, cmd);\n if (cmd.id !== undefined) {\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0);\n return true;\n });\n }\n return result.then(() => true);\n }\n return true;\n }\n\n private _handleQuery(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {\n const id = cmd.id ?? 0;\n const quiet = cmd.quiet ?? 0;\n\n // Per spec: reject unsupported transmission mediums (only t=d is supported atm)\n // TODO: When filesystem support is added (Node.js/Electron), update this to accept\n // t=f (file), t=t (temp file), and t=s (shared memory) and respond OK for queries.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n this._sendResponse(id, 'EINVAL:unsupported transmission medium', quiet);\n return true;\n }\n\n // Check decode error first (invalid base64)\n if (decodeError) {\n this._sendResponse(id, 'EINVAL:invalid base64 data', quiet);\n return true;\n }\n\n // Capability query (no payload) - just respond OK\n if (bytes.length === 0) {\n this._sendResponse(id, 'OK', quiet);\n return true;\n }\n\n const format = cmd.format ?? KittyFormat.RGBA;\n\n if (format === KittyFormat.PNG) {\n this._sendResponse(id, 'OK', quiet);\n } else {\n const width = cmd.width ?? 0;\n const height = cmd.height ?? 0;\n\n if (!width || !height) {\n this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet);\n return true;\n }\n\n const bytesPerPixel = format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n this._sendResponse(id, `EINVAL:insufficient pixel data`, quiet);\n return true;\n }\n\n this._sendResponse(id, 'OK', quiet);\n }\n return true;\n }\n\n private _handleDelete(cmd: IKittyCommand): boolean {\n // Per spec: default delete selector is 'a' (delete all visible placements)\n const selector = cmd.deleteSelector ?? 'a';\n\n // TODO: Distinguish lowercase (delete placements only) from uppercase\n // (delete placements + free stored image data). Currently both variants\n // free everything since we don't separate stored data from placements.\n switch (selector) {\n case 'a':\n case 'A':\n this._cleanupAllPending();\n this._kittyStorage.deleteAll();\n break;\n case 'i':\n case 'I':\n // TODO: When placement id tracking is implemented (see TODO in\n // KittyImageStorage), d=i with p=<pid> should delete only that\n // specific placement, while d=i without p should delete all\n // placements for the image.\n if (cmd.id !== undefined) {\n const pending = this._pendingTransmissions.get(cmd.id);\n if (pending) {\n pending.decoder.release();\n }\n this._removePendingEntry(cmd.id);\n this._kittyStorage.deleteById(cmd.id);\n }\n break;\n default:\n // Unsupported selectors (c, n, p, q, r, x, y, z, f) — ignore for now\n break;\n }\n return true;\n }\n\n private _sendResponse(id: number, message: string, quiet: number, placementId?: number): void {\n const isOk = message === 'OK';\n if (isOk && quiet >= 1) return;\n if (!isOk && quiet >= 2) return;\n\n const pPart = placementId ? `,p=${placementId}` : '';\n const response = `\\x1b_Gi=${id}${pPart};${message}\\x1b\\\\`;\n this._coreTerminal._core.coreService.triggerDataEvent(response);\n }\n\n // Image display\n\n private _displayImage(image: IKittyImageData, cmd: IKittyCommand): Promise<boolean> {\n return this._decodeAndDisplay(image, cmd)\n .then(() => true)\n .catch(() => false);\n }\n\n private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise<void> {\n let bitmap: ImageBitmap | undefined = await this._createBitmap(image);\n\n try {\n const cropX = Math.max(0, cmd.x ?? 0);\n const cropY = Math.max(0, cmd.y ?? 0);\n const cropW = cmd.sourceWidth || (bitmap.width - cropX);\n const cropH = cmd.sourceHeight || (bitmap.height - cropY);\n\n const maxCropW = Math.max(0, bitmap.width - cropX);\n const maxCropH = Math.max(0, bitmap.height - cropY);\n const finalCropW = Math.max(0, Math.min(cropW, maxCropW));\n const finalCropH = Math.max(0, Math.min(cropH, maxCropH));\n\n if (finalCropW === 0 || finalCropH === 0) {\n throw new Error('invalid source rectangle');\n }\n\n if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) {\n const cropped = await createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH);\n bitmap.close();\n bitmap = cropped;\n }\n\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n\n // Per spec: c/r default to image's natural cell dimensions.\n // If only one of c/r is specified, compute the other from image aspect ratio.\n let imgCols: number;\n let imgRows: number;\n if (cmd.columns !== undefined && cmd.rows !== undefined) {\n imgCols = cmd.columns;\n imgRows = cmd.rows;\n } else if (cmd.columns !== undefined) {\n imgCols = cmd.columns;\n imgRows = Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (imgCols * cw) / ch));\n } else if (cmd.rows !== undefined) {\n imgRows = cmd.rows;\n imgCols = Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (imgRows * ch) / cw));\n } else {\n imgCols = Math.ceil(bitmap.width / cw);\n imgRows = Math.ceil(bitmap.height / ch);\n }\n\n let w = bitmap.width;\n let h = bitmap.height;\n\n // Scale bitmap to fit placement rectangle when c/r are specified\n if (cmd.columns !== undefined || cmd.rows !== undefined) {\n w = Math.round(imgCols * cw);\n h = Math.round(imgRows * ch);\n }\n\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n\n // Save cursor position before addImage modifies it\n const buffer = this._coreTerminal._core.buffer;\n const savedX = buffer.x;\n const savedY = buffer.y;\n const savedYbase = buffer.ybase;\n\n // Determine layer based on z-index: negative = behind text, 0+ = on top.\n // When z<0 we always use the bottom layer even without allowTransparency —\n // the image will simply be hidden behind the opaque text background, which\n // is the correct behavior (client asked for \"behind text\").\n const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0;\n const layer: ImageLayer = wantsBottom ? 'bottom' : 'top';\n\n if (w !== bitmap.width || h !== bitmap.height) {\n const scaled = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h });\n bitmap.close();\n bitmap = scaled;\n }\n\n // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions\n const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1);\n const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1);\n if (xOffset !== 0 || yOffset !== 0) {\n // Per spec: X/Y is not added to c/r area. When c/r are explicit, the\n // total placement area remains c*cw × r*ch pixels and the offset image\n // is clipped to fit. When c/r are unset, the padded canvas determines\n // the natural cell dimensions.\n const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : bitmap.width + xOffset;\n const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : bitmap.height + yOffset;\n const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH);\n const offsetCtx = offsetCanvas.getContext('2d');\n if (!offsetCtx) {\n throw new Error('Failed to create offset canvas context');\n }\n offsetCtx.drawImage(bitmap, xOffset, yOffset);\n\n const offsetBitmap = await createImageBitmap(offsetCanvas);\n offsetCanvas.width = offsetCanvas.height = 0;\n bitmap.close();\n bitmap = offsetBitmap;\n w = bitmap.width;\n h = bitmap.height;\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n if (cmd.columns === undefined) {\n imgCols = Math.ceil(bitmap.width / cw);\n }\n if (cmd.rows === undefined) {\n imgRows = Math.ceil(bitmap.height / ch);\n }\n }\n\n const zIndex = cmd.zIndex ?? 0;\n this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex);\n bitmap = undefined; // ownership transferred to storage\n\n // Kitty cursor movement\n // Per spec: cursor placed at first column after last image column,\n // on the last row of the image. C=1 means don't move cursor.\n if (cmd.cursorMovement === 1) {\n // C=1: restore cursor to position before image was placed\n const scrolled = buffer.ybase - savedYbase;\n buffer.x = savedX;\n // Can't restore cursor to scrollback?\n buffer.y = Math.max(savedY - scrolled, 0);\n } else {\n // Default (C=0): advance cursor horizontally past the image\n // addImage already positioned cursor on the last row via lineFeeds\n buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols);\n }\n } catch (e) {\n bitmap?.close();\n throw e;\n }\n }\n\n // Create ImageBitmap from already-decoded image data.\n private async _createBitmap(image: IKittyImageData): Promise<ImageBitmap> {\n let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer());\n\n if (image.compression === KittyCompression.ZLIB) {\n bytes = await this._decompressZlib(bytes);\n }\n\n if (image.format === KittyFormat.PNG) {\n const blob = new Blob([bytes as BlobPart], { type: 'image/png' });\n if (!window.createImageBitmap) {\n const url = URL.createObjectURL(blob);\n const img = new Image();\n return new Promise<ImageBitmap>((resolve, reject) => {\n img.addEventListener('load', () => {\n URL.revokeObjectURL(url);\n const canvas = ImageRenderer.createCanvas(window.document, img.width, img.height);\n canvas.getContext('2d')?.drawImage(img, 0, 0);\n createImageBitmap(canvas).then(resolve).catch(reject);\n });\n img.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n });\n img.src = url;\n });\n }\n return createImageBitmap(blob);\n }\n\n // Raw pixel data\n const width = image.width;\n const height = image.height;\n\n if (!width || !height) {\n throw new Error('Width and height required for raw pixel data');\n }\n\n const bytesPerPixel = image.format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n throw new Error('Insufficient pixel data');\n }\n\n const pixelCount = width * height;\n\n if (image.format === KittyFormat.RGBA) {\n // RGBA: use bytes directly — no copy needed\n return createImageBitmap(new ImageData(new Uint8ClampedArray(bytes.buffer as ArrayBuffer, bytes.byteOffset, pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA), width, height));\n }\n\n // RGB→RGBA: interleave alpha using uint32 block processing (4 pixels per iteration).\n // 3 uint32 reads + 4 uint32 writes per 4 pixels vs 28 byte reads/writes — ~6x faster.\n // Assumes little-endian (all modern browsers/Node.js).\n const data = new Uint8ClampedArray(pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA);\n const src32 = new Uint32Array(bytes.buffer, bytes.byteOffset, Math.floor(bytes.byteLength / 4));\n const dst32 = new Uint32Array(data.buffer);\n const alignedPixels = pixelCount & ~3; // round down to multiple of 4\n\n let srcOffset = 0;\n let dstOffset = 0;\n for (let i = 0; i < alignedPixels; i += 4) {\n const b0 = src32[srcOffset++];\n const b1 = src32[srcOffset++];\n const b2 = src32[srcOffset++];\n // Little-endian: pixel bytes are [R,G,B] → uint32 ABGR layout\n dst32[dstOffset++] = 0xFF000000 | b0;\n dst32[dstOffset++] = 0xFF000000 | (b0 >>> 24) | (b1 << 8);\n dst32[dstOffset++] = 0xFF000000 | (b1 >>> 16) | (b2 << 16);\n dst32[dstOffset++] = 0xFF000000 | (b2 >>> 8);\n }\n\n // Handle remaining 1–3 pixels\n let srcByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n let dstByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n for (let i = alignedPixels; i < pixelCount; i++) {\n data[dstByte] = bytes[srcByte];\n data[dstByte + 1] = bytes[srcByte + 1];\n data[dstByte + 2] = bytes[srcByte + 2];\n data[dstByte + 3] = KittyPixelConstants.ALPHA_OPAQUE;\n srcByte += KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n dstByte += KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n }\n\n return createImageBitmap(new ImageData(data, width, height));\n }\n\n private async _decompressZlib(compressed: Uint8Array): Promise<Uint8Array> {\n try {\n return await this._decompress(compressed, 'deflate');\n } catch {\n return await this._decompress(compressed, 'deflate-raw');\n }\n }\n\n private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise<Uint8Array> {\n const ds = new DecompressionStream(format);\n const writer = ds.writable.getWriter();\n writer.write(compressed as BufferSource);\n writer.close();\n\n const chunks: Uint8Array[] = [];\n const reader = ds.readable.getReader();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._kittyStorage.images;\n }\n\n public get _kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyStorage.kittyIdToStorageId;\n }\n\n public get pendingTransmissions(): ReadonlyMap<number, IPendingTransmission> {\n return this._pendingTransmissions;\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty graphics protocol types, constants, and parsing utilities.\n */\n\nimport type Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\n\n// Kitty graphics protocol action types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'.\nexport const enum KittyAction {\n TRANSMIT = 't',\n TRANSMIT_DISPLAY = 'T',\n QUERY = 'q',\n PLACEMENT = 'p',\n DELETE = 'd'\n}\n\n// Kitty graphics protocol format types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyFormat {\n RGB = 24,\n RGBA = 32,\n PNG = 100\n}\n\n// Kitty graphics protocol compression types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'.\nexport const enum KittyCompression {\n NONE = '',\n ZLIB = 'z'\n}\n\n// Kitty graphics protocol control data keys.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyKey {\n // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete)\n ACTION = 'a',\n // Image format (24=RGB, 32=RGBA, 100=PNG)\n FORMAT = 'f',\n // Image ID for referencing stored images\n ID = 'i',\n // Image number (alternative to ID, terminal assigns ID)\n IMAGE_NUMBER = 'I',\n // Source image width in pixels\n WIDTH = 's',\n // Source image height in pixels\n HEIGHT = 'v',\n // The left edge (in pixels) of the image area to display\n X_OFFSET = 'x',\n // The top edge (in pixels) of the image area to display\n Y_OFFSET = 'y',\n // Width (in pixels) of the source rectangle to display\n SOURCE_WIDTH = 'w',\n // Height (in pixels) of the source rectangle to display\n SOURCE_HEIGHT = 'h',\n // Horizontal offset (in pixels) within the first cell\n X_PLACEMENT_OFFSET = 'X',\n // Vertical offset (in pixels) within the first cell\n Y_PLACEMENT_OFFSET = 'Y',\n // Number of terminal columns to display the image over\n COLUMNS = 'c',\n // Number of terminal rows to display the image over\n ROWS = 'r',\n // More data flag (1=more chunks coming, 0=final chunk)\n MORE = 'm',\n // Compression type (z=zlib). This is essential for chunking larger images.\n COMPRESSION = 'o',\n // Quiet mode (1=suppress OK responses, 2=suppress error responses)\n QUIET = 'q',\n // Cursor movement policy (0=move cursor after image, 1=don't move cursor)\n CURSOR_MOVEMENT = 'C',\n // Z-index for image layering (negative = behind text, 0+ = on top)\n Z_INDEX = 'z',\n // Transmission medium (d=direct, f=file, t=temp file, s=shared memory)\n TRANSMISSION = 't',\n // Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) — only used when a=d\n DELETE_SELECTOR = 'd',\n // Placement ID for targeting specific placements\n PLACEMENT_ID = 'p'\n}\n\n// Pixel format constants\nexport const enum KittyPixelConstants {\n BYTES_PER_PIXEL_RGB = 3,\n BYTES_PER_PIXEL_RGBA = 4,\n ALPHA_OPAQUE = 255\n}\n\n// Parsed Kitty graphics command.\nexport interface IKittyCommand {\n action?: string;\n format?: number;\n id?: number;\n imageNumber?: number;\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n sourceWidth?: number;\n sourceHeight?: number;\n xOffset?: number;\n yOffset?: number;\n columns?: number;\n rows?: number;\n more?: number;\n quiet?: number;\n cursorMovement?: number;\n zIndex?: number;\n transmission?: string;\n deleteSelector?: string;\n placementId?: number;\n compression?: string;\n payload?: string;\n}\n\n// Pending chunked transmission state.\n// Stores metadata from the first chunk while accumulating decoded payload data.\nexport interface IPendingTransmission {\n // The parsed command from the first chunk (contains action, format, dimensions, etc.)\n cmd: IKittyCommand;\n // Decoder used across chunked payloads\n decoder: Base64Decoder;\n // Total encoded (base64) bytes received across all chunks - for size limit enforcement\n totalEncodedSize: number;\n // Whether any chunk has failed to decode\n decodeError: boolean;\n}\n\n// Stored Kitty image data.\nexport interface IKittyImageData {\n id: number;\n // Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit\n data: Blob;\n width: number;\n height: number;\n format: 24 | 32 | 100;\n compression?: string;\n}\n\n// Parses Kitty graphics control data into a command object.\nexport function parseKittyCommand(data: string): IKittyCommand {\n const cmd: IKittyCommand = {};\n const parts = data.split(',');\n\n for (const part of parts) {\n const eqIdx = part.indexOf('=');\n if (eqIdx === -1) continue;\n\n const key = part.substring(0, eqIdx);\n const value = part.substring(eqIdx + 1);\n\n // Handle string keys first\n if (key === KittyKey.ACTION) {\n cmd.action = value;\n continue;\n }\n if (key === KittyKey.COMPRESSION) {\n cmd.compression = value;\n continue;\n }\n if (key === KittyKey.TRANSMISSION) {\n cmd.transmission = value;\n continue;\n }\n if (key === KittyKey.DELETE_SELECTOR) {\n cmd.deleteSelector = value;\n continue;\n }\n const numValue = parseInt(value, 10);\n switch (key) {\n case KittyKey.FORMAT: cmd.format = numValue; break;\n case KittyKey.ID: cmd.id = numValue; break;\n case KittyKey.IMAGE_NUMBER: cmd.imageNumber = numValue; break;\n case KittyKey.WIDTH: cmd.width = numValue; break;\n case KittyKey.HEIGHT: cmd.height = numValue; break;\n case KittyKey.X_OFFSET: cmd.x = numValue; break;\n case KittyKey.Y_OFFSET: cmd.y = numValue; break;\n case KittyKey.SOURCE_WIDTH: cmd.sourceWidth = numValue; break;\n case KittyKey.SOURCE_HEIGHT: cmd.sourceHeight = numValue; break;\n case KittyKey.X_PLACEMENT_OFFSET: cmd.xOffset = numValue; break;\n case KittyKey.Y_PLACEMENT_OFFSET: cmd.yOffset = numValue; break;\n case KittyKey.COLUMNS: cmd.columns = numValue; break;\n case KittyKey.ROWS: cmd.rows = numValue; break;\n case KittyKey.MORE: cmd.more = numValue; break;\n case KittyKey.QUIET: cmd.quiet = numValue; break;\n case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break;\n case KittyKey.Z_INDEX: cmd.zIndex = numValue; break;\n case KittyKey.PLACEMENT_ID: cmd.placementId = numValue; break;\n }\n }\n\n return cmd;\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { ImageStorage } from '../ImageStorage';\nimport { ImageLayer, IAddImageOpts } from '../Types';\nimport { IKittyImageData } from './KittyGraphicsTypes';\n\n// Kitty-specific image storage controller.\n//\n// Wraps shared ImageStorage with kitty protocol semantics:\n// - tracks transmitted image payloads by kitty image id\n// - tracks kitty image id -> shared ImageStorage id mapping for displayed images\n// - mirrors shared-storage evictions into kitty maps\n// - applies protocol-level undisplayed-image eviction policy\nexport class KittyImageStorage implements IDisposable {\n private static readonly _maxStoredImages = 256;\n\n private _nextImageId = 1;\n private readonly _images: Map<number, IKittyImageData> = new Map();\n // TODO: Support multiple placements per image. The kitty spec identifies\n // placements by an (image id, placement id) pair — same i + different p\n // values should coexist, and same i + same p should replace the prior\n // placement. Currently we track only one storage entry per kitty image id,\n // so multiple placements of the same image overwrite each other. Fixing\n // this requires changing these maps to Map<number, Map<number, number>>\n // (kittyId → placementId → storageId) and updating addImage/deleteById\n // accordingly. The underlying shared ImageStorage would also need to\n // support multiple entries per logical image.\n private readonly _kittyIdToStorageId: Map<number, number> = new Map();\n private readonly _storageIdToKittyId: Map<number, number> = new Map();\n\n private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined;\n private readonly _wrappedOnImageDeleted: (storageId: number) => void;\n private readonly _handleStorageImageDeleted = (storageId: number): void => {\n const kittyId = this._storageIdToKittyId.get(storageId);\n if (kittyId !== undefined) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n this._images.delete(kittyId);\n }\n };\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n\n constructor(\n private readonly _storage: ImageStorage\n ) {\n this._previousOnImageDeleted = this._storage.onImageDeleted;\n this._wrappedOnImageDeleted = (storageId: number) => {\n this._previousOnImageDeleted?.(storageId);\n this._handleStorageImageDeleted(storageId);\n };\n this._storage.onImageDeleted = this._wrappedOnImageDeleted;\n }\n\n public reset(): void {\n this._nextImageId = 1;\n this._images.clear();\n this._kittyIdToStorageId.clear();\n this._storageIdToKittyId.clear();\n }\n\n public dispose(): void {\n this.reset();\n if (this._storage.onImageDeleted === this._wrappedOnImageDeleted) {\n this._storage.onImageDeleted = this._previousOnImageDeleted;\n }\n }\n\n public storeImage(id: number | undefined, imageData: Omit<IKittyImageData, 'id'>): number {\n const imageId = id ?? this._nextImageId++;\n\n const oldStorageId = this._kittyIdToStorageId.get(imageId);\n if (oldStorageId !== undefined) {\n this._storage.deleteImage(oldStorageId);\n this._kittyIdToStorageId.delete(imageId);\n this._storageIdToKittyId.delete(oldStorageId);\n }\n\n if (!this._images.has(imageId) && this._images.size >= KittyImageStorage._maxStoredImages) {\n this._evictUndisplayedImages();\n }\n\n this._images.set(imageId, {\n ...imageData,\n id: imageId\n });\n return imageId;\n }\n\n public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void {\n // Clean up stale reverse-mapping from a previous placement of the same\n // kitty image. The old shared-storage entry is kept (it may still be\n // visible on screen) but its reverse mapping is removed so that eviction\n // of the old entry won't incorrectly delete the kitty image data.\n const oldStorageId = this._kittyIdToStorageId.get(kittyId);\n if (oldStorageId !== undefined) {\n this._storageIdToKittyId.delete(oldStorageId);\n }\n this._addImageOpts.scrolling = scrolling;\n this._addImageOpts.layer = layer;\n this._addImageOpts.zIndex = zIndex;\n const storageId = this._storage.addImage(image, this._addImageOpts);\n this._kittyIdToStorageId.set(kittyId, storageId);\n this._storageIdToKittyId.set(storageId, kittyId);\n }\n\n public getImage(kittyId: number): IKittyImageData | undefined {\n return this._images.get(kittyId);\n }\n\n public deleteById(kittyId: number): void {\n this._images.delete(kittyId);\n const storageId = this._kittyIdToStorageId.get(kittyId);\n if (storageId !== undefined) {\n this._storage.deleteImage(storageId);\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n }\n }\n\n public deleteAll(): void {\n this._images.clear();\n for (const storageId of this._kittyIdToStorageId.values()) {\n this._storage.deleteImage(storageId);\n }\n this._kittyIdToStorageId.clear();\n this._storageIdToKittyId.clear();\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._images;\n }\n\n public get kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyIdToStorageId;\n }\n\n public get lastImageId(): number {\n return this._nextImageId - 1;\n }\n\n private _evictUndisplayedImages(): void {\n for (const [kittyId] of this._images) {\n if (this._images.size <= KittyImageStorage._maxStoredImages / 2) {\n break;\n }\n if (!this._kittyIdToStorageId.has(kittyId)) {\n this._images.delete(kittyId);\n }\n }\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023, 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\n/**\n * wasm base64 decoder.\n */\nconst wasmDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#828e69684093b2c6:rdef-start:\"decode\"*/{s:1,t:0,d:'AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML'}/*inwasm#828e69684093b2c6:rdef-end:\"decode\"*/);\n// SIMD version (speedup ~1.4x, not covered by tests yet)\n/*\nconst wasmDecode = InWasm({\n name: 'decode',\n type: OutputType.INSTANCE,\n mode: OutputMode.SYNC,\n srctype: 'Clang-C',\n imports: {\n env: { memory: new WebAssembly.Memory({ initial: 1 }) }\n },\n exports: {\n dec: () => 0,\n end: () => 0\n },\n compile: {\n switches: ['-msimd128', '-Wl,-z,stack-size=0', '-Wl,--stack-first']\n },\n code: `\n #include <wasm_simd128.h>\n typedef struct {\n unsigned int wp;\n unsigned int sp;\n unsigned int dp;\n unsigned int e_size;\n unsigned int dummy[4];\n unsigned char data[0];\n } State;\n\n unsigned int *D0 = (unsigned int *) ${P32.D0 * 4};\n unsigned int *D1 = (unsigned int *) ${P32.D1 * 4};\n unsigned int *D2 = (unsigned int *) ${P32.D2 * 4};\n unsigned int *D3 = (unsigned int *) ${P32.D3 * 4};\n State *state = (State *) ${P32.STATE * 4};\n\n #define packed_byte(x) wasm_i8x16_splat((char) x)\n #define packed_dword(x) wasm_i32x4_splat(x)\n #define masked(x, mask) wasm_v128_and(x, wasm_i32x4_splat(mask))\n\n __attribute__((noinline)) int dec() {\n unsigned int nsp = (state->wp - 1) & ~3;\n unsigned char *src = state->data + state->sp;\n unsigned char *end = state->data + nsp;\n unsigned char *dst = state->data + state->dp;\n unsigned int error = 0;\n\n v128_t err = wasm_i8x16_splat(0);\n unsigned char *end16 = state->data + (nsp & ~15);\n while (src < end16) {\n v128_t data = wasm_v128_load((v128_t *) src);\n\n // wasm-simd rewrite of http://0x80.pl/notesen/2016-01-17-sse-base64-decoding.html#vector-lookup-pshufb\n const v128_t higher_nibble = wasm_u32x4_shr(data, 4) & packed_byte(0x0f);\n const char linv = 1;\n const char hinv = 0;\n\n const v128_t lower_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n linv, linv, 0x2b, 0x30,\n 0x41, 0x50, 0x61, 0x70,\n linv, linv, linv, linv,\n linv, linv, linv, linv\n );\n const v128_t upper_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n hinv, hinv, 0x2b, 0x39,\n 0x4f, 0x5a, 0x6f, 0x7a,\n hinv, hinv, hinv, hinv,\n hinv, hinv, hinv, hinv\n );\n // the difference between the shift and lower bound\n const v128_t shift_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n 0x00, 0x00, 0x3e - 0x2b, 0x34 - 0x30,\n 0x00 - 0x41, 0x0f - 0x50, 0x1a - 0x61, 0x29 - 0x70,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00\n );\n\n const v128_t upper_bound = wasm_i8x16_swizzle(upper_bound_LUT, higher_nibble);\n const v128_t lower_bound = wasm_i8x16_swizzle(lower_bound_LUT, higher_nibble);\n\n const v128_t below = wasm_i8x16_lt(data, lower_bound);\n const v128_t above = wasm_i8x16_gt(data, upper_bound);\n const v128_t eq_2f = wasm_i8x16_eq(data, packed_byte(0x2f));\n\n // in_range = not (below or above) or eq_2f\n // outside = not in_range = below or above and not eq_2f (from deMorgan law)\n const v128_t outside = wasm_v128_andnot(eq_2f, above | below);\n err = wasm_v128_or(err, outside);\n\n const v128_t shift = wasm_i8x16_swizzle(shift_LUT, higher_nibble);\n const v128_t t0 = wasm_i8x16_add(data, shift);\n v128_t v = wasm_i8x16_add(t0, wasm_v128_and(eq_2f, packed_byte(-3)));\n\n // pack bytes\n const v128_t ca = masked(v, 0x003f003f);\n const v128_t db = masked(v, 0x3f003f00);\n const v128_t t00 = wasm_v128_or(wasm_u32x4_shr(db, 8), wasm_i32x4_shl(ca, 6));\n v128_t res = wasm_v128_or(wasm_u32x4_shr(t00, 16), wasm_i32x4_shl(t00, 12));\n res = wasm_i8x16_swizzle(res, wasm_i8x16_const(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 16, 16, 16, 16));\n\n wasm_v128_store((v128_t *) dst, res);\n dst += 12;\n src += 16;\n }\n //if (wasm_i8x16_bitmask(err) != 0) return -1;\n if (wasm_v128_any_true(err)) return -1;\n\n // operate on 4-byte blocks\n while (src < end) {\n error |= *((unsigned int *) dst) = D0[src[0]] | D1[src[1]] | D2[src[2]] | D3[src[3]];\n dst += 3;\n src += 4;\n }\n if (error >> 24) return -1;\n state->sp = nsp;\n state->dp = dst - state->data;\n return 0;\n }\n\n int end() {\n int rem = state->wp - state->sp;\n if (rem > 4 && dec()) return -1;\n rem = state->wp - state->sp;\n if (rem < 2) return -1;\n\n unsigned char *src = state->data + state->sp;\n if (rem == 4) {\n if (src[3] == 61) rem--;\n if (src[2] == 61) rem--;\n }\n unsigned int accu = D0[src[0]] | D1[src[1]];\n int dp = 1;\n if (rem > 2) {\n accu |= D2[src[2]];\n dp++;\n if (rem == 4) {\n accu |= D3[src[3]];\n dp++;\n }\n }\n if (accu >> 24) return -1;\n *((unsigned int *) (state->data + state->dp)) = accu;\n state->dp += dp;\n return 0;\n }\n `\n});\n*/\n// base64 map\nconst MAP = new Uint8Array('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n .split('')\n .map(el => el.charCodeAt(0)));\n// init decoder maps in LE order\nconst D = new Uint32Array(1024);\nD.fill(0xFF000000);\nfor (let i = 0; i < MAP.length; ++i)\n D[MAP[i]] = i << 2;\nfor (let i = 0; i < MAP.length; ++i)\n D[256 + MAP[i]] = i >> 4 | ((i << 4) & 0xFF) << 8;\nfor (let i = 0; i < MAP.length; ++i)\n D[512 + MAP[i]] = (i >> 2) << 8 | ((i << 6) & 0xFF) << 16;\nfor (let i = 0; i < MAP.length; ++i)\n D[768 + MAP[i]] = i << 16;\nconst EMPTY = new Uint8Array(0);\n/**\n * base64 stream decoder.\n *\n * Features / assumptions:\n * - lazy chunkwise decoding\n * - errors out on any non base64 chars (no support for NL formatted base64)\n * - decodes in wasm\n * - inplace decoding to save memory\n * - supports a keepSize for lazy memory release\n */\nclass Base64Decoder {\n /**\n * @param keepSize Keep the wasm instance below this limit when calling `release()`.\n * @param maxBytes Max allowed bytes to allocate.\n * @param initialBytes Initial bytes to allocate.\n */\n constructor(keepSize, maxBytes, initialBytes) {\n this._inst = null;\n this._ended = true;\n this._bytes = 0;\n this.keepSize = keepSize !== null && keepSize !== void 0 ? keepSize : 1048576 /* Bytes.KEEP */;\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : 4294901760 /* Bytes.MAX */;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : 32768 /* Bytes.INITIAL */;\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw new Error('invalid byte settings');\n }\n }\n /**\n * Currently decoded bytes (borrowed).\n * Must be accessed before calling `release` or `init`.\n */\n get data8() {\n return this._inst ? this._d.subarray(0, this._m32[1282 /* P32.STATE_DP */]) : EMPTY;\n }\n /**\n * Release memory conditionally based on `keepSize`.\n * If memory gets released, also the wasm instance will be freed and recreated on next `init`,\n * otherwise the instance will be reused.\n */\n release() {\n if (!this._inst)\n return;\n if (this._bytes > this.keepSize) {\n this._inst = this._m32 = this._d = this._mem = null;\n }\n else {\n this._m32[1280 /* P32.STATE_WP */] = 0;\n this._m32[1281 /* P32.STATE_SP */] = 0;\n this._m32[1282 /* P32.STATE_DP */] = 0;\n }\n }\n /**\n * Initializes the decoder for new base64 data.\n * Must be called before doing any decoding attempts.\n * The method will either spawn a new wasm instance or grow\n * the needed memory of an existing instance.\n * @param maxBytes Max allowed bytes to allocate (overwrites ctor value).\n * @param initialBytes Initial bytes to allocate (overwrites ctor value).\n */\n init(maxBytes, initialBytes) {\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : this.maxBytes;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : Math.min(this._bytes, this.maxBytes);\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw Error('invalid byte settings');\n }\n let m = this._m32;\n const bytes = this._bytes + 5152 /* Bytes._DATA_OFFSET */;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmDecode({ env: { memory: this._mem } });\n m = new Uint32Array(this._mem.buffer, 0);\n m.set(D, 256 /* P32.D0 */);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n m = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n m[1280 /* P32.STATE_WP */] = 0;\n m[1281 /* P32.STATE_SP */] = 0;\n m[1282 /* P32.STATE_DP */] = 0;\n this._m32 = m;\n this._ended = false;\n }\n /**\n * Realloc memory. Realloc only happens, if the requested\n * size doesn't fit in the current memory.\n * The new size will be capped by `maxBytes`.\n * @param requested Bytes to be stored.\n */\n _realloc(requested) {\n const needed = this._m32[1280 /* P32.STATE_WP */] + requested;\n if (this._bytes < needed) {\n if (needed > this.maxBytes) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n let newSize = this._bytes;\n while ((newSize *= 2) < needed) { }\n newSize = Math.min(newSize, this.maxBytes);\n if (newSize < needed) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n if (newSize + 5152 /* Bytes._DATA_OFFSET */ > this._mem.buffer.byteLength) {\n const addPages = Math.ceil((newSize + 5152 /* Bytes._DATA_OFFSET */ - this._mem.buffer.byteLength) / 65536);\n this._mem.grow(addPages);\n this._m32 = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n this._bytes = newSize;\n }\n return 0 /* DecodeStatus.OK */;\n }\n /**\n * Put bytes in `data` into the decoder.\n * Additionally decodes the payload, if it reached 2^17 bytes.\n * The return value indicates the type of issue.\n * @param data Bytes to be loaded.\n */\n put(data) {\n if (!this._inst || this._ended) {\n return -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n if (this._realloc(data.length)) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n const m = this._m32;\n this._d.set(data, m[1280 /* P32.STATE_WP */]);\n m[1280 /* P32.STATE_WP */] += data.length;\n // max chunk in input handler is 2^17, try to run in \"tandem mode\"\n return m[1280 /* P32.STATE_WP */] - m[1281 /* P32.STATE_SP */] >= 131072\n ? this._inst.exports.dec()\n : 0 /* DecodeStatus.OK */;\n }\n /**\n * End the current decoding.\n * Also decodes leftover payload from previous put calls.\n */\n end() {\n this._ended = true;\n return this._inst\n ? this._inst.exports.end()\n : -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n /**\n * Bytes loaded into the decoder.\n */\n get loadedBytes() {\n return this._inst\n ? this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n /**\n * Free bytes to feed to the decoder.\n */\n get freeBytes() {\n return this._inst\n ? this.maxBytes - this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n}\nexports.default = Base64Decoder;\n//# sourceMappingURL=Base64Decoder.wasm.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\nconst wasmQoiDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#459f9e1bfb80b1a8:rdef-start:\"qoi_decode\"*/{s:1,t:0,d:'AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=='}/*inwasm#459f9e1bfb80b1a8:rdef-end:\"qoi_decode\"*/);\nclass QoiDecoder {\n constructor(keepSize) {\n this.keepSize = keepSize;\n this.width = 0;\n this.height = 0;\n }\n decode(d) {\n this.width = d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7];\n this.height = d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11];\n const pixels = this.width * this.height;\n const ib = pixels * 4;\n const dl = d.length;\n /**\n * byte/offset calculation:\n * To save some memory we dont reserve full memory for decoded + encoded,\n * but place encoded at the end of decoded plus 50% security distance\n * to avoid reads before writes positions:\n *\n * encoded < decoded (good compression)\n * enc ####################\n * dec #######################################\n * ^ ^\n * DST_P CHUNK_P\n *\n * encoded > decoded (degenerated compression, should not happen)\n * enc ##############################\n * dec ####################\n * ^ ^\n * DST_P CHUNK_P\n *\n * There is still a chance for overlapping r/w positions in case the compressed\n * data has very different pixel progression, yet the 50% security distance\n * should deal with that, as QOI will bloat data by 25% at max (RGB -> OP byte + RGB).\n * Since we always assume RGBA at decoding stage, the possible bloat reduces to 20% at max.\n */\n const bytes = Math.max(ib, dl) + (Math.min(ib, dl) >> 1) + 4096;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmQoiDecode({ env: { memory: this._mem } });\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n this._d = null;\n }\n if (!this._d) {\n this._d = new Uint8Array(this._mem.buffer);\n }\n // put src data at the end of memory, also align to 256\n const chunkP = (this._mem.buffer.byteLength - dl) & ~0xFF;\n this._d.set(d, chunkP);\n this._inst.exports.dec(chunkP, dl, pixels);\n return this._d.subarray(1024 /* P8.DST_P */, 1024 /* P8.DST_P */ + ib);\n }\n release() {\n if (!this._inst)\n return;\n if (this._mem.buffer.byteLength > this.keepSize) {\n this._inst = this._d = this._mem = null;\n }\n }\n}\nexports.default = QoiDecoder;\n//# sourceMappingURL=QoiDecoder.wasm.js.map","\"use strict\";\n/**\n * Copyright (c) 2022, 2026 Joerg Breitbart\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InWasm = InWasm;\nlet z = (s) => {\n if (Uint8Array.fromBase64)\n return Uint8Array.fromBase64(s);\n if (typeof Buffer !== 'undefined')\n return Buffer.from(s, 'base64');\n const b = atob(s);\n const r = new Uint8Array(b.length);\n for (let i = 0; i < r.length; ++i)\n r[i] = b.charCodeAt(i);\n return r;\n};\nfunction InWasm(def) {\n if (def.d) {\n const { t, s, d } = def;\n let b;\n let m;\n const W = WebAssembly;\n if (t === 0 /* OutputType.INSTANCE */) {\n if (s)\n return (e) => new W.Instance(m || (m = new W.Module(b || (b = z(d)))), e);\n return (e) => m\n ? W.instantiate(m, e)\n : W.instantiate(b || (b = z(d)), e).then(r => (m = r.module) && r.instance);\n }\n if (t === 1 /* OutputType.MODULE */) {\n if (s)\n return () => m || (m = new W.Module(b || (b = z(d))));\n return () => m\n ? Promise.resolve(m)\n : W.compile(b || (b = z(d))).then(r => m = r);\n }\n if (s)\n return () => b || (b = z(d));\n return () => Promise.resolve(b || (b = z(d)));\n }\n if (typeof _wasmCtx === 'undefined')\n throw new Error('must run \"inwasm\"');\n _wasmCtx.add(def);\n}\n//# sourceMappingURL=index.js.map","// 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) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, IDisposable } from '@xterm/xterm';\nimport type { ImageAddon as IImageApi } from '@xterm/addon-image';\nimport { Emitter, type IEvent } from 'common/Event';\nimport { IIPHandler } from './IIPHandler';\nimport { ImageRenderer } from './ImageRenderer';\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { KittyGraphicsHandler } from './kitty/KittyGraphicsHandler';\nimport { KittyImageStorage } from './kitty/KittyImageStorage';\nimport { SixelHandler } from './SixelHandler';\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types';\n\n\n/**\n * Document VT features provided by this addon.\n *\n * @vt: #E[Supported via @xterm/addon-image.] DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q Pt ST\" \"Draw SIXEL image.\"\n *\n * Sixel support is provided by the addon @xterm/addon-image with these limitations:\n * - immediate coloring (no shared palette, allows high color settings of `img2sixel`)\n * - max. palette size of 4096 colors\n * - max. pixel width of 16K\n * - max. 25 MB per sixel sequence\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] OSC 1337 \"iTerm2 Commands\" \"OSC 1337 ; Pt BEL\" \"Custom iTerm2 commands.\"\n *\n * Only the inline image protocol (IIP) is supported by the addon @xterm/addon-image with\n * the following limitations:\n * - sequence:\n * - format: `OSC 1337 ; File=inline=1 ; size=<unencoded size> ; ... : <base64 payload> BEL`\n * - size param must be set and payload may not exceed CEIL(size * 4 / 3)\n * - strict base64 handling as of RFC4648 §4 (standard alphabet, optional padding,\n * no separator bytes allowed)\n * - supported params: size, name, width, height, preserveAspectRatio\n * - image formats: PNG, JPEG and GIF\n * - no animation support (renders first image of a GIF)\n * - no multipart support\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image)\n * and [iTerm2 IIP docs](https://iterm2.com/documentation-images.html) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] APC KITTY_GRAPHICS \"Kitty Graphics\" \"APC G Pt ST\" \"Kitty Graphics Protocol.\"\n *\n * Kitty graphics support is provided by the addon @xterm/addon-image.\n * Note that while basic image output already works, this is still work in progress.\n */\n\n// default values of addon ctor options\nconst DEFAULT_OPTIONS: IImageAddonOptions = {\n enableSizeReports: true,\n pixelLimit: 16777216, // limit to 4096 * 4096 pixels\n sixelSupport: true,\n sixelScrolling: true,\n sixelPaletteLimit: 4096,\n sixelSizeLimit: 33554432,\n storageLimit: 128,\n showPlaceholder: true,\n iipSupport: true,\n iipSizeLimit: 33554432,\n kittySupport: true,\n kittySizeLimit: 33554432\n};\n\n// max palette size supported by the sixel lib (compile time setting)\nconst MAX_SIXEL_PALETTE_SIZE = 4096;\n\n// definitions for _xtermGraphicsAttributes sequence\nconst enum GaItem {\n COLORS = 1,\n SIXEL_GEO = 2,\n REGIS_GEO = 3\n}\nconst enum GaAction {\n READ = 1,\n SET_DEFAULT = 2,\n SET = 3,\n READ_MAX = 4\n}\nconst enum GaStatus {\n SUCCESS = 0,\n ITEM_ERROR = 1,\n ACTION_ERROR = 2,\n FAILURE = 3\n}\n\n\nexport class ImageAddon implements ITerminalAddon, IImageApi {\n private _opts: IImageAddonOptions;\n private _defaultOpts: IImageAddonOptions;\n private _storage: ImageStorage | undefined;\n private _renderer: ImageRenderer | undefined;\n private _disposables: IDisposable[] = [];\n private _terminal: ITerminalExt | undefined;\n private _handlers: Map<String, IResetHandler> = new Map();\n private readonly _onImageAdded = new Emitter<void>();\n public readonly onImageAdded: IEvent<void> = this._onImageAdded.event;\n\n constructor(opts?: Partial<IImageAddonOptions>) {\n this._opts = Object.assign({}, DEFAULT_OPTIONS, opts);\n this._defaultOpts = Object.assign({}, DEFAULT_OPTIONS, opts);\n }\n\n public dispose(): void {\n for (const obj of this._disposables) {\n obj.dispose();\n }\n this._disposables.length = 0;\n this._handlers.clear();\n this._onImageAdded.dispose();\n }\n\n private _disposeLater(...args: IDisposable[]): void {\n for (const obj of args) {\n this._disposables.push(obj);\n }\n }\n\n public activate(terminal: ITerminalExt): void {\n this._terminal = terminal;\n\n // internal data structures\n this._renderer = new ImageRenderer(terminal);\n this._storage = new ImageStorage(terminal, this._renderer, this._opts);\n this._storage.onImageAdded = () => this._onImageAdded.fire();\n\n // enable size reports\n if (this._opts.enableSizeReports) {\n const windowOps = terminal.options.windowOptions ?? {};\n windowOps.getWinSizePixels = true;\n windowOps.getCellSizePixels = true;\n windowOps.getWinSizeChars = true;\n terminal.options.windowOptions = windowOps;\n }\n\n this._disposeLater(\n this._renderer,\n this._storage,\n\n // DECSET/DECRST/DA1/XTSMGRAPHICS handlers\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this._decset(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this._decrst(params)),\n terminal.parser.registerCsiHandler({ final: 'c' }, params => this._da1(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'S' }, params => this._xtermGraphicsAttributes(params)),\n\n // render hook\n terminal.onRender(range => this._storage?.render(range)),\n\n /**\n * reset handlers covered:\n * - DECSTR\n * - RIS\n * - Terminal.reset()\n */\n terminal.parser.registerCsiHandler({ intermediates: '!', final: 'p' }, () => this.reset()),\n terminal.parser.registerEscHandler({ final: 'c' }, () => this.reset()),\n terminal._core._inputHandler.onRequestReset(() => this.reset()),\n\n // wipe canvas and delete alternate images on buffer switch\n terminal.buffer.onBufferChange(() => this._storage?.wipeAlternate()),\n\n // extend images to the right on resize\n terminal.onResize(metrics => this._storage?.viewportResize(metrics))\n );\n\n // SIXEL handler\n if (this._opts.sixelSupport) {\n const sixelStorage = new SixelImageStorage(this._storage!, this._opts, this._renderer!, terminal);\n const sixelHandler = new SixelHandler(this._opts, sixelStorage, terminal);\n this._handlers.set('sixel', sixelHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerDcsHandler({ final: 'q' }, sixelHandler)\n );\n }\n\n // iTerm IIP handler\n if (this._opts.iipSupport) {\n const iipStorage = new IIPImageStorage(this._storage!);\n const iipHandler = new IIPHandler(this._opts, this._renderer!, iipStorage, terminal);\n this._handlers.set('iip', iipHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerOscHandler(1337, iipHandler)\n );\n }\n\n // Kitty graphics handler\n if (this._opts.kittySupport) {\n const kittyStorage = new KittyImageStorage(this._storage!);\n const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, kittyStorage, terminal);\n this._handlers.set('kitty', kittyHandler);\n this._disposeLater(\n kittyStorage,\n kittyHandler,\n terminal._core._inputHandler._parser.registerApcHandler({ final: 'G' }, kittyHandler)\n );\n }\n }\n\n // Note: storageLimit is skipped here to not intoduce a surprising side effect.\n public reset(): boolean {\n // reset options customizable by sequences to defaults\n this._opts.sixelScrolling = this._defaultOpts.sixelScrolling;\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n // also clear image storage\n this._storage?.reset();\n // reset protocol handlers\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return false;\n }\n\n public get storageLimit(): number {\n return this._storage?.getLimit() || -1;\n }\n\n public set storageLimit(limit: number) {\n this._storage?.setLimit(limit);\n this._opts.storageLimit = limit;\n }\n\n public get storageUsage(): number {\n if (this._storage) {\n return this._storage.getUsage();\n }\n return -1;\n }\n\n public get showPlaceholder(): boolean {\n return this._opts.showPlaceholder;\n }\n\n public set showPlaceholder(value: boolean) {\n this._opts.showPlaceholder = value;\n this._renderer?.showPlaceholder(value);\n }\n\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.getImageAtBufferCell(x, y);\n }\n\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.extractTileAtBufferCell(x, y);\n }\n\n private _report(s: string): void {\n this._terminal?._core.input(s, false);\n }\n\n private _decset(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = false;\n break;\n }\n }\n return false;\n }\n\n private _decrst(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = true;\n break;\n }\n }\n return false;\n }\n\n // overload DA to return something more appropriate\n private _da1(params: (number | number[])[]): boolean {\n if (params[0]) {\n return true;\n }\n // reported features:\n // 62 - VT220\n // 4 - SIXEL support\n // 9 - charsets\n // 22 - ANSI colors\n if (this._opts.sixelSupport) {\n this._report(`\\x1b[?62;4;9;22c`);\n return true;\n }\n return false;\n }\n\n /**\n * Implementation of xterm's graphics attribute sequence.\n *\n * Supported features:\n * - read/change palette limits (max 4096 by sixel lib)\n * - read SIXEL canvas geometry (reports current window canvas or\n * squared pixelLimit if canvas > pixel limit)\n *\n * Everything else is deactivated.\n */\n private _xtermGraphicsAttributes(params: (number | number[])[]): boolean {\n if (params.length < 2) {\n return true;\n }\n if (params[0] === GaItem.COLORS) {\n switch (params[1]) {\n case GaAction.READ:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n return true;\n case GaAction.SET_DEFAULT:\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n // also reset protocol handlers for now\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return true;\n case GaAction.SET:\n if (params.length > 2 && !(params[2] instanceof Array) && params[2] <= MAX_SIXEL_PALETTE_SIZE) {\n this._opts.sixelPaletteLimit = params[2];\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n } else {\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n }\n return true;\n case GaAction.READ_MAX:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${MAX_SIXEL_PALETTE_SIZE}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n if (params[0] === GaItem.SIXEL_GEO) {\n switch (params[1]) {\n // we only implement read and read_max here\n case GaAction.READ:\n let width = this._renderer?.dimensions?.css.canvas.width;\n let height = this._renderer?.dimensions?.css.canvas.height;\n if (!width || !height) {\n // for some reason we have no working image renderer\n // --> fallback to default cell size\n const cellSize = CELL_SIZE_DEFAULT;\n width = (this._terminal?.cols || 80) * cellSize.width;\n height = (this._terminal?.rows || 24) * cellSize.height;\n }\n if (width * height < this._opts.pixelLimit) {\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${width.toFixed(0)};${height.toFixed(0)}S`);\n } else {\n // if we overflow pixelLimit report that squared instead\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n }\n return true;\n case GaAction.READ_MAX:\n // read_max returns pixelLimit as square area\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n // exit with error on ReGIS or any other requests\n this._report(`\\x1b[?${params[0]};${GaStatus.ITEM_ERROR}S`);\n return true;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","red","n","green","blue","toRGBA8888","r","g","b","a","clamp","low","high","value","Math","max","min","h2c","t1","t2","c","normalizeRGB","round","Object","defineProperty","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","PALETTE_ANSI_256","PALETTE_VT340_GREY","PALETTE_VT340_COLOR","normalizeHLS","nearestColorIndex","fromRGBA8888","alpha","BIG_ENDIAN","Uint8Array","Uint32Array","buffer","console","warn","color","palette","Number","MAX_SAFE_INTEGER","idx","i","length","dr","dg","db","d","h","l","s","v","HLStoRGB","p","push","decodeAsync","decode","Decoder","DecoderAsync","Colors_1","__webpack_require__","wasm_1","WASM_BYTES","Buffer","from","bytestring","atob","result","charCodeAt","decodeBase64","LIMITS","BYTES","WASM_MODULE","NULL_CANVAS","CallbackProxy","constructor","this","bandHandler","width","modeHandler","mode","handle_band","mode_parsed","DEFAULT_OPTIONS","memoryLimit","sixelColor","fillColor","paletteLimit","PALETTE_SIZE","truncate","opts","cbProxy","importObj","env","bind","WebAssembly","instantiate","then","inst","instance","_instance","_cbProxy","_PIXEL_OFFSET","MAX_WIDTH","_canvas","_bandWidths","_maxWidth","_minWidth","_lastOffset","_currentHeight","_opts","assign","Error","_handle_band","_initCanvas","Module","Instance","_wasm","_chunk","memory","get_chunk_address","CHUNK_SIZE","_states","get_state_address","_palette","get_palette_address","set","_pSrc","get_p0_address","init","_fillColor","_truncate","_rasterWidth","_rasterHeight","_width","_height","_level","_mode","_paletteLimit","pixels","height","release","_realloc","offset","additionalPixels","newCanvas","ceil","adv","remaining","subarray","current_width","current_height","memoryUsage","byteLength","properties","level","memUsage","rasterAttributes","numerator","denominator","data","start","end","decodeString","j","data32","currentWidth","fill","escape","final","finalOffset","bw","currentHeight","data8","Uint8ClampedArray","dec","async","Lifecycle_1","EventUtils","_listeners","_disposed","event","_event","listener","thisArgs","disposables","toDisposable","entry","fn","slice","indexOf","splice","Array","isArray","add","fire","call","listeners","len","dispose","forward","to","e","map","undefined","any","events","store","DisposableStore","runAndSubscribe","handler","initial","arg","_disposables","Set","_isDisposed","isDisposed","o","clear","Disposable","_store","_register","None","freeze","_value","AttributeData","fg","bg","extended","ExtendedAttrs","toColorRGB","fromColorRGB","clone","newObj","isInverse","isBold","isUnderline","hasExtendedAttrs","underlineStyle","isBlink","isInvisible","isItalic","isDim","isStrikethrough","isProtected","isOverline","getFgColorMode","getBgColorMode","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","getFgColor","getBgColor","updateExtended","isEmpty","getUnderlineColor","underlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","ext","_urlId","_ext","urlId","val","payload","TextDecoder_1","Constants_1","AttributeData_1","CellData","content","combinedData","fromCharData","obj","setFromCharData","isCombined","getWidth","getChars","stringFromCodePoint","getCode","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","code","second","CHAR_DATA_WIDTH_INDEX","getAsCharData","attributesEquals","other","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","CHAR_DATA_CODE_INDEX","NULL_CELL_CHAR","NULL_CELL_WIDTH","NULL_CELL_CODE","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","String","fromCharCode","codepoint","_interim","input","target","size","startPos","interim","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","type","missing","fourStop","ImageRenderer_1","ImageStorage_1","Base64Decoder_wasm_1","__importDefault","QoiDecoder_wasm_1","IIPHeaderParser_1","IIPMetrics_1","DEFAULT_HEADER","name","preserveAspectRatio","inline","_renderer","_storage","_coreTerminal","_aborted","_hp","HeaderParser","_header","_isMultipart","_abortMulti","maxEncodedBytes","iipSizeLimit","initialBytes","_dec","default","_qoiDec","reset","put","state","dataPos","parse","fields","success","seqType","w","CELL_SIZE_DEFAULT","dimensions","css","canvas","cols","rows","scale","_c","_a","_core","_coreBrowserService","dpr","report","toFixed","cond","blob","metrics","UNSUPPORTED_TYPE","imageType","mime","pixelLimit","_resize","floor","ImageData","byteOffset","ImageRenderer","createCanvas","_b","getContext","putImageData","addImage","Blob","createImageBitmap","resizeWidth","resizeHeight","bm","catch","cw","cell","ch","_d","rw","_dim","rh","wf","hf","f","total","cdim","endsWith","parseInt","toStr","toInt","toSize","match","DECODERS","toString","bs","TextDecoder","FILE_MARKER","MULTIPARTFILE_MARKER","FILEPART_MARKER","FILEEND_MARKER","REPORTCELLSIZE_MARKER","MAX_FIELDCHARS","_buffer","_position","_key","k","_storeValue","_storeKey","_addImageOpts","scrolling","layer","zIndex","cursorPos","img","d32","blockLength","jpgSize","dim","limit","_layers","get","localDocument","document","createElement","createImageData","ctx","imgData","Promise","resolve","_terminal","super","Map","_optionsRefresh","MutableDisposable","_oldOpen","open","parent","_open","screenElement","optionsService","onOptionChange","option","rescaleCanvas","_renderService","refreshRows","removeLayerFromDom","_oldSetRenderer","setRenderer","_placeholderBitmap","close","_placeholder","showPlaceholder","cellSize","_createPlaceHolder","clearLines","y","clearRect","_e","clearAll","draw","imgSpec","tileId","col","row","count","_rescaleImage","actual","sx","sy","dx","dy","finalWidth","finalHeight","drawImage","extractTile","drawPlaceholder","values","spec","actualCellSize","originalWidth","originalHeight","origCellSize","orig","renderer","key","keys","insertLayerToDom","has","classList","style","isolation","insertBefore","firstChild","appendChild","remove","delete","hasLayer","bWidth","blueprint","black","white","shift","x","screen","ctx2","bitmap","window","CellData_1","ImageTileInfo","imageId","_images","_lastId","_lowestId","_fullyCleared","_needsFullClear","_pixelLimit","_workCell","setLimit","storageLimit","error","message","getLimit","_viewportMetrics","marker","RangeError","_evictOldest","getUsage","_getStoredPixels","storedPixels","_delImg","id","ImageBitmap","onImageDeleted","wipeAlternate","zero","entries","bufferType","deleteImage","termCols","termRows","originX","originY","tileCount","_inputHandler","_dirtyRowTracker","markDirty","line","lines","ybase","_writeToCell","lineFeed","endMarker","registerMarker","onDispose","active","_evictOnAlternate","onImageAdded","render","range","hasTopImages","hasBottomImages","drawCalls","placeholderCalls","ydisp","getExtended","startTile","startCol","nextE","sort","viewportResize","oldCol","tilesPerRow","hasData","rightCol","hasContent","lastTile","expandCol","getImageAtBufferCell","extractTileAtBufferCell","room","used","current","workCell","loadCell","old","oldSpec","extattr","setCell","Decoder_1","DEFAULT_PALETTE","convertLe","_size","sixelPaletteLimit","hook","params","attr","colors","foreground","rgba","t","ansi","background","extractActiveBg","_curAttrData","_themeService","sixelSizeLimit","unhook","advanceCursor","sixelScrolling","KittyGraphicsTypes_1","_kittyStorage","_decodeError","_activeDecoder","_inControlData","_controlData","_controlLength","_encodedSizeLimit","_totalEncodedSize","_parsedCommand","_pendingTransmissions","_maxEncodedBytes","kittySizeLimit","_initialEncodedBytes","_cleanupAllPending","_removePendingEntry","_lastPendingKey","pending","decoder","controlEnd","copyLength","parseKittyCommand","_parseControlDataString","imageNumber","_sendResponse","quiet","action","payloadStart","_streamPayload","pendingKey","previousEncodedSize","totalEncodedSize","decoderToRelease","_handleNoPayloadCommand","cmd","_handleDelete","isMoreComing","more","decodeError","finalCmd","imageBytes","_handleCommandWithBytesAndCmd","str","fromCodePoint","_handlePlacement","bytes","_handleTransmit","transmission","_handleTransmitDisplay","_handleQuery","image","getImage","_displayImage","placementId","storeImage","format","compression","_f","lastImageId","expectedBytes","deleteSelector","deleteAll","deleteById","isOk","response","coreService","triggerDataEvent","_decodeAndDisplay","_createBitmap","cropX","cropY","cropW","sourceWidth","cropH","sourceHeight","maxCropW","maxCropH","finalCropW","finalCropH","cropped","imgCols","imgRows","columns","savedX","savedY","savedYbase","scaled","xOffset","yOffset","canvasW","canvasH","offsetCanvas","offsetCtx","offsetBitmap","_g","cursorMovement","scrolled","arrayBuffer","_decompressZlib","url","URL","createObjectURL","Image","reject","addEventListener","revokeObjectURL","src","pixelCount","src32","dst32","alignedPixels","srcOffset","dstOffset","b0","b1","b2","srcByte","dstByte","compressed","_decompress","ds","DecompressionStream","writer","writable","getWriter","write","chunks","reader","readable","getReader","done","read","totalLength","reduce","sum","chunk","images","_kittyIdToStorageId","kittyIdToStorageId","pendingTransmissions","parts","split","part","eqIdx","substring","numValue","KittyImageStorage","_nextImageId","_storageIdToKittyId","_handleStorageImageDeleted","storageId","kittyId","_previousOnImageDeleted","_wrappedOnImageDeleted","imageData","oldStorageId","_maxStoredImages","_evictUndisplayedImages","wasmDecode","InWasm","MAP","el","D","EMPTY","keepSize","maxBytes","_inst","_ended","_bytes","_m32","_mem","m","grow","Memory","requested","needed","newSize","addPages","loadedBytes","freeBytes","wasmQoiDecode","ib","dl","chunkP","def","W","z","compile","_wasmCtx","fromBase64","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","Event_1","IIPHandler_1","KittyGraphicsHandler_1","KittyImageStorage_1","SixelHandler_1","SixelImageStorage_1","IIPImageStorage_1","enableSizeReports","sixelSupport","iipSupport","kittySupport","_handlers","_onImageAdded","Emitter","_defaultOpts","_disposeLater","args","activate","terminal","ImageStorage","windowOps","options","windowOptions","getWinSizePixels","getCellSizePixels","getWinSizeChars","parser","registerCsiHandler","prefix","_decset","_decrst","_da1","_xtermGraphicsAttributes","onRender","intermediates","registerEscHandler","onRequestReset","onBufferChange","onResize","sixelStorage","SixelImageStorage","sixelHandler","SixelHandler","_parser","registerDcsHandler","iipStorage","IIPImageStorage","iipHandler","IIPHandler","registerOscHandler","kittyStorage","kittyHandler","KittyGraphicsHandler","registerApcHandler","storageUsage","_report","sqrt"],"sourceRoot":""}
|
||
\ No newline at end of file
|
||
+{"version":3,"file":"addon-image.js","mappings":"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AAO,IAAO,IAAO,IAAO,IAC/D,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAQ,KAAQ,KAAQ,KAClE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MA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","sources":["webpack://ImageAddon/webpack/universalModuleDefinition","webpack://ImageAddon/../node_modules/sixel/lib/Colors.js","webpack://ImageAddon/../node_modules/sixel/lib/Decoder.js","webpack://ImageAddon/../node_modules/sixel/lib/wasm.js","webpack://ImageAddon/../src/common/Async.ts","webpack://ImageAddon/../src/common/Event.ts","webpack://ImageAddon/../src/common/Lifecycle.ts","webpack://ImageAddon/../src/common/buffer/AttributeData.ts","webpack://ImageAddon/../src/common/buffer/CellData.ts","webpack://ImageAddon/../src/common/buffer/Constants.ts","webpack://ImageAddon/../src/common/input/TextDecoder.ts","webpack://ImageAddon/./src/IIPHandler.ts","webpack://ImageAddon/./src/IIPHeaderParser.ts","webpack://ImageAddon/./src/IIPImageStorage.ts","webpack://ImageAddon/./src/IIPMetrics.ts","webpack://ImageAddon/./src/ImageRenderer.ts","webpack://ImageAddon/./src/ImageStorage.ts","webpack://ImageAddon/./src/SixelHandler.ts","webpack://ImageAddon/./src/SixelImageStorage.ts","webpack://ImageAddon/./src/kitty/KittyGraphicsHandler.ts","webpack://ImageAddon/./src/kitty/KittyGraphicsTypes.ts","webpack://ImageAddon/./src/kitty/KittyImageStorage.ts","webpack://ImageAddon/../node_modules/xterm-wasm-parts/lib/base64/Base64Decoder.wasm.js","webpack://ImageAddon/../node_modules/xterm-wasm-parts/lib/qoi/QoiDecoder.wasm.js","webpack://ImageAddon/javascript/node_modules/inwasm-runtime/lib/index.cjs","webpack://ImageAddon/webpack/bootstrap","webpack://ImageAddon/./src/ImageAddon.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[\"ImageAddon\"] = factory();\n\telse\n\t\troot[\"ImageAddon\"] = factory();\n})(globalThis, () => {\nreturn ","\"use strict\";\n/**\n * Copyright (c) 2019 Joerg Breitbart.\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_FOREGROUND = exports.DEFAULT_BACKGROUND = exports.PALETTE_ANSI_256 = exports.PALETTE_VT340_GREY = exports.PALETTE_VT340_COLOR = exports.normalizeHLS = exports.normalizeRGB = exports.nearestColorIndex = exports.fromRGBA8888 = exports.toRGBA8888 = exports.alpha = exports.blue = exports.green = exports.red = exports.BIG_ENDIAN = void 0;\n// FIXME: cleanup this mess, move things either to decoder/encoder, keep only shared things\n// system endianess\nexports.BIG_ENDIAN = new Uint8Array(new Uint32Array([0xFF000000]).buffer)[0] === 0xFF;\nif (exports.BIG_ENDIAN) {\n console.warn('BE platform detected. This version of node-sixel works only on LE properly.');\n}\n// channel values\nfunction red(n) {\n return n & 0xFF;\n}\nexports.red = red;\nfunction green(n) {\n return (n >>> 8) & 0xFF;\n}\nexports.green = green;\nfunction blue(n) {\n return (n >>> 16) & 0xFF;\n}\nexports.blue = blue;\nfunction alpha(n) {\n return (n >>> 24) & 0xFF;\n}\nexports.alpha = alpha;\n/**\n * Convert RGB channels to native color RGBA8888.\n */\nfunction toRGBA8888(r, g, b, a = 255) {\n return ((a & 0xFF) << 24 | (b & 0xFF) << 16 | (g & 0xFF) << 8 | (r & 0xFF)) >>> 0; // ABGR32\n}\nexports.toRGBA8888 = toRGBA8888;\n/**\n * Convert native color to [r, g, b, a].\n */\nfunction fromRGBA8888(color) {\n return [color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF, color >>> 24];\n}\nexports.fromRGBA8888 = fromRGBA8888;\n/**\n * Get index of nearest color in `palette` for `color`.\n * Uses euclidean distance without any luminescence correction.\n */\nfunction nearestColorIndex(color, palette) {\n const r = red(color);\n const g = green(color);\n const b = blue(color);\n let min = Number.MAX_SAFE_INTEGER;\n let idx = -1;\n // use euclidean distance (manhattan gives very poor results)\n for (let i = 0; i < palette.length; ++i) {\n const dr = r - palette[i][0];\n const dg = g - palette[i][1];\n const db = b - palette[i][2];\n const d = dr * dr + dg * dg + db * db;\n if (!d)\n return i;\n if (d < min) {\n min = d;\n idx = i;\n }\n }\n return idx;\n}\nexports.nearestColorIndex = nearestColorIndex;\n// color conversions\n// HLS taken from: http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl\nfunction clamp(low, high, value) {\n return Math.max(low, Math.min(value, high));\n}\nfunction h2c(t1, t2, c) {\n if (c < 0)\n c += 1;\n if (c > 1)\n c -= 1;\n return c * 6 < 1\n ? t2 + (t1 - t2) * 6 * c\n : c * 2 < 1\n ? t1\n : c * 3 < 2\n ? t2 + (t1 - t2) * (4 - c * 6)\n : t2;\n}\nfunction HLStoRGB(h, l, s) {\n if (!s) {\n const v = Math.round(l * 255);\n return toRGBA8888(v, v, v);\n }\n const t1 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t2 = 2 * l - t1;\n return toRGBA8888(clamp(0, 255, Math.round(h2c(t1, t2, h + 1 / 3) * 255)), clamp(0, 255, Math.round(h2c(t1, t2, h) * 255)), clamp(0, 255, Math.round(h2c(t1, t2, h - 1 / 3) * 255)));\n}\n/**\n * Normalize SIXEL RGB values (percent based, 0-100) to RGBA8888.\n */\nfunction normalizeRGB(r, g, b) {\n return (0xFF000000 | Math.round(b / 100 * 255) << 16 | Math.round(g / 100 * 255) << 8 | Math.round(r / 100 * 255)) >>> 0; // ABGR32\n}\nexports.normalizeRGB = normalizeRGB;\n/**\n * Normalize SIXEL HLS values to RGBA8888. Applies hue correction of +240°.\n */\nfunction normalizeHLS(h, l, s) {\n // Note: hue value is turned by 240° in VT340, all values given as fractions\n return HLStoRGB((h + 240 % 360) / 360, l / 100, s / 100);\n}\nexports.normalizeHLS = normalizeHLS;\n/**\n * default palettes\n */\n// FIXME: move palettes to Decoder.ts\n/**\n * 16 predefined color registers of VT340 (values in %):\n * ```\n * R G B\n * 0 Black 0 0 0\n * 1 Blue 20 20 80\n * 2 Red 80 13 13\n * 3 Green 20 80 20\n * 4 Magenta 80 20 80\n * 5 Cyan 20 80 80\n * 6 Yellow 80 80 20\n * 7 Gray 50% 53 53 53\n * 8 Gray 25% 26 26 26\n * 9 Blue* 33 33 60\n * 10 Red* 60 26 26\n * 11 Green* 33 60 33\n * 12 Magenta* 60 33 60\n * 13 Cyan* 33 60 60\n * 14 Yellow* 60 60 33\n * 15 Gray 75% 80 80 80\n * ```\n * (*) less saturated\n *\n * @see https://vt100.net/docs/vt3xx-gp/chapter2.html#S2.4\n*/\nexports.PALETTE_VT340_COLOR = new Uint32Array([\n normalizeRGB(0, 0, 0),\n normalizeRGB(20, 20, 80),\n normalizeRGB(80, 13, 13),\n normalizeRGB(20, 80, 20),\n normalizeRGB(80, 20, 80),\n normalizeRGB(20, 80, 80),\n normalizeRGB(80, 80, 20),\n normalizeRGB(53, 53, 53),\n normalizeRGB(26, 26, 26),\n normalizeRGB(33, 33, 60),\n normalizeRGB(60, 26, 26),\n normalizeRGB(33, 60, 33),\n normalizeRGB(60, 33, 60),\n normalizeRGB(33, 60, 60),\n normalizeRGB(60, 60, 33),\n normalizeRGB(80, 80, 80)\n]);\n/**\n * 16 predefined monochrome registers of VT340 (values in %):\n * ```\n * R G B\n * 0 Black 0 0 0\n * 1 Gray-2 13 13 13\n * 2 Gray-4 26 26 26\n * 3 Gray-6 40 40 40\n * 4 Gray-1 6 6 6\n * 5 Gray-3 20 20 20\n * 6 Gray-5 33 33 33\n * 7 White 7 46 46 46\n * 8 Black 0 0 0 0\n * 9 Gray-2 13 13 13\n * 10 Gray-4 26 26 26\n * 11 Gray-6 40 40 40\n * 12 Gray-1 6 6 6\n * 13 Gray-3 20 20 20\n * 14 Gray-5 33 33 33\n * 15 White 7 46 46 46\n * ```\n *\n * @see https://vt100.net/docs/vt3xx-gp/chapter2.html#S2.4\n */\nexports.PALETTE_VT340_GREY = new Uint32Array([\n normalizeRGB(0, 0, 0),\n normalizeRGB(13, 13, 13),\n normalizeRGB(26, 26, 26),\n normalizeRGB(40, 40, 40),\n normalizeRGB(6, 6, 6),\n normalizeRGB(20, 20, 20),\n normalizeRGB(33, 33, 33),\n normalizeRGB(46, 46, 46),\n normalizeRGB(0, 0, 0),\n normalizeRGB(13, 13, 13),\n normalizeRGB(26, 26, 26),\n normalizeRGB(40, 40, 40),\n normalizeRGB(6, 6, 6),\n normalizeRGB(20, 20, 20),\n normalizeRGB(33, 33, 33),\n normalizeRGB(46, 46, 46)\n]);\n/**\n * 256 predefined ANSI colors.\n *\n * @see https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit\n */\nexports.PALETTE_ANSI_256 = (() => {\n // 16 lower colors (taken from xterm)\n const p = [\n toRGBA8888(0, 0, 0),\n toRGBA8888(205, 0, 0),\n toRGBA8888(0, 205, 0),\n toRGBA8888(205, 205, 0),\n toRGBA8888(0, 0, 238),\n toRGBA8888(205, 0, 205),\n toRGBA8888(0, 250, 205),\n toRGBA8888(229, 229, 229),\n toRGBA8888(127, 127, 127),\n toRGBA8888(255, 0, 0),\n toRGBA8888(0, 255, 0),\n toRGBA8888(255, 255, 0),\n toRGBA8888(92, 92, 255),\n toRGBA8888(255, 0, 255),\n toRGBA8888(0, 255, 255),\n toRGBA8888(255, 255, 255),\n ];\n // colors up to 232\n const d = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; ++r) {\n for (let g = 0; g < 6; ++g) {\n for (let b = 0; b < 6; ++b) {\n p.push(toRGBA8888(d[r], d[g], d[b]));\n }\n }\n }\n // grey scale to up 255\n for (let v = 8; v <= 238; v += 10) {\n p.push(toRGBA8888(v, v, v));\n }\n return new Uint32Array(p);\n})();\n/**\n * Background: Black by default.\n * Foreground: White by default.\n *\n * Background color is used whenever a fill color is needed and not explicitly set.\n * Foreground color is used as default initial sixel color.\n */\nexports.DEFAULT_BACKGROUND = toRGBA8888(0, 0, 0, 255);\nexports.DEFAULT_FOREGROUND = toRGBA8888(255, 255, 255, 255);\n//# sourceMappingURL=Colors.js.map","\"use strict\";\n/**\n * Copyright (c) 2021 Joerg Breitbart.\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decodeAsync = exports.decode = exports.Decoder = exports.DecoderAsync = void 0;\nconst Colors_1 = require(\"./Colors\");\nconst wasm_1 = require(\"./wasm\");\n/* istanbul ignore next */\nfunction decodeBase64(s) {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(s, 'base64');\n }\n const bytestring = atob(s);\n const result = new Uint8Array(bytestring.length);\n for (let i = 0; i < result.length; ++i) {\n result[i] = bytestring.charCodeAt(i);\n }\n return result;\n}\nconst WASM_BYTES = decodeBase64(wasm_1.LIMITS.BYTES);\nlet WASM_MODULE;\n// empty canvas\nconst NULL_CANVAS = new Uint32Array();\n// proxy for lazy binding of decoder methods to wasm env callbacks\nclass CallbackProxy {\n constructor() {\n this.bandHandler = (width) => 1;\n this.modeHandler = (mode) => 1;\n }\n handle_band(width) {\n return this.bandHandler(width);\n }\n mode_parsed(mode) {\n return this.modeHandler(mode);\n }\n}\n// default decoder options\nconst DEFAULT_OPTIONS = {\n memoryLimit: 2048 * 65536,\n sixelColor: Colors_1.DEFAULT_FOREGROUND,\n fillColor: Colors_1.DEFAULT_BACKGROUND,\n palette: Colors_1.PALETTE_VT340_COLOR,\n paletteLimit: wasm_1.LIMITS.PALETTE_SIZE,\n truncate: true\n};\n/**\n * Create a decoder instance asynchronously.\n * To be used in the browser main thread.\n */\nfunction DecoderAsync(opts) {\n const cbProxy = new CallbackProxy();\n const importObj = {\n env: {\n handle_band: cbProxy.handle_band.bind(cbProxy),\n mode_parsed: cbProxy.mode_parsed.bind(cbProxy)\n }\n };\n return WebAssembly.instantiate(WASM_MODULE || WASM_BYTES, importObj)\n .then((inst) => {\n WASM_MODULE = WASM_MODULE || inst.module;\n return new Decoder(opts, inst.instance || inst, cbProxy);\n });\n}\nexports.DecoderAsync = DecoderAsync;\n/**\n * Decoder - web assembly based sixel stream decoder.\n *\n * Usage pattern:\n * - call `init` to initialize decoder for new image\n * - feed data chunks to `decode` or `decodeString`\n * - grab pixels from `data32`\n * - optional: call `release` to free memory (e.g. after big images)\n * - start over with next image by calling `init`\n *\n * Properties:\n * - max width of 2^14 - 4 pixels (compile time setting in wasm)\n * - no explicit height limit (only limited by memory)\n * - max 4096 colors palette (compile time setting in wasm)\n *\n * Explanation operation modes:\n * - M1 Mode chosen for level 1 images (no raster attributes),\n * or for level 2 images with `truncate=false`.\n * - M2 Mode chosen for level 2 images with `truncate=true` (default).\n * While this mode is not fully spec conform (decoder not expected to truncate),\n * it is what spec conform encoders should create (should not excess raster).\n * This mode has several advantages:\n * - ~15% faster decoding speed\n * - image dimensions can be evaluated early without processing the whole data\n * - faster pixel access in `data32` (precalulated)\n * - image height is not reported as multiple of 6 pixels\n * - M0 Undecided mode state after `init`.\n * The level of an image is determined during early decoding based on the fact,\n * whether the data contains valid raster attributes before any sixel data.\n * Until then the mode of an image is marked as M0, meaning the real operation mode\n * could not be decided yet.\n */\nclass Decoder {\n /**\n * Synchonous ctor. Can be called from nodejs or a webworker context.\n * For instantiation in the browser main thread use `WasmDecoderAsync` instead.\n */\n constructor(opts, _instance, _cbProxy) {\n this._PIXEL_OFFSET = wasm_1.LIMITS.MAX_WIDTH + 4;\n this._canvas = NULL_CANVAS;\n this._bandWidths = [];\n this._maxWidth = 0;\n this._minWidth = wasm_1.LIMITS.MAX_WIDTH;\n this._lastOffset = 0;\n this._currentHeight = 0;\n this._opts = Object.assign({}, DEFAULT_OPTIONS, opts);\n if (this._opts.paletteLimit > wasm_1.LIMITS.PALETTE_SIZE) {\n throw new Error(`DecoderOptions.paletteLimit must not exceed ${wasm_1.LIMITS.PALETTE_SIZE}`);\n }\n if (!_instance) {\n const module = WASM_MODULE || (WASM_MODULE = new WebAssembly.Module(WASM_BYTES));\n _instance = new WebAssembly.Instance(module, {\n env: {\n handle_band: this._handle_band.bind(this),\n mode_parsed: this._initCanvas.bind(this)\n }\n });\n }\n else {\n _cbProxy.bandHandler = this._handle_band.bind(this);\n _cbProxy.modeHandler = this._initCanvas.bind(this);\n }\n this._instance = _instance;\n this._wasm = this._instance.exports;\n this._chunk = new Uint8Array(this._wasm.memory.buffer, this._wasm.get_chunk_address(), wasm_1.LIMITS.CHUNK_SIZE);\n this._states = new Uint32Array(this._wasm.memory.buffer, this._wasm.get_state_address(), 12);\n this._palette = new Uint32Array(this._wasm.memory.buffer, this._wasm.get_palette_address(), wasm_1.LIMITS.PALETTE_SIZE);\n this._palette.set(this._opts.palette);\n this._pSrc = new Uint32Array(this._wasm.memory.buffer, this._wasm.get_p0_address());\n this._wasm.init(Colors_1.DEFAULT_FOREGROUND, 0, this._opts.paletteLimit, 0);\n }\n // some readonly parser states for internal usage\n get _fillColor() { return this._states[0]; }\n get _truncate() { return this._states[8]; }\n get _rasterWidth() { return this._states[6]; }\n get _rasterHeight() { return this._states[7]; }\n get _width() { return this._states[2] ? this._states[2] - 4 : 0; }\n get _height() { return this._states[3]; }\n get _level() { return this._states[9]; }\n get _mode() { return this._states[10]; }\n get _paletteLimit() { return this._states[11]; }\n _initCanvas(mode) {\n if (mode === 2 /* M2 */) {\n const pixels = this.width * this.height;\n if (pixels > this._canvas.length) {\n if (this._opts.memoryLimit && pixels * 4 > this._opts.memoryLimit) {\n this.release();\n throw new Error('image exceeds memory limit');\n }\n this._canvas = new Uint32Array(pixels);\n }\n this._maxWidth = this._width;\n }\n else if (mode === 1 /* M1 */) {\n if (this._level === 2) {\n // got raster attributes, use them as initial size hint\n const pixels = Math.min(this._rasterWidth, wasm_1.LIMITS.MAX_WIDTH) * this._rasterHeight;\n if (pixels > this._canvas.length) {\n if (this._opts.memoryLimit && pixels * 4 > this._opts.memoryLimit) {\n this.release();\n throw new Error('image exceeds memory limit');\n }\n this._canvas = new Uint32Array(pixels);\n }\n }\n else {\n // else fallback to generic resizing, starting with 256*256 pixels\n if (this._canvas.length < 65536) {\n this._canvas = new Uint32Array(65536);\n }\n }\n }\n return 0; // 0 - continue, 1 - abort right away\n }\n _realloc(offset, additionalPixels) {\n const pixels = offset + additionalPixels;\n if (pixels > this._canvas.length) {\n if (this._opts.memoryLimit && pixels * 4 > this._opts.memoryLimit) {\n this.release();\n throw new Error('image exceeds memory limit');\n }\n // extend in 65536 pixel blocks\n const newCanvas = new Uint32Array(Math.ceil(pixels / 65536) * 65536);\n newCanvas.set(this._canvas);\n this._canvas = newCanvas;\n }\n }\n _handle_band(width) {\n const adv = this._PIXEL_OFFSET;\n let offset = this._lastOffset;\n if (this._mode === 2 /* M2 */) {\n let remaining = this.height - this._currentHeight;\n let c = 0;\n while (c < 6 && remaining > 0) {\n this._canvas.set(this._pSrc.subarray(adv * c, adv * c + width), offset + width * c);\n c++;\n remaining--;\n }\n this._lastOffset += width * c;\n this._currentHeight += c;\n }\n else if (this._mode === 1 /* M1 */) {\n this._realloc(offset, width * 6);\n this._maxWidth = Math.max(this._maxWidth, width);\n this._minWidth = Math.min(this._minWidth, width);\n for (let i = 0; i < 6; ++i) {\n this._canvas.set(this._pSrc.subarray(adv * i, adv * i + width), offset + width * i);\n }\n this._bandWidths.push(width);\n this._lastOffset += width * 6;\n this._currentHeight += 6;\n }\n return 0; // 0 - continue, 1 - abort right away\n }\n /**\n * Width of the image data.\n * Returns the rasterWidth in level2/truncating mode,\n * otherwise the max width, that has been seen so far.\n */\n get width() {\n return this._mode !== 1 /* M1 */\n ? this._width\n : Math.max(this._maxWidth, this._wasm.current_width());\n }\n /**\n * Height of the image data.\n * Returns the rasterHeight in level2/truncating mode,\n * otherwise height touched by sixels.\n */\n get height() {\n return this._mode !== 1 /* M1 */\n ? this._height\n : this._wasm.current_width()\n ? this._bandWidths.length * 6 + this._wasm.current_height()\n : this._bandWidths.length * 6;\n }\n /**\n * Get active palette colors as RGBA8888[] (borrowed).\n */\n get palette() {\n return this._palette.subarray(0, this._paletteLimit);\n }\n /**\n * Get the memory used by the decoder.\n *\n * This is a rough estimate accounting the wasm instance memory\n * and pixel buffers held on JS side (real value will be slightly\n * higher due to JS book-keeping).\n * Note that the decoder does not free ressources on its own,\n * call `release` to free excess memory.\n */\n get memoryUsage() {\n return this._canvas.byteLength + this._wasm.memory.buffer.byteLength + 8 * this._bandWidths.length;\n }\n /**\n * Get various properties of the decoder and the current image.\n */\n get properties() {\n return {\n width: this.width,\n height: this.height,\n mode: this._mode,\n level: this._level,\n truncate: !!this._truncate,\n paletteLimit: this._paletteLimit,\n fillColor: this._fillColor,\n memUsage: this.memoryUsage,\n rasterAttributes: {\n numerator: this._states[4],\n denominator: this._states[5],\n width: this._rasterWidth,\n height: this._rasterHeight,\n }\n };\n }\n /**\n * Initialize decoder for next image. Must be called before\n * any calls to `decode` or `decodeString`.\n */\n // FIXME: reorder arguments, better palette handling\n init(fillColor = this._opts.fillColor, palette = this._opts.palette, paletteLimit = this._opts.paletteLimit, truncate = this._opts.truncate) {\n this._wasm.init(this._opts.sixelColor, fillColor, paletteLimit, truncate ? 1 : 0);\n if (palette) {\n this._palette.set(palette.subarray(0, wasm_1.LIMITS.PALETTE_SIZE));\n }\n this._bandWidths.length = 0;\n this._maxWidth = 0;\n this._minWidth = wasm_1.LIMITS.MAX_WIDTH;\n this._lastOffset = 0;\n this._currentHeight = 0;\n }\n /**\n * Decode next chunk of data from start to end index (exclusive).\n * @throws Will throw if the image exceeds the memory limit.\n */\n decode(data, start = 0, end = data.length) {\n let p = start;\n while (p < end) {\n const length = Math.min(end - p, wasm_1.LIMITS.CHUNK_SIZE);\n this._chunk.set(data.subarray(p, p += length));\n this._wasm.decode(0, length);\n }\n }\n /**\n * Decode next chunk of string data from start to end index (exclusive).\n * Note: Decoding from string data is rather slow, use `decode` with byte data instead.\n * @throws Will throw if the image exceeds the memory limit.\n */\n decodeString(data, start = 0, end = data.length) {\n let p = start;\n while (p < end) {\n const length = Math.min(end - p, wasm_1.LIMITS.CHUNK_SIZE);\n for (let i = 0, j = p; i < length; ++i, ++j) {\n this._chunk[i] = data.charCodeAt(j);\n }\n p += length;\n this._wasm.decode(0, length);\n }\n }\n /**\n * Get current pixel data as 32-bit typed array (RGBA8888).\n * Also peeks into pixel data of the current band, that got not pushed yet.\n */\n get data32() {\n if (this._mode === 0 /* M0 */ || !this.width || !this.height) {\n return NULL_CANVAS;\n }\n // get width of pending band to peek into left-over data\n const currentWidth = this._wasm.current_width();\n if (this._mode === 2 /* M2 */) {\n let remaining = this.height - this._currentHeight;\n if (remaining > 0) {\n const adv = this._PIXEL_OFFSET;\n let offset = this._lastOffset;\n let c = 0;\n while (c < 6 && remaining > 0) {\n this._canvas.set(this._pSrc.subarray(adv * c, adv * c + currentWidth), offset + currentWidth * c);\n c++;\n remaining--;\n }\n if (remaining) {\n this._canvas.fill(this._fillColor, offset + currentWidth * c);\n }\n }\n return this._canvas.subarray(0, this.width * this.height);\n }\n if (this._mode === 1 /* M1 */) {\n if (this._minWidth === this._maxWidth) {\n let escape = false;\n if (currentWidth) {\n if (currentWidth !== this._minWidth) {\n escape = true;\n }\n else {\n const adv = this._PIXEL_OFFSET;\n let offset = this._lastOffset;\n this._realloc(offset, currentWidth * 6);\n for (let i = 0; i < 6; ++i) {\n this._canvas.set(this._pSrc.subarray(adv * i, adv * i + currentWidth), offset + currentWidth * i);\n }\n }\n }\n if (!escape) {\n return this._canvas.subarray(0, this.width * this.height);\n }\n }\n // worst case: re-align pixels if we have bands with different width\n // This is somewhat allocation intensive, any way to do that in-place, and just once?\n const final = new Uint32Array(this.width * this.height);\n final.fill(this._fillColor);\n let finalOffset = 0;\n let start = 0;\n for (let i = 0; i < this._bandWidths.length; ++i) {\n const bw = this._bandWidths[i];\n for (let p = 0; p < 6; ++p) {\n final.set(this._canvas.subarray(start, start += bw), finalOffset);\n finalOffset += this.width;\n }\n }\n // also handle left-over pixels of the current band\n if (currentWidth) {\n const adv = this._PIXEL_OFFSET;\n // other than finished bands, this runs only up to currentHeight\n const currentHeight = this._wasm.current_height();\n for (let i = 0; i < currentHeight; ++i) {\n final.set(this._pSrc.subarray(adv * i, adv * i + currentWidth), finalOffset + this.width * i);\n }\n }\n return final;\n }\n // fallthrough for all not handled cases\n return NULL_CANVAS;\n }\n /**\n * Same as `data32`, but returning pixel data as Uint8ClampedArray suitable\n * for direct usage with `ImageData`.\n */\n get data8() {\n return new Uint8ClampedArray(this.data32.buffer, 0, this.width * this.height * 4);\n }\n /**\n * Release image ressources on JS side held by the decoder.\n *\n * The decoder tries to re-use memory ressources of a previous image\n * to lower allocation and GC pressure. Decoding a single big image\n * will grow the memory usage of the decoder permanently.\n * Call `release` to reset the internal buffers and free the memory.\n * Note that this destroys the image data, call it when done processing\n * a rather big image, otherwise it is not needed. Use `memoryUsage`\n * to decide, whether the held memory is still within your limits.\n * This does not affect the wasm module (operates on static memory).\n */\n release() {\n this._canvas = NULL_CANVAS;\n this._bandWidths.length = 0;\n this._maxWidth = 0;\n this._minWidth = wasm_1.LIMITS.MAX_WIDTH;\n // also nullify parser states in wasm to avoid\n // width/height reporting potential out-of-bound values\n this._wasm.init(Colors_1.DEFAULT_FOREGROUND, 0, this._opts.paletteLimit, 0);\n }\n}\nexports.Decoder = Decoder;\n/**\n * Convenient decoding functions for easier usage.\n *\n * These can be used for casual decoding of sixel images,\n * that dont come in as stream chunks.\n * Note that the functions instantiate a stream decoder for every call,\n * which comes with a performance penalty of ~25%.\n */\n/**\n * Decode function with synchronous wasm loading.\n * Can be used in a web worker or in nodejs. Does not work reliable in normal browser context.\n * @throws Will throw if the image exceeds the memory limit.\n */\nfunction decode(data, opts) {\n const dec = new Decoder(opts);\n dec.init();\n typeof data === 'string' ? dec.decodeString(data) : dec.decode(data);\n return {\n width: dec.width,\n height: dec.height,\n data32: dec.data32,\n data8: dec.data8\n };\n}\nexports.decode = decode;\n/**\n * Decode function with asynchronous wasm loading.\n * Use this version in normal browser context.\n * @throws Will throw if the image exceeds the memory limit.\n */\nasync function decodeAsync(data, opts) {\n const dec = await DecoderAsync(opts);\n dec.init();\n typeof data === 'string' ? dec.decodeString(data) : dec.decode(data);\n return {\n width: dec.width,\n height: dec.height,\n data32: dec.data32,\n data8: dec.data8\n };\n}\nexports.decodeAsync = decodeAsync;\n//# sourceMappingURL=Decoder.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LIMITS = void 0;\nexports.LIMITS = {\n CHUNK_SIZE: 16384,\n PALETTE_SIZE: 4096,\n MAX_WIDTH: 16384,\n BYTES: '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AEHAiwIgADcDAEG4iwIgADcDAEGwiwIgADcDAEGoiwIgADcDAEGgiwIgADcDAEGYiwIgADcDAEGQiwIgADcDAEGIiwIgADcDAEGAiwIgADcDAEH4igIgADcDAEHwigIgADcDAEHoigIgADcDAEHgigIgADcDAEHYigIgADcDAEHQigIgADcDAEHIigIgADcDAEHAigIgADcDAEG4igIgADcDAEGwigIgADcDAEGoigIgADcDAEGgigIgADcDAEGYigIgADcDAEGQigIgADcDAEGIigIgADcDAEGAigIgADcDAEH4iQIgADcDAEHwiQIgADcDAEHoiQIgADcDAEHgiQIgADcDAEHYiQIgADcDAEHQiQIgADcDAEHIiQIgADcDAEHAiQIgADcDAEG4iQIgADcDAEGwiQIgADcDAEGoCCgCACIEQf8AakGAAW0hCAJAIARBgQFIDQBBASEBIAhBAiAIQQJKG0EBayICQQFxIQMgBEGBAk4EQCACQX5xIQIDQCABQQl0IgdBEHJBoIkCakGwiQJBgAT8CgAAIAdBsI0CakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsLIANFDQAgAUEJdEEQckGgiQJqQbCJAkGABPwKAAALAkAgBEEBSA0AIAhBASAIQQFKGyIDQQFxIQUCQCADQQFrIgdFBEBBACEBDAELIANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQbCJBmpBsIkCQYAE/AoAACAGQZAEckGwiQZqQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACwsgBQRAIAFBCXRBEHJBsIkGakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEFIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiBkEQckHAiQpqQbCJAkGABPwKAAAgBkGQBHJBwIkKakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAFBEAgAUECdEHAiQpqQbCJAkGABPwKAAALIARBAUgNACADQQFxIQUgBwR/IANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQdCJDmpBsIkCQYAE/AoAACAGQZAEckHQiQ5qQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACyABQQd0QQRyBUEECyEBIAUEQCABQQJ0QdCJDmpBsIkCQYAE/AoAAAsgBEEBSA0AIANBAXEhBSAHBH8gA0H+////B3EhAkEAIQEDQCABQQl0IgZBEHJB4IkSakGwiQJBgAT8CgAAIAZBkARyQeCJEmpBsIkCQYAE/AoAACABQQJqIQEgAkECayICDQALIAFBB3RBBHIFQQQLIQEgBQRAIAFBAnRB4IkSakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEEIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiA0EQckHwiRZqQbCJAkGABPwKAAAgA0GQBHJB8IkWakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAERQ0AIAFBAnRB8IkWakGwiQJBgAT8CgAAC0HUCCAIQQd0QQRyNgIAC58TAgh/AX5B5AgoAgAhA0HgCCgCACECQegIKAIAIQcgAUGQiQFqIglB/wE6AAAgACABSARAIABBkIkBaiEIA0AgAiEEIAhBAWohAQJAIAgtAABB/wBxIgJBMGtBCUsEQCABIQgMAQtB7AgoAgBBAnRB7AhqIgUoAgAhAANAIAUgAiAAQQpsakEwayIANgIAIAEtAAAhAiABQQFqIgghASACQf8AcSICQTBrQQpJDQALCwJAAkACQAJAAkACQAJ/AkAgAkE/ayIAQT9NBEAgBEUNASAEQSFGBEBB8AgoAgAiAUEBIAEbIgQgB2ohAQJAIABFDQAgB0H//wBLDQBBgIABIAdrIAQgAUH//wBLGyEFAkAgAEEBcUUNACAHQQJ0QaCJAmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEECcUUNACAHQQJ0QbCJBmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEEEcUUNACAHQQJ0QcCJCmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEEIcUUNACAHQQJ0QdCJDmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLAkAgAEEQcUUNACAHQQJ0QeCJEmohAiAFIgRBB3EiBgRAA0AgAiADNgIAIAJBBGohAiAEQQFrIQQgBkEBayIGDQALCyAFQQFrQQdJDQADQCACIAM2AhwgAiADNgIYIAIgAzYCFCACIAM2AhAgAiADNgIMIAIgAzYCCCACIAM2AgQgAiADNgIAIAJBIGohAiAEQQhrIgQNAAsLIABBIHFFDQAgBUEBayEEIAdBAnRB8IkWaiEAIAVBB3EiAgRAA0AgACADNgIAIABBBGohACAFQQFrIQUgAkEBayICDQALCyAEQQdJDQADQCAAIAM2AhwgACADNgIYIAAgAzYCFCAAIAM2AhAgACADNgIMIAAgAzYCCCAAIAM2AgQgACADNgIAIABBIGohACAFQQhrIgUNAAsLIAhBAWoiBSAILQAAQf8AcSICQT9rIgBBP00NAxoMBAsCQEHsCCgCACIFQQFGBEBB8AgoAgAiAUHMCCgCACIESQ0BIAEgBHAhAQwBC0H4CCgCACEEQfQIKAIAIQECQAJAIAVBBUcNACABQQFHDQAgBEHpAk4NBAwBCyAEQeQASg0DQfwIKAIAQeQASg0DQYAJKAIAQeQASg0DCwJAIAFFDQAgAUECSg0AIARB/AgoAgBBgAkoAgAgAUECdEGICGooAgARAgAhBEHwCCgCACIBQcwIKAIAIgVPBH8gASAFcAUgAQtBAnRBkAlqIAQ2AgALQfAIKAIAIgFBzAgoAgAiBEkNACABIARwIQELIAFBAnRBkAlqKAIAIQMMAQsgAkH9AHFBIUcEQCAHIQEgAiEADAQLIARBI0cNBAJAQewIKAIAIgRBAUYEQEHwCCgCACIBQcwIKAIAIgBJDQEgASAAcCEBDAELQfgIKAIAIQFB9AgoAgAhAAJAAkAgBEEFRw0AIABBAUcNACABQekCSA0BDAcLIAFB5ABKDQZB/AgoAgBB5ABKDQZBgAkoAgBB5ABKDQYLAkAgAEUNACAAQQJKDQAgAUH8CCgCAEGACSgCACAAQQJ0QYgIaigCABECACEAQfAIKAIAIgFBzAgoAgAiBE8EfyABIARwBSABC0ECdEGQCWogADYCAAtB8AgoAgAiAUHMCCgCACIASQ0AIAEgAHAhAQsgAUECdEGQCWooAgAhAwwECyAHIQEgCAshBQNAIAFB//8ATQRAIABBAXEgAWxBAnRBoIkCaiADNgIAIABBAXZBAXEgAWxBAnRBsIkGaiADNgIAIABBAnZBAXEgAWxBAnRBwIkKaiADNgIAIABBA3ZBAXEgAWxBAnRB0IkOaiADNgIAIABBBHZBAXEgAWxBAnRB4IkSaiADNgIAIABBBXYgAWxBAnRB8IkWaiADNgIACyABQQFqIQEgBS0AACEAIAVBAWoiBCEFIABB/wBxIgJBP2siAEHAAEkNAAsgBCEFC0EAIQQgBSEIIAEhByACIQAgAkH9AHFBIUYNAQtBBCEHIAQhAiAAQSRrDgoDAgICAgICAgIBAgtB7AhCATcCAAwCC0GoCCgCAEEEaxAABEBB0AhBATYCAA8LAkBBqAgoAgAiBkEFSA0AQaAIKQMAIQogBkEDa0EBdiIBQQdxIQJBACEAIAFBAWtBB08EQCABQfj///8HcSEFA0AgAEEDdCIBQbCJAmogCjcDACABQQhyQbCJAmogCjcDACABQRByQbCJAmogCjcDACABQRhyQbCJAmogCjcDACABQSByQbCJAmogCjcDACABQShyQbCJAmogCjcDACABQTByQbCJAmogCjcDACABQThyQbCJAmogCjcDACAAQQhqIQAgBUEIayIFDQALCyACRQ0AA0AgAEEDdEGwiQJqIAo3AwAgAEEBaiEAIAJBAWsiAg0ACwtBwIkGQbCJAiAGQQJ0IgD8CgAAQdCJCkGwiQIgAPwKAABB4IkOQbCJAiAA/AoAAEHwiRJBsIkCIAD8CgAAQYCKFkGwiQIgAPwKAAAgBCECDAELAkAgAEE7Rw0AQewIKAIAIgBBB0oNAEHsCCAAQQFqNgIAIABBAnRB8AhqQQA2AgALIAEhBwsgCCAJSQ0ACwtB5AggAzYCAEHgCCACNgIAQegIIAc2AgAL4gcCBX8BfgJAQdAIAn8CQAJAIAAgAU4NACABQZCJAWohBiAAQZCJAWohBQNAIAUtAAAiA0H/AHEhAgJAAkACQAJAAkACQAJAQeAIKAIAIgRBIkcEQCAEDQcgAkEiRgRAQewIQgE3AgBB4AhBIjYCAAwICyACQT9rQcAASQ0GIANBIWsiAkEMTQ0BDAULAkAgAkEwayIEQQlNBEBB7AgoAgBBAnRB7AhqIgIgBCACKAIAQQpsajYCAAwBC0HsCCgCACEEIAJBO0YEQCAEQQdKDQFB7AggBEEBajYCACAEQQJ0QfAIakEANgIADAELIARBBEYEQEHECEECNgIAQbAIQfAIKQMANwMAQbgIQfgIKAIAIgI2AgBBvAhB/AgoAgAiBDYCAEHICEECQQFBwAgoAgAiAxs2AgBBrAggBEEAIAMbNgIAQagIIAJBgIABIAJBgIABSBtBBGpBACADGzYCAEHgCEEANgIADAoLIAJBP2tBwABJDQQLIANBIWsiAkEMTQ0BDAILQQEgAnRBjSBxRQ0DDAQLQQEgAnRBjSBxDQELIANBoQFrIgJBDEsNA0EBIAJ0QY0gcUUNAwtBxAhCgYCAgBA3AgBBsAhB8AgoAgBBAEHsCCgCACICQQBKGzYCAEG0CEH0CCgCAEEAIAJBAUobNgIAQbgIQfgIKAIAQQAgAkECShs2AgBB4AhBADYCAEG8CEEANgIADAQLIANBoQFrIgJBDEsNAUEBIAJ0QY0gcUUNAQtBxAhCgYCAgBA3AgBBsAhCADcDAEG4CEIANwMADAMLIAVBAWoiBSAGSQ0ACwsCQEHICCgCAA4DAwEAAQsCQEGoCCgCACIFQQVIDQBBoAgpAwAhByAFQQNrQQF2IgNBB3EhBEEAIQIgA0EBa0EHTwRAIANB+P///wdxIQYDQCACQQN0IgNBsIkCaiAHNwMAIANBCHJBsIkCaiAHNwMAIANBEHJBsIkCaiAHNwMAIANBGHJBsIkCaiAHNwMAIANBIHJBsIkCaiAHNwMAIANBKHJBsIkCaiAHNwMAIANBMHJBsIkCaiAHNwMAIANBOHJBsIkCaiAHNwMAIAJBCGohAiAGQQhrIgYNAAsLIARFDQADQCACQQN0QbCJAmogBzcDACACQQFqIQIgBEEBayIEDQALC0HAiQZBsIkCIAVBAnQiA/wKAABB0IkKQbCJAiAD/AoAAEHgiQ5BsIkCIAP8CgAAQfCJEkGwiQIgA/wKAABBgIoWQbCJAiAD/AoAAEECDAELEAhByAgoAgALEAEiAjYCACACDQAgACABQcgIKAIAQQJ0QYAIaigCABEBAAsLdABB6AhBBDYCAEHkCCAANgIAQewIQgE3AgBBxAhCADcCAEHACCADNgIAQdwIQgA3AgBBqAhCADcDAEGwCEIANwMAQbgIQgA3AwBBzAggAkGAICACQYAgSRs2AgBBoAggAa1CgYCAgBB+NwMAQdAIQQA2AgALIwBB0AgoAgBFBEAgACABQcgIKAIAQQJ0QYAIaigCABEBAAsLWgECfwJAAkACQEHICCgCAEEBaw4CAAECC0HYCEHoCCgCACIAQdgIKAIAIgEgACABShsiAEGAgAEgAEGAgAFIGyIANgIAIABBBGsPC0GoCCgCAEEEayEACyAAC0IBAX8Cf0EGQdwIKAIAIgBBIHENABpBBSAAQRBxDQAaQQQgAEEIcQ0AGkEDIABBBHENABpBAiAAQQFxIABBAnEbCwu9BQEFfQJ/IAJFBEAgAUH/AWxBMmpB5ABtIgBBCHQgAHIgAEEQdHIMAQsgArJDAADIQpUhBiAAQfABarJDAAC0Q5UhBQJ9IAGyQwAAyEKVIgNDAAAAP10EQCADIAZDAACAP5KUDAELIAYgA0MAAIA/IAaTlJILIQcgAyADkiEGAkAgBUOrqqo+kiIEQwAAAABdBEAgBEMAAIA/kiEEDAELIARDAACAP15FDQAgBEMAAIC/kiEECyAGIAeTIQMgBUMAAAAAXSEAAn8CfSADIAcgA5NDAADAQJQgBJSSIARDq6oqPl0NABogByAEQwAAAD9dDQAaIAMgBEOrqio/XUUNABogAyAHIAOTIARDAADAwJRDAACAQJKUkgtDAAB/Q5RDAAAAP5IiBkMAAIBPXSAGQwAAAABgcQRAIAapDAELQQALIQECQCAABEAgBUMAAIA/kiEEDAELIAUiBEMAAIA/XkUNACAFQwAAgL+SIQQLIAVDq6qqvpIiBUMAAAAAXSECAn8CfSADIAcgA5NDAADAQJQgBJSSIARDq6oqPl0NABogByAEQwAAAD9dDQAaIAMgBEOrqio/XUUNABogAyAHIAOTIARDAADAwJRDAACAQJKUkgtDAAB/Q5RDAAAAP5IiBkMAAIBPXSAGQwAAAABgcQRAIAapDAELQQALIQACQCACBEAgBUMAAIA/kiEFDAELIAVDAACAP15FDQAgBUMAAIC/kiEFCwJAIAVDq6oqPl0EQCADIAcgA5NDAADAQJQgBZSSIQcMAQsgBUMAAAA/XQ0AIAVDq6oqP11FBEAgAyEHDAELIAMgByADkyAFQwAAwMCUQwAAgECSlJIhBwsgAEEIdAJ/IAdDAAB/Q5RDAAAAP5IiBkMAAIBPXSAGQwAAAABgcQRAIAapDAELQQALQRB0ciABcgtBgICAeHILNwAgAEH/AWxBMmpB5ABtIAFB/wFsQTJqQeQAbUEIdHIgAkH/AWxBMmpB5ABtQRB0ckGAgIB4cgsEACMACwYAIAAkAAsQACMAIABrQXBxIgAkACAACwsYAQBBgAgLEQEAAAACAAAAAwAAAAQAAAAF'\n};\n//# sourceMappingURL=wasm.js.map","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent<T> {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter<T> {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent<T> | undefined;\n\n public get event(): IEvent<T> {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward<T>(from: IEvent<T>, to: Emitter<T>): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map<I, O>(event: IEvent<I>, map: (i: I) => O): IEvent<O> {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any<T>(...events: IEvent<T>[]): IEvent<T>;\n export function any(...events: IEvent<any>[]): IEvent<void>;\n export function any<T>(...events: IEvent<T>[]): IEvent<T> {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set<IDisposable>();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add<T extends IDisposable>(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register<T extends IDisposable>(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\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 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 * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './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 public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\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 payload: Object | undefined;\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 public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\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 && this.payload === undefined;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\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 public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\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 alignment.\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.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\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.HAS_CONTENT_MASK)`\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.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\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..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\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;\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]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\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) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IImageAddonOptions, IOscHandler, IResetHandler, ITerminalExt } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { CELL_SIZE_DEFAULT } from './ImageStorage';\nimport Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport QoiDecoder from 'xterm-wasm-parts/lib/qoi/QoiDecoder.wasm';\nimport { HeaderParser, IHeaderFields, HeaderState, SequenceType } from './IIPHeaderParser';\nimport { imageType, UNSUPPORTED_TYPE } from './IIPMetrics';\n\n// Local const enum mirror - esbuild can't inline const enums from external packages\nconst enum DecoderConst {\n // Held memory in base64/QOI decoders between images. Zero because each kept\n // decoder pins a wasm memory, and V8 caps those per process (~124 in a\n // sandboxed renderer), so idle terminals must not hold one.\n KEEP_DATA = 0,\n // Initial buffer allocation for the decoder.\n INITIAL_DATA = 1048576,\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n OK = 0\n}\n\n// default IIP header values\nconst DEFAULT_HEADER: IHeaderFields = {\n type: SequenceType.INVALID,\n name: 'Unnamed file',\n size: 0,\n width: 'auto',\n height: 'auto',\n preserveAspectRatio: 1,\n inline: 0\n};\n\n\nexport class IIPHandler implements IOscHandler, IResetHandler {\n private _generation = 0;\n private _aborted = false;\n private _hp = new HeaderParser();\n private _header: IHeaderFields = DEFAULT_HEADER;\n private _dec: Base64Decoder;\n private _qoiDec: QoiDecoder;\n private _isMultipart = false;\n private _abortMulti = false;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _storage: IIPImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n const maxEncodedBytes = Math.ceil(this._opts.iipSizeLimit * 4 / 3);\n const initialBytes = Math.min(DecoderConst.INITIAL_DATA, maxEncodedBytes);\n this._dec = new Base64Decoder(DecoderConst.KEEP_DATA, maxEncodedBytes, initialBytes);\n this._qoiDec = new QoiDecoder(DecoderConst.KEEP_DATA);\n }\n\n public reset(): void {\n this._generation++;\n this._hp.reset();\n this._dec.release();\n this._qoiDec.release();\n }\n\n public start(): void {\n this._aborted = false;\n this._hp.reset();\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (this._hp.state === HeaderState.END) {\n if ((this._dec.put(data.subarray(start, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n }\n } else {\n const dataPos = this._hp.parse(data, start, end);\n if (dataPos === -1) {\n this._aborted = true;\n return;\n }\n if (dataPos > 0) {\n const seqType = this._hp.fields.type;\n if (seqType === SequenceType.FILE) {\n if (this._isMultipart) {\n this._isMultipart = false;\n this._abortMulti = false;\n this._dec.release();\n }\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n if (!this._header.inline) {\n this._aborted = true;\n return;\n }\n if (!this._initDecoder()) {\n this._aborted = true;\n return;\n }\n } else if (this._abortMulti) {\n this._aborted = true;\n return;\n }\n if ((this._dec.put(data.subarray(dataPos, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n if (this._isMultipart) this._abortMulti = true;\n }\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted) return true;\n\n if (this._hp.state !== HeaderState.END) {\n if (this._hp.end()) return true;\n }\n const seqType = this._hp.fields.type;\n\n if (seqType === SequenceType.FILEPART) return true;\n\n if (seqType === SequenceType.REPORTCELLSIZE) {\n // OSC 1337 ; ReportCellSize=[height];[width];[scale] ST\n let w = CELL_SIZE_DEFAULT.width;\n let h = CELL_SIZE_DEFAULT.height;\n if (this._renderer.dimensions) {\n w = this._renderer.dimensions.css.canvas.width / this._coreTerminal.cols;\n h = this._renderer.dimensions.css.canvas.height / this._coreTerminal.rows;\n }\n const scale = this._coreTerminal._core._coreBrowserService?.dpr ?? 1;\n const report = `\\x1b]1337;ReportCellSize=${h.toFixed(3)};${w.toFixed(3)};${scale.toFixed(3)}\\x1b\\\\`;\n this._coreTerminal.input(report, false);\n return true;\n }\n\n if (seqType === SequenceType.MULTIPARTFILE) {\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n this._isMultipart = true;\n this._abortMulti = false;\n this._dec.release();\n if (!this._initDecoder()) {\n this._abortMulti = true;\n }\n return true;\n }\n\n if (seqType === SequenceType.FILEEND) {\n if (!this._isMultipart) return true;\n this._isMultipart = false;\n if (this._abortMulti || this._header.type !== SequenceType.MULTIPARTFILE) return true;\n }\n\n // fallthrough for SequenceType.FILE & SequenceType.FILEEND\n\n let w = 0;\n let h = 0;\n\n // early exit condition chain\n let cond: number | boolean;\n let metrics = UNSUPPORTED_TYPE;\n if (cond = success) {\n if (cond = !this._dec.end()) {\n metrics = imageType(this._dec.data8);\n if (cond = metrics.mime !== 'unsupported') {\n w = metrics.width;\n h = metrics.height;\n if (cond = w && h && w * h < this._opts.pixelLimit) {\n [w, h] = this._resize(w, h).map(Math.floor);\n cond = w && h && w * h < this._opts.pixelLimit;\n } else {\n console.warn(`IIP: image dimension issue ${metrics.width}x${metrics.height}`);\n }\n } else {\n console.warn('IIP: unsupported image type');\n }\n } else {\n console.warn('IIP: error during BASE64 decoding');\n }\n }\n if (!cond) {\n this._dec.release();\n return true;\n }\n\n let blob: Blob | ImageData;\n if (metrics.mime === 'image/qoi') {\n let data: Uint8Array<ArrayBuffer>;\n try {\n data = this._qoiDec.decode(this._dec.data8);\n } catch (e) {\n console.warn('IIP: could not decode QOI image', e);\n this._dec.release();\n this._qoiDec.release();\n return true;\n }\n blob = new ImageData(\n new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength),\n this._qoiDec.width,\n this._qoiDec.height\n );\n this._qoiDec.release();\n if (w === this._qoiDec.width && h === this._qoiDec.height) {\n // use fast-path if we don't need to rescale\n this._dec.release();\n const canvas = ImageRenderer.createCanvas(undefined, this._qoiDec.width, this._qoiDec.height);\n canvas.getContext('2d')?.putImageData(blob, 0, 0);\n this._storage.addImage(canvas);\n return true;\n }\n } else {\n blob = new Blob([this._dec.data8], { type: metrics.mime });\n }\n this._dec.release();\n const generation = this._generation;\n return createImageBitmap(blob, { resizeWidth: w, resizeHeight: h })\n .then(bm => {\n if (generation !== this._generation) {\n bm.close();\n return true;\n }\n this._storage.addImage(bm);\n return true;\n })\n .catch(e => {\n console.warn(`IIP: decoding error ${metrics.mime} ${metrics.width}x${metrics.height}`, e);\n return true;\n });\n }\n\n // Why: wasm memory exhaustion must drop this image, not throw out of the parser and wedge the write queue.\n private _initDecoder(): boolean {\n try {\n this._dec.init();\n return true;\n } catch (e) {\n console.warn('IIP: could not allocate decoder', e);\n this._dec.release();\n return false;\n }\n }\n\n private _resize(w: number, h: number): [number, number] {\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n const width = this._renderer.dimensions?.css.canvas.width || cw * this._coreTerminal.cols;\n const height = this._renderer.dimensions?.css.canvas.height || ch * this._coreTerminal.rows;\n\n const rw = this._dim(this._header.width!, width, cw);\n const rh = this._dim(this._header.height!, height, ch);\n if (!rw && !rh) {\n const wf = width / w; // TODO: should this respect initial cursor offset?\n const hf = (height - ch) / h; // TODO: fix offset issues from float cell height\n const f = Math.min(wf, hf);\n return f < 1 ? [w * f, h * f] : [w, h];\n }\n return !rw\n ? [w * rh / h, rh]\n : this._header.preserveAspectRatio || !rw || !rh\n ? [rw, h * rw / w] : [rw, rh];\n }\n\n private _dim(s: string, total: number, cdim: number): number {\n if (s === 'auto') return 0;\n if (s.endsWith('%')) return parseInt(s.slice(0, -1), 10) * total / 100;\n if (s.endsWith('px')) return parseInt(s.slice(0, -2), 10);\n return parseInt(s, 10) * cdim;\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// eslint-disable-next-line\ndeclare const Buffer: any;\n\nexport const enum HeaderState {\n START = 0,\n ABORT = 1,\n KEY = 2,\n VALUE = 3,\n END = 4\n}\n\nexport const enum SequenceType {\n INVALID = 0,\n FILE = 1,\n MULTIPARTFILE = 2,\n FILEPART = 3,\n FILEEND = 4,\n REPORTCELLSIZE = 5\n}\n\nexport interface IHeaderFields {\n [key: string]: number | string | Uint32Array | null | undefined;\n // sequence type\n type: SequenceType;\n // base-64 encoded filename. Defaults to \"Unnamed file\".\n name: string;\n // File size in bytes. The file transfer will be canceled if this size is exceeded.\n size: number;\n /**\n * Optional width and height to render:\n * - N: N character cells.\n * - Npx: N pixels.\n * - N%: N percent of the session's width or height.\n * - auto: The image's inherent size will be used to determine an appropriate dimension.\n */\n width?: string;\n height?: string;\n // Optional, defaults to 1 respecting aspect ratio (width takes precedence).\n preserveAspectRatio?: number;\n // Optional, defaults to 0. If set to 1, the file will be displayed inline, else downloaded\n // (download not supported).\n inline?: number;\n}\n\n// field value decoders\n\n// ASCII bytes to string\nfunction toStr(data: Uint32Array): string {\n let s = '';\n for (let i = 0; i < data.length; ++i) {\n s += String.fromCharCode(data[i]);\n }\n return s;\n}\n\n// digits to integer\nfunction toInt(data: Uint32Array): number {\n let v = 0;\n for (let i = 0; i < data.length; ++i) {\n if (data[i] < 48 || data[i] > 57) {\n throw new Error('illegal char');\n }\n v = v * 10 + data[i] - 48;\n }\n return v;\n}\n\n// check for correct size entry\nfunction toSize(data: Uint32Array): string {\n const v = toStr(data);\n if (!v.match(/^((auto)|(\\d+?((px)|(%)){0,1}))$/)) {\n throw new Error('illegal size');\n }\n return v;\n}\n\n// name is base64 encoded utf-8\nfunction toName(data: Uint32Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(toStr(data), 'base64').toString();\n }\n const bs = atob(toStr(data));\n const b = new Uint8Array(bs.length);\n for (let i = 0; i < b.length; ++i) {\n b[i] = bs.charCodeAt(i);\n }\n return new TextDecoder().decode(b);\n}\n\nconst DECODERS: {[key: string]: (v: Uint32Array) => number | string} = {\n inline: toInt,\n size: toInt,\n name: toName,\n width: toSize,\n height: toSize,\n preserveAspectRatio: toInt\n};\n\n\n// sequence type markers\n// File\nconst FILE_MARKER = [70, 105, 108, 101];\n// MultipartFile\nconst MULTIPARTFILE_MARKER = [77, 117, 108, 116, 105, 112, 97, 114, 116, 70, 105, 108, 101];\n// FilePart\nconst FILEPART_MARKER = [70, 105, 108, 101, 80, 97, 114, 116];\n// FileEnd\nconst FILEEND_MARKER = [70, 105, 108, 101, 69, 110, 100];\n// ReportCellSize\nconst REPORTCELLSIZE_MARKER = [82, 101, 112, 111, 114, 116, 67, 101, 108, 108, 83, 105, 122, 101];\n\n// max allowed chars for sequence header\nconst MAX_FIELDCHARS = 1024;\n\n\nexport class HeaderParser {\n public state: HeaderState = HeaderState.START;\n private _buffer = new Uint32Array(MAX_FIELDCHARS);\n private _position = 0;\n private _key = '';\n public fields: {[key: string]: number | string | Uint32Array | null | undefined} = {};\n\n public reset(): void {\n this._buffer.fill(0);\n this.state = HeaderState.START;\n this._position = 0;\n this.fields = {};\n this._key = '';\n }\n\n public end(): number {\n if (this.state === HeaderState.START) {\n if (this._position === FILEEND_MARKER.length) {\n for (let k = 0; k < FILEEND_MARKER.length; ++k) {\n if (this._buffer[k] !== FILEEND_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEEND;\n this.state = HeaderState.END;\n return 0;\n }\n if (this._position === REPORTCELLSIZE_MARKER.length) {\n for (let k = 0; k < REPORTCELLSIZE_MARKER.length; ++k) {\n if (this._buffer[k] !== REPORTCELLSIZE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.REPORTCELLSIZE;\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n if (this.state === HeaderState.END) return 0;\n if (this.state === HeaderState.VALUE\n && this.fields.type === SequenceType.MULTIPARTFILE\n ) {\n if (!this._storeValue(this._position)) return this._a();\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n\n public parse(data: Uint32Array, start: number, end: number): number {\n let state = this.state;\n let pos = this._position;\n const buffer = this._buffer;\n if (state === HeaderState.ABORT || state === HeaderState.END) return -1;\n if (state === HeaderState.START && pos > 14) return -1;\n for (let i = start; i < end; ++i) {\n const c = data[i];\n switch (c) {\n case 59: // ;\n if (!this._storeValue(pos)) return this._a();\n state = HeaderState.KEY;\n pos = 0;\n break;\n case 61: // =\n if (state === HeaderState.START) {\n if (buffer[0] === 70) {\n // 'File' or 'FilePart'\n let k = 0;\n for (; k < FILE_MARKER.length; ++k) {\n if (buffer[k] !== FILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILE;\n if (pos === FILEPART_MARKER.length) {\n for (; k < FILEPART_MARKER.length; ++k) {\n if (buffer[k] !== FILEPART_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEPART;\n this.state = HeaderState.END;\n return i + 1;\n }\n } else if (buffer[0] === 77) {\n // 'MultipartFile'\n for (let k = 0; k < MULTIPARTFILE_MARKER.length; ++k) {\n if (buffer[k] !== MULTIPARTFILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.MULTIPARTFILE;\n } else {\n return this._a();\n }\n state = HeaderState.KEY;\n pos = 0;\n } else if (state === HeaderState.KEY) {\n if (!this._storeKey(pos)) return this._a();\n state = HeaderState.VALUE;\n pos = 0;\n } else if (state === HeaderState.VALUE) {\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n break;\n case 58: // :\n if (state === HeaderState.VALUE) {\n if (!this._storeValue(pos)) return this._a();\n }\n this.state = HeaderState.END;\n return i + 1;\n default:\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n }\n this.state = state;\n this._position = pos;\n return -2;\n }\n\n private _a(): number {\n this.fields.type = SequenceType.INVALID;\n this.state = HeaderState.ABORT;\n return -1;\n }\n\n private _storeKey(pos: number): boolean {\n const k = toStr(this._buffer.subarray(0, pos));\n if (k) {\n this._key = k;\n this.fields[k] = null;\n return true;\n }\n return false;\n }\n\n private _storeValue(pos: number): boolean {\n if (this._key) {\n try {\n const v = this._buffer.slice(0, pos);\n this.fields[this._key] = DECODERS[this._key] ? DECODERS[this._key](v) : v;\n } catch {\n return false;\n }\n return true;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAddImageOpts } from './Types';\nimport { ImageStorage } from './ImageStorage';\n\n/**\n * IIP (iTerm Image Protocol) specific image storage controller.\n *\n * Wraps the shared ImageStorage with IIP protocol semantics:\n * - Always uses scrolling mode (cursor advances with image)\n */\nexport class IIPImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n constructor(\n private readonly _storage: ImageStorage\n ) {}\n\n /**\n * Add an IIP image to storage.\n * Always uses scrolling mode — cursor advances past the image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._storage.addImage(img, this._addImageOpts);\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\nexport type ImageType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/qoi' | 'image/webp' | 'image/avif' | 'unsupported' | '';\n\nexport interface IMetrics {\n mime: ImageType;\n width: number;\n height: number;\n}\n\nexport const UNSUPPORTED_TYPE: IMetrics = {\n mime: 'unsupported',\n width: 0,\n height: 0\n};\n\nexport function imageType(d: Uint8Array): IMetrics {\n if (d.length < 32) {\n return UNSUPPORTED_TYPE;\n }\n const d32 = new Uint32Array(d.buffer, d.byteOffset, 8);\n // PNG: 89 50 4E 47 0D 0A 1A 0A (8 first bytes == magic number for PNG)\n // + first chunk must be IHDR\n if (d32[0] === 0x474E5089 && d32[1] === 0x0A1A0A0D && d32[3] === 0x52444849) {\n return {\n mime: 'image/png',\n width: d[16] << 24 | d[17] << 16 | d[18] << 8 | d[19],\n height: d[20] << 24 | d[21] << 16 | d[22] << 8 | d[23]\n };\n }\n // JPEG: FF D8 FF\n if (d[0] === 0xFF && d[1] === 0xD8 && d[2] === 0xFF) {\n const [width, height] = jpgSize(d);\n return { mime: 'image/jpeg', width, height };\n }\n // GIF: GIF87a or GIF89a\n if (d32[0] === 0x38464947 && (d[4] === 0x37 || d[4] === 0x39) && d[5] === 0x61) {\n return {\n mime: 'image/gif',\n width: d[7] << 8 | d[6],\n height: d[9] << 8 | d[8]\n };\n }\n // QOI: qoif\n if (d32[0] === 0x66696F71) {\n return {\n mime: 'image/qoi',\n width: d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7],\n height: d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11]\n };\n }\n // WEBP: RIFF | xxxx | WEBP | VP8x\n if (d32[0] === 0x46464952 && d32[2] === 0x50424557 && (d32[3] & 0xFFFFFF) === 0x385056) {\n switch (d[15]) {\n case 0x58: // Extended WebP VP8X --> \"X\"\n return {\n mime: 'image/webp',\n width: (d[24] | d[25] << 8 | d[26] << 16) + 1,\n height: (d[27] | d[28] << 8 | d[29] << 16) + 1\n };\n case 0x4C: // Lossless WebP VP8L --> \"L\"\n if (d[20] !== 0x2f) return UNSUPPORTED_TYPE;\n const dim = d[21] | d[22] << 8 | d[23] << 16 | d[24] << 24;\n return {\n mime: 'image/webp',\n width: (dim & 0x3FFF) + 1,\n height: (dim >>> 14 & 0x3FFF) + 1\n };\n case 0x20: // Lossy WebP VP8 --> \" \"\n if (d[23] !== 0x9d || d[24] !== 0x01 || d[25] !== 0x2a) return UNSUPPORTED_TYPE;\n return {\n mime: 'image/webp',\n width: (d[26] | d[27] << 8) & 0x3FFF,\n height: (d[28] | d[29] << 8) & 0x3FFF\n };\n }\n return UNSUPPORTED_TYPE;\n }\n // AVIF: Box size | ftyp | avif/avis\n if (d32[1] === 0x70797466 && (d32[2] === 0x66697661 || d32[2] === 0x73697661)) {\n let pos = -1;\n // search for ispe box within first 1024 bytes\n const limit = Math.min(d.length - 16, 1024);\n for (let i = 8; i < limit; i++) {\n // scan for ispe\n if (d[i] === 0x69 && d[i + 1] === 0x73 && d[i + 2] === 0x70 && d[i + 3] === 0x65) {\n pos = i;\n break;\n }\n }\n if (pos !== -1) {\n // dimensions are in BE at +8 (width) at +12 (height)\n const width =\n d[pos + 8] << 24 |\n d[pos + 9] << 16 |\n d[pos + 10] << 8 |\n d[pos + 11];\n const height =\n d[pos + 12] << 24 |\n d[pos + 13] << 16 |\n d[pos + 14] << 8 |\n d[pos + 15];\n if (width > 0 && height > 0) {\n return { mime: 'image/avif', width, height };\n }\n }\n return UNSUPPORTED_TYPE;\n }\n return UNSUPPORTED_TYPE;\n}\n\n\nfunction jpgSize(d: Uint8Array): [number, number] {\n const len = d.length;\n let i = 4;\n let blockLength = d[i] << 8 | d[i + 1];\n while (true) {\n i += blockLength;\n if (i >= len) {\n // exhausted without size info\n return [0, 0];\n }\n if (d[i] !== 0xFF) {\n return [0, 0];\n }\n if (d[i + 1] === 0xC0 || d[i + 1] === 0xC2) {\n if (i + 8 < len) {\n return [\n d[i + 7] << 8 | d[i + 8],\n d[i + 5] << 8 | d[i + 6]\n ];\n }\n return [0, 0];\n }\n i += 2;\n blockLength = d[i] << 8 | d[i + 1];\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toRGBA8888 } from 'sixel/lib/Colors';\nimport { IDisposable } from '@xterm/xterm';\nimport { ICellSize, ImageLayer, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\n\nconst enum Constants {\n PLACEHOLDER_LENGTH = 4096,\n PLACEHOLDER_HEIGHT = 24\n}\n\n/**\n * ImageRenderer - terminal frontend extension:\n * - provide primitives for canvas, ImageData, Bitmap (static)\n * - add canvas layer to DOM (browser only for now)\n * - draw image tiles onRender\n */\nexport class ImageRenderer extends Disposable implements IDisposable {\n /** @deprecated Kept for backward compat — points to top layer canvas. */\n public get canvas(): HTMLCanvasElement | undefined { return this._layers.get('top')?.canvas; }\n private _layers = new Map<ImageLayer, CanvasRenderingContext2D>();\n private _placeholder: HTMLCanvasElement | undefined;\n private _placeholderBitmap: ImageBitmap | undefined;\n private _optionsRefresh = this._register(new MutableDisposable());\n private _oldOpen: ((parent: HTMLElement) => void) | undefined;\n private _renderService: IRenderService | undefined;\n private _oldSetRenderer: ((renderer: any) => void) | undefined;\n\n // drawing primitive - canvas\n public static createCanvas(localDocument: Document | undefined, width: number, height: number): HTMLCanvasElement {\n /**\n * NOTE: We normally dont care, from which document the canvas\n * gets created, so we can fall back to global document,\n * if the terminal has no document associated yet.\n * This way early image loads before calling .open keep working\n * (still discouraged though, as the metrics will be screwed up).\n * Only the DOM output canvas should be on the terminal's document,\n * which gets explicitly checked in `insertLayerToDom`.\n */\n const canvas = (localDocument ?? document).createElement('canvas');\n canvas.width = width | 0;\n canvas.height = height | 0;\n return canvas;\n }\n\n // drawing primitive - ImageData with optional buffer\n public static createImageData(ctx: CanvasRenderingContext2D, width: number, height: number, buffer?: ArrayBuffer): ImageData {\n if (typeof ImageData !== 'function') {\n const imgData = ctx.createImageData(width, height);\n if (buffer) {\n imgData.data.set(new Uint8ClampedArray(buffer, 0, width * height * 4));\n }\n return imgData;\n }\n return buffer\n ? new ImageData(new Uint8ClampedArray(buffer, 0, width * height * 4), width, height)\n : new ImageData(width, height);\n }\n\n // drawing primitive - ImageBitmap\n public static createImageBitmap(img: ImageBitmapSource): Promise<ImageBitmap | undefined> {\n if (typeof createImageBitmap !== 'function') {\n return Promise.resolve(undefined);\n }\n return createImageBitmap(img);\n }\n\n\n constructor(private _terminal: ITerminalExt) {\n super();\n this._oldOpen = this._terminal._core.open;\n this._terminal._core.open = (parent: HTMLElement): void => {\n this._oldOpen?.call(this._terminal._core, parent);\n this._open();\n };\n if (this._terminal._core.screenElement) {\n this._open();\n }\n // hack to spot fontSize changes\n this._optionsRefresh.value = this._terminal._core.optionsService.onOptionChange(option => {\n if (option === 'fontSize') {\n this.rescaleCanvas();\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n });\n this._register(toDisposable(() => {\n this.removeLayerFromDom();\n this.removeLayerFromDom('bottom');\n if (this._terminal._core && this._oldOpen) {\n this._terminal._core.open = this._oldOpen;\n this._oldOpen = undefined;\n }\n if (this._renderService && this._oldSetRenderer) {\n this._renderService.setRenderer = this._oldSetRenderer;\n this._oldSetRenderer = undefined;\n }\n this._renderService = undefined;\n this._layers.clear();\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }));\n }\n\n /**\n * Enable the placeholder.\n */\n public showPlaceholder(value: boolean): void {\n if (value) {\n if (!this._placeholder && this.cellSize.height !== -1) {\n this._createPlaceHolder(Math.max(this.cellSize.height + 1, Constants.PLACEHOLDER_HEIGHT));\n }\n } else {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n\n /**\n * Dimensions of the terminal.\n * Forwarded from internal render service.\n */\n public get dimensions(): IRenderDimensions | undefined {\n return this._terminal.dimensions;\n }\n\n /**\n * Current cell size (float).\n */\n public get cellSize(): ICellSize {\n return {\n width: this.dimensions?.css.cell.width || -1,\n height: this.dimensions?.css.cell.height || -1\n };\n }\n\n public refreshAll(): void {\n this._renderService?.refreshRows(0, this._terminal.rows - 1);\n }\n\n /**\n * Clear a region of the image layer canvas.\n */\n public clearLines(start: number, end: number, layer?: ImageLayer): void {\n const y = start * (this.dimensions?.css.cell.height || 0);\n const w = this.dimensions?.css.canvas.width || 0;\n const h = (end + 1 - start) * (this.dimensions?.css.cell.height || 0);\n if (!layer || layer === 'top') {\n this._layers.get('top')?.clearRect(0, y, w, h);\n }\n if (!layer || layer === 'bottom') {\n this._layers.get('bottom')?.clearRect(0, y, w, h);\n }\n }\n\n /**\n * Clear whole image canvas.\n */\n public clearAll(layer?: ImageLayer): void {\n if (!layer || layer === 'top') {\n const ctx = this._layers.get('top');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n if (!layer || layer === 'bottom') {\n const ctx = this._layers.get('bottom');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }\n\n /**\n * Draw neighboring tiles on the image layer canvas.\n */\n public draw(imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get(imgSpec.layer);\n if (!ctx) {\n return;\n }\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const { width: sourceWidth, height: sourceHeight } = imgSpec.actualCellSize;\n const cols = Math.ceil(img.width / sourceWidth);\n\n const sx = (tileId % cols) * sourceWidth;\n const sy = Math.floor(tileId / cols) * sourceHeight;\n const dx = col * width;\n const dy = row * height;\n\n // safari bug: never access image source out of bounds\n const finalWidth = count * sourceWidth + sx > img.width ? img.width - sx : count * sourceWidth;\n const finalHeight = sy + sourceHeight > img.height ? img.height - sy : sourceHeight;\n\n // Floor all pixel offsets to get stable tile mapping without any overflows.\n // Note: For not pixel perfect aligned cells like in the DOM renderer\n // this will move a tile slightly to the top/left (subpixel range, thus ignore it).\n // FIX #34: avoid striping on displays with pixelDeviceRatio != 1 by ceiling height and width\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.ceil(finalWidth), Math.ceil(finalHeight),\n Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth * width / sourceWidth), Math.ceil(finalHeight * height / sourceHeight)\n );\n }\n\n // Fit the original source into the cell grid without distorting its aspect ratio.\n public drawCellImage(imgSpec: IImageSpec, boxCols: number, boxRows: number, gridRow: number, gridCol: number, count: number, col: number, row: number): void {\n const ctx = this._layers.get(imgSpec.layer);\n if (!ctx) {\n return;\n }\n const { width, height } = this.cellSize;\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n const img = imgSpec.orig;\n if (!img) {\n return;\n }\n\n const boxWidth = boxCols * width;\n const boxHeight = boxRows * height;\n const fitWidth = img.width * boxHeight > img.height * boxWidth;\n const scale = fitWidth\n ? boxWidth / Math.max(1, img.width)\n : boxHeight / Math.max(1, img.height);\n const xOffset = fitWidth ? 0 : (boxWidth - img.width * scale) / 2;\n const yOffset = fitWidth ? (boxHeight - img.height * scale) / 2 : 0;\n\n // Clip source and destination together so edge tiles are not stretched.\n let dx = col * width;\n let dy = row * height;\n let dw = count * width;\n let dh = height;\n let sx = (gridCol * width - xOffset) / scale;\n let sy = (gridRow * height - yOffset) / scale;\n let sw = dw / scale;\n let sh = dh / scale;\n if (sx < 0) {\n const clipped = -sx * scale;\n dx += clipped;\n dw -= clipped;\n sw += sx;\n sx = 0;\n }\n if (sy < 0) {\n const clipped = -sy * scale;\n dy += clipped;\n dh -= clipped;\n sh += sy;\n sy = 0;\n }\n if (sx + sw > img.width) {\n sw = img.width - sx;\n dw = sw * scale;\n }\n if (sy + sh > img.height) {\n sh = img.height - sy;\n dh = sh * scale;\n }\n if (sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {\n return;\n }\n ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n\n /**\n * Extract a single tile from an image.\n */\n public extractTile(imgSpec: IImageSpec, tileId: number): HTMLCanvasElement | undefined {\n const { width, height } = this.cellSize;\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const { width: sourceWidth, height: sourceHeight } = imgSpec.actualCellSize;\n const cols = Math.ceil(img.width / sourceWidth);\n const sx = (tileId % cols) * sourceWidth;\n const sy = Math.floor(tileId / cols) * sourceHeight;\n const finalWidth = sourceWidth + sx > img.width ? img.width - sx : sourceWidth;\n const finalHeight = sy + sourceHeight > img.height ? img.height - sy : sourceHeight;\n\n const canvas = ImageRenderer.createCanvas(this.document, Math.ceil(finalWidth * width / sourceWidth), Math.ceil(finalHeight * height / sourceHeight));\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.floor(finalWidth), Math.floor(finalHeight),\n 0, 0, canvas.width, canvas.height\n );\n return canvas;\n }\n }\n\n /**\n * Draw a line with placeholder on the image layer canvas.\n */\n public drawPlaceholder(col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get('top');\n if (ctx) {\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n if (!this._placeholder) {\n this._createPlaceHolder(Math.max(height + 1, Constants.PLACEHOLDER_HEIGHT));\n } else if (height >= this._placeholder!.height) {\n this._createPlaceHolder(height + 1);\n }\n if (!this._placeholder) return;\n ctx.drawImage(\n this._placeholderBitmap ?? this._placeholder!,\n col * width,\n (row * height) % 2 ? 0 : 1, // needs %2 offset correction\n width * count,\n height,\n col * width,\n row * height,\n width * count,\n height\n );\n }\n }\n\n /**\n * Rescale image layer canvas if needed.\n * Checked once from `ImageStorage.render`.\n */\n public rescaleCanvas(): void {\n const w = this.dimensions?.css.canvas.width || 0;\n const h = this.dimensions?.css.canvas.height || 0;\n for (const ctx of this._layers.values()) {\n if (ctx.canvas.width !== w || ctx.canvas.height !== h) {\n ctx.canvas.width = w;\n ctx.canvas.height = h;\n }\n }\n }\n\n /**\n * Rescale image in storage if needed.\n */\n private _rescaleImage(spec: IImageSpec, currentWidth: number, currentHeight: number): void {\n if (currentWidth === spec.actualCellSize.width && currentHeight === spec.actualCellSize.height) {\n return;\n }\n const { width: originalWidth, height: originalHeight } = spec.origCellSize;\n if (currentWidth === originalWidth && currentHeight === originalHeight) {\n spec.actual = spec.orig;\n spec.actualCellSize.width = originalWidth;\n spec.actualCellSize.height = originalHeight;\n return;\n }\n const scaledWidth = Math.ceil(spec.orig!.width * currentWidth / originalWidth);\n const scaledHeight = Math.ceil(spec.orig!.height * currentHeight / originalHeight);\n // Upscale visible tiles directly; a full zoomed copy can dwarf the image budget.\n if (scaledWidth * scaledHeight > spec.orig!.width * spec.orig!.height) {\n spec.actual = spec.orig;\n spec.actualCellSize.width = originalWidth;\n spec.actualCellSize.height = originalHeight;\n return;\n }\n const canvas = ImageRenderer.createCanvas(this.document, scaledWidth, scaledHeight);\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(spec.orig!, 0, 0, canvas.width, canvas.height);\n spec.actual = canvas;\n spec.actualCellSize.width = currentWidth;\n spec.actualCellSize.height = currentHeight;\n }\n }\n\n /**\n * Lazy init for the renderer.\n */\n private _open(): void {\n this._renderService = this._terminal._core._renderService;\n this._oldSetRenderer = this._renderService.setRenderer.bind(this._renderService);\n this._renderService.setRenderer = (renderer: any) => {\n for (const key of [...this._layers.keys()]) {\n this.removeLayerFromDom(key);\n }\n this._oldSetRenderer?.call(this._renderService, renderer);\n };\n }\n\n public insertLayerToDom(layer: ImageLayer = 'top'): void {\n // make sure that the terminal is attached to a document and to DOM\n if (!this.document || !this._terminal._core.screenElement) {\n console.warn('image addon: cannot insert output canvas to DOM, missing document or screenElement');\n return;\n }\n if (this._layers.has(layer)) {\n return;\n }\n const canvas = ImageRenderer.createCanvas(\n this.document, this.dimensions?.css.canvas.width || 0,\n this.dimensions?.css.canvas.height || 0\n );\n canvas.classList.add(`xterm-image-layer-${layer}`);\n const screenElement = this._terminal._core.screenElement;\n // Use isolation to create a stacking context without overriding z-index,\n // which would conflict with integrators (e.g. VS Code) that set their\n // own z-index on the screen element.\n screenElement.style.isolation = 'isolate';\n if (layer === 'bottom') {\n // Use z-index:-1 so it paints behind non-positioned text elements.\n // The screen element needs to be a stacking context (via isolation)\n // to contain the negative z-index, otherwise it would go behind the\n // entire terminal.\n canvas.style.zIndex = '-1';\n screenElement.insertBefore(canvas, screenElement.firstChild);\n } else {\n // Explicit z-index ensures the image canvas reliably stacks above\n // the text layer (DOM renderer rows). z-index: 0 is below the\n // selection overlay (z-index: 1).\n canvas.style.zIndex = '0';\n screenElement.appendChild(canvas);\n }\n const ctx = canvas.getContext('2d', { alpha: true });\n if (!ctx) {\n canvas.remove();\n return;\n }\n this._layers.set(layer, ctx);\n this.clearAll(layer);\n }\n\n public removeLayerFromDom(layer: ImageLayer = 'top'): void {\n const ctx = this._layers.get(layer);\n if (ctx) {\n ctx.canvas.remove();\n this._layers.delete(layer);\n }\n }\n\n public hasLayer(layer: ImageLayer): boolean {\n return this._layers.has(layer);\n }\n\n private _createPlaceHolder(height: number = Constants.PLACEHOLDER_HEIGHT): void {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n\n // create blueprint to fill placeholder with\n const bWidth = 32; // must be 2^n\n const blueprint = ImageRenderer.createCanvas(this.document, bWidth, height);\n const ctx = blueprint.getContext('2d', { alpha: false });\n if (!ctx) return;\n const imgData = ImageRenderer.createImageData(ctx, bWidth, height);\n const d32 = new Uint32Array(imgData.data.buffer);\n const black = toRGBA8888(0, 0, 0);\n const white = toRGBA8888(255, 255, 255);\n d32.fill(black);\n for (let y = 0; y < height; ++y) {\n const shift = y % 2;\n const offset = y * bWidth;\n for (let x = 0; x < bWidth; x += 2) {\n d32[offset + x + shift] = white;\n }\n }\n ctx.putImageData(imgData, 0, 0);\n\n // create placeholder line, width aligned to blueprint width\n const width = (screen.width + bWidth - 1) & ~(bWidth - 1) || Constants.PLACEHOLDER_LENGTH;\n this._placeholder = ImageRenderer.createCanvas(this.document, width, height);\n const ctx2 = this._placeholder.getContext('2d', { alpha: false });\n if (!ctx2) {\n this._placeholder = undefined;\n return;\n }\n for (let i = 0; i < width; i += bWidth) {\n ctx2.drawImage(blueprint, i, 0);\n }\n const placeholder = this._placeholder;\n ImageRenderer.createImageBitmap(placeholder).then(bitmap => {\n if (this._placeholder !== placeholder) bitmap?.close();\n else this._placeholderBitmap = bitmap;\n }).catch(() => {});\n }\n\n public get document(): Document | undefined {\n return this._terminal._core._coreBrowserService?.window.document;\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { ImageRenderer } from './ImageRenderer';\nimport type {\n ITerminalExt, IImageAddonOptions, IImageSpec, ICellSize, IAddImageOpts\n} from './Types';\nimport type { IBufferLine } from 'common/buffer/Types';\nimport { CellData } from 'common/buffer/CellData';\n\n// fallback default cell size\nexport const CELL_SIZE_DEFAULT: ICellSize = {\n width: 7,\n height: 14\n};\n\nclass ImageTileInfo {\n constructor(\n public imageId = -1,\n public tileId = -1) {\n }\n}\n\n/**\n * ImageStorage - extension of CoreTerminal:\n * - hold image data\n * - write/read image data to/from buffer\n *\n * TODO: image composition for overwrites\n */\nexport class ImageStorage implements IDisposable {\n // storage\n private _images: Map<number, IImageSpec> = new Map();\n // last used id\n private _lastId = 0;\n // last evicted id\n private _lowestId = 0;\n // whether a full clear happened before\n private _fullyCleared = false;\n // whether render should do a full clear\n private _needsFullClear = false;\n // hard limit of stored pixels (fallback limit of 10 MB)\n private _pixelLimit: number = 2500000;\n private _workCell: CellData = new CellData();\n\n private _viewportMetrics: { cols: number, rows: number };\n public onImageAdded: (() => void) | undefined;\n public onImageDeleted: ((storageId: number) => void) | undefined;\n // Placeholder cells carry image references in text and colors, not tile attributes.\n public onRenderLine: ((line: IBufferLine, row: number, cols: number) => void) | undefined;\n\n constructor(\n private _terminal: ITerminalExt,\n private _renderer: ImageRenderer,\n private _opts: IImageAddonOptions\n ) {\n try {\n this.setLimit(this._opts.storageLimit);\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n }\n console.warn(`storageLimit is set to ${this.getLimit()} MB`);\n }\n this._viewportMetrics = {\n cols: this._terminal.cols,\n rows: this._terminal.rows\n };\n }\n\n public dispose(): void {\n this.reset();\n }\n\n public reset(): void {\n for (const id of [...this._images.keys()]) {\n this.deleteImage(id);\n }\n this._renderer.clearAll();\n }\n\n public getLimit(): number {\n return this._pixelLimit * 4 / 1000000;\n }\n\n public setLimit(value: number): void {\n if (value < 0.5 || value > 1000) {\n throw RangeError('invalid storageLimit, should be at least 0.5 MB and not exceed 1G');\n }\n this._pixelLimit = (value / 4 * 1000000) >>> 0;\n this._evictOldest(0);\n }\n\n public getUsage(): number {\n return this._getStoredPixels() * 4 / 1000000;\n }\n\n private _getStoredPixels(): number {\n let storedPixels = 0;\n for (const spec of this._images.values()) {\n if (spec.orig) {\n storedPixels += spec.orig.width * spec.orig.height;\n if (spec.actual && spec.actual !== spec.orig) {\n storedPixels += spec.actual.width * spec.actual.height;\n }\n }\n }\n return storedPixels;\n }\n\n private _delImg(id: number): void {\n const spec = this._images.get(id);\n if (!spec) return;\n this._images.delete(id);\n // FIXME: really ugly workaround to get bitmaps deallocated :(\n if (window.ImageBitmap && spec.orig instanceof ImageBitmap) {\n spec.orig.close();\n }\n this.onImageDeleted?.(id);\n this._renderer.refreshAll();\n }\n\n /**\n * Wipe canvas and images on alternate buffer.\n */\n public wipeAlternate(): void {\n // remove all alternate tagged images\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate') {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n // mark canvas to be wiped on next render\n this._needsFullClear = true;\n this._fullyCleared = false;\n }\n\n /**\n * Delete an image by its internal storage ID.\n * Used by protocols that support explicit deletion (e.g. Kitty a=d).\n */\n public deleteImage(id: number): void {\n const spec = this._images.get(id);\n if (spec) {\n spec.marker?.dispose();\n this._delImg(id);\n }\n }\n\n public addUnplacedImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {\n // never allow storage to exceed memory limit\n this._evictOldest(img.width * img.height);\n\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n\n const imageId = ++this._lastId;\n this._images.set(imageId, {\n orig: img,\n origCellSize: cellSize,\n actual: img,\n actualCellSize: { ...cellSize },\n marker: undefined,\n tileCount: 0,\n virtual: true,\n bufferType: this._terminal.buffer.active.type,\n layer: opts.layer,\n zIndex: opts.zIndex\n });\n this.onImageAdded?.();\n return imageId;\n }\n\n public getImageSpec(id: number): IImageSpec | undefined {\n return this._images.get(id);\n }\n\n /**\n * Method to add an image to the storage.\n * @param img - The image to add (canvas or bitmap).\n * @param opts - Options for addImage:\n * - scrolling: When true, cursor advances with the image.\n * When false, image is placed at ORIGIN and cursor does not move.\n * - layer: Which canvas layer to render on ('top' or 'bottom').\n * - zIndex: Z-index for image layering within the same layer.\n * - cursorPos: 'vt340' for bottom-left, 'iip' for bottom.right.\n * @returns The internal image ID assigned to the stored image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {\n // never allow storage to exceed memory limit\n this._evictOldest(img.width * img.height);\n\n // calc rows x cols needed to display the image\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const cols = Math.ceil(img.width / cellSize.width);\n const rows = Math.ceil(img.height / cellSize.height);\n\n const imageId = ++this._lastId;\n\n const buffer = this._terminal._core.buffer;\n const termCols = this._terminal.cols;\n const termRows = this._terminal.rows;\n const originX = buffer.x;\n const originY = buffer.y;\n let offset = originX;\n let tileCount = 0;\n\n if (!opts.scrolling) {\n buffer.x = 0;\n buffer.y = 0;\n offset = 0;\n }\n\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(buffer.y + buffer.ybase)!;\n for (let col = 0; col < cols; ++col) {\n if (offset + col >= termCols) break;\n this._writeToCell(line, offset + col, imageId, row * cols + col);\n tileCount++;\n }\n if (opts.scrolling) {\n if (row < rows - 1) this._terminal._core._inputHandler.lineFeed();\n } else {\n if (++buffer.y >= termRows) break;\n }\n buffer.x = offset;\n }\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n\n // cursor positioning modes\n if (opts.scrolling) {\n if (opts.cursorPos === 'iip') {\n buffer.x = Math.min(offset + cols, termCols);\n } else {\n buffer.x = offset;\n }\n } else {\n buffer.x = originX;\n buffer.y = originY;\n }\n\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.tileCount < 1 && !spec.virtual) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n\n // eviction marker:\n // delete the image when the marker gets disposed\n const endMarker = this._terminal.registerMarker(0);\n endMarker?.onDispose(() => {\n const spec = this._images.get(imageId);\n if (spec) {\n this._delImg(imageId);\n }\n });\n\n // since markers do not work on alternate for some reason,\n // we evict images here manually\n if (this._terminal.buffer.active.type === 'alternate') {\n this._evictOnAlternate();\n }\n\n // create storage entry\n const imgSpec: IImageSpec = {\n orig: img,\n origCellSize: cellSize,\n actual: img,\n actualCellSize: { ...cellSize }, // clone needed, since later modified\n marker: endMarker || undefined,\n tileCount,\n bufferType: this._terminal.buffer.active.type,\n layer: opts.layer,\n zIndex: opts.zIndex\n };\n\n // finally add the image\n this._images.set(imageId, imgSpec);\n this.onImageAdded?.();\n return imageId;\n }\n\n\n /**\n * Render method. Collects buffer information and triggers\n * canvas updates.\n */\n // TODO: Should we move this to the ImageRenderer?\n public render(range: { start: number, end: number }): void {\n // Determine which layers have images\n let hasTopImages = false;\n let hasBottomImages = false;\n for (const spec of this._images.values()) {\n if (spec.layer === 'bottom') {\n hasBottomImages = true;\n } else {\n hasTopImages = true;\n }\n if (hasTopImages && hasBottomImages) break;\n }\n\n // Lazily insert layers that are needed\n if (hasTopImages && !this._renderer.hasLayer('top')) {\n this._renderer.insertLayerToDom('top');\n if (!this._renderer.hasLayer('top')) return;\n }\n if (hasBottomImages && !this._renderer.hasLayer('bottom')) {\n this._renderer.insertLayerToDom('bottom');\n }\n\n // rescale if needed\n this._renderer.rescaleCanvas();\n\n // exit early if we dont have any images to test for\n if (!this._images.size) {\n if (!this._fullyCleared) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n if (this._renderer.hasLayer('top')) {\n this._renderer.removeLayerFromDom('top');\n }\n if (this._renderer.hasLayer('bottom')) {\n this._renderer.removeLayerFromDom('bottom');\n }\n return;\n }\n\n // Remove layers no longer needed\n if (!hasTopImages && this._renderer.hasLayer('top')) {\n this._renderer.clearAll('top');\n this._renderer.removeLayerFromDom('top');\n }\n if (!hasBottomImages && this._renderer.hasLayer('bottom')) {\n this._renderer.clearAll('bottom');\n this._renderer.removeLayerFromDom('bottom');\n }\n\n // buffer switches force a full clear\n if (this._needsFullClear) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n\n const { start, end } = range;\n const buffer = this._terminal._core.buffer;\n const cols = this._terminal._core.cols;\n\n // clear drawing area\n this._renderer.clearLines(start, end);\n\n // Collect draw calls so we can sort by z-index (lower z drawn first).\n const drawCalls: { imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number }[] = [];\n const placeholderCalls: { col: number, row: number, count: number }[] = [];\n\n // walk all cells in viewport and collect tiles found\n for (let row = start; row <= end; ++row) {\n const line = buffer.lines.get(row + buffer.ydisp);\n if (!line) return;\n this.onRenderLine?.(line, row, cols);\n for (let col = 0; col < cols; ++col) {\n const e = line.getExtended(col)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (e.tileId !== -1) {\n const startTile = e.tileId;\n const startCol = col;\n let count = 1;\n /**\n * merge tiles to the right into a single draw call, if:\n * - not at end of line\n * - cell has same image id\n * - cell has consecutive tile id\n */\n while (++col < cols) {\n const nextE = line.getExtended(col)?.payload;\n if (!(nextE instanceof ImageTileInfo) || nextE.imageId !== imageId || nextE.tileId !== startTile + count) {\n break;\n }\n count++;\n }\n col--;\n if (imgSpec) {\n if (imgSpec.actual) {\n drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count });\n }\n } else if (this._opts.showPlaceholder) {\n placeholderCalls.push({ col: startCol, row, count });\n }\n this._fullyCleared = false;\n }\n }\n }\n }\n\n // Sort by z-index so lower z draws first (higher z renders on top)\n drawCalls.sort((a, b) => a.imgSpec.zIndex - b.imgSpec.zIndex);\n\n // Draw placeholders first (lowest priority)\n for (const call of placeholderCalls) {\n this._renderer.drawPlaceholder(call.col, call.row, call.count);\n }\n\n // Draw images in z-index order\n for (const call of drawCalls) {\n this._renderer.draw(call.imgSpec, call.tileId, call.col, call.row, call.count);\n }\n }\n\n public viewportResize(metrics: { cols: number, rows: number }): void {\n // exit early if we have nothing in storage\n if (!this._images.size) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // handle only viewport width enlargements, exit all other cases\n // TODO: needs patch for tile counter\n if (this._viewportMetrics.cols >= metrics.cols) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // walk scrollbuffer at old col width to find all possible expansion matches\n const buffer = this._terminal._core.buffer;\n const rows = buffer.lines.length;\n const oldCol = this._viewportMetrics.cols - 1;\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(row)!;\n const e = line.getExtended(oldCol)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (!imgSpec) {\n continue;\n }\n // found an image tile at oldCol, check if it qualifies for right exapansion\n const tilesPerRow = Math.ceil((imgSpec.actual?.width || 0) / imgSpec.actualCellSize.width);\n if ((e.tileId % tilesPerRow) + 1 >= tilesPerRow) {\n continue;\n }\n // expand only if right side is empty (nothing got wrapped from below)\n let hasData = false;\n for (let rightCol = oldCol + 1; rightCol > metrics.cols; ++rightCol) {\n if (line.hasContent(rightCol)) {\n hasData = true;\n break;\n }\n }\n if (hasData) {\n continue;\n }\n // do right expansion on terminal buffer\n const end = Math.min(metrics.cols, tilesPerRow - (e.tileId % tilesPerRow) + oldCol);\n let lastTile = e.tileId;\n for (let expandCol = oldCol + 1; expandCol < end; ++expandCol) {\n this._writeToCell(line, expandCol, imageId, ++lastTile);\n imgSpec.tileCount++;\n }\n }\n }\n // store new viewport metrics\n this._viewportMetrics = metrics;\n }\n\n /**\n * Retrieve original canvas at buffer position.\n */\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1) {\n const orig = this._images.get(e.imageId)?.orig;\n if (window.ImageBitmap && orig instanceof ImageBitmap) {\n const canvas = ImageRenderer.createCanvas(window.document, orig.width, orig.height);\n canvas.getContext('2d')?.drawImage(orig, 0, 0, orig.width, orig.height);\n return canvas;\n }\n return orig as HTMLCanvasElement;\n }\n }\n }\n\n /**\n * Extract active single tile at buffer position.\n */\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1 && e.tileId !== -1) {\n const spec = this._images.get(e.imageId);\n if (spec) {\n return this._renderer.extractTile(spec, e.tileId);\n }\n }\n }\n }\n\n // TODO: Do we need some blob offloading tricks here to avoid early eviction?\n // also see https://stackoverflow.com/questions/28307789/is-there-any-limitation-on-javascript-max-blob-size\n private _evictOldest(room: number): number {\n const used = this._getStoredPixels();\n let current = used;\n while (this._pixelLimit < current + room && this._images.size) {\n const spec = this._images.get(++this._lowestId);\n if (spec && spec.orig) {\n current -= spec.orig.width * spec.orig.height;\n if (spec.actual && spec.orig !== spec.actual) {\n current -= spec.actual.width * spec.actual.height;\n }\n spec.marker?.dispose();\n this._delImg(this._lowestId);\n }\n }\n return used - current;\n }\n\n private _writeToCell(line: IBufferLine, x: number, imageId: number, tileId: number): void {\n const workCell = this._workCell;\n line.loadCell(x, workCell);\n if (this._workCell.hasExtendedAttrs()) {\n const old = workCell.extended.payload;\n if (old instanceof ImageTileInfo) {\n // found an old ExtendedAttrsImage, since we know that\n // they are always isolated instances (single cell usage),\n // we can re-use it and just update their id entries\n const oldSpec = this._images.get(old.imageId);\n if (oldSpec) {\n // early eviction for in-viewport overwrites\n oldSpec.tileCount--;\n }\n old.imageId = imageId;\n old.tileId = tileId;\n return;\n }\n }\n // fall-through: always create new ExtendedAttrs entry\n const extattr = workCell.extended.clone();\n extattr.payload = new ImageTileInfo(imageId, tileId);\n workCell.extended = extattr;\n workCell.updateExtended();\n line.setCell(x, workCell);\n }\n\n private _evictOnAlternate(): void {\n // nullify tile count of all images on alternate buffer\n for (const spec of this._images.values()) {\n if (spec.bufferType === 'alternate') {\n spec.tileCount = 0;\n }\n }\n // re-count tiles on whole buffer\n const buffer = this._terminal._core.buffer;\n for (let y = 0; y < this._terminal.rows; ++y) {\n const line = buffer.lines.get(y);\n if (!line) {\n continue;\n }\n for (let x = 0; x < this._terminal.cols; ++x) {\n const payload = line.getExtended(x)?.payload;\n if (payload instanceof ImageTileInfo) {\n const spec = this._images.get(payload.imageId);\n if (spec) {\n spec.tileCount++;\n }\n }\n }\n }\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate' && !spec.tileCount && !spec.virtual) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n }\n}\n","/**\n * Copyright (c) 2020, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IDcsHandler, IParams, IImageAddonOptions, ITerminalExt, AttributeData, IResetHandler, ReadonlyColorSet } from './Types';\nimport { toRGBA8888, BIG_ENDIAN, PALETTE_ANSI_256, PALETTE_VT340_COLOR } from 'sixel/lib/Colors';\nimport { RGBA8888 } from 'sixel/lib/Types';\nimport { ImageRenderer } from './ImageRenderer';\n\nimport { DecoderAsync, Decoder } from 'sixel/lib/Decoder';\nimport { LIMITS } from 'sixel/lib/wasm';\n\n// always free decoder ressources after decoding if it exceeds this limit\nconst MEM_PERMA_LIMIT = 4194304; // 1024 pixels * 1024 pixels * 4 channels = 4MB\n\n// custom default palette: VT340 (lower 16 colors) + ANSI256 (up to 256) + zeroed (up to 4096)\nconst DEFAULT_PALETTE = PALETTE_ANSI_256;\nDEFAULT_PALETTE.set(PALETTE_VT340_COLOR);\n\n// Why pooled: every decoder owns a wasm memory, and V8 caps live wasm memories\n// per process (~124 in a sandboxed renderer). Terminals borrow a decoder only\n// while a SIXEL sequence is open, so idle terminals hold none.\nconst MAX_IDLE_DECODERS = 2;\nconst idleDecoders = new Map<number, Decoder[]>();\nlet poolPrimed = false;\n\nfunction primeDecoderPool(memoryLimit: number): void {\n if (poolPrimed) return;\n poolPrimed = true;\n // Async compile once, off the parser's hot path; later decoders reuse the cached module.\n DecoderAsync({ memoryLimit, palette: DEFAULT_PALETTE }).then(\n d => releaseDecoder(d, memoryLimit),\n () => { poolPrimed = false; }\n );\n}\n\nfunction acquireDecoder(memoryLimit: number): Decoder {\n return idleDecoders.get(memoryLimit)?.pop() ?? new Decoder({ memoryLimit, palette: DEFAULT_PALETTE });\n}\n\nfunction releaseDecoder(dec: Decoder, memoryLimit: number): void {\n if (dec.memoryUsage > MEM_PERMA_LIMIT) {\n dec.release();\n }\n const idle = idleDecoders.get(memoryLimit) ?? [];\n if (idle.length < MAX_IDLE_DECODERS) {\n idle.push(dec);\n idleDecoders.set(memoryLimit, idle);\n }\n}\n\n\nexport class SixelHandler implements IDcsHandler, IResetHandler {\n private _size = 0;\n private _aborted = false;\n private _dec: Decoder | undefined;\n private _decMemoryLimit = 0;\n // Color registers outlive a single image, so they live here rather than in a pooled decoder.\n private readonly _palette = new Uint32Array(LIMITS.PALETTE_SIZE);\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _storage: SixelImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n this._palette.set(DEFAULT_PALETTE);\n primeDecoderPool(this._opts.pixelLimit * 4);\n }\n\n public reset(): void {\n this._returnDecoder();\n this._palette.fill(0);\n this._palette.set(DEFAULT_PALETTE);\n }\n\n public hook(params: IParams): void {\n this._size = 0;\n this._aborted = false;\n this._returnDecoder();\n const memoryLimit = this._opts.pixelLimit * 4;\n try {\n this._dec = acquireDecoder(memoryLimit);\n } catch (e) {\n // Why: exhausting wasm memory must drop this image, not throw out of the parser and wedge the write queue.\n console.warn(`SIXEL: could not allocate decoder - ${e}`);\n this._aborted = true;\n return;\n }\n this._decMemoryLimit = memoryLimit;\n const fillColor = params.params[1] === 1 ? 0 : extractActiveBg(\n this._coreTerminal._core._inputHandler._curAttrData,\n this._coreTerminal._core._themeService?.colors);\n this._dec.init(fillColor, this._palette, this._opts.sixelPaletteLimit);\n }\n\n private _returnDecoder(): void {\n const dec = this._dec;\n if (!dec) return;\n this._dec = undefined;\n this._palette.set(dec.palette);\n releaseDecoder(dec, this._decMemoryLimit);\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted || !this._dec) {\n return;\n }\n this._size += end - start;\n if (this._size > this._opts.sixelSizeLimit) {\n console.warn(`SIXEL: too much data, aborting`);\n this._aborted = true;\n this._dec.release();\n return;\n }\n try {\n this._dec.decode(data, start, end);\n } catch (e) {\n console.warn(`SIXEL: error while decoding image - ${e}`);\n this._aborted = true;\n this._dec.release();\n }\n }\n\n public unhook(success: boolean): boolean | Promise<boolean> {\n try {\n return this._unhook(success);\n } finally {\n this._returnDecoder();\n }\n }\n\n private _unhook(success: boolean): boolean {\n if (this._aborted || !success || !this._dec) {\n return true;\n }\n\n const width = this._dec.width;\n const height = this._dec.height;\n\n // partial fix for https://github.com/jerch/xterm-addon-image/issues/37\n if (!width || !height) {\n if (height) {\n this._storage.advanceCursor(height);\n }\n return true;\n }\n\n const canvas = ImageRenderer.createCanvas(undefined, width, height);\n canvas.getContext('2d')?.putImageData(new ImageData(this._dec.data8 as Uint8ClampedArray<ArrayBuffer>, width, height), 0, 0);\n this._storage.addImage(canvas);\n return true;\n }\n}\n\n\n/**\n * Some helpers to extract current terminal colors.\n */\n\n// get currently active background color from terminal\n// also respect INVERSE setting\nfunction extractActiveBg(attr: AttributeData, colors: ReadonlyColorSet | undefined): RGBA8888 {\n let bg = 0;\n if (!colors) {\n // FIXME: theme service is prolly not available yet,\n // happens if .open() was not called yet (bug in core?)\n return bg;\n }\n if (attr.isInverse()) {\n if (attr.isFgDefault()) {\n bg = convertLe(colors.foreground.rgba);\n } else if (attr.isFgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getFgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getFgColor()].rgba);\n }\n } else {\n if (attr.isBgDefault()) {\n bg = convertLe(colors.background.rgba);\n } else if (attr.isBgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getBgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getBgColor()].rgba);\n }\n }\n return bg;\n}\n\n// rgba values on the color managers are always in BE, thus convert to LE\nfunction convertLe(color: number): RGBA8888 {\n if (BIG_ENDIAN) return color;\n return (color & 0xFF) << 24 | (color >>> 8 & 0xFF) << 16 | (color >>> 16 & 0xFF) << 8 | color >>> 24 & 0xFF;\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { IImageAddonOptions, ITerminalExt, IAddImageOpts } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\n\n/**\n * Sixel-specific image storage controller.\n *\n * Wraps the shared ImageStorage with sixel protocol semantics:\n * - Cursor behavior governed by DECSET 80 (sixelScrolling option)\n * - advanceCursor for empty sixels carrying only height\n */\nexport class SixelImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'vt340' };\n constructor(\n private readonly _storage: ImageStorage,\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _terminal: ITerminalExt\n ) {}\n\n /**\n * Add a sixel image to storage.\n * Cursor behavior depends on the sixelScrolling option (DECSET 80).\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._addImageOpts.scrolling = this._opts.sixelScrolling;\n this._storage.addImage(img, this._addImageOpts);\n }\n\n /**\n * Only advance text cursor.\n * This is an edge case from empty sixels carrying only a height but no pixels.\n * Partially fixes https://github.com/jerch/xterm-addon-image/issues/37.\n */\n public advanceCursor(height: number): void {\n if (this._opts.sixelScrolling) {\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const rows = Math.ceil(height / cellSize.height);\n for (let i = 1; i < rows; ++i) {\n this._terminal._core._inputHandler.lineFeed();\n }\n }\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types';\nimport { ImageRenderer } from '../ImageRenderer';\nimport { CELL_SIZE_DEFAULT } from '../ImageStorage';\nimport { imageType } from '../IIPMetrics';\nimport { KittyImageStorage } from './KittyImageStorage';\nimport Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport {\n KittyAction,\n KittyFormat,\n KittyCompression,\n IKittyCommand,\n IPendingTransmission,\n IKittyImageData,\n KittyPixelConstants,\n parseKittyCommand\n} from './KittyGraphicsTypes';\n\nconst enum Constants {\n // Memory limit for base64 decoder (4MB, same as IIPHandler)\n DECODER_KEEP_DATA = 4194304,\n DECODER_INITIAL_DATA = 4194304, // 4MB\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n DECODER_OK = 0,\n // Maximum control data size\n MAX_CONTROL_DATA_SIZE = 512,\n // Semicolon codepoint\n SEMICOLON = 0x3B\n}\n\nconst DECODER_OK = Constants.DECODER_OK as unknown as DecodeStatus.OK;\n\n// Kitty graphics protocol handler with streaming base64 decoding.\nexport class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable {\n private _aborted = false;\n private _generation = 0;\n private _decodeError = false;\n\n private _activeDecoder: Base64Decoder | null = null;\n private readonly _maxEncodedBytes: number;\n private readonly _initialEncodedBytes: number;\n\n // Streaming related states\n\n // True while receiving control data (before semicolon).\n private _inControlData = true;\n\n // Buffer for control data.\n private _controlData = new Uint32Array(Constants.MAX_CONTROL_DATA_SIZE);\n private _controlLength = 0;\n\n // Pre-calculated encoded size limit\n private _encodedSizeLimit = 0;\n private _totalEncodedSize = 0;\n\n // Parsed command. These are the control data before semicolon.\n private _parsedCommand: IKittyCommand | null = null;\n\n // Storage related states\n\n private _pendingTransmissions: Map<number, IPendingTransmission> = new Map();\n // Tracks the pending key of the most recently started chunked upload.\n // Per spec, subsequent chunks only need m= (and optionally q=), without i=.\n // When a chunk arrives with no i=, this key is used to find the pending upload.\n private _lastPendingKey: number | undefined;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _kittyStorage: KittyImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n // Convert decoded size limit -> max encoded bytes.\n this._maxEncodedBytes = Math.ceil(this._opts.kittySizeLimit * 4 / 3);\n // ensure we preallocate more than configured limit while using 4mb initial size.\n this._initialEncodedBytes = Math.min(Constants.DECODER_INITIAL_DATA, this._maxEncodedBytes);\n }\n\n public reset(): void {\n this._generation++;\n this._cleanupAllPending();\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n this._kittyStorage.reset();\n }\n\n public dispose(): void {\n this.reset();\n }\n\n private _removePendingEntry(key: number): void {\n this._pendingTransmissions.delete(key);\n if (this._lastPendingKey === key) {\n this._lastPendingKey = undefined;\n }\n }\n\n private _cleanupAllPending(): void {\n for (const pending of this._pendingTransmissions.values()) {\n pending.decoder.release();\n }\n this._pendingTransmissions.clear();\n this._lastPendingKey = undefined;\n }\n\n public start(): void {\n this._aborted = false;\n this._decodeError = false;\n this._inControlData = true;\n this._controlLength = 0;\n this._parsedCommand = null;\n // Pre-calculate encoded limit once: base64 is 4 bytes encoded → 3 bytes decoded\n this._encodedSizeLimit = this._maxEncodedBytes;\n this._totalEncodedSize = 0;\n this._activeDecoder = null;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (!this._inControlData) {\n this._streamPayload(data, start, end);\n } else {\n // Scan for semicolon\n let controlEnd = end;\n for (let i = start; i < end; i++) {\n if (data[i] === Constants.SEMICOLON) {\n this._inControlData = false;\n controlEnd = i;\n break;\n }\n }\n\n // Copy control data\n const copyLength = controlEnd - start;\n if (this._controlLength + copyLength > Constants.MAX_CONTROL_DATA_SIZE) {\n this._aborted = true;\n return;\n }\n this._controlData.set(data.subarray(start, controlEnd), this._controlLength);\n this._controlLength += copyLength;\n\n if (!this._inControlData) {\n // Found semicolon - parse control data early for validation\n this._parsedCommand = parseKittyCommand(this._parseControlDataString());\n\n // Early validation: i+I conflict\n if (this._parsedCommand.id !== undefined && this._parsedCommand.imageNumber !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'EINVAL:cannot specify both i and I keys', this._parsedCommand.quiet ?? 0);\n this._aborted = true;\n return;\n }\n\n // Delete action doesn't need payload - skip streaming\n if (this._parsedCommand.action === KittyAction.DELETE) {\n return;\n }\n\n // Stream remaining as payload\n const payloadStart = controlEnd + 1;\n if (payloadStart < end) {\n this._streamPayload(data, payloadStart, end);\n }\n }\n }\n }\n\n // Stream payload bytes into the base64 decoder.\n private _streamPayload(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n // Check size limit (compare encoded bytes against pre-calculated limit)\n // Include cumulative size from pending transmission for multi-chunk images.\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = this._parsedCommand?.id ?? this._lastPendingKey ?? 0;\n const pending = this._pendingTransmissions.get(pendingKey);\n const previousEncodedSize = pending?.totalEncodedSize ?? 0;\n this._totalEncodedSize += end - start;\n const cumulativeEncodedSize = previousEncodedSize + this._totalEncodedSize;\n if (cumulativeEncodedSize > this._encodedSizeLimit) {\n const decoderToRelease = this._activeDecoder ?? pending?.decoder;\n if (decoderToRelease) {\n decoderToRelease.release();\n }\n this._activeDecoder = null;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n this._aborted = true;\n return;\n }\n\n if (this._decodeError) return;\n\n if (pending?.decoder && !this._activeDecoder) {\n this._activeDecoder = pending.decoder;\n }\n if (!this._activeDecoder) {\n // Budget WASM capacity, including one page of decoder state and rounding.\n const decoderCapacity = this._maxEncodedBytes + 131072;\n if (decoderCapacity > this._opts.storageLimit * 1000000) {\n this._aborted = true;\n if (this._parsedCommand?.id !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'ENOMEM:pending image budget exceeded', this._parsedCommand.quiet ?? 0);\n }\n return;\n }\n const maxPending = Math.max(1, Math.floor(this._opts.storageLimit * 1000000 / decoderCapacity));\n while (this._pendingTransmissions.size >= maxPending) {\n const oldest = this._pendingTransmissions.entries().next().value;\n if (!oldest) break;\n oldest[1].decoder.release();\n this._removePendingEntry(oldest[0]);\n if (oldest[1].cmd.id !== undefined) {\n this._sendResponse(oldest[1].cmd.id, 'ENOMEM:pending image budget exceeded', oldest[1].cmd.quiet ?? 0);\n }\n }\n const decoder = new Base64Decoder(Constants.DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes);\n try {\n decoder.init();\n } catch (e) {\n // Why: wasm memory exhaustion must drop this image, not throw out of the parser and wedge the write queue.\n console.warn('KITTY: could not allocate decoder', e);\n this._aborted = true;\n if (this._parsedCommand?.id !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'ENOMEM:could not allocate decoder', this._parsedCommand.quiet ?? 0);\n }\n return;\n }\n this._activeDecoder = decoder;\n }\n\n if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_OK) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n this._decodeError = true;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted || !success) {\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n return true;\n }\n\n // No semicolon = no payload (delete, capability query)\n if (this._inControlData) {\n return this._handleNoPayloadCommand();\n }\n\n // Use command parsed early in put() - i+I already validated there\n const cmd = this._parsedCommand!;\n\n // Delete action was handled by skipping payload - just execute\n if (cmd.action === KittyAction.DELETE) {\n return this._handleDelete(cmd);\n }\n\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = cmd.id ?? this._lastPendingKey ?? 0;\n const isMoreComing = cmd.more === 1;\n const pending = this._pendingTransmissions.get(pendingKey);\n\n if (isMoreComing) {\n if (this._activeDecoder) {\n if (pending) {\n pending.totalEncodedSize += this._totalEncodedSize;\n pending.decodeError = pending.decodeError || this._decodeError;\n } else {\n this._pendingTransmissions.set(pendingKey, {\n cmd: { ...cmd },\n decoder: this._activeDecoder,\n totalEncodedSize: this._totalEncodedSize,\n decodeError: this._decodeError\n });\n }\n this._lastPendingKey = pendingKey;\n this._activeDecoder = null;\n }\n return true;\n }\n\n // Final chunk received — clear the last pending key\n if (pending) {\n this._lastPendingKey = undefined;\n }\n\n let decodeError = this._decodeError;\n let finalCmd = cmd;\n let decoder = this._activeDecoder;\n\n if (pending) {\n finalCmd = pending.cmd;\n decoder = pending.decoder;\n decodeError = decodeError || pending.decodeError;\n this._pendingTransmissions.delete(pendingKey);\n }\n\n let imageBytes = new Uint8Array(0);\n if (decoder) {\n if (decoder.end() !== DECODER_OK) {\n decodeError = true;\n }\n imageBytes = decoder.data8;\n }\n this._activeDecoder = null;\n\n // Handle command first — handlers create Blob/ImageData from imageBytes,\n // which copies the data. Only then is it safe to release the decoder's\n // wasm memory that imageBytes points into.\n const result = this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError);\n if (decoder) {\n decoder.release();\n }\n return result;\n }\n\n // Command handling\n\n private _parseControlDataString(): string {\n let str = '';\n for (let i = 0; i < this._controlLength; i++) {\n str += String.fromCodePoint(this._controlData[i]);\n }\n return str;\n }\n\n private _handleNoPayloadCommand(): boolean | Promise<boolean> {\n const cmd = parseKittyCommand(this._parseControlDataString());\n\n // Per spec: specifying both i and I is an error\n if (cmd.id !== undefined && cmd.imageNumber !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0);\n return true;\n }\n\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.DELETE:\n return this._handleDelete(cmd);\n case KittyAction.QUERY:\n this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0);\n return true;\n case KittyAction.PLACEMENT:\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handleCommandWithBytesAndCmd(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.TRANSMIT: {\n const result = this._handleTransmit(cmd, bytes, decodeError);\n // Only send response when _handleTransmit didn't already respond\n // (it handles unsupported transmission medium responses internally)\n if ((cmd.transmission ?? 'd') === 'd' && cmd.id !== undefined) {\n if (decodeError) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n } else if (bytes.length > 0) {\n this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0);\n }\n }\n return result;\n }\n case KittyAction.TRANSMIT_DISPLAY:\n return this._handleTransmitDisplay(cmd, bytes, decodeError);\n case KittyAction.QUERY:\n return this._handleQuery(cmd, bytes, decodeError);\n case KittyAction.PLACEMENT:\n // a=p ignores any payload — image data was already transmitted\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handlePlacement(cmd: IKittyCommand): boolean | Promise<boolean> {\n if (cmd.id === undefined) {\n return true;\n }\n const id = cmd.id;\n const image = this._kittyStorage.getImage(id);\n if (!image) {\n this._sendResponse(id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId);\n return true;\n }\n const result = cmd.unicodePlaceholder === 1\n ? this._placeVirtual(image, cmd)\n : this._displayImage(image, cmd);\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId);\n return true;\n });\n }\n\n private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean, retainVirtual = false): boolean {\n // TODO: Support file-based transmission modes (t=f, t=t, t=s)\n // Currently only supports direct transmission (t=d, the default).\n // - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path.\n // - t=t (temp file): Payload is base64-encoded path in temp directory. Terminal reads, deletes.\n // - t=s: Payload is base64-encoded POSIX shm name. Terminal reads from shared memory.\n // These modes require filesystem/IPC access not available in browsers. For Node.js/Electron:\n // 1. Check cmd.transmission (t key) before treating bytes as image data\n // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents\n // 3. For t=d: treat bytes as image data (current behavior)\n // When implementing, also update _handleQuery to accept these transmission mediums.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported transmission medium', cmd.quiet ?? 0);\n }\n return true;\n }\n\n if (decodeError || bytes.length === 0) return true;\n\n this._kittyStorage.storeImage(cmd.id, {\n data: new Blob([bytes as BlobPart]),\n width: cmd.width ?? 0,\n height: cmd.height ?? 0,\n format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100,\n compression: cmd.compression ?? ''\n }, retainVirtual);\n return true;\n }\n\n private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n if (decodeError) {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n }\n return true;\n }\n\n const virtual = cmd.unicodePlaceholder === 1;\n this._handleTransmit(cmd, bytes, decodeError, virtual);\n\n const id = cmd.id ?? this._kittyStorage.lastImageId;\n const image = this._kittyStorage.getImage(id);\n if (image) {\n const result = virtual\n ? this._placeVirtual(image, cmd, true)\n : this._displayImage(image, cmd);\n if (cmd.id !== undefined) {\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0);\n return true;\n });\n }\n return result.then(() => true);\n }\n return true;\n }\n\n private _handleQuery(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {\n const id = cmd.id ?? 0;\n const quiet = cmd.quiet ?? 0;\n\n // Per spec: reject unsupported transmission mediums (only t=d is supported atm)\n // TODO: When filesystem support is added (Node.js/Electron), update this to accept\n // t=f (file), t=t (temp file), and t=s (shared memory) and respond OK for queries.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n this._sendResponse(id, 'EINVAL:unsupported transmission medium', quiet);\n return true;\n }\n\n // Check decode error first (invalid base64)\n if (decodeError) {\n this._sendResponse(id, 'EINVAL:invalid base64 data', quiet);\n return true;\n }\n\n // Capability query (no payload) - just respond OK\n if (bytes.length === 0) {\n this._sendResponse(id, 'OK', quiet);\n return true;\n }\n\n const format = cmd.format ?? KittyFormat.RGBA;\n\n if (format === KittyFormat.PNG) {\n this._sendResponse(id, 'OK', quiet);\n } else {\n const width = cmd.width ?? 0;\n const height = cmd.height ?? 0;\n\n if (!width || !height) {\n this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet);\n return true;\n }\n\n const bytesPerPixel = format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n this._sendResponse(id, `EINVAL:insufficient pixel data`, quiet);\n return true;\n }\n\n this._sendResponse(id, 'OK', quiet);\n }\n return true;\n }\n\n private _handleDelete(cmd: IKittyCommand): boolean {\n // Per spec: default delete selector is 'a' (delete all visible placements)\n const selector = cmd.deleteSelector ?? 'a';\n\n switch (selector) {\n case 'a':\n this._kittyStorage.deletePhysicalPlacements();\n break;\n case 'A':\n this._cleanupAllPending();\n this._kittyStorage.deleteAll(true);\n break;\n case 'i':\n case 'I':\n if (cmd.id !== undefined) {\n if (selector === 'I') {\n const pending = this._pendingTransmissions.get(cmd.id);\n pending?.decoder.release();\n this._removePendingEntry(cmd.id);\n this._kittyStorage.deleteById(cmd.id, cmd.placementId);\n } else {\n this._kittyStorage.deletePlacementsById(cmd.id, cmd.placementId);\n }\n }\n break;\n default:\n // Unsupported selectors (c, n, p, q, r, x, y, z, f) — ignore for now\n break;\n }\n return true;\n }\n\n private _sendResponse(id: number, message: string, quiet: number, placementId?: number): void {\n const isOk = message === 'OK';\n if (isOk && quiet >= 1) return;\n if (!isOk && quiet >= 2) return;\n\n const pPart = placementId ? `,p=${placementId}` : '';\n const response = `\\x1b_Gi=${id}${pPart};${message}\\x1b\\\\`;\n this._coreTerminal._core.coreService.triggerDataEvent(response);\n }\n\n // Image display\n\n private _displayImage(image: IKittyImageData, cmd: IKittyCommand): Promise<boolean> {\n return this._decodeAndDisplay(image, cmd)\n .then(() => true)\n .catch(() => false);\n }\n\n private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise<void> {\n const generation = this._generation;\n let bitmap: ImageBitmap | undefined = await this._createBitmap(image);\n\n try {\n if (generation !== this._generation) throw new Error('image decode canceled');\n const cropped = this._cropImage(bitmap, cmd);\n bitmap = cropped instanceof Promise ? await cropped : cropped;\n\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n let { cols: imgCols, rows: imgRows } = this._placementGrid(bitmap, cmd, cw, ch);\n\n let w = bitmap.width;\n let h = bitmap.height;\n\n // Scale bitmap to fit placement rectangle when c/r are specified\n if (cmd.columns !== undefined || cmd.rows !== undefined) {\n w = Math.round(imgCols * cw);\n h = Math.round(imgRows * ch);\n }\n\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n\n // Save cursor position before addImage modifies it\n const buffer = this._coreTerminal._core.buffer;\n const savedX = buffer.x;\n const savedY = buffer.y;\n const savedYbase = buffer.ybase;\n\n // Determine layer based on z-index: negative = behind text, 0+ = on top.\n // When z<0 we always use the bottom layer even without allowTransparency —\n // the image will simply be hidden behind the opaque text background, which\n // is the correct behavior (client asked for \"behind text\").\n const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0;\n const layer: ImageLayer = wantsBottom ? 'bottom' : 'top';\n\n if (w !== bitmap.width || h !== bitmap.height) {\n const scaled = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h });\n bitmap.close();\n bitmap = scaled;\n }\n\n // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions\n const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1);\n const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1);\n if (xOffset !== 0 || yOffset !== 0) {\n // Per spec: X/Y is not added to c/r area. When c/r are explicit, the\n // total placement area remains c*cw × r*ch pixels and the offset image\n // is clipped to fit. When c/r are unset, the padded canvas determines\n // the natural cell dimensions.\n const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : bitmap.width + xOffset;\n const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : bitmap.height + yOffset;\n const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH);\n const offsetCtx = offsetCanvas.getContext('2d');\n if (!offsetCtx) {\n throw new Error('Failed to create offset canvas context');\n }\n offsetCtx.drawImage(bitmap, xOffset, yOffset);\n\n const offsetBitmap = await createImageBitmap(offsetCanvas);\n offsetCanvas.width = offsetCanvas.height = 0;\n bitmap.close();\n bitmap = offsetBitmap;\n w = bitmap.width;\n h = bitmap.height;\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n if (cmd.columns === undefined) {\n imgCols = Math.ceil(bitmap.width / cw);\n }\n if (cmd.rows === undefined) {\n imgRows = Math.ceil(bitmap.height / ch);\n }\n }\n\n if (generation !== this._generation) throw new Error('image decode canceled');\n const zIndex = cmd.zIndex ?? 0;\n this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex);\n bitmap = undefined; // ownership transferred to storage\n\n // Kitty cursor movement\n // Per spec: cursor placed at first column after last image column,\n // on the last row of the image. C=1 means don't move cursor.\n if (cmd.cursorMovement === 1) {\n // C=1: restore cursor to position before image was placed\n const scrolled = buffer.ybase - savedYbase;\n buffer.x = savedX;\n // Can't restore cursor to scrollback?\n buffer.y = Math.max(savedY - scrolled, 0);\n } else {\n // Default (C=0): advance cursor horizontally past the image\n // addImage already positioned cursor on the last row via lineFeeds\n buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols);\n }\n } catch (e) {\n bitmap?.close();\n throw e;\n }\n }\n\n // Keep the uncropped path synchronous to preserve its parser scheduling.\n private _cropImage(bitmap: ImageBitmap, cmd: IKittyCommand): ImageBitmap | Promise<ImageBitmap> {\n const cropX = Math.max(0, cmd.x ?? 0);\n const cropY = Math.max(0, cmd.y ?? 0);\n const cropW = cmd.sourceWidth || (bitmap.width - cropX);\n const cropH = cmd.sourceHeight || (bitmap.height - cropY);\n\n const maxCropW = Math.max(0, bitmap.width - cropX);\n const maxCropH = Math.max(0, bitmap.height - cropY);\n const finalCropW = Math.max(0, Math.min(cropW, maxCropW));\n const finalCropH = Math.max(0, Math.min(cropH, maxCropH));\n\n if (finalCropW === 0 || finalCropH === 0) {\n throw new Error('invalid source rectangle');\n }\n\n if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) {\n return createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH).then(cropped => {\n bitmap.close();\n return cropped;\n });\n }\n return bitmap;\n }\n\n // An omitted grid dimension follows the source aspect ratio.\n private _placementGrid(bitmap: ImageBitmap, cmd: IKittyCommand, cw: number, ch: number): { cols: number; rows: number } {\n if (cmd.columns !== undefined && cmd.rows !== undefined) {\n return { cols: cmd.columns, rows: cmd.rows };\n }\n if (cmd.columns !== undefined) {\n return { cols: cmd.columns, rows: Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (cmd.columns * cw) / ch)) };\n }\n if (cmd.rows !== undefined) {\n return { cols: Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (cmd.rows * ch) / cw)), rows: cmd.rows };\n }\n return { cols: Math.ceil(bitmap.width / cw), rows: Math.ceil(bitmap.height / ch) };\n }\n\n private async _placeVirtual(image: IKittyImageData, cmd: IKittyCommand, replaces = false): Promise<boolean> {\n const generation = this._generation;\n const isCurrent = (): boolean => generation === this._generation && this._kittyStorage.getImage(image.id) === image;\n let bitmap: ImageBitmap | undefined;\n try {\n bitmap = await this._createBitmap(image);\n if (!isCurrent()) throw new Error('image decode canceled');\n const cropped = this._cropImage(bitmap, cmd);\n bitmap = cropped instanceof Promise ? await cropped : cropped;\n\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n const { cols, rows } = this._placementGrid(bitmap, cmd, cw, ch);\n\n if (bitmap.width * bitmap.height > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n\n if (!isCurrent()) throw new Error('image decode canceled');\n this._kittyStorage.addVirtualPlacement(image.id, cmd.placementId ?? 0, bitmap, cols, rows);\n bitmap = undefined; // ownership transferred to storage\n if (replaces) this._kittyStorage.discardVirtualPlacements(image.id, cmd.placementId ?? 0);\n return true;\n } catch {\n bitmap?.close();\n if (replaces && isCurrent()) this._kittyStorage.discardVirtualPlacements(image.id);\n return false;\n }\n }\n\n // Create ImageBitmap from already-decoded image data.\n private async _createBitmap(image: IKittyImageData): Promise<ImageBitmap> {\n let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer());\n\n if (image.compression === KittyCompression.ZLIB) {\n bytes = await this._decompressZlib(bytes);\n }\n\n if (image.format === KittyFormat.PNG) {\n const metrics = imageType(bytes);\n // IHDR dimensions are parsed with signed shifts, so a value >= 0x80000000 comes\n // back negative and a bare `>` pixel-limit test passes it; require positive.\n if (metrics.mime !== 'image/png' || !(metrics.width > 0) || !(metrics.height > 0) || metrics.width * metrics.height > this._opts.pixelLimit) {\n throw new RangeError('PNG exceeds pixel limit or has invalid dimensions');\n }\n const blob = new Blob([bytes as BlobPart], { type: 'image/png' });\n if (!window.createImageBitmap) {\n const url = URL.createObjectURL(blob);\n const img = new Image();\n return new Promise<ImageBitmap>((resolve, reject) => {\n img.addEventListener('load', () => {\n URL.revokeObjectURL(url);\n const canvas = ImageRenderer.createCanvas(window.document, img.width, img.height);\n canvas.getContext('2d')?.drawImage(img, 0, 0);\n createImageBitmap(canvas).then(resolve).catch(reject);\n });\n img.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n });\n img.src = url;\n });\n }\n return createImageBitmap(blob);\n }\n\n // Raw pixel data\n const width = image.width;\n const height = image.height;\n\n if (!width || !height) {\n throw new Error('Width and height required for raw pixel data');\n }\n\n const bytesPerPixel = image.format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n throw new Error('Insufficient pixel data');\n }\n\n const pixelCount = width * height;\n\n if (image.format === KittyFormat.RGBA) {\n // RGBA: use bytes directly — no copy needed\n return createImageBitmap(new ImageData(new Uint8ClampedArray(bytes.buffer as ArrayBuffer, bytes.byteOffset, pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA), width, height));\n }\n\n // RGB→RGBA: interleave alpha using uint32 block processing (4 pixels per iteration).\n // 3 uint32 reads + 4 uint32 writes per 4 pixels vs 28 byte reads/writes — ~6x faster.\n // Assumes little-endian (all modern browsers/Node.js).\n const data = new Uint8ClampedArray(pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA);\n const src32 = new Uint32Array(bytes.buffer, bytes.byteOffset, Math.floor(bytes.byteLength / 4));\n const dst32 = new Uint32Array(data.buffer);\n const alignedPixels = pixelCount & ~3; // round down to multiple of 4\n\n let srcOffset = 0;\n let dstOffset = 0;\n for (let i = 0; i < alignedPixels; i += 4) {\n const b0 = src32[srcOffset++];\n const b1 = src32[srcOffset++];\n const b2 = src32[srcOffset++];\n // Little-endian: pixel bytes are [R,G,B] → uint32 ABGR layout\n dst32[dstOffset++] = 0xFF000000 | b0;\n dst32[dstOffset++] = 0xFF000000 | (b0 >>> 24) | (b1 << 8);\n dst32[dstOffset++] = 0xFF000000 | (b1 >>> 16) | (b2 << 16);\n dst32[dstOffset++] = 0xFF000000 | (b2 >>> 8);\n }\n\n // Handle remaining 1–3 pixels\n let srcByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n let dstByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n for (let i = alignedPixels; i < pixelCount; i++) {\n data[dstByte] = bytes[srcByte];\n data[dstByte + 1] = bytes[srcByte + 1];\n data[dstByte + 2] = bytes[srcByte + 2];\n data[dstByte + 3] = KittyPixelConstants.ALPHA_OPAQUE;\n srcByte += KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n dstByte += KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n }\n\n return createImageBitmap(new ImageData(data, width, height));\n }\n\n private async _decompressZlib(compressed: Uint8Array): Promise<Uint8Array> {\n try {\n return await this._decompress(compressed, 'deflate');\n } catch (error) {\n if (error instanceof RangeError) throw error;\n return await this._decompress(compressed, 'deflate-raw');\n }\n }\n\n private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise<Uint8Array> {\n const limit = Math.min(this._opts.kittySizeLimit, this._opts.pixelLimit * 4, this._opts.storageLimit * 1000000);\n let offsetIn = 0;\n // Bound inflation within one native transform before its output is budgeted.\n const source = new ReadableStream<BufferSource>({\n pull(controller) {\n if (offsetIn >= compressed.length) {\n controller.close();\n return;\n }\n const end = Math.min(offsetIn + 4096, compressed.length);\n controller.enqueue(new Uint8Array(compressed.subarray(offsetIn, end)));\n offsetIn = end;\n }\n });\n const reader = source.pipeThrough(new DecompressionStream(format)).getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n totalLength += value.byteLength;\n if (totalLength > limit) {\n await reader.cancel().catch(() => {});\n throw new RangeError('decompressed image exceeds byte limit');\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._kittyStorage.images;\n }\n\n public get _kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyStorage.kittyIdToStorageId;\n }\n\n public get pendingTransmissions(): ReadonlyMap<number, IPendingTransmission> {\n return this._pendingTransmissions;\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty graphics protocol types, constants, and parsing utilities.\n */\n\nimport type Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\n\n// Kitty graphics protocol action types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'.\nexport const enum KittyAction {\n TRANSMIT = 't',\n TRANSMIT_DISPLAY = 'T',\n QUERY = 'q',\n PLACEMENT = 'p',\n DELETE = 'd'\n}\n\n// Kitty graphics protocol format types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyFormat {\n RGB = 24,\n RGBA = 32,\n PNG = 100\n}\n\n// Kitty graphics protocol compression types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'.\nexport const enum KittyCompression {\n NONE = '',\n ZLIB = 'z'\n}\n\n// Kitty graphics protocol control data keys.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyKey {\n // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete)\n ACTION = 'a',\n // Image format (24=RGB, 32=RGBA, 100=PNG)\n FORMAT = 'f',\n // Image ID for referencing stored images\n ID = 'i',\n // Image number (alternative to ID, terminal assigns ID)\n IMAGE_NUMBER = 'I',\n // Source image width in pixels\n WIDTH = 's',\n // Source image height in pixels\n HEIGHT = 'v',\n // The left edge (in pixels) of the image area to display\n X_OFFSET = 'x',\n // The top edge (in pixels) of the image area to display\n Y_OFFSET = 'y',\n // Width (in pixels) of the source rectangle to display\n SOURCE_WIDTH = 'w',\n // Height (in pixels) of the source rectangle to display\n SOURCE_HEIGHT = 'h',\n // Horizontal offset (in pixels) within the first cell\n X_PLACEMENT_OFFSET = 'X',\n // Vertical offset (in pixels) within the first cell\n Y_PLACEMENT_OFFSET = 'Y',\n // Number of terminal columns to display the image over\n COLUMNS = 'c',\n // Number of terminal rows to display the image over\n ROWS = 'r',\n // More data flag (1=more chunks coming, 0=final chunk)\n MORE = 'm',\n // Compression type (z=zlib). This is essential for chunking larger images.\n COMPRESSION = 'o',\n // Quiet mode (1=suppress OK responses, 2=suppress error responses)\n QUIET = 'q',\n // Cursor movement policy (0=move cursor after image, 1=don't move cursor)\n CURSOR_MOVEMENT = 'C',\n // Z-index for image layering (negative = behind text, 0+ = on top)\n Z_INDEX = 'z',\n // Transmission medium (d=direct, f=file, t=temp file, s=shared memory)\n TRANSMISSION = 't',\n // Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) — only used when a=d\n DELETE_SELECTOR = 'd',\n // Placement ID for targeting specific placements\n PLACEMENT_ID = 'p',\n // U=1 creates a prototype for placeholder cells without placing cursor tiles.\n UNICODE_PLACEHOLDER = 'U'\n}\n\n// Pixel format constants\nexport const enum KittyPixelConstants {\n BYTES_PER_PIXEL_RGB = 3,\n BYTES_PER_PIXEL_RGBA = 4,\n ALPHA_OPAQUE = 255\n}\n\n// Parsed Kitty graphics command.\nexport interface IKittyCommand {\n action?: string;\n format?: number;\n id?: number;\n imageNumber?: number;\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n sourceWidth?: number;\n sourceHeight?: number;\n xOffset?: number;\n yOffset?: number;\n columns?: number;\n rows?: number;\n more?: number;\n quiet?: number;\n cursorMovement?: number;\n zIndex?: number;\n transmission?: string;\n deleteSelector?: string;\n placementId?: number;\n compression?: string;\n unicodePlaceholder?: number;\n payload?: string;\n}\n\n// Pending chunked transmission state.\n// Stores metadata from the first chunk while accumulating decoded payload data.\nexport interface IPendingTransmission {\n // The parsed command from the first chunk (contains action, format, dimensions, etc.)\n cmd: IKittyCommand;\n // Decoder used across chunked payloads\n decoder: Base64Decoder;\n // Total encoded (base64) bytes received across all chunks - for size limit enforcement\n totalEncodedSize: number;\n // Whether any chunk has failed to decode\n decodeError: boolean;\n}\n\n// Stored Kitty image data.\nexport interface IKittyImageData {\n id: number;\n // Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit\n data: Blob;\n width: number;\n height: number;\n format: 24 | 32 | 100;\n compression?: string;\n}\n\nexport interface IVirtualPlacement {\n placementId: number;\n storageId: number;\n cols: number;\n rows: number;\n}\n\n// Parses Kitty graphics control data into a command object.\nexport function parseKittyCommand(data: string): IKittyCommand {\n const cmd: IKittyCommand = {};\n const parts = data.split(',');\n\n for (const part of parts) {\n const eqIdx = part.indexOf('=');\n if (eqIdx === -1) continue;\n\n const key = part.substring(0, eqIdx);\n const value = part.substring(eqIdx + 1);\n\n // Handle string keys first\n if (key === KittyKey.ACTION) {\n cmd.action = value;\n continue;\n }\n if (key === KittyKey.COMPRESSION) {\n cmd.compression = value;\n continue;\n }\n if (key === KittyKey.TRANSMISSION) {\n cmd.transmission = value;\n continue;\n }\n if (key === KittyKey.DELETE_SELECTOR) {\n cmd.deleteSelector = value;\n continue;\n }\n const numValue = parseInt(value, 10);\n switch (key) {\n case KittyKey.FORMAT: cmd.format = numValue; break;\n case KittyKey.ID: cmd.id = numValue; break;\n case KittyKey.IMAGE_NUMBER: cmd.imageNumber = numValue; break;\n case KittyKey.WIDTH: cmd.width = numValue; break;\n case KittyKey.HEIGHT: cmd.height = numValue; break;\n case KittyKey.X_OFFSET: cmd.x = numValue; break;\n case KittyKey.Y_OFFSET: cmd.y = numValue; break;\n case KittyKey.SOURCE_WIDTH: cmd.sourceWidth = numValue; break;\n case KittyKey.SOURCE_HEIGHT: cmd.sourceHeight = numValue; break;\n case KittyKey.X_PLACEMENT_OFFSET: cmd.xOffset = numValue; break;\n case KittyKey.Y_PLACEMENT_OFFSET: cmd.yOffset = numValue; break;\n case KittyKey.COLUMNS: cmd.columns = numValue; break;\n case KittyKey.ROWS: cmd.rows = numValue; break;\n case KittyKey.MORE: cmd.more = numValue; break;\n case KittyKey.QUIET: cmd.quiet = numValue; break;\n case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break;\n case KittyKey.Z_INDEX: cmd.zIndex = numValue; break;\n case KittyKey.PLACEMENT_ID: cmd.placementId = numValue; break;\n case KittyKey.UNICODE_PLACEHOLDER: cmd.unicodePlaceholder = numValue; break;\n }\n }\n\n return cmd;\n}\n\n\n// Source patches can only name files included in the published package.\n\nexport const PLACEHOLDER_CHAR = 0x10EEEE;\n\n// Protocol table order; values are one-based so zero can mean an omitted diacritic.\nexport const PLACEHOLDER_DIACRITICS: readonly number[] = [\n 0x305, 0x30D, 0x30E, 0x310, 0x312, 0x33D, 0x33E, 0x33F, 0x346, 0x34A,\n 0x34B, 0x34C, 0x350, 0x351, 0x352, 0x357, 0x35B, 0x363, 0x364, 0x365,\n 0x366, 0x367, 0x368, 0x369, 0x36A, 0x36B, 0x36C, 0x36D, 0x36E, 0x36F,\n 0x483, 0x484, 0x485, 0x486, 0x487, 0x592, 0x593, 0x594, 0x595, 0x597,\n 0x598, 0x599, 0x59C, 0x59D, 0x59E, 0x59F, 0x5A0, 0x5A1, 0x5A8, 0x5A9,\n 0x5AB, 0x5AC, 0x5AF, 0x5C4, 0x610, 0x611, 0x612, 0x613, 0x614, 0x615,\n 0x616, 0x617, 0x657, 0x658, 0x659, 0x65A, 0x65B, 0x65D, 0x65E, 0x6D6,\n 0x6D7, 0x6D8, 0x6D9, 0x6DA, 0x6DB, 0x6DC, 0x6DF, 0x6E0, 0x6E1, 0x6E2,\n 0x6E4, 0x6E7, 0x6E8, 0x6EB, 0x6EC, 0x730, 0x732, 0x733, 0x735, 0x736,\n 0x73A, 0x73D, 0x73F, 0x740, 0x741, 0x743, 0x745, 0x747, 0x749, 0x74A,\n 0x7EB, 0x7EC, 0x7ED, 0x7EE, 0x7EF, 0x7F0, 0x7F1, 0x7F3, 0x816, 0x817,\n 0x818, 0x819, 0x81B, 0x81C, 0x81D, 0x81E, 0x81F, 0x820, 0x821, 0x822,\n 0x823, 0x825, 0x826, 0x827, 0x829, 0x82A, 0x82B, 0x82C, 0x82D, 0x951,\n 0x953, 0x954, 0xF82, 0xF83, 0xF86, 0xF87, 0x135D, 0x135E, 0x135F, 0x17DD,\n 0x193A, 0x1A17, 0x1A75, 0x1A76, 0x1A77, 0x1A78, 0x1A79, 0x1A7A, 0x1A7B, 0x1A7C,\n 0x1B6B, 0x1B6D, 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73, 0x1CD0, 0x1CD1,\n 0x1CD2, 0x1CDA, 0x1CDB, 0x1CE0, 0x1DC0, 0x1DC1, 0x1DC3, 0x1DC4, 0x1DC5, 0x1DC6,\n 0x1DC7, 0x1DC8, 0x1DC9, 0x1DCB, 0x1DCC, 0x1DD1, 0x1DD2, 0x1DD3, 0x1DD4, 0x1DD5,\n 0x1DD6, 0x1DD7, 0x1DD8, 0x1DD9, 0x1DDA, 0x1DDB, 0x1DDC, 0x1DDD, 0x1DDE, 0x1DDF,\n 0x1DE0, 0x1DE1, 0x1DE2, 0x1DE3, 0x1DE4, 0x1DE5, 0x1DE6, 0x1DFE, 0x20D0, 0x20D1,\n 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20DB, 0x20DC, 0x20E1, 0x20E7, 0x20E9, 0x20F0,\n 0x2CEF, 0x2CF0, 0x2CF1, 0x2DE0, 0x2DE1, 0x2DE2, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6,\n 0x2DE7, 0x2DE8, 0x2DE9, 0x2DEA, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, 0x2DEF, 0x2DF0,\n 0x2DF1, 0x2DF2, 0x2DF3, 0x2DF4, 0x2DF5, 0x2DF6, 0x2DF7, 0x2DF8, 0x2DF9, 0x2DFA,\n 0x2DFB, 0x2DFC, 0x2DFD, 0x2DFE, 0x2DFF, 0xA66F, 0xA67C, 0xA67D, 0xA6F0, 0xA6F1,\n 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, 0xA8E8, 0xA8E9,\n 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xAAB0, 0xAAB2,\n 0xAAB3, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xFE20, 0xFE21, 0xFE22, 0xFE23,\n 0xFE24, 0xFE25, 0xFE26, 0x10A0F, 0x10A38, 0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189,\n 0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244,\n];\n\nconst PLACEHOLDER_DIACRITIC_VALUES: Map<number, number> = new Map();\nfor (let i = 0; i < PLACEHOLDER_DIACRITICS.length; ++i) {\n PLACEHOLDER_DIACRITIC_VALUES.set(PLACEHOLDER_DIACRITICS[i], i + 1);\n}\n\n// Zero values may inherit from the preceding placeholder cell.\nexport interface IPlaceholderLocation {\n row: number;\n column: number;\n highByte: number;\n}\n\nfunction placeholderDiacriticValue(mark: string | undefined): number {\n return mark === undefined ? 0 : PLACEHOLDER_DIACRITIC_VALUES.get(mark.codePointAt(0) ?? -1) ?? -1;\n}\n\nexport function decodePlaceholderLocation(chars: string): IPlaceholderLocation {\n const [, row, column, highByte] = chars;\n return {\n row: placeholderDiacriticValue(row),\n column: placeholderDiacriticValue(column),\n highByte: placeholderDiacriticValue(highByte)\n };\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IBufferLine } from 'common/buffer/Types';\nimport { IDisposable } from '@xterm/xterm';\nimport { CellData } from 'common/buffer/CellData';\nimport { FgFlags } from 'common/buffer/Constants';\nimport { ImageRenderer } from '../ImageRenderer';\nimport { ImageStorage } from '../ImageStorage';\nimport { Attributes, ITerminalExt, ImageLayer, IAddImageOpts } from '../Types';\nimport { decodePlaceholderLocation, IKittyImageData, IPlaceholderLocation, IVirtualPlacement, PLACEHOLDER_CHAR } from './KittyGraphicsTypes';\n\ninterface IPlaceholderCell {\n imageId: number;\n placementId: number;\n location: IPlaceholderLocation;\n}\n\n// Kitty-specific image storage controller.\n//\n// Wraps shared ImageStorage with kitty protocol semantics:\n// - tracks transmitted image payloads by kitty image id\n// - tracks kitty image id -> shared ImageStorage id mapping for displayed images\n// - tracks virtual placements that U+10EEEE cells display\n// - mirrors shared-storage evictions into kitty maps\n// - applies protocol-level undisplayed-image eviction policy\nexport class KittyImageStorage implements IDisposable {\n private static readonly _maxStoredImages = 256;\n\n private _nextImageId = 1;\n private readonly _images: Map<number, IKittyImageData> = new Map();\n // TODO: Track physical placements by (image id, placement id), like virtual placements.\n private readonly _kittyIdToStorageId: Map<number, number> = new Map();\n private readonly _storageIdToKittyId: Map<number, number> = new Map();\n private readonly _virtualPlacements: Map<number, Map<number, IVirtualPlacement>> = new Map();\n private readonly _virtualStorageIds = new Map<number, { kittyId: number, placementId: number }>();\n\n private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined;\n private readonly _wrappedOnImageDeleted: (storageId: number) => void;\n private readonly _handleStorageImageDeleted = (storageId: number): void => {\n const virtual = this._virtualStorageIds.get(storageId);\n if (virtual) {\n this._virtualStorageIds.delete(storageId);\n const placements = this._virtualPlacements.get(virtual.kittyId);\n placements?.delete(virtual.placementId);\n if (!placements?.size) this._virtualPlacements.delete(virtual.kittyId);\n }\n const kittyId = this._storageIdToKittyId.get(storageId);\n if (kittyId !== undefined) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n }\n };\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n\n constructor(\n private readonly _storage: ImageStorage,\n private readonly _renderer: ImageRenderer\n ) {\n this._previousOnImageDeleted = this._storage.onImageDeleted;\n this._wrappedOnImageDeleted = (storageId: number) => {\n this._previousOnImageDeleted?.(storageId);\n this._handleStorageImageDeleted(storageId);\n };\n this._storage.onImageDeleted = this._wrappedOnImageDeleted;\n this._storage.onRenderLine = this._renderPlaceholderLine;\n }\n\n // Reserved placeholder text stays in the buffer but never draws as a glyph.\n public hidePlaceholderGlyphs(terminal: ITerminalExt): void {\n const buffer = terminal._core.buffer;\n let cell: CellData | undefined;\n const start = terminal.buffer.active.viewportY;\n for (let row = start; row < start + terminal.rows; ++row) {\n const line = buffer.lines.get(row);\n if (!line) continue;\n for (let col = 0; col < terminal.cols; ++col) {\n if (line.getFg(col) & FgFlags.INVISIBLE) continue;\n if (line.getCodePoint(col) !== PLACEHOLDER_CHAR\n && (!line.isCombined(col) || line.getString(col).codePointAt(0) !== PLACEHOLDER_CHAR)) continue;\n cell ??= new CellData();\n line.loadCell(col, cell);\n cell.fg |= FgFlags.INVISIBLE;\n line.setCell(col, cell);\n }\n }\n }\n\n public reset(): void {\n this._nextImageId = 1;\n this._images.clear();\n this._kittyIdToStorageId.clear();\n this._storageIdToKittyId.clear();\n this._virtualPlacements.clear();\n this._virtualStorageIds.clear();\n }\n\n public dispose(): void {\n this.reset();\n if (this._storage.onImageDeleted === this._wrappedOnImageDeleted) {\n this._storage.onImageDeleted = this._previousOnImageDeleted;\n }\n if (this._storage.onRenderLine === this._renderPlaceholderLine) {\n this._storage.onRenderLine = undefined;\n }\n }\n\n public storeImage(id: number | undefined, imageData: Omit<IKittyImageData, 'id'>, retainVirtual = false): number {\n const imageId = id ?? this._nextImageId++;\n\n if (!retainVirtual) this._deleteVirtualPlacements(imageId);\n const oldStorageId = this._kittyIdToStorageId.get(imageId);\n if (oldStorageId !== undefined) {\n this._storage.deleteImage(oldStorageId);\n this._kittyIdToStorageId.delete(imageId);\n this._storageIdToKittyId.delete(oldStorageId);\n }\n\n if (!this._images.has(imageId) && this._images.size >= KittyImageStorage._maxStoredImages) {\n this._evictUndisplayedImages();\n }\n\n // Encoded images awaiting placement are outside ImageStorage's pixel budget.\n // Unplaced payloads are evicted first so a new upload cannot erase a visible\n // image while abandoned blobs still hold budget; placed ones go only when\n // that is not enough, because the byte cap is a hard bound. The new image is\n // always stored, so an oversized one overshoots by at most one payload\n // (itself bounded by kittySizeLimit) rather than being dropped after an OK ack.\n const byteLimit = this._storage.getLimit() * 1000000;\n this._images.delete(imageId);\n let retainedBytes = 0;\n for (const image of this._images.values()) retainedBytes += image.data.size;\n for (const evictPlaced of [false, true]) {\n for (const [oldestId, image] of this._images) {\n if (retainedBytes + imageData.data.size <= byteLimit) break;\n if ((this._kittyIdToStorageId.has(oldestId) || this._virtualPlacements.has(oldestId)) !== evictPlaced) continue;\n retainedBytes -= image.data.size;\n this.deleteById(oldestId);\n }\n }\n\n this._images.set(imageId, {\n ...imageData,\n id: imageId\n });\n return imageId;\n }\n\n public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void {\n // Clean up stale reverse-mapping from a previous placement of the same\n // kitty image. The old shared-storage entry is kept (it may still be\n // visible on screen) but its reverse mapping is removed so that eviction\n // of the old entry won't incorrectly delete the kitty image data.\n const oldStorageId = this._kittyIdToStorageId.get(kittyId);\n if (oldStorageId !== undefined) {\n this._storageIdToKittyId.delete(oldStorageId);\n }\n this._addImageOpts.scrolling = scrolling;\n this._addImageOpts.layer = layer;\n this._addImageOpts.zIndex = zIndex;\n const storageId = this._storage.addImage(image, this._addImageOpts);\n this._kittyIdToStorageId.set(kittyId, storageId);\n this._storageIdToKittyId.set(storageId, kittyId);\n }\n\n public getImage(kittyId: number): IKittyImageData | undefined {\n return this._images.get(kittyId);\n }\n\n // Fit prototypes at render time so each placement holds only the source pixels.\n public addVirtualPlacement(kittyId: number, placementId: number, image: HTMLCanvasElement | ImageBitmap, cols: number, rows: number): void {\n const previous = this._virtualPlacements.get(kittyId)?.get(placementId);\n if (image.width * image.height * 4 > this._storage.getLimit() * 1000000) throw new Error('virtual image exceeds storage limit');\n if (!previous && this._virtualStorageIds.size >= KittyImageStorage._maxStoredImages) throw new Error('virtual placement limit exceeded');\n if (previous) this._storage.deleteImage(previous.storageId);\n const storageId = this._storage.addUnplacedImage(image, { scrolling: false, layer: 'top', zIndex: 0, cursorPos: 'iip' });\n let placements = this._virtualPlacements.get(kittyId);\n if (!placements) {\n placements = new Map();\n this._virtualPlacements.set(kittyId, placements);\n }\n placements.set(placementId, { placementId, storageId, cols, rows });\n this._virtualStorageIds.set(storageId, { kittyId, placementId });\n this._renderer.refreshAll();\n }\n\n private _virtualPlacementFor(kittyId: number, placementId: number): IVirtualPlacement | undefined {\n const placements = this._virtualPlacements.get(kittyId);\n return placementId === 0 ? placements?.values().next().value : placements?.get(placementId);\n }\n\n public discardVirtualPlacements(kittyId: number, keepPlacementId?: number): void {\n this._deleteVirtualPlacements(kittyId, undefined, keepPlacementId);\n }\n\n private _deleteVirtualPlacements(kittyId: number, placementId?: number, keepPlacementId?: number): void {\n const placements = this._virtualPlacements.get(kittyId);\n if (!placements) return;\n for (const placement of [...placements.values()]) {\n if ((placementId === undefined || placementId === placement.placementId) && placement.placementId !== keepPlacementId) {\n this._storage.deleteImage(placement.storageId);\n }\n }\n }\n\n public deletePlacementsById(kittyId: number, placementId?: number): void {\n this._deleteVirtualPlacements(kittyId, placementId);\n if (placementId !== undefined) return;\n const storageId = this._kittyIdToStorageId.get(kittyId);\n if (storageId !== undefined) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n this._storage.deleteImage(storageId);\n }\n }\n\n public deleteById(kittyId: number, placementId?: number): void {\n this.deletePlacementsById(kittyId, placementId);\n if (!this._virtualPlacements.has(kittyId) && !this._kittyIdToStorageId.has(kittyId)) {\n this._images.delete(kittyId);\n }\n }\n\n public deletePhysicalPlacements(): void {\n for (const [kittyId, storageId] of [...this._kittyIdToStorageId]) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n this._storage.deleteImage(storageId);\n }\n }\n\n public deleteAll(preserveVirtual = false): void {\n if (preserveVirtual) this.deletePhysicalPlacements();\n for (const kittyId of [...this._images.keys()]) {\n if (!preserveVirtual || !this._virtualPlacements.has(kittyId)) this.deleteById(kittyId);\n }\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._images;\n }\n\n public get kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyIdToStorageId;\n }\n\n public get lastImageId(): number {\n return this._nextImageId - 1;\n }\n\n private _evictUndisplayedImages(): void {\n for (const [kittyId] of this._images) {\n if (this._images.size <= KittyImageStorage._maxStoredImages / 2) {\n break;\n }\n if (!this._kittyIdToStorageId.has(kittyId) && !this._virtualPlacements.has(kittyId)) {\n this._images.delete(kittyId);\n this._virtualPlacements.delete(kittyId);\n }\n }\n }\n\n // Omitted diacritics inherit only from a consecutive matching placeholder.\n private readonly _renderPlaceholderLine = (line: IBufferLine, row: number, cols: number): void => {\n if (this._virtualPlacements.size === 0) {\n return;\n }\n let runLength = 0;\n let previous: IPlaceholderCell | undefined;\n for (let col = 0; col <= cols; ++col) {\n const cell = col < cols ? this._placeholderCell(line, col) : undefined;\n if (runLength > 0 && cell !== undefined && previous !== undefined\n && cell.imageId === previous.imageId\n && cell.placementId === previous.placementId\n && (cell.location.row === 0 || cell.location.row === previous.location.row)\n && (cell.location.column === 0 || cell.location.column === previous.location.column + 1)\n && (cell.location.highByte === 0 || cell.location.highByte === previous.location.highByte)) {\n runLength++;\n cell.location.row = Math.max(previous.location.row, 1);\n cell.location.column = previous.location.column + 1;\n cell.location.highByte = Math.max(previous.location.highByte, 1);\n } else {\n if (runLength > 0 && previous !== undefined) {\n this._drawPlaceholderRun(previous, col - runLength, runLength, row);\n }\n runLength = 0;\n if (cell !== undefined) {\n runLength = 1;\n if (!cell.location.row) cell.location.row = 1;\n if (!cell.location.column) cell.location.column = 1;\n if (!cell.location.highByte) cell.location.highByte = 1;\n }\n }\n previous = cell ?? previous;\n }\n };\n\n private _placeholderCell(line: IBufferLine, col: number): IPlaceholderCell | undefined {\n if (!line.isCombined(col) && line.getCodePoint(col) !== PLACEHOLDER_CHAR) {\n return undefined;\n }\n const chars = line.getString(col);\n if (chars.codePointAt(0) !== PLACEHOLDER_CHAR) {\n return undefined;\n }\n\n const fg = line.getFg(col);\n const fgMode = fg & Attributes.CM_MASK;\n const imageId = fgMode === Attributes.CM_RGB\n ? fg & Attributes.RGB_MASK\n : fgMode === 0 ? 0 : fg & Attributes.PCOLOR_MASK;\n if (fgMode === 0) {\n return undefined;\n }\n\n // Placement IDs use underline color without an underline style.\n let placementId = 0;\n const underlineColor = line.getExtended(col)?.underlineColor ?? 0;\n if (underlineColor > 0) {\n const underlineMode = underlineColor & Attributes.CM_MASK;\n placementId = underlineMode === Attributes.CM_RGB\n ? underlineColor & Attributes.RGB_MASK\n : underlineMode === 0 ? 0 : underlineColor & Attributes.PCOLOR_MASK;\n }\n\n const location = decodePlaceholderLocation(chars);\n if (location.row < 0 || location.column < 0 || location.highByte < 0 || location.highByte > 256) return undefined;\n return { imageId, placementId, location };\n }\n\n private _drawPlaceholderRun(cell: IPlaceholderCell, startCol: number, count: number, row: number): void {\n const imageId = (cell.imageId | ((cell.location.highByte - 1) << 24)) >>> 0;\n const placement = this._virtualPlacementFor(imageId, cell.placementId);\n const spec = placement && this._storage.getImageSpec(placement.storageId);\n // `column` is 1-based and holds the last cell of the run.\n const gridRow = cell.location.row - 1;\n const gridCol = cell.location.column - count;\n if (!placement || !spec || gridRow < 0 || gridRow >= placement.rows || gridCol < 0) {\n return;\n }\n // Cells past the placement's box show nothing.\n const tiles = Math.min(count, placement.cols - gridCol);\n if (tiles <= 0) {\n return;\n }\n this._renderer.drawCellImage(spec, placement.cols, placement.rows, gridRow, gridCol, tiles, startCol, row);\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023, 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\n/**\n * wasm base64 decoder.\n */\nconst wasmDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#828e69684093b2c6:rdef-start:\"decode\"*/{s:1,t:0,d:'AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML'}/*inwasm#828e69684093b2c6:rdef-end:\"decode\"*/);\n// SIMD version (speedup ~1.4x, not covered by tests yet)\n/*\nconst wasmDecode = InWasm({\n name: 'decode',\n type: OutputType.INSTANCE,\n mode: OutputMode.SYNC,\n srctype: 'Clang-C',\n imports: {\n env: { memory: new WebAssembly.Memory({ initial: 1 }) }\n },\n exports: {\n dec: () => 0,\n end: () => 0\n },\n compile: {\n switches: ['-msimd128', '-Wl,-z,stack-size=0', '-Wl,--stack-first']\n },\n code: `\n #include <wasm_simd128.h>\n typedef struct {\n unsigned int wp;\n unsigned int sp;\n unsigned int dp;\n unsigned int e_size;\n unsigned int dummy[4];\n unsigned char data[0];\n } State;\n\n unsigned int *D0 = (unsigned int *) ${P32.D0 * 4};\n unsigned int *D1 = (unsigned int *) ${P32.D1 * 4};\n unsigned int *D2 = (unsigned int *) ${P32.D2 * 4};\n unsigned int *D3 = (unsigned int *) ${P32.D3 * 4};\n State *state = (State *) ${P32.STATE * 4};\n\n #define packed_byte(x) wasm_i8x16_splat((char) x)\n #define packed_dword(x) wasm_i32x4_splat(x)\n #define masked(x, mask) wasm_v128_and(x, wasm_i32x4_splat(mask))\n\n __attribute__((noinline)) int dec() {\n unsigned int nsp = (state->wp - 1) & ~3;\n unsigned char *src = state->data + state->sp;\n unsigned char *end = state->data + nsp;\n unsigned char *dst = state->data + state->dp;\n unsigned int error = 0;\n\n v128_t err = wasm_i8x16_splat(0);\n unsigned char *end16 = state->data + (nsp & ~15);\n while (src < end16) {\n v128_t data = wasm_v128_load((v128_t *) src);\n\n // wasm-simd rewrite of http://0x80.pl/notesen/2016-01-17-sse-base64-decoding.html#vector-lookup-pshufb\n const v128_t higher_nibble = wasm_u32x4_shr(data, 4) & packed_byte(0x0f);\n const char linv = 1;\n const char hinv = 0;\n\n const v128_t lower_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n linv, linv, 0x2b, 0x30,\n 0x41, 0x50, 0x61, 0x70,\n linv, linv, linv, linv,\n linv, linv, linv, linv\n );\n const v128_t upper_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n hinv, hinv, 0x2b, 0x39,\n 0x4f, 0x5a, 0x6f, 0x7a,\n hinv, hinv, hinv, hinv,\n hinv, hinv, hinv, hinv\n );\n // the difference between the shift and lower bound\n const v128_t shift_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n 0x00, 0x00, 0x3e - 0x2b, 0x34 - 0x30,\n 0x00 - 0x41, 0x0f - 0x50, 0x1a - 0x61, 0x29 - 0x70,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00\n );\n\n const v128_t upper_bound = wasm_i8x16_swizzle(upper_bound_LUT, higher_nibble);\n const v128_t lower_bound = wasm_i8x16_swizzle(lower_bound_LUT, higher_nibble);\n\n const v128_t below = wasm_i8x16_lt(data, lower_bound);\n const v128_t above = wasm_i8x16_gt(data, upper_bound);\n const v128_t eq_2f = wasm_i8x16_eq(data, packed_byte(0x2f));\n\n // in_range = not (below or above) or eq_2f\n // outside = not in_range = below or above and not eq_2f (from deMorgan law)\n const v128_t outside = wasm_v128_andnot(eq_2f, above | below);\n err = wasm_v128_or(err, outside);\n\n const v128_t shift = wasm_i8x16_swizzle(shift_LUT, higher_nibble);\n const v128_t t0 = wasm_i8x16_add(data, shift);\n v128_t v = wasm_i8x16_add(t0, wasm_v128_and(eq_2f, packed_byte(-3)));\n\n // pack bytes\n const v128_t ca = masked(v, 0x003f003f);\n const v128_t db = masked(v, 0x3f003f00);\n const v128_t t00 = wasm_v128_or(wasm_u32x4_shr(db, 8), wasm_i32x4_shl(ca, 6));\n v128_t res = wasm_v128_or(wasm_u32x4_shr(t00, 16), wasm_i32x4_shl(t00, 12));\n res = wasm_i8x16_swizzle(res, wasm_i8x16_const(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 16, 16, 16, 16));\n\n wasm_v128_store((v128_t *) dst, res);\n dst += 12;\n src += 16;\n }\n //if (wasm_i8x16_bitmask(err) != 0) return -1;\n if (wasm_v128_any_true(err)) return -1;\n\n // operate on 4-byte blocks\n while (src < end) {\n error |= *((unsigned int *) dst) = D0[src[0]] | D1[src[1]] | D2[src[2]] | D3[src[3]];\n dst += 3;\n src += 4;\n }\n if (error >> 24) return -1;\n state->sp = nsp;\n state->dp = dst - state->data;\n return 0;\n }\n\n int end() {\n int rem = state->wp - state->sp;\n if (rem > 4 && dec()) return -1;\n rem = state->wp - state->sp;\n if (rem < 2) return -1;\n\n unsigned char *src = state->data + state->sp;\n if (rem == 4) {\n if (src[3] == 61) rem--;\n if (src[2] == 61) rem--;\n }\n unsigned int accu = D0[src[0]] | D1[src[1]];\n int dp = 1;\n if (rem > 2) {\n accu |= D2[src[2]];\n dp++;\n if (rem == 4) {\n accu |= D3[src[3]];\n dp++;\n }\n }\n if (accu >> 24) return -1;\n *((unsigned int *) (state->data + state->dp)) = accu;\n state->dp += dp;\n return 0;\n }\n `\n});\n*/\n// base64 map\nconst MAP = new Uint8Array('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n .split('')\n .map(el => el.charCodeAt(0)));\n// init decoder maps in LE order\nconst D = new Uint32Array(1024);\nD.fill(0xFF000000);\nfor (let i = 0; i < MAP.length; ++i)\n D[MAP[i]] = i << 2;\nfor (let i = 0; i < MAP.length; ++i)\n D[256 + MAP[i]] = i >> 4 | ((i << 4) & 0xFF) << 8;\nfor (let i = 0; i < MAP.length; ++i)\n D[512 + MAP[i]] = (i >> 2) << 8 | ((i << 6) & 0xFF) << 16;\nfor (let i = 0; i < MAP.length; ++i)\n D[768 + MAP[i]] = i << 16;\nconst EMPTY = new Uint8Array(0);\n/**\n * base64 stream decoder.\n *\n * Features / assumptions:\n * - lazy chunkwise decoding\n * - errors out on any non base64 chars (no support for NL formatted base64)\n * - decodes in wasm\n * - inplace decoding to save memory\n * - supports a keepSize for lazy memory release\n */\nclass Base64Decoder {\n /**\n * @param keepSize Keep the wasm instance below this limit when calling `release()`.\n * @param maxBytes Max allowed bytes to allocate.\n * @param initialBytes Initial bytes to allocate.\n */\n constructor(keepSize, maxBytes, initialBytes) {\n this._inst = null;\n this._ended = true;\n this._bytes = 0;\n this.keepSize = keepSize !== null && keepSize !== void 0 ? keepSize : 1048576 /* Bytes.KEEP */;\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : 4294901760 /* Bytes.MAX */;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : 32768 /* Bytes.INITIAL */;\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw new Error('invalid byte settings');\n }\n }\n /**\n * Currently decoded bytes (borrowed).\n * Must be accessed before calling `release` or `init`.\n */\n get data8() {\n return this._inst ? this._d.subarray(0, this._m32[1282 /* P32.STATE_DP */]) : EMPTY;\n }\n /**\n * Release memory conditionally based on `keepSize`.\n * If memory gets released, also the wasm instance will be freed and recreated on next `init`,\n * otherwise the instance will be reused.\n */\n release() {\n if (!this._inst)\n return;\n if (this._bytes > this.keepSize) {\n this._inst = this._m32 = this._d = this._mem = null;\n }\n else {\n this._m32[1280 /* P32.STATE_WP */] = 0;\n this._m32[1281 /* P32.STATE_SP */] = 0;\n this._m32[1282 /* P32.STATE_DP */] = 0;\n }\n }\n /**\n * Initializes the decoder for new base64 data.\n * Must be called before doing any decoding attempts.\n * The method will either spawn a new wasm instance or grow\n * the needed memory of an existing instance.\n * @param maxBytes Max allowed bytes to allocate (overwrites ctor value).\n * @param initialBytes Initial bytes to allocate (overwrites ctor value).\n */\n init(maxBytes, initialBytes) {\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : this.maxBytes;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : Math.min(this._bytes, this.maxBytes);\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw Error('invalid byte settings');\n }\n let m = this._m32;\n const bytes = this._bytes + 5152 /* Bytes._DATA_OFFSET */;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmDecode({ env: { memory: this._mem } });\n m = new Uint32Array(this._mem.buffer, 0);\n m.set(D, 256 /* P32.D0 */);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n m = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n m[1280 /* P32.STATE_WP */] = 0;\n m[1281 /* P32.STATE_SP */] = 0;\n m[1282 /* P32.STATE_DP */] = 0;\n this._m32 = m;\n this._ended = false;\n }\n /**\n * Realloc memory. Realloc only happens, if the requested\n * size doesn't fit in the current memory.\n * The new size will be capped by `maxBytes`.\n * @param requested Bytes to be stored.\n */\n _realloc(requested) {\n const needed = this._m32[1280 /* P32.STATE_WP */] + requested;\n if (this._bytes < needed) {\n if (needed > this.maxBytes) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n let newSize = this._bytes;\n while ((newSize *= 2) < needed) { }\n newSize = Math.min(newSize, this.maxBytes);\n if (newSize < needed) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n if (newSize + 5152 /* Bytes._DATA_OFFSET */ > this._mem.buffer.byteLength) {\n const addPages = Math.ceil((newSize + 5152 /* Bytes._DATA_OFFSET */ - this._mem.buffer.byteLength) / 65536);\n this._mem.grow(addPages);\n this._m32 = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n this._bytes = newSize;\n }\n return 0 /* DecodeStatus.OK */;\n }\n /**\n * Put bytes in `data` into the decoder.\n * Additionally decodes the payload, if it reached 2^17 bytes.\n * The return value indicates the type of issue.\n * @param data Bytes to be loaded.\n */\n put(data) {\n if (!this._inst || this._ended) {\n return -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n if (this._realloc(data.length)) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n const m = this._m32;\n this._d.set(data, m[1280 /* P32.STATE_WP */]);\n m[1280 /* P32.STATE_WP */] += data.length;\n // max chunk in input handler is 2^17, try to run in \"tandem mode\"\n return m[1280 /* P32.STATE_WP */] - m[1281 /* P32.STATE_SP */] >= 131072\n ? this._inst.exports.dec()\n : 0 /* DecodeStatus.OK */;\n }\n /**\n * End the current decoding.\n * Also decodes leftover payload from previous put calls.\n */\n end() {\n this._ended = true;\n return this._inst\n ? this._inst.exports.end()\n : -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n /**\n * Bytes loaded into the decoder.\n */\n get loadedBytes() {\n return this._inst\n ? this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n /**\n * Free bytes to feed to the decoder.\n */\n get freeBytes() {\n return this._inst\n ? this.maxBytes - this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n}\nexports.default = Base64Decoder;\n//# sourceMappingURL=Base64Decoder.wasm.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\nconst wasmQoiDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#459f9e1bfb80b1a8:rdef-start:\"qoi_decode\"*/{s:1,t:0,d:'AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=='}/*inwasm#459f9e1bfb80b1a8:rdef-end:\"qoi_decode\"*/);\nclass QoiDecoder {\n constructor(keepSize) {\n this.keepSize = keepSize;\n this.width = 0;\n this.height = 0;\n }\n decode(d) {\n this.width = d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7];\n this.height = d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11];\n const pixels = this.width * this.height;\n const ib = pixels * 4;\n const dl = d.length;\n /**\n * byte/offset calculation:\n * To save some memory we dont reserve full memory for decoded + encoded,\n * but place encoded at the end of decoded plus 50% security distance\n * to avoid reads before writes positions:\n *\n * encoded < decoded (good compression)\n * enc ####################\n * dec #######################################\n * ^ ^\n * DST_P CHUNK_P\n *\n * encoded > decoded (degenerated compression, should not happen)\n * enc ##############################\n * dec ####################\n * ^ ^\n * DST_P CHUNK_P\n *\n * There is still a chance for overlapping r/w positions in case the compressed\n * data has very different pixel progression, yet the 50% security distance\n * should deal with that, as QOI will bloat data by 25% at max (RGB -> OP byte + RGB).\n * Since we always assume RGBA at decoding stage, the possible bloat reduces to 20% at max.\n */\n const bytes = Math.max(ib, dl) + (Math.min(ib, dl) >> 1) + 4096;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmQoiDecode({ env: { memory: this._mem } });\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n this._d = null;\n }\n if (!this._d) {\n this._d = new Uint8Array(this._mem.buffer);\n }\n // put src data at the end of memory, also align to 256\n const chunkP = (this._mem.buffer.byteLength - dl) & ~0xFF;\n this._d.set(d, chunkP);\n this._inst.exports.dec(chunkP, dl, pixels);\n return this._d.subarray(1024 /* P8.DST_P */, 1024 /* P8.DST_P */ + ib);\n }\n release() {\n if (!this._inst)\n return;\n if (this._mem.buffer.byteLength > this.keepSize) {\n this._inst = this._d = this._mem = null;\n }\n }\n}\nexports.default = QoiDecoder;\n//# sourceMappingURL=QoiDecoder.wasm.js.map","\"use strict\";\n/**\n * Copyright (c) 2022, 2026 Joerg Breitbart\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InWasm = InWasm;\nlet z = (s) => {\n if (Uint8Array.fromBase64)\n return Uint8Array.fromBase64(s);\n if (typeof Buffer !== 'undefined')\n return Buffer.from(s, 'base64');\n const b = atob(s);\n const r = new Uint8Array(b.length);\n for (let i = 0; i < r.length; ++i)\n r[i] = b.charCodeAt(i);\n return r;\n};\nfunction InWasm(def) {\n if (def.d) {\n const { t, s, d } = def;\n let b;\n let m;\n const W = WebAssembly;\n if (t === 0 /* OutputType.INSTANCE */) {\n if (s)\n return (e) => new W.Instance(m || (m = new W.Module(b || (b = z(d)))), e);\n return (e) => m\n ? W.instantiate(m, e)\n : W.instantiate(b || (b = z(d)), e).then(r => (m = r.module) && r.instance);\n }\n if (t === 1 /* OutputType.MODULE */) {\n if (s)\n return () => m || (m = new W.Module(b || (b = z(d))));\n return () => m\n ? Promise.resolve(m)\n : W.compile(b || (b = z(d))).then(r => m = r);\n }\n if (s)\n return () => b || (b = z(d));\n return () => Promise.resolve(b || (b = z(d)));\n }\n if (typeof _wasmCtx === 'undefined')\n throw new Error('must run \"inwasm\"');\n _wasmCtx.add(def);\n}\n//# sourceMappingURL=index.js.map","// 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) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, IDisposable } from '@xterm/xterm';\nimport type { ImageAddon as IImageApi } from '@xterm/addon-image';\nimport { Emitter, type IEvent } from 'common/Event';\nimport { MicrotaskTimer } from 'common/Async';\nimport { IIPHandler } from './IIPHandler';\nimport { ImageRenderer } from './ImageRenderer';\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { KittyGraphicsHandler } from './kitty/KittyGraphicsHandler';\nimport { KittyImageStorage } from './kitty/KittyImageStorage';\nimport { SixelHandler } from './SixelHandler';\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types';\n\n\n/**\n * Document VT features provided by this addon.\n *\n * @vt: #E[Supported via @xterm/addon-image.] DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q Pt ST\" \"Draw SIXEL image.\"\n *\n * Sixel support is provided by the addon @xterm/addon-image with these limitations:\n * - immediate coloring (no shared palette, allows high color settings of `img2sixel`)\n * - max. palette size of 4096 colors\n * - max. pixel width of 16K\n * - max. 25 MB per sixel sequence\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] OSC 1337 \"iTerm2 Commands\" \"OSC 1337 ; Pt BEL\" \"Custom iTerm2 commands.\"\n *\n * Only the inline image protocol (IIP) is supported by the addon @xterm/addon-image with\n * the following limitations:\n * - sequence:\n * - format: `OSC 1337 ; File=inline=1 ; size=<unencoded size> ; ... : <base64 payload> BEL`\n * - size param must be set and payload may not exceed CEIL(size * 4 / 3)\n * - strict base64 handling as of RFC4648 §4 (standard alphabet, optional padding,\n * no separator bytes allowed)\n * - supported params: size, name, width, height, preserveAspectRatio\n * - image formats: PNG, JPEG and GIF\n * - no animation support (renders first image of a GIF)\n * - no multipart support\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image)\n * and [iTerm2 IIP docs](https://iterm2.com/documentation-images.html) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] APC KITTY_GRAPHICS \"Kitty Graphics\" \"APC G Pt ST\" \"Kitty Graphics Protocol.\"\n *\n * Kitty graphics support is provided by the addon @xterm/addon-image.\n * Note that while basic image output already works, this is still work in progress.\n */\n\n// default values of addon ctor options\nconst DEFAULT_OPTIONS: IImageAddonOptions = {\n enableSizeReports: true,\n pixelLimit: 16777216, // limit to 4096 * 4096 pixels\n sixelSupport: true,\n sixelScrolling: true,\n sixelPaletteLimit: 4096,\n sixelSizeLimit: 33554432,\n storageLimit: 128,\n showPlaceholder: true,\n iipSupport: true,\n iipSizeLimit: 33554432,\n kittySupport: true,\n kittySizeLimit: 33554432\n};\n\n// max palette size supported by the sixel lib (compile time setting)\nconst MAX_SIXEL_PALETTE_SIZE = 4096;\n\n// definitions for _xtermGraphicsAttributes sequence\nconst enum GaItem {\n COLORS = 1,\n SIXEL_GEO = 2,\n REGIS_GEO = 3\n}\nconst enum GaAction {\n READ = 1,\n SET_DEFAULT = 2,\n SET = 3,\n READ_MAX = 4\n}\nconst enum GaStatus {\n SUCCESS = 0,\n ITEM_ERROR = 1,\n ACTION_ERROR = 2,\n FAILURE = 3\n}\n\n\nexport class ImageAddon implements ITerminalAddon, IImageApi {\n private _opts: IImageAddonOptions;\n private _defaultOpts: IImageAddonOptions;\n private _storage: ImageStorage | undefined;\n private _renderer: ImageRenderer | undefined;\n private _disposables: IDisposable[] = [];\n private _terminal: ITerminalExt | undefined;\n private _handlers: Map<String, IResetHandler> = new Map();\n private readonly _onImageAdded = new Emitter<void>();\n public readonly onImageAdded: IEvent<void> = this._onImageAdded.event;\n\n constructor(opts?: Partial<IImageAddonOptions>) {\n this._opts = Object.assign({}, DEFAULT_OPTIONS, opts);\n this._defaultOpts = Object.assign({}, DEFAULT_OPTIONS, opts);\n }\n\n public dispose(): void {\n for (const handler of this._handlers.values()) handler.reset();\n for (const obj of this._disposables) {\n obj.dispose();\n }\n this._disposables.length = 0;\n this._handlers.clear();\n this._onImageAdded.dispose();\n }\n\n private _disposeLater(...args: IDisposable[]): void {\n for (const obj of args) {\n this._disposables.push(obj);\n }\n }\n\n public activate(terminal: ITerminalExt): void {\n this._terminal = terminal;\n\n // internal data structures\n this._renderer = new ImageRenderer(terminal);\n this._storage = new ImageStorage(terminal, this._renderer, this._opts);\n this._storage.onImageAdded = () => this._onImageAdded.fire();\n\n // enable size reports\n if (this._opts.enableSizeReports) {\n const windowOps = terminal.options.windowOptions ?? {};\n windowOps.getWinSizePixels = true;\n windowOps.getCellSizePixels = true;\n windowOps.getWinSizeChars = true;\n terminal.options.windowOptions = windowOps;\n }\n\n this._disposeLater(\n this._renderer,\n this._storage,\n\n // DECSET/DECRST/DA1/XTSMGRAPHICS handlers\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this._decset(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this._decrst(params)),\n terminal.parser.registerCsiHandler({ final: 'c' }, params => this._da1(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'S' }, params => this._xtermGraphicsAttributes(params)),\n\n // render hook\n terminal.onRender(range => this._storage?.render(range)),\n\n /**\n * reset handlers covered:\n * - DECSTR\n * - RIS\n * - Terminal.reset()\n */\n terminal.parser.registerCsiHandler({ intermediates: '!', final: 'p' }, () => this.reset()),\n terminal.parser.registerEscHandler({ final: 'c' }, () => this.reset()),\n terminal._core._inputHandler.onRequestReset(() => this.reset()),\n\n // wipe canvas and delete alternate images on buffer switch\n terminal.buffer.onBufferChange(() => this._storage?.wipeAlternate()),\n\n // extend images to the right on resize\n terminal.onResize(metrics => this._storage?.viewportResize(metrics))\n );\n\n // SIXEL handler\n if (this._opts.sixelSupport) {\n const sixelStorage = new SixelImageStorage(this._storage!, this._opts, this._renderer!, terminal);\n const sixelHandler = new SixelHandler(this._opts, sixelStorage, terminal);\n this._handlers.set('sixel', sixelHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerDcsHandler({ final: 'q' }, sixelHandler)\n );\n }\n\n // iTerm IIP handler\n if (this._opts.iipSupport) {\n const iipStorage = new IIPImageStorage(this._storage!);\n const iipHandler = new IIPHandler(this._opts, this._renderer!, iipStorage, terminal);\n this._handlers.set('iip', iipHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerOscHandler(1337, iipHandler)\n );\n }\n\n // Kitty graphics handler\n if (this._opts.kittySupport) {\n const kittyStorage = new KittyImageStorage(this._storage!, this._renderer!);\n const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, kittyStorage, terminal);\n this._handlers.set('kitty', kittyHandler);\n const scrollMask = new MicrotaskTimer();\n const hide = (): void => kittyStorage.hidePlaceholderGlyphs(terminal);\n this._disposeLater(\n kittyStorage,\n kittyHandler,\n scrollMask,\n terminal.onWriteParsed(() => { scrollMask.cancel(); hide(); }),\n terminal.onScroll(() => scrollMask.set(hide)),\n terminal.onResize(hide),\n terminal._core._inputHandler._parser.registerApcHandler({ final: 'G' }, kittyHandler)\n );\n hide();\n }\n }\n\n // Note: storageLimit is skipped here to not intoduce a surprising side effect.\n public reset(): boolean {\n // reset options customizable by sequences to defaults\n this._opts.sixelScrolling = this._defaultOpts.sixelScrolling;\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n // also clear image storage\n this._storage?.reset();\n // reset protocol handlers\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return false;\n }\n\n public get storageLimit(): number {\n return this._storage?.getLimit() || -1;\n }\n\n public set storageLimit(limit: number) {\n this._storage?.setLimit(limit);\n this._opts.storageLimit = limit;\n }\n\n public get storageUsage(): number {\n if (this._storage) {\n return this._storage.getUsage();\n }\n return -1;\n }\n\n public get showPlaceholder(): boolean {\n return this._opts.showPlaceholder;\n }\n\n public set showPlaceholder(value: boolean) {\n this._opts.showPlaceholder = value;\n this._renderer?.showPlaceholder(value);\n }\n\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.getImageAtBufferCell(x, y);\n }\n\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.extractTileAtBufferCell(x, y);\n }\n\n private _report(s: string): void {\n this._terminal?._core.input(s, false);\n }\n\n private _decset(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = false;\n break;\n }\n }\n return false;\n }\n\n private _decrst(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = true;\n break;\n }\n }\n return false;\n }\n\n // overload DA to return something more appropriate\n private _da1(params: (number | number[])[]): boolean {\n if (params[0]) {\n return true;\n }\n // reported features:\n // 62 - VT220\n // 4 - SIXEL support\n // 9 - charsets\n // 22 - ANSI colors\n if (this._opts.sixelSupport) {\n this._report(`\\x1b[?62;4;9;22c`);\n return true;\n }\n return false;\n }\n\n /**\n * Implementation of xterm's graphics attribute sequence.\n *\n * Supported features:\n * - read/change palette limits (max 4096 by sixel lib)\n * - read SIXEL canvas geometry (reports current window canvas or\n * squared pixelLimit if canvas > pixel limit)\n *\n * Everything else is deactivated.\n */\n private _xtermGraphicsAttributes(params: (number | number[])[]): boolean {\n if (params.length < 2) {\n return true;\n }\n if (params[0] === GaItem.COLORS) {\n switch (params[1]) {\n case GaAction.READ:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n return true;\n case GaAction.SET_DEFAULT:\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n // also reset protocol handlers for now\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return true;\n case GaAction.SET:\n if (params.length > 2 && !(params[2] instanceof Array) && params[2] <= MAX_SIXEL_PALETTE_SIZE) {\n this._opts.sixelPaletteLimit = params[2];\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n } else {\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n }\n return true;\n case GaAction.READ_MAX:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${MAX_SIXEL_PALETTE_SIZE}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n if (params[0] === GaItem.SIXEL_GEO) {\n switch (params[1]) {\n // we only implement read and read_max here\n case GaAction.READ:\n let width = this._renderer?.dimensions?.css.canvas.width;\n let height = this._renderer?.dimensions?.css.canvas.height;\n if (!width || !height) {\n // for some reason we have no working image renderer\n // --> fallback to default cell size\n const cellSize = CELL_SIZE_DEFAULT;\n width = (this._terminal?.cols || 80) * cellSize.width;\n height = (this._terminal?.rows || 24) * cellSize.height;\n }\n if (width * height < this._opts.pixelLimit) {\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${width.toFixed(0)};${height.toFixed(0)}S`);\n } else {\n // if we overflow pixelLimit report that squared instead\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n }\n return true;\n case GaAction.READ_MAX:\n // read_max returns pixelLimit as square area\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n // exit with error on ReGIS or any other requests\n this._report(`\\x1b[?${params[0]};${GaStatus.ITEM_ERROR}S`);\n return true;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","red","n","green","blue","toRGBA8888","r","g","b","a","clamp","low","high","value","Math","max","min","h2c","t1","t2","c","normalizeRGB","round","Object","defineProperty","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","PALETTE_ANSI_256","PALETTE_VT340_GREY","PALETTE_VT340_COLOR","normalizeHLS","nearestColorIndex","fromRGBA8888","alpha","BIG_ENDIAN","Uint8Array","Uint32Array","buffer","console","warn","color","palette","Number","MAX_SAFE_INTEGER","idx","i","length","dr","dg","db","d","h","l","s","v","HLStoRGB","p","push","decodeAsync","decode","Decoder","DecoderAsync","Colors_1","__webpack_require__","wasm_1","WASM_BYTES","Buffer","from","bytestring","atob","result","charCodeAt","decodeBase64","LIMITS","BYTES","WASM_MODULE","NULL_CANVAS","CallbackProxy","constructor","this","bandHandler","width","modeHandler","mode","handle_band","mode_parsed","DEFAULT_OPTIONS","memoryLimit","sixelColor","fillColor","paletteLimit","PALETTE_SIZE","truncate","opts","cbProxy","importObj","env","bind","WebAssembly","instantiate","then","inst","instance","_instance","_cbProxy","_PIXEL_OFFSET","MAX_WIDTH","_canvas","_bandWidths","_maxWidth","_minWidth","_lastOffset","_currentHeight","_opts","assign","Error","_handle_band","_initCanvas","Module","Instance","_wasm","_chunk","memory","get_chunk_address","CHUNK_SIZE","_states","get_state_address","_palette","get_palette_address","set","_pSrc","get_p0_address","init","_fillColor","_truncate","_rasterWidth","_rasterHeight","_width","_height","_level","_mode","_paletteLimit","pixels","height","release","_realloc","offset","additionalPixels","newCanvas","ceil","adv","remaining","subarray","current_width","current_height","memoryUsage","byteLength","properties","level","memUsage","rasterAttributes","numerator","denominator","data","start","end","decodeString","j","data32","currentWidth","fill","escape","final","finalOffset","bw","currentHeight","data8","Uint8ClampedArray","dec","async","millis","Promise","resolve","setTimeout","handler","timeout","store","timer","disposable","dispose","Lifecycle_1","toDisposable","clearTimeout","add","_token","_isDisposed","cancel","cancelAndSet","runner","setIfNotSet","_isScheduled","queueMicrotask","_disposable","undefined","interval","context","handle","setInterval","clearInterval","EventUtils","_listeners","_disposed","event","_event","listener","thisArgs","disposables","entry","fn","slice","indexOf","splice","Array","isArray","fire","call","listeners","len","forward","to","e","map","any","events","DisposableStore","runAndSubscribe","initial","arg","_disposables","Set","isDisposed","o","clear","Disposable","_store","_register","None","freeze","_value","AttributeData","fg","bg","extended","ExtendedAttrs","toColorRGB","fromColorRGB","clone","newObj","isInverse","isBold","isUnderline","hasExtendedAttrs","underlineStyle","isBlink","isInvisible","isItalic","isDim","isStrikethrough","isProtected","isOverline","getFgColorMode","getBgColorMode","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","getFgColor","getBgColor","updateExtended","isEmpty","getUnderlineColor","underlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","ext","_urlId","_ext","urlId","val","payload","TextDecoder_1","Constants_1","AttributeData_1","CellData","content","combinedData","fromCharData","obj","setFromCharData","isCombined","getWidth","getChars","stringFromCodePoint","getCode","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","code","second","CHAR_DATA_WIDTH_INDEX","getAsCharData","attributesEquals","other","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","CHAR_DATA_CODE_INDEX","NULL_CELL_CHAR","NULL_CELL_WIDTH","NULL_CELL_CODE","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","String","fromCharCode","codepoint","_interim","input","target","size","startPos","interim","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","type","missing","fourStop","ImageRenderer_1","ImageStorage_1","Base64Decoder_wasm_1","__importDefault","QoiDecoder_wasm_1","IIPHeaderParser_1","IIPMetrics_1","DEFAULT_HEADER","name","preserveAspectRatio","inline","_renderer","_storage","_coreTerminal","_generation","_aborted","_hp","HeaderParser","_header","_isMultipart","_abortMulti","maxEncodedBytes","iipSizeLimit","initialBytes","_dec","default","_qoiDec","reset","put","state","dataPos","parse","fields","_initDecoder","success","seqType","w","CELL_SIZE_DEFAULT","dimensions","css","canvas","cols","rows","scale","_c","_a","_core","_coreBrowserService","dpr","report","toFixed","cond","blob","metrics","UNSUPPORTED_TYPE","imageType","mime","pixelLimit","_resize","floor","ImageData","byteOffset","ImageRenderer","createCanvas","_b","getContext","putImageData","addImage","Blob","generation","createImageBitmap","resizeWidth","resizeHeight","bm","close","catch","cw","cell","ch","_d","rw","_dim","rh","wf","hf","f","total","cdim","endsWith","parseInt","toStr","toInt","toSize","match","DECODERS","toString","bs","TextDecoder","FILE_MARKER","MULTIPARTFILE_MARKER","FILEPART_MARKER","FILEEND_MARKER","REPORTCELLSIZE_MARKER","MAX_FIELDCHARS","_buffer","_position","_key","k","_storeValue","_storeKey","_addImageOpts","scrolling","layer","zIndex","cursorPos","img","d32","blockLength","jpgSize","dim","limit","_layers","get","localDocument","document","createElement","createImageData","ctx","imgData","_terminal","super","Map","_optionsRefresh","MutableDisposable","_oldOpen","open","parent","_open","screenElement","optionsService","onOptionChange","option","rescaleCanvas","_renderService","refreshRows","removeLayerFromDom","_oldSetRenderer","setRenderer","_placeholderBitmap","_placeholder","showPlaceholder","cellSize","_createPlaceHolder","refreshAll","clearLines","y","clearRect","_e","clearAll","draw","imgSpec","tileId","col","row","count","_rescaleImage","actual","sourceWidth","sourceHeight","actualCellSize","sx","sy","dx","dy","finalWidth","finalHeight","drawImage","drawCellImage","boxCols","boxRows","gridRow","gridCol","orig","boxWidth","boxHeight","fitWidth","dw","dh","sw","sh","clipped","extractTile","drawPlaceholder","values","spec","originalWidth","originalHeight","origCellSize","scaledWidth","scaledHeight","renderer","key","keys","insertLayerToDom","has","classList","style","isolation","insertBefore","firstChild","appendChild","remove","delete","hasLayer","bWidth","blueprint","black","white","shift","x","screen","ctx2","placeholder","bitmap","window","CellData_1","ImageTileInfo","imageId","_images","_lastId","_lowestId","_fullyCleared","_needsFullClear","_pixelLimit","_workCell","setLimit","storageLimit","error","message","getLimit","_viewportMetrics","id","deleteImage","RangeError","_evictOldest","getUsage","_getStoredPixels","storedPixels","_delImg","ImageBitmap","onImageDeleted","wipeAlternate","zero","entries","bufferType","marker","addUnplacedImage","tileCount","virtual","active","onImageAdded","getImageSpec","termCols","termRows","originX","originY","_inputHandler","_dirtyRowTracker","markDirty","line","lines","ybase","_writeToCell","lineFeed","endMarker","registerMarker","onDispose","_evictOnAlternate","render","range","hasTopImages","hasBottomImages","drawCalls","placeholderCalls","ydisp","onRenderLine","getExtended","startTile","startCol","nextE","sort","viewportResize","oldCol","tilesPerRow","hasData","rightCol","hasContent","lastTile","expandCol","getImageAtBufferCell","extractTileAtBufferCell","room","used","current","workCell","loadCell","old","oldSpec","extattr","setCell","Decoder_1","DEFAULT_PALETTE","idleDecoders","poolPrimed","releaseDecoder","idle","convertLe","_size","_decMemoryLimit","_returnDecoder","hook","params","pop","acquireDecoder","attr","colors","foreground","rgba","t","ansi","background","extractActiveBg","_curAttrData","_themeService","sixelPaletteLimit","sixelSizeLimit","unhook","_unhook","advanceCursor","sixelScrolling","KittyGraphicsTypes_1","_kittyStorage","_decodeError","_activeDecoder","_inControlData","_controlData","_controlLength","_encodedSizeLimit","_totalEncodedSize","_parsedCommand","_pendingTransmissions","_maxEncodedBytes","kittySizeLimit","_initialEncodedBytes","_cleanupAllPending","_removePendingEntry","_lastPendingKey","pending","decoder","controlEnd","copyLength","parseKittyCommand","_parseControlDataString","imageNumber","_sendResponse","quiet","action","payloadStart","_streamPayload","pendingKey","previousEncodedSize","_f","totalEncodedSize","decoderToRelease","_g","decoderCapacity","_h","maxPending","oldest","next","cmd","_j","_k","_handleNoPayloadCommand","_handleDelete","isMoreComing","more","decodeError","finalCmd","imageBytes","_handleCommandWithBytesAndCmd","str","fromCodePoint","_handlePlacement","bytes","_handleTransmit","transmission","_handleTransmitDisplay","_handleQuery","image","getImage","unicodePlaceholder","_placeVirtual","_displayImage","placementId","retainVirtual","storeImage","format","compression","lastImageId","expectedBytes","selector","deleteSelector","deletePhysicalPlacements","deleteAll","deleteById","deletePlacementsById","isOk","response","coreService","triggerDataEvent","_decodeAndDisplay","_createBitmap","cropped","_cropImage","imgCols","imgRows","_placementGrid","columns","savedX","savedY","savedYbase","scaled","xOffset","yOffset","canvasW","canvasH","offsetCanvas","offsetCtx","offsetBitmap","cursorMovement","scrolled","cropX","cropY","cropW","cropH","maxCropW","maxCropH","finalCropW","finalCropH","replaces","isCurrent","addVirtualPlacement","discardVirtualPlacements","arrayBuffer","_decompressZlib","url","URL","createObjectURL","Image","reject","addEventListener","revokeObjectURL","src","pixelCount","src32","dst32","alignedPixels","srcOffset","dstOffset","b0","b1","b2","srcByte","dstByte","compressed","_decompress","offsetIn","reader","ReadableStream","pull","controller","enqueue","pipeThrough","DecompressionStream","getReader","chunks","totalLength","done","read","releaseLock","chunk","images","_kittyIdToStorageId","kittyIdToStorageId","pendingTransmissions","parts","split","part","eqIdx","substring","numValue","chars","column","highByte","placeholderDiacriticValue","PLACEHOLDER_CHAR","PLACEHOLDER_DIACRITICS","PLACEHOLDER_DIACRITIC_VALUES","mark","codePointAt","KittyImageStorage","_nextImageId","_storageIdToKittyId","_virtualPlacements","_virtualStorageIds","_handleStorageImageDeleted","storageId","placements","kittyId","_renderPlaceholderLine","previous","runLength","_placeholderCell","location","_drawPlaceholderRun","_previousOnImageDeleted","_wrappedOnImageDeleted","hidePlaceholderGlyphs","terminal","viewportY","getFg","getCodePoint","getString","imageData","_deleteVirtualPlacements","oldStorageId","_maxStoredImages","_evictUndisplayedImages","byteLimit","retainedBytes","evictPlaced","oldestId","_virtualPlacementFor","keepPlacementId","placement","preserveVirtual","fgMode","underlineMode","decodePlaceholderLocation","tiles","wasmDecode","InWasm","MAP","el","D","EMPTY","keepSize","maxBytes","_inst","_ended","_bytes","_m32","_mem","m","grow","Memory","requested","needed","newSize","addPages","loadedBytes","freeBytes","wasmQoiDecode","ib","dl","chunkP","def","W","z","compile","_wasmCtx","fromBase64","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","Event_1","Async_1","IIPHandler_1","KittyGraphicsHandler_1","KittyImageStorage_1","SixelHandler_1","SixelImageStorage_1","IIPImageStorage_1","enableSizeReports","sixelSupport","iipSupport","kittySupport","_handlers","_onImageAdded","Emitter","_defaultOpts","_disposeLater","args","activate","ImageStorage","windowOps","options","windowOptions","getWinSizePixels","getCellSizePixels","getWinSizeChars","parser","registerCsiHandler","prefix","_decset","_decrst","_da1","_xtermGraphicsAttributes","onRender","intermediates","registerEscHandler","onRequestReset","onBufferChange","onResize","sixelStorage","SixelImageStorage","sixelHandler","SixelHandler","_parser","registerDcsHandler","iipStorage","IIPImageStorage","iipHandler","IIPHandler","registerOscHandler","kittyStorage","kittyHandler","KittyGraphicsHandler","scrollMask","MicrotaskTimer","hide","onWriteParsed","onScroll","registerApcHandler","storageUsage","_report","sqrt"],"sourceRoot":""}
|
||
\ No newline at end of file
|
||
diff --git a/lib/addon-image.mjs b/lib/addon-image.mjs
|
||
index 096b58a76fb8aa77dfe925cc1f69290be25fdab2..1d420850834c781761ec6650637ab40700cb052b 100644
|
||
--- a/lib/addon-image.mjs
|
||
+++ b/lib/addon-image.mjs
|
||
@@ -14,5 +14,5 @@
|
||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
*--------------------------------------------------------------------------------------------*/
|
||
-var ot=Object.create;var ve=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,gt=Object.prototype.hasOwnProperty;var L=(s,e)=>()=>{try{return e||s((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}};var dt=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let A of ht(e))!gt.call(s,A)&&A!==t&&ve(s,A,{get:()=>e[A],enumerable:!(i=at(e,A))||i.enumerable});return s};var R=(s,e,t)=>(t=s!=null?ot(lt(s)):{},dt(e||!s||!s.__esModule?ve(t,"default",{value:s,enumerable:!0}):t,s));var Z=L(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});u.DEFAULT_FOREGROUND=u.DEFAULT_BACKGROUND=u.PALETTE_ANSI_256=u.PALETTE_VT340_GREY=u.PALETTE_VT340_COLOR=u.normalizeHLS=u.normalizeRGB=u.nearestColorIndex=u.fromRGBA8888=u.toRGBA8888=u.alpha=u.blue=u.green=u.red=u.BIG_ENDIAN=void 0;u.BIG_ENDIAN=new Uint8Array(new Uint32Array([4278190080]).buffer)[0]===255;u.BIG_ENDIAN&&console.warn("BE platform detected. This version of node-sixel works only on LE properly.");function Fe(s){return s&255}u.red=Fe;function Ne(s){return s>>>8&255}u.green=Ne;function ke(s){return s>>>16&255}u.blue=ke;function ct(s){return s>>>24&255}u.alpha=ct;function f(s,e,t,i=255){return((i&255)<<24|(t&255)<<16|(e&255)<<8|s&255)>>>0}u.toRGBA8888=f;function ut(s){return[s&255,s>>8&255,s>>16&255,s>>>24]}u.fromRGBA8888=ut;function mt(s,e){let t=Fe(s),i=Ne(s),A=ke(s),r=Number.MAX_SAFE_INTEGER,o=-1;for(let n=0;n<e.length;++n){let a=t-e[n][0],l=i-e[n][1],h=A-e[n][2],g=a*a+l*l+h*h;if(!g)return n;g<r&&(r=g,o=n)}return o}u.nearestColorIndex=mt;function Ie(s,e,t){return Math.max(s,Math.min(t,e))}function ce(s,e,t){return t<0&&(t+=1),t>1&&(t-=1),t*6<1?e+(s-e)*6*t:t*2<1?s:t*3<2?e+(s-e)*(4-t*6):e}function _t(s,e,t){if(!t){let r=Math.round(e*255);return f(r,r,r)}let i=e<.5?e*(1+t):e+t-e*t,A=2*e-i;return f(Ie(0,255,Math.round(ce(i,A,s+1/3)*255)),Ie(0,255,Math.round(ce(i,A,s)*255)),Ie(0,255,Math.round(ce(i,A,s-1/3)*255)))}function c(s,e,t){return(4278190080|Math.round(t/100*255)<<16|Math.round(e/100*255)<<8|Math.round(s/100*255))>>>0}u.normalizeRGB=c;function Ct(s,e,t){return _t((s+240%360)/360,e/100,t/100)}u.normalizeHLS=Ct;u.PALETTE_VT340_COLOR=new Uint32Array([c(0,0,0),c(20,20,80),c(80,13,13),c(20,80,20),c(80,20,80),c(20,80,80),c(80,80,20),c(53,53,53),c(26,26,26),c(33,33,60),c(60,26,26),c(33,60,33),c(60,33,60),c(33,60,60),c(60,60,33),c(80,80,80)]);u.PALETTE_VT340_GREY=new Uint32Array([c(0,0,0),c(13,13,13),c(26,26,26),c(40,40,40),c(6,6,6),c(20,20,20),c(33,33,33),c(46,46,46),c(0,0,0),c(13,13,13),c(26,26,26),c(40,40,40),c(6,6,6),c(20,20,20),c(33,33,33),c(46,46,46)]);u.PALETTE_ANSI_256=(()=>{let s=[f(0,0,0),f(205,0,0),f(0,205,0),f(205,205,0),f(0,0,238),f(205,0,205),f(0,250,205),f(229,229,229),f(127,127,127),f(255,0,0),f(0,255,0),f(255,255,0),f(92,92,255),f(255,0,255),f(0,255,255),f(255,255,255)],e=[0,95,135,175,215,255];for(let t=0;t<6;++t)for(let i=0;i<6;++i)for(let A=0;A<6;++A)s.push(f(e[t],e[i],e[A]));for(let t=8;t<=238;t+=10)s.push(f(t,t,t));return new Uint32Array(s)})();u.DEFAULT_BACKGROUND=f(0,0,0,255);u.DEFAULT_FOREGROUND=f(255,255,255,255)});var Ce=L(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0});_e.InWasm=pt;var F=s=>{if(Uint8Array.fromBase64)return Uint8Array.fromBase64(s);if(typeof Buffer<"u")return Buffer.from(s,"base64");let e=atob(s),t=new Uint8Array(e.length);for(let i=0;i<t.length;++i)t[i]=e.charCodeAt(i);return t};function pt(s){if(s.d){let{t:e,s:t,d:i}=s,A,r,o=WebAssembly;return e===0?t?n=>new o.Instance(r||(r=new o.Module(A||(A=F(i)))),n):n=>r?o.instantiate(r,n):o.instantiate(A||(A=F(i)),n).then(a=>(r=a.module)&&a.instance):e===1?t?()=>r||(r=new o.Module(A||(A=F(i)))):()=>r?Promise.resolve(r):o.compile(A||(A=F(i))).then(n=>r=n):t?()=>A||(A=F(i)):()=>Promise.resolve(A||(A=F(i)))}if(typeof _wasmCtx>"u")throw new Error('must run "inwasm"');_wasmCtx.add(s)}});var fe=L(pe=>{"use strict";Object.defineProperty(pe,"__esModule",{value:!0});var ft=Ce(),Bt=(0,ft.InWasm)({s:1,t:0,d:"AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML"}),S=new Uint8Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").map(s=>s.charCodeAt(0))),N=new Uint32Array(1024);N.fill(4278190080);for(let s=0;s<S.length;++s)N[S[s]]=s<<2;for(let s=0;s<S.length;++s)N[256+S[s]]=s>>4|(s<<4&255)<<8;for(let s=0;s<S.length;++s)N[512+S[s]]=s>>2<<8|(s<<6&255)<<16;for(let s=0;s<S.length;++s)N[768+S[s]]=s<<16;var Qt=new Uint8Array(0),Ee=class{constructor(e,t,i){if(this._inst=null,this._ended=!0,this._bytes=0,this.keepSize=e??1048576,this.maxBytes=t??4294901760,this._bytes=i??32768,this._bytes>this.maxBytes||this.maxBytes>4294901760)throw new Error("invalid byte settings")}get data8(){return this._inst?this._d.subarray(0,this._m32[1282]):Qt}release(){this._inst&&(this._bytes>this.keepSize?this._inst=this._m32=this._d=this._mem=null:(this._m32[1280]=0,this._m32[1281]=0,this._m32[1282]=0))}init(e,t){if(this.maxBytes=e??this.maxBytes,this._bytes=t??Math.min(this._bytes,this.maxBytes),this._bytes>this.maxBytes||this.maxBytes>4294901760)throw Error("invalid byte settings");let i=this._m32,A=this._bytes+5152;this._inst?this._mem.buffer.byteLength<A&&(this._mem.grow(Math.ceil((A-this._mem.buffer.byteLength)/65536)),i=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)):(this._mem=new WebAssembly.Memory({initial:Math.ceil(A/65536)}),this._inst=Bt({env:{memory:this._mem}}),i=new Uint32Array(this._mem.buffer,0),i.set(N,256),this._d=new Uint8Array(this._mem.buffer,5152)),i[1280]=0,i[1281]=0,i[1282]=0,this._m32=i,this._ended=!1}_realloc(e){let t=this._m32[1280]+e;if(this._bytes<t){if(t>this.maxBytes)return-3;let i=this._bytes;for(;(i*=2)<t;);if(i=Math.min(i,this.maxBytes),i<t)return-3;if(i+5152>this._mem.buffer.byteLength){let A=Math.ceil((i+5152-this._mem.buffer.byteLength)/65536);this._mem.grow(A),this._m32=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)}this._bytes=i}return 0}put(e){if(!this._inst||this._ended)return-2;if(this._realloc(e.length))return-3;let t=this._m32;return this._d.set(e,t[1280]),t[1280]+=e.length,t[1280]-t[1281]>=131072?this._inst.exports.dec():0}end(){return this._ended=!0,this._inst?this._inst.exports.end():-2}get loadedBytes(){return this._inst?this._m32[1280]:0}get freeBytes(){return this._inst?this.maxBytes-this._m32[1280]:0}};pe.default=Ee});var Ge=L(Qe=>{"use strict";Object.defineProperty(Qe,"__esModule",{value:!0});var Dt=Ce(),bt=(0,Dt.InWasm)({s:1,t:0,d:"AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=="}),Be=class{constructor(e){this.keepSize=e,this.width=0,this.height=0}decode(e){this.width=e[4]<<24|e[5]<<16|e[6]<<8|e[7],this.height=e[8]<<24|e[9]<<16|e[10]<<8|e[11];let t=this.width*this.height,i=t*4,A=e.length,r=Math.max(i,A)+(Math.min(i,A)>>1)+4096;this._inst?this._mem.buffer.byteLength<r&&(this._mem.grow(Math.ceil((r-this._mem.buffer.byteLength)/65536)),this._d=null):(this._mem=new WebAssembly.Memory({initial:Math.ceil(r/65536)}),this._inst=bt({env:{memory:this._mem}})),this._d||(this._d=new Uint8Array(this._mem.buffer));let o=this._mem.buffer.byteLength-A&-256;return this._d.set(e,o),this._inst.exports.dec(o,A,t),this._d.subarray(1024,1024+i)}release(){this._inst&&this._mem.buffer.byteLength>this.keepSize&&(this._inst=this._d=this._mem=null)}};Qe.default=Be});var Xe=L(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.LIMITS=void 0;re.LIMITS={CHUNK_SIZE:16384,PALETTE_SIZE:4096,MAX_WIDTH:16384,BYTES:"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AEHAiwIgADcDAEG4iwIgADcDAEGwiwIgADcDAEGoiwIgADcDAEGgiwIgADcDAEGYiwIgADcDAEGQiwIgADcDAEGIiwIgADcDAEGAiwIgADcDAEH4igIgADcDAEHwigIgADcDAEHoigIgADcDAEHgigIgADcDAEHYigIgADcDAEHQigIgADcDAEHIigIgADcDAEHAigIgADcDAEG4igIgADcDAEGwigIgADcDAEGoigIgADcDAEGgigIgADcDAEGYigIgADcDAEGQigIgADcDAEGIigIgADcDAEGAigIgADcDAEH4iQIgADcDAEHwiQIgADcDAEHoiQIgADcDAEHgiQIgADcDAEHYiQIgADcDAEHQiQIgADcDAEHIiQIgADcDAEHAiQIgADcDAEG4iQIgADcDAEGwiQIgADcDAEGoCCgCACIEQf8AakGAAW0hCAJAIARBgQFIDQBBASEBIAhBAiAIQQJKG0EBayICQQFxIQMgBEGBAk4EQCACQX5xIQIDQCABQQl0IgdBEHJBoIkCakGwiQJBgAT8CgAAIAdBsI0CakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsLIANFDQAgAUEJdEEQckGgiQJqQbCJAkGABPwKAAALAkAgBEEBSA0AIAhBASAIQQFKGyIDQQFxIQUCQCADQQFrIgdFBEBBACEBDAELIANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQbCJBmpBsIkCQYAE/AoAACAGQZAEckGwiQZqQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACwsgBQRAIAFBCXRBEHJBsIkGakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEFIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiBkEQckHAiQpqQbCJAkGABPwKAAAgBkGQBHJBwIkKakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAFBEAgAUECdEHAiQpqQbCJAkGABPwKAAALIARBAUgNACADQQFxIQUgBwR/IANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQdCJDmpBsIkCQYAE/AoAACAGQZAEckHQiQ5qQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACyABQQd0QQRyBUEECyEBIAUEQCABQQJ0QdCJ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"}});var Ve=L(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.decodeAsync=y.decode=y.Decoder=y.DecoderAsync=void 0;var J=Z(),Q=Xe();function xt(s){if(typeof Buffer<"u")return Buffer.from(s,"base64");let e=atob(s),t=new Uint8Array(e.length);for(let i=0;i<t.length;++i)t[i]=e.charCodeAt(i);return t}var Ze=xt(Q.LIMITS.BYTES),K,ne=new Uint32Array,Te=class{constructor(){this.bandHandler=e=>1,this.modeHandler=e=>1}handle_band(e){return this.bandHandler(e)}mode_parsed(e){return this.modeHandler(e)}},St={memoryLimit:2048*65536,sixelColor:J.DEFAULT_FOREGROUND,fillColor:J.DEFAULT_BACKGROUND,palette:J.PALETTE_VT340_COLOR,paletteLimit:Q.LIMITS.PALETTE_SIZE,truncate:!0};function je(s){let e=new Te,t={env:{handle_band:e.handle_band.bind(e),mode_parsed:e.mode_parsed.bind(e)}};return WebAssembly.instantiate(K||Ze,t).then(i=>(K=K||i.module,new P(s,i.instance||i,e)))}y.DecoderAsync=je;var P=class{constructor(e,t,i){if(this._PIXEL_OFFSET=Q.LIMITS.MAX_WIDTH+4,this._canvas=ne,this._bandWidths=[],this._maxWidth=0,this._minWidth=Q.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0,this._opts=Object.assign({},St,e),this._opts.paletteLimit>Q.LIMITS.PALETTE_SIZE)throw new Error(`DecoderOptions.paletteLimit must not exceed ${Q.LIMITS.PALETTE_SIZE}`);if(t)i.bandHandler=this._handle_band.bind(this),i.modeHandler=this._initCanvas.bind(this);else{let A=K||(K=new WebAssembly.Module(Ze));t=new WebAssembly.Instance(A,{env:{handle_band:this._handle_band.bind(this),mode_parsed:this._initCanvas.bind(this)}})}this._instance=t,this._wasm=this._instance.exports,this._chunk=new Uint8Array(this._wasm.memory.buffer,this._wasm.get_chunk_address(),Q.LIMITS.CHUNK_SIZE),this._states=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_state_address(),12),this._palette=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_palette_address(),Q.LIMITS.PALETTE_SIZE),this._palette.set(this._opts.palette),this._pSrc=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_p0_address()),this._wasm.init(J.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}get _fillColor(){return this._states[0]}get _truncate(){return this._states[8]}get _rasterWidth(){return this._states[6]}get _rasterHeight(){return this._states[7]}get _width(){return this._states[2]?this._states[2]-4:0}get _height(){return this._states[3]}get _level(){return this._states[9]}get _mode(){return this._states[10]}get _paletteLimit(){return this._states[11]}_initCanvas(e){if(e===2){let t=this.width*this.height;if(t>this._canvas.length){if(this._opts.memoryLimit&&t*4>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(t)}this._maxWidth=this._width}else if(e===1)if(this._level===2){let t=Math.min(this._rasterWidth,Q.LIMITS.MAX_WIDTH)*this._rasterHeight;if(t>this._canvas.length){if(this._opts.memoryLimit&&t*4>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(t)}}else this._canvas.length<65536&&(this._canvas=new Uint32Array(65536));return 0}_realloc(e,t){let i=e+t;if(i>this._canvas.length){if(this._opts.memoryLimit&&i*4>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");let A=new Uint32Array(Math.ceil(i/65536)*65536);A.set(this._canvas),this._canvas=A}}_handle_band(e){let t=this._PIXEL_OFFSET,i=this._lastOffset;if(this._mode===2){let A=this.height-this._currentHeight,r=0;for(;r<6&&A>0;)this._canvas.set(this._pSrc.subarray(t*r,t*r+e),i+e*r),r++,A--;this._lastOffset+=e*r,this._currentHeight+=r}else if(this._mode===1){this._realloc(i,e*6),this._maxWidth=Math.max(this._maxWidth,e),this._minWidth=Math.min(this._minWidth,e);for(let A=0;A<6;++A)this._canvas.set(this._pSrc.subarray(t*A,t*A+e),i+e*A);this._bandWidths.push(e),this._lastOffset+=e*6,this._currentHeight+=6}return 0}get width(){return this._mode!==1?this._width:Math.max(this._maxWidth,this._wasm.current_width())}get height(){return this._mode!==1?this._height:this._wasm.current_width()?this._bandWidths.length*6+this._wasm.current_height():this._bandWidths.length*6}get palette(){return this._palette.subarray(0,this._paletteLimit)}get memoryUsage(){return this._canvas.byteLength+this._wasm.memory.buffer.byteLength+8*this._bandWidths.length}get properties(){return{width:this.width,height:this.height,mode:this._mode,level:this._level,truncate:!!this._truncate,paletteLimit:this._paletteLimit,fillColor:this._fillColor,memUsage:this.memoryUsage,rasterAttributes:{numerator:this._states[4],denominator:this._states[5],width:this._rasterWidth,height:this._rasterHeight}}}init(e=this._opts.fillColor,t=this._opts.palette,i=this._opts.paletteLimit,A=this._opts.truncate){this._wasm.init(this._opts.sixelColor,e,i,A?1:0),t&&this._palette.set(t.subarray(0,Q.LIMITS.PALETTE_SIZE)),this._bandWidths.length=0,this._maxWidth=0,this._minWidth=Q.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0}decode(e,t=0,i=e.length){let A=t;for(;A<i;){let r=Math.min(i-A,Q.LIMITS.CHUNK_SIZE);this._chunk.set(e.subarray(A,A+=r)),this._wasm.decode(0,r)}}decodeString(e,t=0,i=e.length){let A=t;for(;A<i;){let r=Math.min(i-A,Q.LIMITS.CHUNK_SIZE);for(let o=0,n=A;o<r;++o,++n)this._chunk[o]=e.charCodeAt(n);A+=r,this._wasm.decode(0,r)}}get data32(){if(this._mode===0||!this.width||!this.height)return ne;let e=this._wasm.current_width();if(this._mode===2){let t=this.height-this._currentHeight;if(t>0){let i=this._PIXEL_OFFSET,A=this._lastOffset,r=0;for(;r<6&&t>0;)this._canvas.set(this._pSrc.subarray(i*r,i*r+e),A+e*r),r++,t--;t&&this._canvas.fill(this._fillColor,A+e*r)}return this._canvas.subarray(0,this.width*this.height)}if(this._mode===1){if(this._minWidth===this._maxWidth){let r=!1;if(e)if(e!==this._minWidth)r=!0;else{let o=this._PIXEL_OFFSET,n=this._lastOffset;this._realloc(n,e*6);for(let a=0;a<6;++a)this._canvas.set(this._pSrc.subarray(o*a,o*a+e),n+e*a)}if(!r)return this._canvas.subarray(0,this.width*this.height)}let t=new Uint32Array(this.width*this.height);t.fill(this._fillColor);let i=0,A=0;for(let r=0;r<this._bandWidths.length;++r){let o=this._bandWidths[r];for(let n=0;n<6;++n)t.set(this._canvas.subarray(A,A+=o),i),i+=this.width}if(e){let r=this._PIXEL_OFFSET,o=this._wasm.current_height();for(let n=0;n<o;++n)t.set(this._pSrc.subarray(r*n,r*n+e),i+this.width*n)}return t}return ne}get data8(){return new Uint8ClampedArray(this.data32.buffer,0,this.width*this.height*4)}release(){this._canvas=ne,this._bandWidths.length=0,this._maxWidth=0,this._minWidth=Q.LIMITS.MAX_WIDTH,this._wasm.init(J.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}};y.Decoder=P;function Mt(s,e){let t=new P(e);return t.init(),typeof s=="string"?t.decodeString(s):t.decode(s),{width:t.width,height:t.height,data32:t.data32,data8:t.data8}}y.decode=Mt;async function Tt(s,e){let t=await je(e);return t.init(),typeof s=="string"?t.decodeString(s):t.decode(s),{width:t.width,height:t.height,data32:t.data32,data8:t.data8}}y.decodeAsync=Tt});function G(s){return{dispose:s}}var H=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(let e of this._disposables)e.dispose();this._disposables.clear()}},k=class{constructor(){this._store=new H}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}};k.None=Object.freeze({dispose(){}});var z=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}};var X=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(e,t,i)=>{if(this._disposed)return G(()=>{});let A={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(A);let r=G(()=>{let o=this._listeners.indexOf(A);o!==-1&&(this._listeners=this._listeners.slice(),this._listeners.splice(o,1))});return i&&(Array.isArray(i)?i.push(r):i.add(r)),r},this._event)}fire(e){if(this._disposed||!this._listeners.length)return;if(this._listeners.length===1){this._listeners[0].fn.call(this._listeners[0].thisArgs,e);return}let t=this._listeners;for(let i=0,A=t.length;i<A;++i)t[i].fn.call(t[i].thisArgs,e)}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},It;(A=>{function s(r,o){return r(n=>o.fire(n))}A.forward=s;function e(r,o){return(n,a,l)=>r(h=>n.call(a,o(h)),void 0,l)}A.map=e;function t(...r){return(o,n,a)=>{let l=new H;for(let h of r)l.add(h(g=>o.call(n,g)));return a&&(Array.isArray(a)?a.push(l):a.add(l)),l}}A.any=t;function i(r,o,n){return o(n),r(a=>o(a))}A.runAndSubscribe=i})(It||={});var ue=R(Z());var D=class s extends k{constructor(t){super();this._terminal=t;this._layers=new Map;this._optionsRefresh=this._register(new z);this._oldOpen=this._terminal._core.open,this._terminal._core.open=i=>{this._oldOpen?.call(this._terminal._core,i),this._open()},this._terminal._core.screenElement&&this._open(),this._optionsRefresh.value=this._terminal._core.optionsService.onOptionChange(i=>{i==="fontSize"&&(this.rescaleCanvas(),this._renderService?.refreshRows(0,this._terminal.rows))}),this._register(G(()=>{this.removeLayerFromDom(),this.removeLayerFromDom("bottom"),this._terminal._core&&this._oldOpen&&(this._terminal._core.open=this._oldOpen,this._oldOpen=void 0),this._renderService&&this._oldSetRenderer&&(this._renderService.setRenderer=this._oldSetRenderer,this._oldSetRenderer=void 0),this._renderService=void 0,this._layers.clear(),this._placeholderBitmap?.close(),this._placeholderBitmap=void 0,this._placeholder=void 0}))}get canvas(){return this._layers.get("top")?.canvas}static createCanvas(t,i,A){let r=(t??document).createElement("canvas");return r.width=i|0,r.height=A|0,r}static createImageData(t,i,A,r){if(typeof ImageData!="function"){let o=t.createImageData(i,A);return r&&o.data.set(new Uint8ClampedArray(r,0,i*A*4)),o}return r?new ImageData(new Uint8ClampedArray(r,0,i*A*4),i,A):new ImageData(i,A)}static createImageBitmap(t){return typeof createImageBitmap!="function"?Promise.resolve(void 0):createImageBitmap(t)}showPlaceholder(t){t?!this._placeholder&&this.cellSize.height!==-1&&this._createPlaceHolder(Math.max(this.cellSize.height+1,24)):(this._placeholderBitmap?.close(),this._placeholderBitmap=void 0,this._placeholder=void 0),this._renderService?.refreshRows(0,this._terminal.rows)}get dimensions(){return this._terminal.dimensions}get cellSize(){return{width:this.dimensions?.css.cell.width||-1,height:this.dimensions?.css.cell.height||-1}}clearLines(t,i,A){let r=t*(this.dimensions?.css.cell.height||0),o=this.dimensions?.css.canvas.width||0,n=(i+1-t)*(this.dimensions?.css.cell.height||0);(!A||A==="top")&&this._layers.get("top")?.clearRect(0,r,o,n),(!A||A==="bottom")&&this._layers.get("bottom")?.clearRect(0,r,o,n)}clearAll(t){if(!t||t==="top"){let i=this._layers.get("top");i?.clearRect(0,0,i.canvas.width,i.canvas.height)}if(!t||t==="bottom"){let i=this._layers.get("bottom");i?.clearRect(0,0,i.canvas.width,i.canvas.height)}}draw(t,i,A,r,o=1){let n=this._layers.get(t.layer);if(!n)return;let{width:a,height:l}=this.cellSize;if(a===-1||l===-1)return;this._rescaleImage(t,a,l);let h=t.actual,g=Math.ceil(h.width/a),d=i%g*a,m=Math.floor(i/g)*l,I=A*a,C=r*l,p=o*a+d>h.width?h.width-d:o*a,_=m+l>h.height?h.height-m:l;n.drawImage(h,Math.floor(d),Math.floor(m),Math.ceil(p),Math.ceil(_),Math.floor(I),Math.floor(C),Math.ceil(p),Math.ceil(_))}extractTile(t,i){let{width:A,height:r}=this.cellSize;if(A===-1||r===-1)return;this._rescaleImage(t,A,r);let o=t.actual,n=Math.ceil(o.width/A),a=i%n*A,l=Math.floor(i/n)*r,h=A+a>o.width?o.width-a:A,g=l+r>o.height?o.height-l:r,d=s.createCanvas(this.document,h,g),m=d.getContext("2d");if(m)return m.drawImage(o,Math.floor(a),Math.floor(l),Math.floor(h),Math.floor(g),0,0,Math.floor(h),Math.floor(g)),d}drawPlaceholder(t,i,A=1){let r=this._layers.get("top");if(r){let{width:o,height:n}=this.cellSize;if(o===-1||n===-1||(this._placeholder?n>=this._placeholder.height&&this._createPlaceHolder(n+1):this._createPlaceHolder(Math.max(n+1,24)),!this._placeholder))return;r.drawImage(this._placeholderBitmap??this._placeholder,t*o,i*n%2?0:1,o*A,n,t*o,i*n,o*A,n)}}rescaleCanvas(){let t=this.dimensions?.css.canvas.width||0,i=this.dimensions?.css.canvas.height||0;for(let A of this._layers.values())(A.canvas.width!==t||A.canvas.height!==i)&&(A.canvas.width=t,A.canvas.height=i)}_rescaleImage(t,i,A){if(i===t.actualCellSize.width&&A===t.actualCellSize.height)return;let{width:r,height:o}=t.origCellSize;if(i===r&&A===o){t.actual=t.orig,t.actualCellSize.width=r,t.actualCellSize.height=o;return}let n=s.createCanvas(this.document,Math.ceil(t.orig.width*i/r),Math.ceil(t.orig.height*A/o)),a=n.getContext("2d");a&&(a.drawImage(t.orig,0,0,n.width,n.height),t.actual=n,t.actualCellSize.width=i,t.actualCellSize.height=A)}_open(){this._renderService=this._terminal._core._renderService,this._oldSetRenderer=this._renderService.setRenderer.bind(this._renderService),this._renderService.setRenderer=t=>{for(let i of[...this._layers.keys()])this.removeLayerFromDom(i);this._oldSetRenderer?.call(this._renderService,t)}}insertLayerToDom(t="top"){if(!this.document||!this._terminal._core.screenElement){console.warn("image addon: cannot insert output canvas to DOM, missing document or screenElement");return}if(this._layers.has(t))return;let i=s.createCanvas(this.document,this.dimensions?.css.canvas.width||0,this.dimensions?.css.canvas.height||0);i.classList.add(`xterm-image-layer-${t}`);let A=this._terminal._core.screenElement;A.style.isolation="isolate",t==="bottom"?(i.style.zIndex="-1",A.insertBefore(i,A.firstChild)):(i.style.zIndex="0",A.appendChild(i));let r=i.getContext("2d",{alpha:!0});if(!r){i.remove();return}this._layers.set(t,r),this.clearAll(t)}removeLayerFromDom(t="top"){let i=this._layers.get(t);i&&(i.canvas.remove(),this._layers.delete(t))}hasLayer(t){return this._layers.has(t)}_createPlaceHolder(t=24){this._placeholderBitmap?.close(),this._placeholderBitmap=void 0;let i=32,A=s.createCanvas(this.document,i,t),r=A.getContext("2d",{alpha:!1});if(!r)return;let o=s.createImageData(r,i,t),n=new Uint32Array(o.data.buffer),a=(0,ue.toRGBA8888)(0,0,0),l=(0,ue.toRGBA8888)(255,255,255);n.fill(a);for(let d=0;d<t;++d){let m=d%2,I=d*i;for(let C=0;C<i;C+=2)n[I+C+m]=l}r.putImageData(o,0,0);let h=screen.width+i-1&~(i-1)||4096;this._placeholder=s.createCanvas(this.document,h,t);let g=this._placeholder.getContext("2d",{alpha:!1});if(!g){this._placeholder=void 0;return}for(let d=0;d<h;d+=i)g.drawImage(A,d,0);s.createImageBitmap(this._placeholder).then(d=>this._placeholderBitmap=d)}get document(){return this._terminal._core._coreBrowserService?.window.document}};function He(s){return s>65535?(s-=65536,String.fromCharCode((s>>10)+55296)+String.fromCharCode(s%1024+56320)):String.fromCharCode(s)}var j=class s{constructor(){this.fg=0;this.bg=0;this.extended=new U}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new s;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},U=class s{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new s(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0&&this.payload===void 0}};var V=class s extends j{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new U;this.combinedData=""}static fromCharData(t){let i=new s;return i.setFromCharData(t),i}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?He(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let i=!1;if(t[1].length>2)i=!0;else if(t[1].length===2){let A=t[1].charCodeAt(0);if(55296<=A&&A<=56319){let r=t[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(A-55296)*1024+r-56320+65536|t[2]<<22:i=!0}else i=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;i&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor()||this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor()||this.isInverse()!==t.isInverse()||this.isBold()!==t.isBold()||this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;let i=this.isUnderlineColorDefault(),A=t.isUnderlineColorDefault();if(!(i&&A)&&(i!==A||this.getUnderlineColor()!==t.getUnderlineColor()||this.getUnderlineColorMode()!==t.getUnderlineColorMode()))return!1}return!(this.isOverline()!==t.isOverline()||this.isBlink()!==t.isBlink()||this.isInvisible()!==t.isInvisible()||this.isItalic()!==t.isItalic()||this.isDim()!==t.isDim()||this.isStrikethrough()!==t.isStrikethrough())}};var b={width:7,height:14},w=class{constructor(e=-1,t=-1){this.imageId=e;this.tileId=t}},$=class{constructor(e,t,i){this._terminal=e;this._renderer=t;this._opts=i;this._images=new Map;this._lastId=0;this._lowestId=0;this._fullyCleared=!1;this._needsFullClear=!1;this._pixelLimit=25e5;this._workCell=new V;try{this.setLimit(this._opts.storageLimit)}catch(A){A instanceof Error&&console.error(A.message),console.warn(`storageLimit is set to ${this.getLimit()} MB`)}this._viewportMetrics={cols:this._terminal.cols,rows:this._terminal.rows}}dispose(){this.reset()}reset(){for(let e of this._images.values())e.marker?.dispose();this._images.clear(),this._renderer.clearAll()}getLimit(){return this._pixelLimit*4/1e6}setLimit(e){if(e<.5||e>1e3)throw RangeError("invalid storageLimit, should be at least 0.5 MB and not exceed 1G");this._pixelLimit=e/4*1e6>>>0,this._evictOldest(0)}getUsage(){return this._getStoredPixels()*4/1e6}_getStoredPixels(){let e=0;for(let t of this._images.values())t.orig&&(e+=t.orig.width*t.orig.height,t.actual&&t.actual!==t.orig&&(e+=t.actual.width*t.actual.height));return e}_delImg(e){let t=this._images.get(e);t&&(this._images.delete(e),window.ImageBitmap&&t.orig instanceof ImageBitmap&&t.orig.close(),this.onImageDeleted?.(e))}wipeAlternate(){let e=[];for(let[t,i]of this._images.entries())i.bufferType==="alternate"&&(i.marker?.dispose(),e.push(t));for(let t of e)this._delImg(t);this._needsFullClear=!0,this._fullyCleared=!1}deleteImage(e){let t=this._images.get(e);t&&(t.marker?.dispose(),this._delImg(e))}addImage(e,t){this._evictOldest(e.width*e.height);let i=this._renderer.cellSize;(i.width===-1||i.height===-1)&&(i=b);let A=Math.ceil(e.width/i.width),r=Math.ceil(e.height/i.height),o=++this._lastId,n=this._terminal._core.buffer,a=this._terminal.cols,l=this._terminal.rows,h=n.x,g=n.y,d=h,m=0;t.scrolling||(n.x=0,n.y=0,d=0),this._terminal._core._inputHandler._dirtyRowTracker.markDirty(n.y);for(let _=0;_<r;++_){let E=n.lines.get(n.y+n.ybase);for(let B=0;B<A&&!(d+B>=a);++B)this._writeToCell(E,d+B,o,_*A+B),m++;if(t.scrolling)_<r-1&&this._terminal._core._inputHandler.lineFeed();else if(++n.y>=l)break;n.x=d}this._terminal._core._inputHandler._dirtyRowTracker.markDirty(n.y),t.scrolling?t.cursorPos==="iip"?n.x=Math.min(d+A,a):n.x=d:(n.x=h,n.y=g);let I=[];for(let[_,E]of this._images.entries())E.tileCount<1&&(E.marker?.dispose(),I.push(_));for(let _ of I)this._delImg(_);let C=this._terminal.registerMarker(0);C?.onDispose(()=>{this._images.get(o)&&this._delImg(o)}),this._terminal.buffer.active.type==="alternate"&&this._evictOnAlternate();let p={orig:e,origCellSize:i,actual:e,actualCellSize:{...i},marker:C||void 0,tileCount:m,bufferType:this._terminal.buffer.active.type,layer:t.layer,zIndex:t.zIndex};return this._images.set(o,p),this.onImageAdded?.(),o}render(e){let t=!1,i=!1;for(let h of this._images.values())if(h.layer==="bottom"?i=!0:t=!0,t&&i)break;if(t&&!this._renderer.hasLayer("top")&&(this._renderer.insertLayerToDom("top"),!this._renderer.hasLayer("top")))return;if(i&&!this._renderer.hasLayer("bottom")&&this._renderer.insertLayerToDom("bottom"),this._renderer.rescaleCanvas(),!this._images.size){this._fullyCleared||(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1),this._renderer.hasLayer("top")&&this._renderer.removeLayerFromDom("top"),this._renderer.hasLayer("bottom")&&this._renderer.removeLayerFromDom("bottom");return}!t&&this._renderer.hasLayer("top")&&(this._renderer.clearAll("top"),this._renderer.removeLayerFromDom("top")),!i&&this._renderer.hasLayer("bottom")&&(this._renderer.clearAll("bottom"),this._renderer.removeLayerFromDom("bottom")),this._needsFullClear&&(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1);let{start:A,end:r}=e,o=this._terminal._core.buffer,n=this._terminal._core.cols;this._renderer.clearLines(A,r);let a=[],l=[];for(let h=A;h<=r;++h){let g=o.lines.get(h+o.ydisp);if(!g)return;for(let d=0;d<n;++d){let m=g.getExtended(d)?.payload;if(m instanceof w){let I=m.imageId;if(I===void 0||I===-1)continue;let C=this._images.get(I);if(m.tileId!==-1){let p=m.tileId,_=d,E=1;for(;++d<n;){let B=g.getExtended(d)?.payload;if(!(B instanceof w)||B.imageId!==I||B.tileId!==p+E)break;E++}d--,C?C.actual&&a.push({imgSpec:C,tileId:p,col:_,row:h,count:E}):this._opts.showPlaceholder&&l.push({col:_,row:h,count:E}),this._fullyCleared=!1}}}}a.sort((h,g)=>h.imgSpec.zIndex-g.imgSpec.zIndex);for(let h of l)this._renderer.drawPlaceholder(h.col,h.row,h.count);for(let h of a)this._renderer.draw(h.imgSpec,h.tileId,h.col,h.row,h.count)}viewportResize(e){if(!this._images.size){this._viewportMetrics=e;return}if(this._viewportMetrics.cols>=e.cols){this._viewportMetrics=e;return}let t=this._terminal._core.buffer,i=t.lines.length,A=this._viewportMetrics.cols-1;for(let r=0;r<i;++r){let o=t.lines.get(r),n=o.getExtended(A)?.payload;if(n instanceof w){let a=n.imageId;if(a===void 0||a===-1)continue;let l=this._images.get(a);if(!l)continue;let h=Math.ceil((l.actual?.width||0)/l.actualCellSize.width);if(n.tileId%h+1>=h)continue;let g=!1;for(let I=A+1;I>e.cols;++I)if(o.hasContent(I)){g=!0;break}if(g)continue;let d=Math.min(e.cols,h-n.tileId%h+A),m=n.tileId;for(let I=A+1;I<d;++I)this._writeToCell(o,I,a,++m),l.tileCount++}}this._viewportMetrics=e}getImageAtBufferCell(e,t){let A=this._terminal._core.buffer.lines.get(t);if(A){let r=A.getExtended(e)?.payload;if(r instanceof w&&r.imageId&&r.imageId!==-1){let o=this._images.get(r.imageId)?.orig;if(window.ImageBitmap&&o instanceof ImageBitmap){let n=D.createCanvas(window.document,o.width,o.height);return n.getContext("2d")?.drawImage(o,0,0,o.width,o.height),n}return o}}}extractTileAtBufferCell(e,t){let A=this._terminal._core.buffer.lines.get(t);if(A){let r=A.getExtended(e)?.payload;if(r instanceof w&&r.imageId&&r.imageId!==-1&&r.tileId!==-1){let o=this._images.get(r.imageId);if(o)return this._renderer.extractTile(o,r.tileId)}}}_evictOldest(e){let t=this._getStoredPixels(),i=t;for(;this._pixelLimit<i+e&&this._images.size;){let A=this._images.get(++this._lowestId);A&&A.orig&&(i-=A.orig.width*A.orig.height,A.actual&&A.orig!==A.actual&&(i-=A.actual.width*A.actual.height),A.marker?.dispose(),this._delImg(this._lowestId))}return t-i}_writeToCell(e,t,i,A){let r=this._workCell;if(e.loadCell(t,r),this._workCell.hasExtendedAttrs()){let n=r.extended.payload;if(n instanceof w){let a=this._images.get(n.imageId);a&&a.tileCount--,n.imageId=i,n.tileId=A;return}}let o=r.extended.clone();o.payload=new w(i,A),r.extended=o,r.updateExtended(),e.setCell(t,r)}_evictOnAlternate(){for(let i of this._images.values())i.bufferType==="alternate"&&(i.tileCount=0);let e=this._terminal._core.buffer;for(let i=0;i<this._terminal.rows;++i){let A=e.lines.get(i);if(A)for(let r=0;r<this._terminal.cols;++r){let o=A.getExtended(r)?.payload;if(o instanceof w){let n=this._images.get(o.imageId);n&&n.tileCount++}}}let t=[];for(let[i,A]of this._images.entries())A.bufferType==="alternate"&&!A.tileCount&&(A.marker?.dispose(),t.push(i));for(let i of t)this._delImg(i)}};var Ye=R(fe()),qe=R(Ge());function ee(s){let e="";for(let t=0;t<s.length;++t)e+=String.fromCharCode(s[t]);return e}function De(s){let e=0;for(let t=0;t<s.length;++t){if(s[t]<48||s[t]>57)throw new Error("illegal char");e=e*10+s[t]-48}return e}function Ue(s){let e=ee(s);if(!e.match(/^((auto)|(\d+?((px)|(%)){0,1}))$/))throw new Error("illegal size");return e}function wt(s){if(typeof Buffer<"u")return Buffer.from(ee(s),"base64").toString();let e=atob(ee(s)),t=new Uint8Array(e.length);for(let i=0;i<t.length;++i)t[i]=e.charCodeAt(i);return new TextDecoder().decode(t)}var Oe={inline:De,size:De,name:wt,width:Ue,height:Ue,preserveAspectRatio:De},Je=[70,105,108,101],Ke=[77,117,108,116,105,112,97,114,116,70,105,108,101],be=[70,105,108,101,80,97,114,116],we=[70,105,108,101,69,110,100],ye=[82,101,112,111,114,116,67,101,108,108,83,105,122,101],xe=1024,te=class{constructor(){this.state=0;this._buffer=new Uint32Array(xe);this._position=0;this._key="";this.fields={}}reset(){this._buffer.fill(0),this.state=0,this._position=0,this.fields={},this._key=""}end(){if(this.state===0){if(this._position===we.length){for(let e=0;e<we.length;++e)if(this._buffer[e]!==we[e])return this._a();return this.fields.type=4,this.state=4,0}if(this._position===ye.length){for(let e=0;e<ye.length;++e)if(this._buffer[e]!==ye[e])return this._a();return this.fields.type=5,this.state=4,0}return this._a()}return this.state===4?0:this.state===3&&this.fields.type===2?this._storeValue(this._position)?(this.state=4,0):this._a():this._a()}parse(e,t,i){let A=this.state,r=this._position,o=this._buffer;if(A===1||A===4||A===0&&r>14)return-1;for(let n=t;n<i;++n){let a=e[n];switch(a){case 59:if(!this._storeValue(r))return this._a();A=2,r=0;break;case 61:if(A===0){if(o[0]===70){let l=0;for(;l<Je.length;++l)if(o[l]!==Je[l])return this._a();if(this.fields.type=1,r===be.length){for(;l<be.length;++l)if(o[l]!==be[l])return this._a();return this.fields.type=3,this.state=4,n+1}}else if(o[0]===77){for(let l=0;l<Ke.length;++l)if(o[l]!==Ke[l])return this._a();this.fields.type=2}else return this._a();A=2,r=0}else if(A===2){if(!this._storeKey(r))return this._a();A=3,r=0}else if(A===3){if(r>=xe)return this._a();o[r++]=a}break;case 58:return A===3&&!this._storeValue(r)?this._a():(this.state=4,n+1);default:if(r>=xe)return this._a();o[r++]=a}}return this.state=A,this._position=r,-2}_a(){return this.fields.type=0,this.state=1,-1}_storeKey(e){let t=ee(this._buffer.subarray(0,e));return t?(this._key=t,this.fields[t]=null,!0):!1}_storeValue(e){if(this._key){try{let t=this._buffer.slice(0,e);this.fields[this._key]=Oe[this._key]?Oe[this._key](t):t}catch{return!1}return!0}return!1}};var M={mime:"unsupported",width:0,height:0};function Pe(s){if(s.length<32)return M;let e=new Uint32Array(s.buffer,s.byteOffset,8);if(e[0]===1196314761&&e[1]===169478669&&e[3]===1380206665)return{mime:"image/png",width:s[16]<<24|s[17]<<16|s[18]<<8|s[19],height:s[20]<<24|s[21]<<16|s[22]<<8|s[23]};if(s[0]===255&&s[1]===216&&s[2]===255){let[t,i]=yt(s);return{mime:"image/jpeg",width:t,height:i}}if(e[0]===944130375&&(s[4]===55||s[4]===57)&&s[5]===97)return{mime:"image/gif",width:s[7]<<8|s[6],height:s[9]<<8|s[8]};if(e[0]===1718185841)return{mime:"image/qoi",width:s[4]<<24|s[5]<<16|s[6]<<8|s[7],height:s[8]<<24|s[9]<<16|s[10]<<8|s[11]};if(e[0]===1179011410&&e[2]===1346520407&&(e[3]&16777215)===3690582){switch(s[15]){case 88:return{mime:"image/webp",width:(s[24]|s[25]<<8|s[26]<<16)+1,height:(s[27]|s[28]<<8|s[29]<<16)+1};case 76:if(s[20]!==47)return M;let t=s[21]|s[22]<<8|s[23]<<16|s[24]<<24;return{mime:"image/webp",width:(t&16383)+1,height:(t>>>14&16383)+1};case 32:return s[23]!==157||s[24]!==1||s[25]!==42?M:{mime:"image/webp",width:(s[26]|s[27]<<8)&16383,height:(s[28]|s[29]<<8)&16383}}return M}if(e[1]===1887007846&&(e[2]===1718187617||e[2]===1936291425)){let t=-1,i=Math.min(s.length-16,1024);for(let A=8;A<i;A++)if(s[A]===105&&s[A+1]===115&&s[A+2]===112&&s[A+3]===101){t=A;break}if(t!==-1){let A=s[t+8]<<24|s[t+9]<<16|s[t+10]<<8|s[t+11],r=s[t+12]<<24|s[t+13]<<16|s[t+14]<<8|s[t+15];if(A>0&&r>0)return{mime:"image/avif",width:A,height:r}}return M}return M}function yt(s){let e=s.length,t=4,i=s[t]<<8|s[t+1];for(;;){if(t+=i,t>=e)return[0,0];if(s[t]!==255)return[0,0];if(s[t+1]===192||s[t+1]===194)return t+8<e?[s[t+7]<<8|s[t+8],s[t+5]<<8|s[t+6]]:[0,0];t+=2,i=s[t]<<8|s[t+1]}}var Se={type:0,name:"Unnamed file",size:0,width:"auto",height:"auto",preserveAspectRatio:1,inline:0},ie=class{constructor(e,t,i,A){this._opts=e;this._renderer=t;this._storage=i;this._coreTerminal=A;this._aborted=!1;this._hp=new te;this._header=Se;this._isMultipart=!1;this._abortMulti=!1;let r=Math.ceil(this._opts.iipSizeLimit*4/3),o=Math.min(1048576,r);this._dec=new Ye.default(4194304,r,o),this._qoiDec=new qe.default(4194304)}reset(){this._hp.reset(),this._dec.release(),this._qoiDec.release()}start(){this._aborted=!1,this._hp.reset()}put(e,t,i){if(!this._aborted)if(this._hp.state===4)this._dec.put(e.subarray(t,i))!==0&&(this._dec.release(),this._aborted=!0);else{let A=this._hp.parse(e,t,i);if(A===-1){this._aborted=!0;return}if(A>0){if(this._hp.fields.type===1){if(this._isMultipart&&(this._isMultipart=!1,this._abortMulti=!1,this._dec.release()),this._header=Object.assign({},Se,this._hp.fields),!this._header.inline){this._aborted=!0;return}this._dec.init()}else if(this._abortMulti){this._aborted=!0;return}this._dec.put(e.subarray(A,i))!==0&&(this._dec.release(),this._aborted=!0,this._isMultipart&&(this._abortMulti=!0))}}}end(e){if(this._aborted||this._hp.state!==4&&this._hp.end())return!0;let t=this._hp.fields.type;if(t===3)return!0;if(t===5){let a=b.width,l=b.height;this._renderer.dimensions&&(a=this._renderer.dimensions.css.canvas.width/this._coreTerminal.cols,l=this._renderer.dimensions.css.canvas.height/this._coreTerminal.rows);let h=this._coreTerminal._core._coreBrowserService?.dpr??1,g=`\x1B]1337;ReportCellSize=${l.toFixed(3)};${a.toFixed(3)};${h.toFixed(3)}\x1B\\`;return this._coreTerminal.input(g,!1),!0}if(t===2)return this._header=Object.assign({},Se,this._hp.fields),this._isMultipart=!0,this._abortMulti=!1,this._dec.release(),this._dec.init(),!0;if(t===4&&(!this._isMultipart||(this._isMultipart=!1,this._abortMulti||this._header.type!==2)))return!0;let i=0,A=0,r,o=M;if((r=e)&&((r=!this._dec.end())?(o=Pe(this._dec.data8),(r=o.mime!=="unsupported")?(i=o.width,A=o.height,(r=i&&A&&i*A<this._opts.pixelLimit)?([i,A]=this._resize(i,A).map(Math.floor),r=i&&A&&i*A<this._opts.pixelLimit):console.warn(`IIP: image dimension issue ${o.width}x${o.height}`)):console.warn("IIP: unsupported image type")):console.warn("IIP: error during BASE64 decoding")),!r)return this._dec.release(),!0;let n;if(o.mime==="image/qoi"){let a=this._qoiDec.decode(this._dec.data8);if(n=new ImageData(new Uint8ClampedArray(a.buffer,a.byteOffset,a.byteLength),this._qoiDec.width,this._qoiDec.height),this._qoiDec.release(),i===this._qoiDec.width&&A===this._qoiDec.height){this._dec.release();let l=D.createCanvas(void 0,this._qoiDec.width,this._qoiDec.height);return l.getContext("2d")?.putImageData(n,0,0),this._storage.addImage(l),!0}}else n=new Blob([this._dec.data8],{type:o.mime});return this._dec.release(),createImageBitmap(n,{resizeWidth:i,resizeHeight:A}).then(a=>(this._storage.addImage(a),!0)).catch(a=>(console.warn(`IIP: decoding error ${o.mime} ${o.width}x${o.height}`,a),!0))}_resize(e,t){let i=this._renderer.dimensions?.css.cell.width||b.width,A=this._renderer.dimensions?.css.cell.height||b.height,r=this._renderer.dimensions?.css.canvas.width||i*this._coreTerminal.cols,o=this._renderer.dimensions?.css.canvas.height||A*this._coreTerminal.rows,n=this._dim(this._header.width,r,i),a=this._dim(this._header.height,o,A);if(!n&&!a){let l=r/e,h=(o-A)/t,g=Math.min(l,h);return g<1?[e*g,t*g]:[e,t]}return n?this._header.preserveAspectRatio||!n||!a?[n,t*n/e]:[n,a]:[e*a/t,a]}_dim(e,t,i){return e==="auto"?0:e.endsWith("%")?parseInt(e.slice(0,-1),10)*t/100:e.endsWith("px")?parseInt(e.slice(0,-2),10):parseInt(e,10)*i}};var ze=R(fe());function Me(s){let e={},t=s.split(",");for(let i of t){let A=i.indexOf("=");if(A===-1)continue;let r=i.substring(0,A),o=i.substring(A+1);if(r==="a"){e.action=o;continue}if(r==="o"){e.compression=o;continue}if(r==="t"){e.transmission=o;continue}if(r==="d"){e.deleteSelector=o;continue}let n=parseInt(o,10);switch(r){case"f":e.format=n;break;case"i":e.id=n;break;case"I":e.imageNumber=n;break;case"s":e.width=n;break;case"v":e.height=n;break;case"x":e.x=n;break;case"y":e.y=n;break;case"w":e.sourceWidth=n;break;case"h":e.sourceHeight=n;break;case"X":e.xOffset=n;break;case"Y":e.yOffset=n;break;case"c":e.columns=n;break;case"r":e.rows=n;break;case"m":e.more=n;break;case"q":e.quiet=n;break;case"C":e.cursorMovement=n;break;case"z":e.zIndex=n;break;case"p":e.placementId=n;break}}return e}var We=0,Ae=class{constructor(e,t,i,A){this._opts=e;this._renderer=t;this._kittyStorage=i;this._coreTerminal=A;this._aborted=!1;this._decodeError=!1;this._activeDecoder=null;this._inControlData=!0;this._controlData=new Uint32Array(512);this._controlLength=0;this._encodedSizeLimit=0;this._totalEncodedSize=0;this._parsedCommand=null;this._pendingTransmissions=new Map;this._maxEncodedBytes=Math.ceil(this._opts.kittySizeLimit*4/3),this._initialEncodedBytes=Math.min(4194304,this._maxEncodedBytes)}reset(){this._cleanupAllPending(),this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),this._kittyStorage.reset()}dispose(){this.reset()}_removePendingEntry(e){this._pendingTransmissions.delete(e),this._lastPendingKey===e&&(this._lastPendingKey=void 0)}_cleanupAllPending(){for(let e of this._pendingTransmissions.values())e.decoder.release();this._pendingTransmissions.clear(),this._lastPendingKey=void 0}start(){this._aborted=!1,this._decodeError=!1,this._inControlData=!0,this._controlLength=0,this._parsedCommand=null,this._encodedSizeLimit=this._maxEncodedBytes,this._totalEncodedSize=0,this._activeDecoder=null}put(e,t,i){if(!this._aborted)if(!this._inControlData)this._streamPayload(e,t,i);else{let A=i;for(let o=t;o<i;o++)if(e[o]===59){this._inControlData=!1,A=o;break}let r=A-t;if(this._controlLength+r>512){this._aborted=!0;return}if(this._controlData.set(e.subarray(t,A),this._controlLength),this._controlLength+=r,!this._inControlData){if(this._parsedCommand=Me(this._parseControlDataString()),this._parsedCommand.id!==void 0&&this._parsedCommand.imageNumber!==void 0){this._sendResponse(this._parsedCommand.id,"EINVAL:cannot specify both i and I keys",this._parsedCommand.quiet??0),this._aborted=!0;return}if(this._parsedCommand.action==="d")return;let o=A+1;o<i&&this._streamPayload(e,o,i)}}}_streamPayload(e,t,i){if(this._aborted)return;let A=this._parsedCommand?.id??this._lastPendingKey??0,r=this._pendingTransmissions.get(A),o=r?.totalEncodedSize??0;if(this._totalEncodedSize+=i-t,o+this._totalEncodedSize>this._encodedSizeLimit){let a=this._activeDecoder??r?.decoder;a&&a.release(),this._activeDecoder=null,r&&this._removePendingEntry(A),this._aborted=!0;return}this._decodeError||(r?.decoder&&!this._activeDecoder&&(this._activeDecoder=r.decoder),this._activeDecoder||(this._activeDecoder=new ze.default(4194304,this._maxEncodedBytes,this._initialEncodedBytes),this._activeDecoder.init()),this._activeDecoder.put(e.subarray(t,i))!==We&&(this._activeDecoder.release(),this._activeDecoder=null,this._decodeError=!0,r&&this._removePendingEntry(A)))}end(e){if(this._aborted||!e)return this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),!0;if(this._inControlData)return this._handleNoPayloadCommand();let t=this._parsedCommand;if(t.action==="d")return this._handleDelete(t);let i=t.id??this._lastPendingKey??0,A=t.more===1,r=this._pendingTransmissions.get(i);if(A)return this._activeDecoder&&(r?(r.totalEncodedSize+=this._totalEncodedSize,r.decodeError=r.decodeError||this._decodeError):this._pendingTransmissions.set(i,{cmd:{...t},decoder:this._activeDecoder,totalEncodedSize:this._totalEncodedSize,decodeError:this._decodeError}),this._lastPendingKey=i,this._activeDecoder=null),!0;r&&(this._lastPendingKey=void 0);let o=this._decodeError,n=t,a=this._activeDecoder;r&&(n=r.cmd,a=r.decoder,o=o||r.decodeError,this._pendingTransmissions.delete(i));let l=new Uint8Array(0);a&&(a.end()!==We&&(o=!0),l=a.data8),this._activeDecoder=null;let h=this._handleCommandWithBytesAndCmd(n,l,o);return a&&a.release(),h}_parseControlDataString(){let e="";for(let t=0;t<this._controlLength;t++)e+=String.fromCodePoint(this._controlData[t]);return e}_handleNoPayloadCommand(){let e=Me(this._parseControlDataString());if(e.id!==void 0&&e.imageNumber!==void 0)return this._sendResponse(e.id,"EINVAL:cannot specify both i and I keys",e.quiet??0),!0;switch(e.action??"t"){case"d":return this._handleDelete(e);case"q":return this._sendResponse(e.id??0,"OK",e.quiet??0),!0;case"p":return this._handlePlacement(e);default:return e.id!==void 0&&this._sendResponse(e.id,"EINVAL:unsupported action",e.quiet??0),!0}}_handleCommandWithBytesAndCmd(e,t,i){switch(e.action??"t"){case"t":{let r=this._handleTransmit(e,t,i);return(e.transmission??"d")==="d"&&e.id!==void 0&&(i?this._sendResponse(e.id,"EINVAL:invalid base64 data",e.quiet??0):t.length>0&&this._sendResponse(e.id,"OK",e.quiet??0)),r}case"T":return this._handleTransmitDisplay(e,t,i);case"q":return this._handleQuery(e,t,i);case"p":return this._handlePlacement(e);default:return e.id!==void 0&&this._sendResponse(e.id,"EINVAL:unsupported action",e.quiet??0),!0}}_handlePlacement(e){if(e.id===void 0)return!0;let t=e.id,i=this._kittyStorage.getImage(t);return i?this._displayImage(i,e).then(r=>(this._sendResponse(t,r?"OK":"EINVAL:image rendering failed",e.quiet??0,e.placementId),!0)):(this._sendResponse(t,"ENOENT:image not found",e.quiet??0,e.placementId),!0)}_handleTransmit(e,t,i){return(e.transmission??"d")!=="d"?(e.id!==void 0&&this._sendResponse(e.id,"EINVAL:unsupported transmission medium",e.quiet??0),!0):(i||t.length===0||this._kittyStorage.storeImage(e.id,{data:new Blob([t]),width:e.width??0,height:e.height??0,format:e.format??32,compression:e.compression??""}),!0)}_handleTransmitDisplay(e,t,i){if(i)return e.id!==void 0&&this._sendResponse(e.id,"EINVAL:invalid base64 data",e.quiet??0),!0;this._handleTransmit(e,t,i);let A=e.id??this._kittyStorage.lastImageId,r=this._kittyStorage.getImage(A);if(r){let o=this._displayImage(r,e);return e.id!==void 0?o.then(n=>(this._sendResponse(A,n?"OK":"EINVAL:image rendering failed",e.quiet??0),!0)):o.then(()=>!0)}return!0}_handleQuery(e,t,i){let A=e.id??0,r=e.quiet??0;if((e.transmission??"d")!=="d")return this._sendResponse(A,"EINVAL:unsupported transmission medium",r),!0;if(i)return this._sendResponse(A,"EINVAL:invalid base64 data",r),!0;if(t.length===0)return this._sendResponse(A,"OK",r),!0;let n=e.format??32;if(n===100)this._sendResponse(A,"OK",r);else{let a=e.width??0,l=e.height??0;if(!a||!l)return this._sendResponse(A,"EINVAL:width and height required for raw pixel data",r),!0;let h=n===32?4:3,g=a*l*h;if(t.length<g)return this._sendResponse(A,"EINVAL:insufficient pixel data",r),!0;this._sendResponse(A,"OK",r)}return!0}_handleDelete(e){switch(e.deleteSelector??"a"){case"a":case"A":this._cleanupAllPending(),this._kittyStorage.deleteAll();break;case"i":case"I":if(e.id!==void 0){let i=this._pendingTransmissions.get(e.id);i&&i.decoder.release(),this._removePendingEntry(e.id),this._kittyStorage.deleteById(e.id)}break;default:break}return!0}_sendResponse(e,t,i,A){let r=t==="OK";if(r&&i>=1||!r&&i>=2)return;let o=A?`,p=${A}`:"",n=`\x1B_Gi=${e}${o};${t}\x1B\\`;this._coreTerminal._core.coreService.triggerDataEvent(n)}_displayImage(e,t){return this._decodeAndDisplay(e,t).then(()=>!0).catch(()=>!1)}async _decodeAndDisplay(e,t){let i=await this._createBitmap(e);try{let A=Math.max(0,t.x??0),r=Math.max(0,t.y??0),o=t.sourceWidth||i.width-A,n=t.sourceHeight||i.height-r,a=Math.max(0,i.width-A),l=Math.max(0,i.height-r),h=Math.max(0,Math.min(o,a)),g=Math.max(0,Math.min(n,l));if(h===0||g===0)throw new Error("invalid source rectangle");if(A!==0||r!==0||h!==i.width||g!==i.height){let T=await createImageBitmap(i,A,r,h,g);i.close(),i=T}let d=this._renderer.dimensions?.css.cell.width||b.width,m=this._renderer.dimensions?.css.cell.height||b.height,I,C;t.columns!==void 0&&t.rows!==void 0?(I=t.columns,C=t.rows):t.columns!==void 0?(I=t.columns,C=Math.max(1,Math.ceil(i.height/i.width*(I*d)/m))):t.rows!==void 0?(C=t.rows,I=Math.max(1,Math.ceil(i.width/i.height*(C*m)/d))):(I=Math.ceil(i.width/d),C=Math.ceil(i.height/m));let p=i.width,_=i.height;if((t.columns!==void 0||t.rows!==void 0)&&(p=Math.round(I*d),_=Math.round(C*m)),p*_>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");let E=this._coreTerminal._core.buffer,B=E.x,Y=E.y,q=E.ybase,At=t.zIndex!==void 0&&t.zIndex<0?"bottom":"top";if(p!==i.width||_!==i.height){let T=await createImageBitmap(i,{resizeWidth:p,resizeHeight:_});i.close(),i=T}let ge=Math.min(Math.max(0,t.xOffset??0),d-1),de=Math.min(Math.max(0,t.yOffset??0),m-1);if(ge!==0||de!==0){let T=t.columns!==void 0?Math.round(I*d):i.width+ge,rt=t.rows!==void 0?Math.round(C*m):i.height+de,W=D.createCanvas(window.document,T,rt),Re=W.getContext("2d");if(!Re)throw new Error("Failed to create offset canvas context");Re.drawImage(i,ge,de);let nt=await createImageBitmap(W);if(W.width=W.height=0,i.close(),i=nt,p=i.width,_=i.height,p*_>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");t.columns===void 0&&(I=Math.ceil(i.width/d)),t.rows===void 0&&(C=Math.ceil(i.height/m))}let st=t.zIndex??0;if(this._kittyStorage.addImage(e.id,i,!0,At,st),i=void 0,t.cursorMovement===1){let T=E.ybase-q;E.x=B,E.y=Math.max(Y-T,0)}else E.x=Math.min(B+I,this._coreTerminal.cols)}catch(A){throw i?.close(),A}}async _createBitmap(e){let t=new Uint8Array(await e.data.arrayBuffer());if(e.compression==="z"&&(t=await this._decompressZlib(t)),e.format===100){let p=new Blob([t],{type:"image/png"});if(!window.createImageBitmap){let _=URL.createObjectURL(p),E=new Image;return new Promise((B,Y)=>{E.addEventListener("load",()=>{URL.revokeObjectURL(_);let q=D.createCanvas(window.document,E.width,E.height);q.getContext("2d")?.drawImage(E,0,0),createImageBitmap(q).then(B).catch(Y)}),E.addEventListener("error",()=>{URL.revokeObjectURL(_),Y(new Error("Failed to load image"))}),E.src=_})}return createImageBitmap(p)}let i=e.width,A=e.height;if(!i||!A)throw new Error("Width and height required for raw pixel data");let r=e.format===32?4:3,o=i*A*r;if(t.length<o)throw new Error("Insufficient pixel data");let n=i*A;if(e.format===32)return createImageBitmap(new ImageData(new Uint8ClampedArray(t.buffer,t.byteOffset,n*4),i,A));let a=new Uint8ClampedArray(n*4),l=new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),h=new Uint32Array(a.buffer),g=n&-4,d=0,m=0;for(let p=0;p<g;p+=4){let _=l[d++],E=l[d++],B=l[d++];h[m++]=4278190080|_,h[m++]=4278190080|_>>>24|E<<8,h[m++]=4278190080|E>>>16|B<<16,h[m++]=4278190080|B>>>8}let I=g*3,C=g*4;for(let p=g;p<n;p++)a[C]=t[I],a[C+1]=t[I+1],a[C+2]=t[I+2],a[C+3]=255,I+=3,C+=4;return createImageBitmap(new ImageData(a,i,A))}async _decompressZlib(e){try{return await this._decompress(e,"deflate")}catch{return await this._decompress(e,"deflate-raw")}}async _decompress(e,t){let i=new DecompressionStream(t),A=i.writable.getWriter();A.write(e),A.close();let r=[],o=i.readable.getReader();for(;;){let{done:h,value:g}=await o.read();if(h)break;r.push(g)}let n=r.reduce((h,g)=>h+g.length,0),a=new Uint8Array(n),l=0;for(let h of r)a.set(h,l),l+=h.length;return a}get images(){return this._kittyStorage.images}get _kittyIdToStorageId(){return this._kittyStorage.kittyIdToStorageId}get pendingTransmissions(){return this._pendingTransmissions}};var O=class O{constructor(e){this._storage=e;this._nextImageId=1;this._images=new Map;this._kittyIdToStorageId=new Map;this._storageIdToKittyId=new Map;this._handleStorageImageDeleted=e=>{let t=this._storageIdToKittyId.get(e);t!==void 0&&(this._kittyIdToStorageId.delete(t),this._storageIdToKittyId.delete(e),this._images.delete(t))};this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"};this._previousOnImageDeleted=this._storage.onImageDeleted,this._wrappedOnImageDeleted=t=>{this._previousOnImageDeleted?.(t),this._handleStorageImageDeleted(t)},this._storage.onImageDeleted=this._wrappedOnImageDeleted}reset(){this._nextImageId=1,this._images.clear(),this._kittyIdToStorageId.clear(),this._storageIdToKittyId.clear()}dispose(){this.reset(),this._storage.onImageDeleted===this._wrappedOnImageDeleted&&(this._storage.onImageDeleted=this._previousOnImageDeleted)}storeImage(e,t){let i=e??this._nextImageId++,A=this._kittyIdToStorageId.get(i);return A!==void 0&&(this._storage.deleteImage(A),this._kittyIdToStorageId.delete(i),this._storageIdToKittyId.delete(A)),!this._images.has(i)&&this._images.size>=O._maxStoredImages&&this._evictUndisplayedImages(),this._images.set(i,{...t,id:i}),i}addImage(e,t,i,A,r){let o=this._kittyIdToStorageId.get(e);o!==void 0&&this._storageIdToKittyId.delete(o),this._addImageOpts.scrolling=i,this._addImageOpts.layer=A,this._addImageOpts.zIndex=r;let n=this._storage.addImage(t,this._addImageOpts);this._kittyIdToStorageId.set(e,n),this._storageIdToKittyId.set(n,e)}getImage(e){return this._images.get(e)}deleteById(e){this._images.delete(e);let t=this._kittyIdToStorageId.get(e);t!==void 0&&(this._storage.deleteImage(t),this._kittyIdToStorageId.delete(e),this._storageIdToKittyId.delete(t))}deleteAll(){this._images.clear();for(let e of this._kittyIdToStorageId.values())this._storage.deleteImage(e);this._kittyIdToStorageId.clear(),this._storageIdToKittyId.clear()}get images(){return this._images}get kittyIdToStorageId(){return this._kittyIdToStorageId}get lastImageId(){return this._nextImageId-1}_evictUndisplayedImages(){for(let[e]of this._images){if(this._images.size<=O._maxStoredImages/2)break;this._kittyIdToStorageId.has(e)||this._images.delete(e)}}};O._maxStoredImages=256;var se=O;var x=R(Z());var $e=R(Ve());var Lt=4194304,Le=x.PALETTE_ANSI_256;Le.set(x.PALETTE_VT340_COLOR);var ae=class{constructor(e,t,i){this._opts=e;this._storage=t;this._coreTerminal=i;this._size=0;this._aborted=!1;(0,$e.DecoderAsync)({memoryLimit:this._opts.pixelLimit*4,palette:Le,paletteLimit:this._opts.sixelPaletteLimit}).then(A=>this._dec=A)}reset(){this._dec&&(this._dec.release(),this._dec._palette.fill(0),this._dec.init(0,Le,this._opts.sixelPaletteLimit))}hook(e){if(this._size=0,this._aborted=!1,this._dec){let t=e.params[1]===1?0:Rt(this._coreTerminal._core._inputHandler._curAttrData,this._coreTerminal._core._themeService?.colors);this._dec.init(t,null,this._opts.sixelPaletteLimit)}}put(e,t,i){if(!(this._aborted||!this._dec)){if(this._size+=i-t,this._size>this._opts.sixelSizeLimit){console.warn("SIXEL: too much data, aborting"),this._aborted=!0,this._dec.release();return}try{this._dec.decode(e,t,i)}catch(A){console.warn(`SIXEL: error while decoding image - ${A}`),this._aborted=!0,this._dec.release()}}}unhook(e){if(this._aborted||!e||!this._dec)return!0;let t=this._dec.width,i=this._dec.height;if(!t||!i)return i&&this._storage.advanceCursor(i),!0;let A=D.createCanvas(void 0,t,i);return A.getContext("2d")?.putImageData(new ImageData(this._dec.data8,t,i),0,0),this._dec.memoryUsage>Lt&&this._dec.release(),this._storage.addImage(A),!0}};function Rt(s,e){let t=0;if(!e)return t;if(s.isInverse())if(s.isFgDefault())t=oe(e.foreground.rgba);else if(s.isFgRGB()){let i=s.constructor.toColorRGB(s.getFgColor());t=(0,x.toRGBA8888)(...i)}else t=oe(e.ansi[s.getFgColor()].rgba);else if(s.isBgDefault())t=oe(e.background.rgba);else if(s.isBgRGB()){let i=s.constructor.toColorRGB(s.getBgColor());t=(0,x.toRGBA8888)(...i)}else t=oe(e.ansi[s.getBgColor()].rgba);return t}function oe(s){return x.BIG_ENDIAN?s:(s&255)<<24|(s>>>8&255)<<16|(s>>>16&255)<<8|s>>>24&255}var he=class{constructor(e,t,i,A){this._storage=e;this._opts=t;this._renderer=i;this._terminal=A;this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"vt340"}}addImage(e){this._addImageOpts.scrolling=this._opts.sixelScrolling,this._storage.addImage(e,this._addImageOpts)}advanceCursor(e){if(this._opts.sixelScrolling){let t=this._renderer.cellSize;(t.width===-1||t.height===-1)&&(t=b);let i=Math.ceil(e/t.height);for(let A=1;A<i;++A)this._terminal._core._inputHandler.lineFeed()}}};var le=class{constructor(e){this._storage=e;this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"}}addImage(e){this._storage.addImage(e,this._addImageOpts)}};var et={enableSizeReports:!0,pixelLimit:16777216,sixelSupport:!0,sixelScrolling:!0,sixelPaletteLimit:4096,sixelSizeLimit:33554432,storageLimit:128,showPlaceholder:!0,iipSupport:!0,iipSizeLimit:33554432,kittySupport:!0,kittySizeLimit:33554432},tt=4096;var it=class{constructor(e){this._disposables=[];this._handlers=new Map;this._onImageAdded=new X;this.onImageAdded=this._onImageAdded.event;this._opts=Object.assign({},et,e),this._defaultOpts=Object.assign({},et,e)}dispose(){for(let e of this._disposables)e.dispose();this._disposables.length=0,this._handlers.clear(),this._onImageAdded.dispose()}_disposeLater(...e){for(let t of e)this._disposables.push(t)}activate(e){if(this._terminal=e,this._renderer=new D(e),this._storage=new $(e,this._renderer,this._opts),this._storage.onImageAdded=()=>this._onImageAdded.fire(),this._opts.enableSizeReports){let t=e.options.windowOptions??{};t.getWinSizePixels=!0,t.getCellSizePixels=!0,t.getWinSizeChars=!0,e.options.windowOptions=t}if(this._disposeLater(this._renderer,this._storage,e.parser.registerCsiHandler({prefix:"?",final:"h"},t=>this._decset(t)),e.parser.registerCsiHandler({prefix:"?",final:"l"},t=>this._decrst(t)),e.parser.registerCsiHandler({final:"c"},t=>this._da1(t)),e.parser.registerCsiHandler({prefix:"?",final:"S"},t=>this._xtermGraphicsAttributes(t)),e.onRender(t=>this._storage?.render(t)),e.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>this.reset()),e.parser.registerEscHandler({final:"c"},()=>this.reset()),e._core._inputHandler.onRequestReset(()=>this.reset()),e.buffer.onBufferChange(()=>this._storage?.wipeAlternate()),e.onResize(t=>this._storage?.viewportResize(t))),this._opts.sixelSupport){let t=new he(this._storage,this._opts,this._renderer,e),i=new ae(this._opts,t,e);this._handlers.set("sixel",i),this._disposeLater(e._core._inputHandler._parser.registerDcsHandler({final:"q"},i))}if(this._opts.iipSupport){let t=new le(this._storage),i=new ie(this._opts,this._renderer,t,e);this._handlers.set("iip",i),this._disposeLater(e._core._inputHandler._parser.registerOscHandler(1337,i))}if(this._opts.kittySupport){let t=new se(this._storage),i=new Ae(this._opts,this._renderer,t,e);this._handlers.set("kitty",i),this._disposeLater(t,i,e._core._inputHandler._parser.registerApcHandler({final:"G"},i))}}reset(){this._opts.sixelScrolling=this._defaultOpts.sixelScrolling,this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,this._storage?.reset();for(let e of this._handlers.values())e.reset();return!1}get storageLimit(){return this._storage?.getLimit()||-1}set storageLimit(e){this._storage?.setLimit(e),this._opts.storageLimit=e}get storageUsage(){return this._storage?this._storage.getUsage():-1}get showPlaceholder(){return this._opts.showPlaceholder}set showPlaceholder(e){this._opts.showPlaceholder=e,this._renderer?.showPlaceholder(e)}getImageAtBufferCell(e,t){return this._storage?.getImageAtBufferCell(e,t)}extractTileAtBufferCell(e,t){return this._storage?.extractTileAtBufferCell(e,t)}_report(e){this._terminal?._core.input(e,!1)}_decset(e){for(let t=0;t<e.length;++t)e[t]===80&&(this._opts.sixelScrolling=!1);return!1}_decrst(e){for(let t=0;t<e.length;++t)e[t]===80&&(this._opts.sixelScrolling=!0);return!1}_da1(e){return e[0]?!0:this._opts.sixelSupport?(this._report("\x1B[?62;4;9;22c"),!0):!1}_xtermGraphicsAttributes(e){if(e.length<2)return!0;if(e[0]===1)switch(e[1]){case 1:return this._report(`\x1B[?${e[0]};0;${this._opts.sixelPaletteLimit}S`),!0;case 2:this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,this._report(`\x1B[?${e[0]};0;${this._opts.sixelPaletteLimit}S`);for(let t of this._handlers.values())t.reset();return!0;case 3:return e.length>2&&!(e[2]instanceof Array)&&e[2]<=tt?(this._opts.sixelPaletteLimit=e[2],this._report(`\x1B[?${e[0]};0;${this._opts.sixelPaletteLimit}S`)):this._report(`\x1B[?${e[0]};2S`),!0;case 4:return this._report(`\x1B[?${e[0]};0;${tt}S`),!0;default:return this._report(`\x1B[?${e[0]};2S`),!0}if(e[0]===2)switch(e[1]){case 1:let t=this._renderer?.dimensions?.css.canvas.width,i=this._renderer?.dimensions?.css.canvas.height;if(!t||!i){let r=b;t=(this._terminal?.cols||80)*r.width,i=(this._terminal?.rows||24)*r.height}if(t*i<this._opts.pixelLimit)this._report(`\x1B[?${e[0]};0;${t.toFixed(0)};${i.toFixed(0)}S`);else{let r=Math.floor(Math.sqrt(this._opts.pixelLimit));this._report(`\x1B[?${e[0]};0;${r};${r}S`)}return!0;case 4:let A=Math.floor(Math.sqrt(this._opts.pixelLimit));return this._report(`\x1B[?${e[0]};0;${A};${A}S`),!0;default:return this._report(`\x1B[?${e[0]};2S`),!0}return this._report(`\x1B[?${e[0]};1S`),!0}};export{it as ImageAddon};
|
||
+var mt=Object.create;var Ke=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var pt=Object.getPrototypeOf,Et=Object.prototype.hasOwnProperty;var P=(A,e)=>()=>{try{return e||A((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}};var ft=(A,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ct(e))!Et.call(A,r)&&r!==t&&Ke(A,r,{get:()=>e[r],enumerable:!(i=_t(e,r))||i.enumerable});return A};var k=(A,e,t)=>(t=A!=null?mt(pt(A)):{},ft(e||!A||!A.__esModule?Ke(t,"default",{value:A,enumerable:!0}):t,A));var Ae=P(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.DEFAULT_FOREGROUND=_.DEFAULT_BACKGROUND=_.PALETTE_ANSI_256=_.PALETTE_VT340_GREY=_.PALETTE_VT340_COLOR=_.normalizeHLS=_.normalizeRGB=_.nearestColorIndex=_.fromRGBA8888=_.toRGBA8888=_.alpha=_.blue=_.green=_.red=_.BIG_ENDIAN=void 0;_.BIG_ENDIAN=new Uint8Array(new Uint32Array([4278190080]).buffer)[0]===255;_.BIG_ENDIAN&&console.warn("BE platform detected. This version of node-sixel works only on LE properly.");function Ye(A){return A&255}_.red=Ye;function ze(A){return A>>>8&255}_.green=ze;function qe(A){return A>>>16&255}_.blue=qe;function Dt(A){return A>>>24&255}_.alpha=Dt;function B(A,e,t,i=255){return((i&255)<<24|(t&255)<<16|(e&255)<<8|A&255)>>>0}_.toRGBA8888=B;function Qt(A){return[A&255,A>>8&255,A>>16&255,A>>>24]}_.fromRGBA8888=Qt;function bt(A,e){let t=Ye(A),i=ze(A),r=qe(A),s=Number.MAX_SAFE_INTEGER,o=-1;for(let n=0;n<e.length;++n){let a=t-e[n][0],l=i-e[n][1],d=r-e[n][2],h=a*a+l*l+d*d;if(!h)return n;h<s&&(s=h,o=n)}return o}_.nearestColorIndex=bt;function fe(A,e,t){return Math.max(A,Math.min(t,e))}function Be(A,e,t){return t<0&&(t+=1),t>1&&(t-=1),t*6<1?e+(A-e)*6*t:t*2<1?A:t*3<2?e+(A-e)*(4-t*6):e}function xt(A,e,t){if(!t){let s=Math.round(e*255);return B(s,s,s)}let i=e<.5?e*(1+t):e+t-e*t,r=2*e-i;return B(fe(0,255,Math.round(Be(i,r,A+1/3)*255)),fe(0,255,Math.round(Be(i,r,A)*255)),fe(0,255,Math.round(Be(i,r,A-1/3)*255)))}function m(A,e,t){return(4278190080|Math.round(t/100*255)<<16|Math.round(e/100*255)<<8|Math.round(A/100*255))>>>0}_.normalizeRGB=m;function wt(A,e,t){return xt((A+240%360)/360,e/100,t/100)}_.normalizeHLS=wt;_.PALETTE_VT340_COLOR=new Uint32Array([m(0,0,0),m(20,20,80),m(80,13,13),m(20,80,20),m(80,20,80),m(20,80,80),m(80,80,20),m(53,53,53),m(26,26,26),m(33,33,60),m(60,26,26),m(33,60,33),m(60,33,60),m(33,60,60),m(60,60,33),m(80,80,80)]);_.PALETTE_VT340_GREY=new Uint32Array([m(0,0,0),m(13,13,13),m(26,26,26),m(40,40,40),m(6,6,6),m(20,20,20),m(33,33,33),m(46,46,46),m(0,0,0),m(13,13,13),m(26,26,26),m(40,40,40),m(6,6,6),m(20,20,20),m(33,33,33),m(46,46,46)]);_.PALETTE_ANSI_256=(()=>{let A=[B(0,0,0),B(205,0,0),B(0,205,0),B(205,205,0),B(0,0,238),B(205,0,205),B(0,250,205),B(229,229,229),B(127,127,127),B(255,0,0),B(0,255,0),B(255,255,0),B(92,92,255),B(255,0,255),B(0,255,255),B(255,255,255)],e=[0,95,135,175,215,255];for(let t=0;t<6;++t)for(let i=0;i<6;++i)for(let r=0;r<6;++r)A.push(B(e[t],e[i],e[r]));for(let t=8;t<=238;t+=10)A.push(B(t,t,t));return new Uint32Array(A)})();_.DEFAULT_BACKGROUND=B(0,0,0,255);_.DEFAULT_FOREGROUND=B(255,255,255,255)});var xe=P(be=>{"use strict";Object.defineProperty(be,"__esModule",{value:!0});be.InWasm=Rt;var K=A=>{if(Uint8Array.fromBase64)return Uint8Array.fromBase64(A);if(typeof Buffer<"u")return Buffer.from(A,"base64");let e=atob(A),t=new Uint8Array(e.length);for(let i=0;i<t.length;++i)t[i]=e.charCodeAt(i);return t};function Rt(A){if(A.d){let{t:e,s:t,d:i}=A,r,s,o=WebAssembly;return e===0?t?n=>new o.Instance(s||(s=new o.Module(r||(r=K(i)))),n):n=>s?o.instantiate(s,n):o.instantiate(r||(r=K(i)),n).then(a=>(s=a.module)&&a.instance):e===1?t?()=>s||(s=new o.Module(r||(r=K(i)))):()=>s?Promise.resolve(s):o.compile(r||(r=K(i))).then(n=>s=n):t?()=>r||(r=K(i)):()=>Promise.resolve(r||(r=K(i)))}if(typeof _wasmCtx>"u")throw new Error('must run "inwasm"');_wasmCtx.add(A)}});var Se=P(ye=>{"use strict";Object.defineProperty(ye,"__esModule",{value:!0});var Ft=xe(),kt=(0,Ft.InWasm)({s:1,t:0,d:"AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML"}),R=new Uint8Array("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").map(A=>A.charCodeAt(0))),Y=new Uint32Array(1024);Y.fill(4278190080);for(let A=0;A<R.length;++A)Y[R[A]]=A<<2;for(let A=0;A<R.length;++A)Y[256+R[A]]=A>>4|(A<<4&255)<<8;for(let A=0;A<R.length;++A)Y[512+R[A]]=A>>2<<8|(A<<6&255)<<16;for(let A=0;A<R.length;++A)Y[768+R[A]]=A<<16;var Nt=new Uint8Array(0),we=class{constructor(e,t,i){if(this._inst=null,this._ended=!0,this._bytes=0,this.keepSize=e??1048576,this.maxBytes=t??4294901760,this._bytes=i??32768,this._bytes>this.maxBytes||this.maxBytes>4294901760)throw new Error("invalid byte settings")}get data8(){return this._inst?this._d.subarray(0,this._m32[1282]):Nt}release(){this._inst&&(this._bytes>this.keepSize?this._inst=this._m32=this._d=this._mem=null:(this._m32[1280]=0,this._m32[1281]=0,this._m32[1282]=0))}init(e,t){if(this.maxBytes=e??this.maxBytes,this._bytes=t??Math.min(this._bytes,this.maxBytes),this._bytes>this.maxBytes||this.maxBytes>4294901760)throw Error("invalid byte settings");let i=this._m32,r=this._bytes+5152;this._inst?this._mem.buffer.byteLength<r&&(this._mem.grow(Math.ceil((r-this._mem.buffer.byteLength)/65536)),i=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)):(this._mem=new WebAssembly.Memory({initial:Math.ceil(r/65536)}),this._inst=kt({env:{memory:this._mem}}),i=new Uint32Array(this._mem.buffer,0),i.set(Y,256),this._d=new Uint8Array(this._mem.buffer,5152)),i[1280]=0,i[1281]=0,i[1282]=0,this._m32=i,this._ended=!1}_realloc(e){let t=this._m32[1280]+e;if(this._bytes<t){if(t>this.maxBytes)return-3;let i=this._bytes;for(;(i*=2)<t;);if(i=Math.min(i,this.maxBytes),i<t)return-3;if(i+5152>this._mem.buffer.byteLength){let r=Math.ceil((i+5152-this._mem.buffer.byteLength)/65536);this._mem.grow(r),this._m32=new Uint32Array(this._mem.buffer,0),this._d=new Uint8Array(this._mem.buffer,5152)}this._bytes=i}return 0}put(e){if(!this._inst||this._ended)return-2;if(this._realloc(e.length))return-3;let t=this._m32;return this._d.set(e,t[1280]),t[1280]+=e.length,t[1280]-t[1281]>=131072?this._inst.exports.dec():0}end(){return this._ended=!0,this._inst?this._inst.exports.end():-2}get loadedBytes(){return this._inst?this._m32[1280]:0}get freeBytes(){return this._inst?this.maxBytes-this._m32[1280]:0}};ye.default=we});var Ze=P(ve=>{"use strict";Object.defineProperty(ve,"__esModule",{value:!0});var Ht=xe(),Gt=(0,Ht.InWasm)({s:1,t:0,d:"AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=="}),Me=class{constructor(e){this.keepSize=e,this.width=0,this.height=0}decode(e){this.width=e[4]<<24|e[5]<<16|e[6]<<8|e[7],this.height=e[8]<<24|e[9]<<16|e[10]<<8|e[11];let t=this.width*this.height,i=t*4,r=e.length,s=Math.max(i,r)+(Math.min(i,r)>>1)+4096;this._inst?this._mem.buffer.byteLength<s&&(this._mem.grow(Math.ceil((s-this._mem.buffer.byteLength)/65536)),this._d=null):(this._mem=new WebAssembly.Memory({initial:Math.ceil(s/65536)}),this._inst=Gt({env:{memory:this._mem}})),this._d||(this._d=new Uint8Array(this._mem.buffer));let o=this._mem.buffer.byteLength-r&-256;return this._d.set(e,o),this._inst.exports.dec(o,r,t),this._d.subarray(1024,1024+i)}release(){this._inst&&this._mem.buffer.byteLength>this.keepSize&&(this._inst=this._d=this._mem=null)}};ve.default=Me});var Pe=P(Ie=>{"use strict";Object.defineProperty(Ie,"__esModule",{value:!0});Ie.LIMITS=void 0;Ie.LIMITS={CHUNK_SIZE:16384,PALETTE_SIZE:4096,MAX_WIDTH:16384,BYTES:"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AEHAiwIgADcDAEG4iwIgADcDAEGwiwIgADcDAEGoiwIgADcDAEGgiwIgADcDAEGYiwIgADcDAEGQiwIgADcDAEGIiwIgADcDAEGAiwIgADcDAEH4igIgADcDAEHwigIgADcDAEHoigIgADcDAEHgigIgADcDAEHYigIgADcDAEHQigIgADcDAEHIigIgADcDAEHAigIgADcDAEG4igIgADcDAEGwigIgADcDAEGoigIgADcDAEGgigIgADcDAEGYigIgADcDAEGQigIgADcDAEGIigIgADcDAEGAigIgADcDAEH4iQIgADcDAEHwiQIgADcDAEHoiQIgADcDAEHgiQIgADcDAEHYiQIgADcDAEHQiQIgADcDAEHIiQIgADcDAEHAiQIgADcDAEG4iQIgADcDAEGwiQIgADcDAEGoCCgCACIEQf8AakGAAW0hCAJAIARBgQFIDQBBASEBIAhBAiAIQQJKG0EBayICQQFxIQMgBEGBAk4EQCACQX5xIQIDQCABQQl0IgdBEHJBoIkCakGwiQJBgAT8CgAAIAdBsI0CakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsLIANFDQAgAUEJdEEQckGgiQJqQbCJAkGABPwKAAALAkAgBEEBSA0AIAhBASAIQQFKGyIDQQFxIQUCQCADQQFrIgdFBEBBACEBDAELIANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQbCJBmpBsIkCQYAE/AoAACAGQZAEckGwiQZqQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACwsgBQRAIAFBCXRBEHJBsIkGakGwiQJBgAT8CgAACyAEQQFIDQAgA0EBcSEFIAcEfyADQf7///8HcSECQQAhAQNAIAFBCXQiBkEQckHAiQpqQbCJAkGABPwKAAAgBkGQBHJBwIkKakGwiQJBgAT8CgAAIAFBAmohASACQQJrIgINAAsgAUEHdEEEcgVBBAshASAFBEAgAUECdEHAiQpqQbCJAkGABPwKAAALIARBAUgNACADQQFxIQUgBwR/IANB/v///wdxIQJBACEBA0AgAUEJdCIGQRByQdCJDmpBsIkCQYAE/AoAACAGQZAEckHQiQ5qQbCJAkGABPwKAAAgAUECaiEBIAJBAmsiAg0ACyABQQd0QQRyBUEECyEBIAUEQCABQQJ0QdCJ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"}});var dt=P(v=>{"use strict";Object.defineProperty(v,"__esModule",{value:!0});v.decodeAsync=v.decode=v.Decoder=v.DecoderAsync=void 0;var j=Ae(),Q=Pe();function Ot(A){if(typeof Buffer<"u")return Buffer.from(A,"base64");let e=atob(A),t=new Uint8Array(e.length);for(let i=0;i<t.length;++i)t[i]=e.charCodeAt(i);return t}var at=Ot(Q.LIMITS.BYTES),$,ue=new Uint32Array,Ue=class{constructor(){this.bandHandler=e=>1,this.modeHandler=e=>1}handle_band(e){return this.bandHandler(e)}mode_parsed(e){return this.modeHandler(e)}},Jt={memoryLimit:2048*65536,sixelColor:j.DEFAULT_FOREGROUND,fillColor:j.DEFAULT_BACKGROUND,palette:j.PALETTE_VT340_COLOR,paletteLimit:Q.LIMITS.PALETTE_SIZE,truncate:!0};function lt(A){let e=new Ue,t={env:{handle_band:e.handle_band.bind(e),mode_parsed:e.mode_parsed.bind(e)}};return WebAssembly.instantiate($||at,t).then(i=>($=$||i.module,new ee(A,i.instance||i,e)))}v.DecoderAsync=lt;var ee=class{constructor(e,t,i){if(this._PIXEL_OFFSET=Q.LIMITS.MAX_WIDTH+4,this._canvas=ue,this._bandWidths=[],this._maxWidth=0,this._minWidth=Q.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0,this._opts=Object.assign({},Jt,e),this._opts.paletteLimit>Q.LIMITS.PALETTE_SIZE)throw new Error(`DecoderOptions.paletteLimit must not exceed ${Q.LIMITS.PALETTE_SIZE}`);if(t)i.bandHandler=this._handle_band.bind(this),i.modeHandler=this._initCanvas.bind(this);else{let r=$||($=new WebAssembly.Module(at));t=new WebAssembly.Instance(r,{env:{handle_band:this._handle_band.bind(this),mode_parsed:this._initCanvas.bind(this)}})}this._instance=t,this._wasm=this._instance.exports,this._chunk=new Uint8Array(this._wasm.memory.buffer,this._wasm.get_chunk_address(),Q.LIMITS.CHUNK_SIZE),this._states=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_state_address(),12),this._palette=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_palette_address(),Q.LIMITS.PALETTE_SIZE),this._palette.set(this._opts.palette),this._pSrc=new Uint32Array(this._wasm.memory.buffer,this._wasm.get_p0_address()),this._wasm.init(j.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}get _fillColor(){return this._states[0]}get _truncate(){return this._states[8]}get _rasterWidth(){return this._states[6]}get _rasterHeight(){return this._states[7]}get _width(){return this._states[2]?this._states[2]-4:0}get _height(){return this._states[3]}get _level(){return this._states[9]}get _mode(){return this._states[10]}get _paletteLimit(){return this._states[11]}_initCanvas(e){if(e===2){let t=this.width*this.height;if(t>this._canvas.length){if(this._opts.memoryLimit&&t*4>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(t)}this._maxWidth=this._width}else if(e===1)if(this._level===2){let t=Math.min(this._rasterWidth,Q.LIMITS.MAX_WIDTH)*this._rasterHeight;if(t>this._canvas.length){if(this._opts.memoryLimit&&t*4>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");this._canvas=new Uint32Array(t)}}else this._canvas.length<65536&&(this._canvas=new Uint32Array(65536));return 0}_realloc(e,t){let i=e+t;if(i>this._canvas.length){if(this._opts.memoryLimit&&i*4>this._opts.memoryLimit)throw this.release(),new Error("image exceeds memory limit");let r=new Uint32Array(Math.ceil(i/65536)*65536);r.set(this._canvas),this._canvas=r}}_handle_band(e){let t=this._PIXEL_OFFSET,i=this._lastOffset;if(this._mode===2){let r=this.height-this._currentHeight,s=0;for(;s<6&&r>0;)this._canvas.set(this._pSrc.subarray(t*s,t*s+e),i+e*s),s++,r--;this._lastOffset+=e*s,this._currentHeight+=s}else if(this._mode===1){this._realloc(i,e*6),this._maxWidth=Math.max(this._maxWidth,e),this._minWidth=Math.min(this._minWidth,e);for(let r=0;r<6;++r)this._canvas.set(this._pSrc.subarray(t*r,t*r+e),i+e*r);this._bandWidths.push(e),this._lastOffset+=e*6,this._currentHeight+=6}return 0}get width(){return this._mode!==1?this._width:Math.max(this._maxWidth,this._wasm.current_width())}get height(){return this._mode!==1?this._height:this._wasm.current_width()?this._bandWidths.length*6+this._wasm.current_height():this._bandWidths.length*6}get palette(){return this._palette.subarray(0,this._paletteLimit)}get memoryUsage(){return this._canvas.byteLength+this._wasm.memory.buffer.byteLength+8*this._bandWidths.length}get properties(){return{width:this.width,height:this.height,mode:this._mode,level:this._level,truncate:!!this._truncate,paletteLimit:this._paletteLimit,fillColor:this._fillColor,memUsage:this.memoryUsage,rasterAttributes:{numerator:this._states[4],denominator:this._states[5],width:this._rasterWidth,height:this._rasterHeight}}}init(e=this._opts.fillColor,t=this._opts.palette,i=this._opts.paletteLimit,r=this._opts.truncate){this._wasm.init(this._opts.sixelColor,e,i,r?1:0),t&&this._palette.set(t.subarray(0,Q.LIMITS.PALETTE_SIZE)),this._bandWidths.length=0,this._maxWidth=0,this._minWidth=Q.LIMITS.MAX_WIDTH,this._lastOffset=0,this._currentHeight=0}decode(e,t=0,i=e.length){let r=t;for(;r<i;){let s=Math.min(i-r,Q.LIMITS.CHUNK_SIZE);this._chunk.set(e.subarray(r,r+=s)),this._wasm.decode(0,s)}}decodeString(e,t=0,i=e.length){let r=t;for(;r<i;){let s=Math.min(i-r,Q.LIMITS.CHUNK_SIZE);for(let o=0,n=r;o<s;++o,++n)this._chunk[o]=e.charCodeAt(n);r+=s,this._wasm.decode(0,s)}}get data32(){if(this._mode===0||!this.width||!this.height)return ue;let e=this._wasm.current_width();if(this._mode===2){let t=this.height-this._currentHeight;if(t>0){let i=this._PIXEL_OFFSET,r=this._lastOffset,s=0;for(;s<6&&t>0;)this._canvas.set(this._pSrc.subarray(i*s,i*s+e),r+e*s),s++,t--;t&&this._canvas.fill(this._fillColor,r+e*s)}return this._canvas.subarray(0,this.width*this.height)}if(this._mode===1){if(this._minWidth===this._maxWidth){let s=!1;if(e)if(e!==this._minWidth)s=!0;else{let o=this._PIXEL_OFFSET,n=this._lastOffset;this._realloc(n,e*6);for(let a=0;a<6;++a)this._canvas.set(this._pSrc.subarray(o*a,o*a+e),n+e*a)}if(!s)return this._canvas.subarray(0,this.width*this.height)}let t=new Uint32Array(this.width*this.height);t.fill(this._fillColor);let i=0,r=0;for(let s=0;s<this._bandWidths.length;++s){let o=this._bandWidths[s];for(let n=0;n<6;++n)t.set(this._canvas.subarray(r,r+=o),i),i+=this.width}if(e){let s=this._PIXEL_OFFSET,o=this._wasm.current_height();for(let n=0;n<o;++n)t.set(this._pSrc.subarray(s*n,s*n+e),i+this.width*n)}return t}return ue}get data8(){return new Uint8ClampedArray(this.data32.buffer,0,this.width*this.height*4)}release(){this._canvas=ue,this._bandWidths.length=0,this._maxWidth=0,this._minWidth=Q.LIMITS.MAX_WIDTH,this._wasm.init(j.DEFAULT_FOREGROUND,0,this._opts.paletteLimit,0)}};v.Decoder=ee;function Kt(A,e){let t=new ee(e);return t.init(),typeof A=="string"?t.decodeString(A):t.decode(A),{width:t.width,height:t.height,data32:t.data32,data8:t.data8}}v.decode=Kt;async function Yt(A,e){let t=await lt(e);return t.init(),typeof A=="string"?t.decodeString(A):t.decode(A),{width:t.width,height:t.height,data32:t.data32,data8:t.data8}}v.decodeAsync=Yt});function U(A){return{dispose:A}}var X=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(let e of this._disposables)e.dispose();this._disposables.clear()}},W=class{constructor(){this._store=new X}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}};W.None=Object.freeze({dispose(){}});var ie=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}};var re=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(e,t,i)=>{if(this._disposed)return U(()=>{});let r={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(r);let s=U(()=>{let o=this._listeners.indexOf(r);o!==-1&&(this._listeners=this._listeners.slice(),this._listeners.splice(o,1))});return i&&(Array.isArray(i)?i.push(s):i.add(s)),s},this._event)}fire(e){if(this._disposed||!this._listeners.length)return;if(this._listeners.length===1){this._listeners[0].fn.call(this._listeners[0].thisArgs,e);return}let t=this._listeners;for(let i=0,r=t.length;i<r;++i)t[i].fn.call(t[i].thisArgs,e)}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},Bt;(r=>{function A(s,o){return s(n=>o.fire(n))}r.forward=A;function e(s,o){return(n,a,l)=>s(d=>n.call(a,o(d)),void 0,l)}r.map=e;function t(...s){return(o,n,a)=>{let l=new X;for(let d of s)l.add(d(h=>o.call(n,h)));return a&&(Array.isArray(a)?a.push(l):a.add(l)),l}}r.any=t;function i(s,o,n){return o(n),s(a=>o(a))}r.runAndSubscribe=i})(Bt||={});var se=class{constructor(){this._isScheduled=!1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(e){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,e())}))}};var De=k(Ae());var b=class A extends W{constructor(t){super();this._terminal=t;this._layers=new Map;this._optionsRefresh=this._register(new ie);this._oldOpen=this._terminal._core.open,this._terminal._core.open=i=>{this._oldOpen?.call(this._terminal._core,i),this._open()},this._terminal._core.screenElement&&this._open(),this._optionsRefresh.value=this._terminal._core.optionsService.onOptionChange(i=>{i==="fontSize"&&(this.rescaleCanvas(),this._renderService?.refreshRows(0,this._terminal.rows))}),this._register(U(()=>{this.removeLayerFromDom(),this.removeLayerFromDom("bottom"),this._terminal._core&&this._oldOpen&&(this._terminal._core.open=this._oldOpen,this._oldOpen=void 0),this._renderService&&this._oldSetRenderer&&(this._renderService.setRenderer=this._oldSetRenderer,this._oldSetRenderer=void 0),this._renderService=void 0,this._layers.clear(),this._placeholderBitmap?.close(),this._placeholderBitmap=void 0,this._placeholder=void 0}))}get canvas(){return this._layers.get("top")?.canvas}static createCanvas(t,i,r){let s=(t??document).createElement("canvas");return s.width=i|0,s.height=r|0,s}static createImageData(t,i,r,s){if(typeof ImageData!="function"){let o=t.createImageData(i,r);return s&&o.data.set(new Uint8ClampedArray(s,0,i*r*4)),o}return s?new ImageData(new Uint8ClampedArray(s,0,i*r*4),i,r):new ImageData(i,r)}static createImageBitmap(t){return typeof createImageBitmap!="function"?Promise.resolve(void 0):createImageBitmap(t)}showPlaceholder(t){t?!this._placeholder&&this.cellSize.height!==-1&&this._createPlaceHolder(Math.max(this.cellSize.height+1,24)):(this._placeholderBitmap?.close(),this._placeholderBitmap=void 0,this._placeholder=void 0),this._renderService?.refreshRows(0,this._terminal.rows)}get dimensions(){return this._terminal.dimensions}get cellSize(){return{width:this.dimensions?.css.cell.width||-1,height:this.dimensions?.css.cell.height||-1}}refreshAll(){this._renderService?.refreshRows(0,this._terminal.rows-1)}clearLines(t,i,r){let s=t*(this.dimensions?.css.cell.height||0),o=this.dimensions?.css.canvas.width||0,n=(i+1-t)*(this.dimensions?.css.cell.height||0);(!r||r==="top")&&this._layers.get("top")?.clearRect(0,s,o,n),(!r||r==="bottom")&&this._layers.get("bottom")?.clearRect(0,s,o,n)}clearAll(t){if(!t||t==="top"){let i=this._layers.get("top");i?.clearRect(0,0,i.canvas.width,i.canvas.height)}if(!t||t==="bottom"){let i=this._layers.get("bottom");i?.clearRect(0,0,i.canvas.width,i.canvas.height)}}draw(t,i,r,s,o=1){let n=this._layers.get(t.layer);if(!n)return;let{width:a,height:l}=this.cellSize;if(a===-1||l===-1)return;this._rescaleImage(t,a,l);let d=t.actual,{width:h,height:c}=t.actualCellSize,g=Math.ceil(d.width/h),I=i%g*h,p=Math.floor(i/g)*c,E=r*a,u=s*l,f=o*h+I>d.width?d.width-I:o*h,C=p+c>d.height?d.height-p:c;n.drawImage(d,Math.floor(I),Math.floor(p),Math.ceil(f),Math.ceil(C),Math.floor(E),Math.floor(u),Math.ceil(f*a/h),Math.ceil(C*l/c))}drawCellImage(t,i,r,s,o,n,a,l){let d=this._layers.get(t.layer);if(!d)return;let{width:h,height:c}=this.cellSize;if(h===-1||c===-1)return;let g=t.orig;if(!g)return;let I=i*h,p=r*c,E=g.width*p>g.height*I,u=E?I/Math.max(1,g.width):p/Math.max(1,g.height),f=E?0:(I-g.width*u)/2,C=E?(p-g.height*u)/2:0,N=a*h,x=l*c,w=n*h,y=c,S=(o*h-f)/u,L=(s*c-C)/u,H=w/u,G=y/u;if(S<0){let q=-S*u;N+=q,w-=q,H+=S,S=0}if(L<0){let q=-L*u;x+=q,y-=q,G+=L,L=0}S+H>g.width&&(H=g.width-S,w=H*u),L+G>g.height&&(G=g.height-L,y=G*u),!(H<=0||G<=0||w<=0||y<=0)&&d.drawImage(g,S,L,H,G,N,x,w,y)}extractTile(t,i){let{width:r,height:s}=this.cellSize;if(r===-1||s===-1)return;this._rescaleImage(t,r,s);let o=t.actual,{width:n,height:a}=t.actualCellSize,l=Math.ceil(o.width/n),d=i%l*n,h=Math.floor(i/l)*a,c=n+d>o.width?o.width-d:n,g=h+a>o.height?o.height-h:a,I=A.createCanvas(this.document,Math.ceil(c*r/n),Math.ceil(g*s/a)),p=I.getContext("2d");if(p)return p.drawImage(o,Math.floor(d),Math.floor(h),Math.floor(c),Math.floor(g),0,0,I.width,I.height),I}drawPlaceholder(t,i,r=1){let s=this._layers.get("top");if(s){let{width:o,height:n}=this.cellSize;if(o===-1||n===-1||(this._placeholder?n>=this._placeholder.height&&this._createPlaceHolder(n+1):this._createPlaceHolder(Math.max(n+1,24)),!this._placeholder))return;s.drawImage(this._placeholderBitmap??this._placeholder,t*o,i*n%2?0:1,o*r,n,t*o,i*n,o*r,n)}}rescaleCanvas(){let t=this.dimensions?.css.canvas.width||0,i=this.dimensions?.css.canvas.height||0;for(let r of this._layers.values())(r.canvas.width!==t||r.canvas.height!==i)&&(r.canvas.width=t,r.canvas.height=i)}_rescaleImage(t,i,r){if(i===t.actualCellSize.width&&r===t.actualCellSize.height)return;let{width:s,height:o}=t.origCellSize;if(i===s&&r===o){t.actual=t.orig,t.actualCellSize.width=s,t.actualCellSize.height=o;return}let n=Math.ceil(t.orig.width*i/s),a=Math.ceil(t.orig.height*r/o);if(n*a>t.orig.width*t.orig.height){t.actual=t.orig,t.actualCellSize.width=s,t.actualCellSize.height=o;return}let l=A.createCanvas(this.document,n,a),d=l.getContext("2d");d&&(d.drawImage(t.orig,0,0,l.width,l.height),t.actual=l,t.actualCellSize.width=i,t.actualCellSize.height=r)}_open(){this._renderService=this._terminal._core._renderService,this._oldSetRenderer=this._renderService.setRenderer.bind(this._renderService),this._renderService.setRenderer=t=>{for(let i of[...this._layers.keys()])this.removeLayerFromDom(i);this._oldSetRenderer?.call(this._renderService,t)}}insertLayerToDom(t="top"){if(!this.document||!this._terminal._core.screenElement){console.warn("image addon: cannot insert output canvas to DOM, missing document or screenElement");return}if(this._layers.has(t))return;let i=A.createCanvas(this.document,this.dimensions?.css.canvas.width||0,this.dimensions?.css.canvas.height||0);i.classList.add(`xterm-image-layer-${t}`);let r=this._terminal._core.screenElement;r.style.isolation="isolate",t==="bottom"?(i.style.zIndex="-1",r.insertBefore(i,r.firstChild)):(i.style.zIndex="0",r.appendChild(i));let s=i.getContext("2d",{alpha:!0});if(!s){i.remove();return}this._layers.set(t,s),this.clearAll(t)}removeLayerFromDom(t="top"){let i=this._layers.get(t);i&&(i.canvas.remove(),this._layers.delete(t))}hasLayer(t){return this._layers.has(t)}_createPlaceHolder(t=24){this._placeholderBitmap?.close(),this._placeholderBitmap=void 0;let i=32,r=A.createCanvas(this.document,i,t),s=r.getContext("2d",{alpha:!1});if(!s)return;let o=A.createImageData(s,i,t),n=new Uint32Array(o.data.buffer),a=(0,De.toRGBA8888)(0,0,0),l=(0,De.toRGBA8888)(255,255,255);n.fill(a);for(let g=0;g<t;++g){let I=g%2,p=g*i;for(let E=0;E<i;E+=2)n[p+E+I]=l}s.putImageData(o,0,0);let d=screen.width+i-1&~(i-1)||4096;this._placeholder=A.createCanvas(this.document,d,t);let h=this._placeholder.getContext("2d",{alpha:!1});if(!h){this._placeholder=void 0;return}for(let g=0;g<d;g+=i)h.drawImage(r,g,0);let c=this._placeholder;A.createImageBitmap(c).then(g=>{this._placeholder!==c?g?.close():this._placeholderBitmap=g}).catch(()=>{})}get document(){return this._terminal._core._coreBrowserService?.window.document}};function We(A){return A>65535?(A-=65536,String.fromCharCode((A>>10)+55296)+String.fromCharCode(A%1024+56320)):String.fromCharCode(A)}var ne=class A{constructor(){this.fg=0;this.bg=0;this.extended=new Z}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new A;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},Z=class A{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new A(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0&&this.payload===void 0}};var J=class A extends ne{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new Z;this.combinedData=""}static fromCharData(t){let i=new A;return i.setFromCharData(t),i}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?We(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let i=!1;if(t[1].length>2)i=!0;else if(t[1].length===2){let r=t[1].charCodeAt(0);if(55296<=r&&r<=56319){let s=t[1].charCodeAt(1);56320<=s&&s<=57343?this.content=(r-55296)*1024+s-56320+65536|t[2]<<22:i=!0}else i=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;i&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor()||this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor()||this.isInverse()!==t.isInverse()||this.isBold()!==t.isBold()||this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;let i=this.isUnderlineColorDefault(),r=t.isUnderlineColorDefault();if(!(i&&r)&&(i!==r||this.getUnderlineColor()!==t.getUnderlineColor()||this.getUnderlineColorMode()!==t.getUnderlineColorMode()))return!1}return!(this.isOverline()!==t.isOverline()||this.isBlink()!==t.isBlink()||this.isInvisible()!==t.isInvisible()||this.isItalic()!==t.isItalic()||this.isDim()!==t.isDim()||this.isStrikethrough()!==t.isStrikethrough())}};var D={width:7,height:14},M=class{constructor(e=-1,t=-1){this.imageId=e;this.tileId=t}},oe=class{constructor(e,t,i){this._terminal=e;this._renderer=t;this._opts=i;this._images=new Map;this._lastId=0;this._lowestId=0;this._fullyCleared=!1;this._needsFullClear=!1;this._pixelLimit=25e5;this._workCell=new J;try{this.setLimit(this._opts.storageLimit)}catch(r){r instanceof Error&&console.error(r.message),console.warn(`storageLimit is set to ${this.getLimit()} MB`)}this._viewportMetrics={cols:this._terminal.cols,rows:this._terminal.rows}}dispose(){this.reset()}reset(){for(let e of[...this._images.keys()])this.deleteImage(e);this._renderer.clearAll()}getLimit(){return this._pixelLimit*4/1e6}setLimit(e){if(e<.5||e>1e3)throw RangeError("invalid storageLimit, should be at least 0.5 MB and not exceed 1G");this._pixelLimit=e/4*1e6>>>0,this._evictOldest(0)}getUsage(){return this._getStoredPixels()*4/1e6}_getStoredPixels(){let e=0;for(let t of this._images.values())t.orig&&(e+=t.orig.width*t.orig.height,t.actual&&t.actual!==t.orig&&(e+=t.actual.width*t.actual.height));return e}_delImg(e){let t=this._images.get(e);t&&(this._images.delete(e),window.ImageBitmap&&t.orig instanceof ImageBitmap&&t.orig.close(),this.onImageDeleted?.(e),this._renderer.refreshAll())}wipeAlternate(){let e=[];for(let[t,i]of this._images.entries())i.bufferType==="alternate"&&(i.marker?.dispose(),e.push(t));for(let t of e)this._delImg(t);this._needsFullClear=!0,this._fullyCleared=!1}deleteImage(e){let t=this._images.get(e);t&&(t.marker?.dispose(),this._delImg(e))}addUnplacedImage(e,t){this._evictOldest(e.width*e.height);let i=this._renderer.cellSize;(i.width===-1||i.height===-1)&&(i=D);let r=++this._lastId;return this._images.set(r,{orig:e,origCellSize:i,actual:e,actualCellSize:{...i},marker:void 0,tileCount:0,virtual:!0,bufferType:this._terminal.buffer.active.type,layer:t.layer,zIndex:t.zIndex}),this.onImageAdded?.(),r}getImageSpec(e){return this._images.get(e)}addImage(e,t){this._evictOldest(e.width*e.height);let i=this._renderer.cellSize;(i.width===-1||i.height===-1)&&(i=D);let r=Math.ceil(e.width/i.width),s=Math.ceil(e.height/i.height),o=++this._lastId,n=this._terminal._core.buffer,a=this._terminal.cols,l=this._terminal.rows,d=n.x,h=n.y,c=d,g=0;t.scrolling||(n.x=0,n.y=0,c=0),this._terminal._core._inputHandler._dirtyRowTracker.markDirty(n.y);for(let u=0;u<s;++u){let f=n.lines.get(n.y+n.ybase);for(let C=0;C<r&&!(c+C>=a);++C)this._writeToCell(f,c+C,o,u*r+C),g++;if(t.scrolling)u<s-1&&this._terminal._core._inputHandler.lineFeed();else if(++n.y>=l)break;n.x=c}this._terminal._core._inputHandler._dirtyRowTracker.markDirty(n.y),t.scrolling?t.cursorPos==="iip"?n.x=Math.min(c+r,a):n.x=c:(n.x=d,n.y=h);let I=[];for(let[u,f]of this._images.entries())f.tileCount<1&&!f.virtual&&(f.marker?.dispose(),I.push(u));for(let u of I)this._delImg(u);let p=this._terminal.registerMarker(0);p?.onDispose(()=>{this._images.get(o)&&this._delImg(o)}),this._terminal.buffer.active.type==="alternate"&&this._evictOnAlternate();let E={orig:e,origCellSize:i,actual:e,actualCellSize:{...i},marker:p||void 0,tileCount:g,bufferType:this._terminal.buffer.active.type,layer:t.layer,zIndex:t.zIndex};return this._images.set(o,E),this.onImageAdded?.(),o}render(e){let t=!1,i=!1;for(let d of this._images.values())if(d.layer==="bottom"?i=!0:t=!0,t&&i)break;if(t&&!this._renderer.hasLayer("top")&&(this._renderer.insertLayerToDom("top"),!this._renderer.hasLayer("top")))return;if(i&&!this._renderer.hasLayer("bottom")&&this._renderer.insertLayerToDom("bottom"),this._renderer.rescaleCanvas(),!this._images.size){this._fullyCleared||(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1),this._renderer.hasLayer("top")&&this._renderer.removeLayerFromDom("top"),this._renderer.hasLayer("bottom")&&this._renderer.removeLayerFromDom("bottom");return}!t&&this._renderer.hasLayer("top")&&(this._renderer.clearAll("top"),this._renderer.removeLayerFromDom("top")),!i&&this._renderer.hasLayer("bottom")&&(this._renderer.clearAll("bottom"),this._renderer.removeLayerFromDom("bottom")),this._needsFullClear&&(this._renderer.clearAll(),this._fullyCleared=!0,this._needsFullClear=!1);let{start:r,end:s}=e,o=this._terminal._core.buffer,n=this._terminal._core.cols;this._renderer.clearLines(r,s);let a=[],l=[];for(let d=r;d<=s;++d){let h=o.lines.get(d+o.ydisp);if(!h)return;this.onRenderLine?.(h,d,n);for(let c=0;c<n;++c){let g=h.getExtended(c)?.payload;if(g instanceof M){let I=g.imageId;if(I===void 0||I===-1)continue;let p=this._images.get(I);if(g.tileId!==-1){let E=g.tileId,u=c,f=1;for(;++c<n;){let C=h.getExtended(c)?.payload;if(!(C instanceof M)||C.imageId!==I||C.tileId!==E+f)break;f++}c--,p?p.actual&&a.push({imgSpec:p,tileId:E,col:u,row:d,count:f}):this._opts.showPlaceholder&&l.push({col:u,row:d,count:f}),this._fullyCleared=!1}}}}a.sort((d,h)=>d.imgSpec.zIndex-h.imgSpec.zIndex);for(let d of l)this._renderer.drawPlaceholder(d.col,d.row,d.count);for(let d of a)this._renderer.draw(d.imgSpec,d.tileId,d.col,d.row,d.count)}viewportResize(e){if(!this._images.size){this._viewportMetrics=e;return}if(this._viewportMetrics.cols>=e.cols){this._viewportMetrics=e;return}let t=this._terminal._core.buffer,i=t.lines.length,r=this._viewportMetrics.cols-1;for(let s=0;s<i;++s){let o=t.lines.get(s),n=o.getExtended(r)?.payload;if(n instanceof M){let a=n.imageId;if(a===void 0||a===-1)continue;let l=this._images.get(a);if(!l)continue;let d=Math.ceil((l.actual?.width||0)/l.actualCellSize.width);if(n.tileId%d+1>=d)continue;let h=!1;for(let I=r+1;I>e.cols;++I)if(o.hasContent(I)){h=!0;break}if(h)continue;let c=Math.min(e.cols,d-n.tileId%d+r),g=n.tileId;for(let I=r+1;I<c;++I)this._writeToCell(o,I,a,++g),l.tileCount++}}this._viewportMetrics=e}getImageAtBufferCell(e,t){let r=this._terminal._core.buffer.lines.get(t);if(r){let s=r.getExtended(e)?.payload;if(s instanceof M&&s.imageId&&s.imageId!==-1){let o=this._images.get(s.imageId)?.orig;if(window.ImageBitmap&&o instanceof ImageBitmap){let n=b.createCanvas(window.document,o.width,o.height);return n.getContext("2d")?.drawImage(o,0,0,o.width,o.height),n}return o}}}extractTileAtBufferCell(e,t){let r=this._terminal._core.buffer.lines.get(t);if(r){let s=r.getExtended(e)?.payload;if(s instanceof M&&s.imageId&&s.imageId!==-1&&s.tileId!==-1){let o=this._images.get(s.imageId);if(o)return this._renderer.extractTile(o,s.tileId)}}}_evictOldest(e){let t=this._getStoredPixels(),i=t;for(;this._pixelLimit<i+e&&this._images.size;){let r=this._images.get(++this._lowestId);r&&r.orig&&(i-=r.orig.width*r.orig.height,r.actual&&r.orig!==r.actual&&(i-=r.actual.width*r.actual.height),r.marker?.dispose(),this._delImg(this._lowestId))}return t-i}_writeToCell(e,t,i,r){let s=this._workCell;if(e.loadCell(t,s),this._workCell.hasExtendedAttrs()){let n=s.extended.payload;if(n instanceof M){let a=this._images.get(n.imageId);a&&a.tileCount--,n.imageId=i,n.tileId=r;return}}let o=s.extended.clone();o.payload=new M(i,r),s.extended=o,s.updateExtended(),e.setCell(t,s)}_evictOnAlternate(){for(let i of this._images.values())i.bufferType==="alternate"&&(i.tileCount=0);let e=this._terminal._core.buffer;for(let i=0;i<this._terminal.rows;++i){let r=e.lines.get(i);if(r)for(let s=0;s<this._terminal.cols;++s){let o=r.getExtended(s)?.payload;if(o instanceof M){let n=this._images.get(o.imageId);n&&n.tileCount++}}}let t=[];for(let[i,r]of this._images.entries())r.bufferType==="alternate"&&!r.tileCount&&!r.virtual&&(r.marker?.dispose(),t.push(i));for(let i of t)this._delImg(i)}};var tt=k(Se()),it=k(Ze());function ae(A){let e="";for(let t=0;t<A.length;++t)e+=String.fromCharCode(A[t]);return e}function Le(A){let e=0;for(let t=0;t<A.length;++t){if(A[t]<48||A[t]>57)throw new Error("illegal char");e=e*10+A[t]-48}return e}function Ve(A){let e=ae(A);if(!e.match(/^((auto)|(\d+?((px)|(%)){0,1}))$/))throw new Error("illegal size");return e}function Pt(A){if(typeof Buffer<"u")return Buffer.from(ae(A),"base64").toString();let e=atob(ae(A)),t=new Uint8Array(e.length);for(let i=0;i<t.length;++i)t[i]=e.charCodeAt(i);return new TextDecoder().decode(t)}var je={inline:Le,size:Le,name:Pt,width:Ve,height:Ve,preserveAspectRatio:Le},$e=[70,105,108,101],et=[77,117,108,116,105,112,97,114,116,70,105,108,101],Te=[70,105,108,101,80,97,114,116],Re=[70,105,108,101,69,110,100],Fe=[82,101,112,111,114,116,67,101,108,108,83,105,122,101],ke=1024,le=class{constructor(){this.state=0;this._buffer=new Uint32Array(ke);this._position=0;this._key="";this.fields={}}reset(){this._buffer.fill(0),this.state=0,this._position=0,this.fields={},this._key=""}end(){if(this.state===0){if(this._position===Re.length){for(let e=0;e<Re.length;++e)if(this._buffer[e]!==Re[e])return this._a();return this.fields.type=4,this.state=4,0}if(this._position===Fe.length){for(let e=0;e<Fe.length;++e)if(this._buffer[e]!==Fe[e])return this._a();return this.fields.type=5,this.state=4,0}return this._a()}return this.state===4?0:this.state===3&&this.fields.type===2?this._storeValue(this._position)?(this.state=4,0):this._a():this._a()}parse(e,t,i){let r=this.state,s=this._position,o=this._buffer;if(r===1||r===4||r===0&&s>14)return-1;for(let n=t;n<i;++n){let a=e[n];switch(a){case 59:if(!this._storeValue(s))return this._a();r=2,s=0;break;case 61:if(r===0){if(o[0]===70){let l=0;for(;l<$e.length;++l)if(o[l]!==$e[l])return this._a();if(this.fields.type=1,s===Te.length){for(;l<Te.length;++l)if(o[l]!==Te[l])return this._a();return this.fields.type=3,this.state=4,n+1}}else if(o[0]===77){for(let l=0;l<et.length;++l)if(o[l]!==et[l])return this._a();this.fields.type=2}else return this._a();r=2,s=0}else if(r===2){if(!this._storeKey(s))return this._a();r=3,s=0}else if(r===3){if(s>=ke)return this._a();o[s++]=a}break;case 58:return r===3&&!this._storeValue(s)?this._a():(this.state=4,n+1);default:if(s>=ke)return this._a();o[s++]=a}}return this.state=r,this._position=s,-2}_a(){return this.fields.type=0,this.state=1,-1}_storeKey(e){let t=ae(this._buffer.subarray(0,e));return t?(this._key=t,this.fields[t]=null,!0):!1}_storeValue(e){if(this._key){try{let t=this._buffer.slice(0,e);this.fields[this._key]=je[this._key]?je[this._key](t):t}catch{return!1}return!0}return!1}};var F={mime:"unsupported",width:0,height:0};function de(A){if(A.length<32)return F;let e=new Uint32Array(A.buffer,A.byteOffset,8);if(e[0]===1196314761&&e[1]===169478669&&e[3]===1380206665)return{mime:"image/png",width:A[16]<<24|A[17]<<16|A[18]<<8|A[19],height:A[20]<<24|A[21]<<16|A[22]<<8|A[23]};if(A[0]===255&&A[1]===216&&A[2]===255){let[t,i]=Ut(A);return{mime:"image/jpeg",width:t,height:i}}if(e[0]===944130375&&(A[4]===55||A[4]===57)&&A[5]===97)return{mime:"image/gif",width:A[7]<<8|A[6],height:A[9]<<8|A[8]};if(e[0]===1718185841)return{mime:"image/qoi",width:A[4]<<24|A[5]<<16|A[6]<<8|A[7],height:A[8]<<24|A[9]<<16|A[10]<<8|A[11]};if(e[0]===1179011410&&e[2]===1346520407&&(e[3]&16777215)===3690582){switch(A[15]){case 88:return{mime:"image/webp",width:(A[24]|A[25]<<8|A[26]<<16)+1,height:(A[27]|A[28]<<8|A[29]<<16)+1};case 76:if(A[20]!==47)return F;let t=A[21]|A[22]<<8|A[23]<<16|A[24]<<24;return{mime:"image/webp",width:(t&16383)+1,height:(t>>>14&16383)+1};case 32:return A[23]!==157||A[24]!==1||A[25]!==42?F:{mime:"image/webp",width:(A[26]|A[27]<<8)&16383,height:(A[28]|A[29]<<8)&16383}}return F}if(e[1]===1887007846&&(e[2]===1718187617||e[2]===1936291425)){let t=-1,i=Math.min(A.length-16,1024);for(let r=8;r<i;r++)if(A[r]===105&&A[r+1]===115&&A[r+2]===112&&A[r+3]===101){t=r;break}if(t!==-1){let r=A[t+8]<<24|A[t+9]<<16|A[t+10]<<8|A[t+11],s=A[t+12]<<24|A[t+13]<<16|A[t+14]<<8|A[t+15];if(r>0&&s>0)return{mime:"image/avif",width:r,height:s}}return F}return F}function Ut(A){let e=A.length,t=4,i=A[t]<<8|A[t+1];for(;;){if(t+=i,t>=e)return[0,0];if(A[t]!==255)return[0,0];if(A[t+1]===192||A[t+1]===194)return t+8<e?[A[t+7]<<8|A[t+8],A[t+5]<<8|A[t+6]]:[0,0];t+=2,i=A[t]<<8|A[t+1]}}var Ne={type:0,name:"Unnamed file",size:0,width:"auto",height:"auto",preserveAspectRatio:1,inline:0},he=class{constructor(e,t,i,r){this._opts=e;this._renderer=t;this._storage=i;this._coreTerminal=r;this._generation=0;this._aborted=!1;this._hp=new le;this._header=Ne;this._isMultipart=!1;this._abortMulti=!1;let s=Math.ceil(this._opts.iipSizeLimit*4/3),o=Math.min(1048576,s);this._dec=new tt.default(0,s,o),this._qoiDec=new it.default(0)}reset(){this._generation++,this._hp.reset(),this._dec.release(),this._qoiDec.release()}start(){this._aborted=!1,this._hp.reset()}put(e,t,i){if(!this._aborted)if(this._hp.state===4)this._dec.put(e.subarray(t,i))!==0&&(this._dec.release(),this._aborted=!0);else{let r=this._hp.parse(e,t,i);if(r===-1){this._aborted=!0;return}if(r>0){if(this._hp.fields.type===1){if(this._isMultipart&&(this._isMultipart=!1,this._abortMulti=!1,this._dec.release()),this._header=Object.assign({},Ne,this._hp.fields),!this._header.inline){this._aborted=!0;return}if(!this._initDecoder()){this._aborted=!0;return}}else if(this._abortMulti){this._aborted=!0;return}this._dec.put(e.subarray(r,i))!==0&&(this._dec.release(),this._aborted=!0,this._isMultipart&&(this._abortMulti=!0))}}}end(e){if(this._aborted||this._hp.state!==4&&this._hp.end())return!0;let t=this._hp.fields.type;if(t===3)return!0;if(t===5){let l=D.width,d=D.height;this._renderer.dimensions&&(l=this._renderer.dimensions.css.canvas.width/this._coreTerminal.cols,d=this._renderer.dimensions.css.canvas.height/this._coreTerminal.rows);let h=this._coreTerminal._core._coreBrowserService?.dpr??1,c=`\x1B]1337;ReportCellSize=${d.toFixed(3)};${l.toFixed(3)};${h.toFixed(3)}\x1B\\`;return this._coreTerminal.input(c,!1),!0}if(t===2)return this._header=Object.assign({},Ne,this._hp.fields),this._isMultipart=!0,this._abortMulti=!1,this._dec.release(),this._initDecoder()||(this._abortMulti=!0),!0;if(t===4&&(!this._isMultipart||(this._isMultipart=!1,this._abortMulti||this._header.type!==2)))return!0;let i=0,r=0,s,o=F;if((s=e)&&((s=!this._dec.end())?(o=de(this._dec.data8),(s=o.mime!=="unsupported")?(i=o.width,r=o.height,(s=i&&r&&i*r<this._opts.pixelLimit)?([i,r]=this._resize(i,r).map(Math.floor),s=i&&r&&i*r<this._opts.pixelLimit):console.warn(`IIP: image dimension issue ${o.width}x${o.height}`)):console.warn("IIP: unsupported image type")):console.warn("IIP: error during BASE64 decoding")),!s)return this._dec.release(),!0;let n;if(o.mime==="image/qoi"){let l;try{l=this._qoiDec.decode(this._dec.data8)}catch(d){return console.warn("IIP: could not decode QOI image",d),this._dec.release(),this._qoiDec.release(),!0}if(n=new ImageData(new Uint8ClampedArray(l.buffer,l.byteOffset,l.byteLength),this._qoiDec.width,this._qoiDec.height),this._qoiDec.release(),i===this._qoiDec.width&&r===this._qoiDec.height){this._dec.release();let d=b.createCanvas(void 0,this._qoiDec.width,this._qoiDec.height);return d.getContext("2d")?.putImageData(n,0,0),this._storage.addImage(d),!0}}else n=new Blob([this._dec.data8],{type:o.mime});this._dec.release();let a=this._generation;return createImageBitmap(n,{resizeWidth:i,resizeHeight:r}).then(l=>a!==this._generation?(l.close(),!0):(this._storage.addImage(l),!0)).catch(l=>(console.warn(`IIP: decoding error ${o.mime} ${o.width}x${o.height}`,l),!0))}_initDecoder(){try{return this._dec.init(),!0}catch(e){return console.warn("IIP: could not allocate decoder",e),this._dec.release(),!1}}_resize(e,t){let i=this._renderer.dimensions?.css.cell.width||D.width,r=this._renderer.dimensions?.css.cell.height||D.height,s=this._renderer.dimensions?.css.canvas.width||i*this._coreTerminal.cols,o=this._renderer.dimensions?.css.canvas.height||r*this._coreTerminal.rows,n=this._dim(this._header.width,s,i),a=this._dim(this._header.height,o,r);if(!n&&!a){let l=s/e,d=(o-r)/t,h=Math.min(l,d);return h<1?[e*h,t*h]:[e,t]}return n?this._header.preserveAspectRatio||!n||!a?[n,t*n/e]:[n,a]:[e*a/t,a]}_dim(e,t,i){return e==="auto"?0:e.endsWith("%")?parseInt(e.slice(0,-1),10)*t/100:e.endsWith("px")?parseInt(e.slice(0,-2),10):parseInt(e,10)*i}};var ot=k(Se());function Ge(A){let e={},t=A.split(",");for(let i of t){let r=i.indexOf("=");if(r===-1)continue;let s=i.substring(0,r),o=i.substring(r+1);if(s==="a"){e.action=o;continue}if(s==="o"){e.compression=o;continue}if(s==="t"){e.transmission=o;continue}if(s==="d"){e.deleteSelector=o;continue}let n=parseInt(o,10);switch(s){case"f":e.format=n;break;case"i":e.id=n;break;case"I":e.imageNumber=n;break;case"s":e.width=n;break;case"v":e.height=n;break;case"x":e.x=n;break;case"y":e.y=n;break;case"w":e.sourceWidth=n;break;case"h":e.sourceHeight=n;break;case"X":e.xOffset=n;break;case"Y":e.yOffset=n;break;case"c":e.columns=n;break;case"r":e.rows=n;break;case"m":e.more=n;break;case"q":e.quiet=n;break;case"C":e.cursorMovement=n;break;case"z":e.zIndex=n;break;case"p":e.placementId=n;break;case"U":e.unicodePlaceholder=n;break}}return e}var V=1109742,rt=[773,781,782,784,786,829,830,831,838,842,843,844,848,849,850,855,859,867,868,869,870,871,872,873,874,875,876,877,878,879,1155,1156,1157,1158,1159,1426,1427,1428,1429,1431,1432,1433,1436,1437,1438,1439,1440,1441,1448,1449,1451,1452,1455,1476,1552,1553,1554,1555,1556,1557,1558,1559,1623,1624,1625,1626,1627,1629,1630,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1764,1767,1768,1771,1772,1840,1842,1843,1845,1846,1850,1853,1855,1856,1857,1859,1861,1863,1865,1866,2027,2028,2029,2030,2031,2032,2033,2035,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2385,2387,2388,3970,3971,3974,3975,4957,4958,4959,6109,6458,6679,6773,6774,6775,6776,6777,6778,6779,6780,7019,7021,7022,7023,7024,7025,7026,7027,7376,7377,7378,7386,7387,7392,7616,7617,7619,7620,7621,7622,7623,7624,7625,7627,7628,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7678,8400,8401,8404,8405,8406,8407,8411,8412,8417,8423,8425,8432,11503,11504,11505,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,42607,42620,42621,42736,42737,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43696,43698,43699,43703,43704,43710,43711,43713,65056,65057,65058,65059,65060,65061,65062,68111,68152,119173,119174,119175,119176,119177,119210,119211,119212,119213,119362,119363,119364],st=new Map;for(let A=0;A<rt.length;++A)st.set(rt[A],A+1);function He(A){return A===void 0?0:st.get(A.codePointAt(0)??-1)??-1}function At(A){let[,e,t,i]=A;return{row:He(e),column:He(t),highByte:He(i)}}var nt=0,ce=class{constructor(e,t,i,r){this._opts=e;this._renderer=t;this._kittyStorage=i;this._coreTerminal=r;this._aborted=!1;this._generation=0;this._decodeError=!1;this._activeDecoder=null;this._inControlData=!0;this._controlData=new Uint32Array(512);this._controlLength=0;this._encodedSizeLimit=0;this._totalEncodedSize=0;this._parsedCommand=null;this._pendingTransmissions=new Map;this._maxEncodedBytes=Math.ceil(this._opts.kittySizeLimit*4/3),this._initialEncodedBytes=Math.min(4194304,this._maxEncodedBytes)}reset(){this._generation++,this._cleanupAllPending(),this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),this._kittyStorage.reset()}dispose(){this.reset()}_removePendingEntry(e){this._pendingTransmissions.delete(e),this._lastPendingKey===e&&(this._lastPendingKey=void 0)}_cleanupAllPending(){for(let e of this._pendingTransmissions.values())e.decoder.release();this._pendingTransmissions.clear(),this._lastPendingKey=void 0}start(){this._aborted=!1,this._decodeError=!1,this._inControlData=!0,this._controlLength=0,this._parsedCommand=null,this._encodedSizeLimit=this._maxEncodedBytes,this._totalEncodedSize=0,this._activeDecoder=null}put(e,t,i){if(!this._aborted)if(!this._inControlData)this._streamPayload(e,t,i);else{let r=i;for(let o=t;o<i;o++)if(e[o]===59){this._inControlData=!1,r=o;break}let s=r-t;if(this._controlLength+s>512){this._aborted=!0;return}if(this._controlData.set(e.subarray(t,r),this._controlLength),this._controlLength+=s,!this._inControlData){if(this._parsedCommand=Ge(this._parseControlDataString()),this._parsedCommand.id!==void 0&&this._parsedCommand.imageNumber!==void 0){this._sendResponse(this._parsedCommand.id,"EINVAL:cannot specify both i and I keys",this._parsedCommand.quiet??0),this._aborted=!0;return}if(this._parsedCommand.action==="d")return;let o=r+1;o<i&&this._streamPayload(e,o,i)}}}_streamPayload(e,t,i){if(this._aborted)return;let r=this._parsedCommand?.id??this._lastPendingKey??0,s=this._pendingTransmissions.get(r),o=s?.totalEncodedSize??0;if(this._totalEncodedSize+=i-t,o+this._totalEncodedSize>this._encodedSizeLimit){let a=this._activeDecoder??s?.decoder;a&&a.release(),this._activeDecoder=null,s&&this._removePendingEntry(r),this._aborted=!0;return}if(!this._decodeError){if(s?.decoder&&!this._activeDecoder&&(this._activeDecoder=s.decoder),!this._activeDecoder){let a=this._maxEncodedBytes+131072;if(a>this._opts.storageLimit*1e6){this._aborted=!0,this._parsedCommand?.id!==void 0&&this._sendResponse(this._parsedCommand.id,"ENOMEM:pending image budget exceeded",this._parsedCommand.quiet??0);return}let l=Math.max(1,Math.floor(this._opts.storageLimit*1e6/a));for(;this._pendingTransmissions.size>=l;){let h=this._pendingTransmissions.entries().next().value;if(!h)break;h[1].decoder.release(),this._removePendingEntry(h[0]),h[1].cmd.id!==void 0&&this._sendResponse(h[1].cmd.id,"ENOMEM:pending image budget exceeded",h[1].cmd.quiet??0)}let d=new ot.default(4194304,this._maxEncodedBytes,this._initialEncodedBytes);try{d.init()}catch(h){console.warn("KITTY: could not allocate decoder",h),this._aborted=!0,this._parsedCommand?.id!==void 0&&this._sendResponse(this._parsedCommand.id,"ENOMEM:could not allocate decoder",this._parsedCommand.quiet??0);return}this._activeDecoder=d}this._activeDecoder.put(e.subarray(t,i))!==nt&&(this._activeDecoder.release(),this._activeDecoder=null,this._decodeError=!0,s&&this._removePendingEntry(r))}}end(e){if(this._aborted||!e)return this._activeDecoder&&(this._activeDecoder.release(),this._activeDecoder=null),!0;if(this._inControlData)return this._handleNoPayloadCommand();let t=this._parsedCommand;if(t.action==="d")return this._handleDelete(t);let i=t.id??this._lastPendingKey??0,r=t.more===1,s=this._pendingTransmissions.get(i);if(r)return this._activeDecoder&&(s?(s.totalEncodedSize+=this._totalEncodedSize,s.decodeError=s.decodeError||this._decodeError):this._pendingTransmissions.set(i,{cmd:{...t},decoder:this._activeDecoder,totalEncodedSize:this._totalEncodedSize,decodeError:this._decodeError}),this._lastPendingKey=i,this._activeDecoder=null),!0;s&&(this._lastPendingKey=void 0);let o=this._decodeError,n=t,a=this._activeDecoder;s&&(n=s.cmd,a=s.decoder,o=o||s.decodeError,this._pendingTransmissions.delete(i));let l=new Uint8Array(0);a&&(a.end()!==nt&&(o=!0),l=a.data8),this._activeDecoder=null;let d=this._handleCommandWithBytesAndCmd(n,l,o);return a&&a.release(),d}_parseControlDataString(){let e="";for(let t=0;t<this._controlLength;t++)e+=String.fromCodePoint(this._controlData[t]);return e}_handleNoPayloadCommand(){let e=Ge(this._parseControlDataString());if(e.id!==void 0&&e.imageNumber!==void 0)return this._sendResponse(e.id,"EINVAL:cannot specify both i and I keys",e.quiet??0),!0;switch(e.action??"t"){case"d":return this._handleDelete(e);case"q":return this._sendResponse(e.id??0,"OK",e.quiet??0),!0;case"p":return this._handlePlacement(e);default:return e.id!==void 0&&this._sendResponse(e.id,"EINVAL:unsupported action",e.quiet??0),!0}}_handleCommandWithBytesAndCmd(e,t,i){switch(e.action??"t"){case"t":{let s=this._handleTransmit(e,t,i);return(e.transmission??"d")==="d"&&e.id!==void 0&&(i?this._sendResponse(e.id,"EINVAL:invalid base64 data",e.quiet??0):t.length>0&&this._sendResponse(e.id,"OK",e.quiet??0)),s}case"T":return this._handleTransmitDisplay(e,t,i);case"q":return this._handleQuery(e,t,i);case"p":return this._handlePlacement(e);default:return e.id!==void 0&&this._sendResponse(e.id,"EINVAL:unsupported action",e.quiet??0),!0}}_handlePlacement(e){if(e.id===void 0)return!0;let t=e.id,i=this._kittyStorage.getImage(t);return i?(e.unicodePlaceholder===1?this._placeVirtual(i,e):this._displayImage(i,e)).then(s=>(this._sendResponse(t,s?"OK":"EINVAL:image rendering failed",e.quiet??0,e.placementId),!0)):(this._sendResponse(t,"ENOENT:image not found",e.quiet??0,e.placementId),!0)}_handleTransmit(e,t,i,r=!1){return(e.transmission??"d")!=="d"?(e.id!==void 0&&this._sendResponse(e.id,"EINVAL:unsupported transmission medium",e.quiet??0),!0):(i||t.length===0||this._kittyStorage.storeImage(e.id,{data:new Blob([t]),width:e.width??0,height:e.height??0,format:e.format??32,compression:e.compression??""},r),!0)}_handleTransmitDisplay(e,t,i){if(i)return e.id!==void 0&&this._sendResponse(e.id,"EINVAL:invalid base64 data",e.quiet??0),!0;let r=e.unicodePlaceholder===1;this._handleTransmit(e,t,i,r);let s=e.id??this._kittyStorage.lastImageId,o=this._kittyStorage.getImage(s);if(o){let n=r?this._placeVirtual(o,e,!0):this._displayImage(o,e);return e.id!==void 0?n.then(a=>(this._sendResponse(s,a?"OK":"EINVAL:image rendering failed",e.quiet??0),!0)):n.then(()=>!0)}return!0}_handleQuery(e,t,i){let r=e.id??0,s=e.quiet??0;if((e.transmission??"d")!=="d")return this._sendResponse(r,"EINVAL:unsupported transmission medium",s),!0;if(i)return this._sendResponse(r,"EINVAL:invalid base64 data",s),!0;if(t.length===0)return this._sendResponse(r,"OK",s),!0;let n=e.format??32;if(n===100)this._sendResponse(r,"OK",s);else{let a=e.width??0,l=e.height??0;if(!a||!l)return this._sendResponse(r,"EINVAL:width and height required for raw pixel data",s),!0;let d=n===32?4:3,h=a*l*d;if(t.length<h)return this._sendResponse(r,"EINVAL:insufficient pixel data",s),!0;this._sendResponse(r,"OK",s)}return!0}_handleDelete(e){let t=e.deleteSelector??"a";switch(t){case"a":this._kittyStorage.deletePhysicalPlacements();break;case"A":this._cleanupAllPending(),this._kittyStorage.deleteAll(!0);break;case"i":case"I":e.id!==void 0&&(t==="I"?(this._pendingTransmissions.get(e.id)?.decoder.release(),this._removePendingEntry(e.id),this._kittyStorage.deleteById(e.id,e.placementId)):this._kittyStorage.deletePlacementsById(e.id,e.placementId));break;default:break}return!0}_sendResponse(e,t,i,r){let s=t==="OK";if(s&&i>=1||!s&&i>=2)return;let o=r?`,p=${r}`:"",n=`\x1B_Gi=${e}${o};${t}\x1B\\`;this._coreTerminal._core.coreService.triggerDataEvent(n)}_displayImage(e,t){return this._decodeAndDisplay(e,t).then(()=>!0).catch(()=>!1)}async _decodeAndDisplay(e,t){let i=this._generation,r=await this._createBitmap(e);try{if(i!==this._generation)throw new Error("image decode canceled");let s=this._cropImage(r,t);r=s instanceof Promise?await s:s;let o=this._renderer.dimensions?.css.cell.width||D.width,n=this._renderer.dimensions?.css.cell.height||D.height,{cols:a,rows:l}=this._placementGrid(r,t,o,n),d=r.width,h=r.height;if((t.columns!==void 0||t.rows!==void 0)&&(d=Math.round(a*o),h=Math.round(l*n)),d*h>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");let c=this._coreTerminal._core.buffer,g=c.x,I=c.y,p=c.ybase,u=t.zIndex!==void 0&&t.zIndex<0?"bottom":"top";if(d!==r.width||h!==r.height){let x=await createImageBitmap(r,{resizeWidth:d,resizeHeight:h});r.close(),r=x}let f=Math.min(Math.max(0,t.xOffset??0),o-1),C=Math.min(Math.max(0,t.yOffset??0),n-1);if(f!==0||C!==0){let x=t.columns!==void 0?Math.round(a*o):r.width+f,w=t.rows!==void 0?Math.round(l*n):r.height+C,y=b.createCanvas(window.document,x,w),S=y.getContext("2d");if(!S)throw new Error("Failed to create offset canvas context");S.drawImage(r,f,C);let L=await createImageBitmap(y);if(y.width=y.height=0,r.close(),r=L,d=r.width,h=r.height,d*h>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");t.columns===void 0&&(a=Math.ceil(r.width/o)),t.rows===void 0&&(l=Math.ceil(r.height/n))}if(i!==this._generation)throw new Error("image decode canceled");let N=t.zIndex??0;if(this._kittyStorage.addImage(e.id,r,!0,u,N),r=void 0,t.cursorMovement===1){let x=c.ybase-p;c.x=g,c.y=Math.max(I-x,0)}else c.x=Math.min(g+a,this._coreTerminal.cols)}catch(s){throw r?.close(),s}}_cropImage(e,t){let i=Math.max(0,t.x??0),r=Math.max(0,t.y??0),s=t.sourceWidth||e.width-i,o=t.sourceHeight||e.height-r,n=Math.max(0,e.width-i),a=Math.max(0,e.height-r),l=Math.max(0,Math.min(s,n)),d=Math.max(0,Math.min(o,a));if(l===0||d===0)throw new Error("invalid source rectangle");return i!==0||r!==0||l!==e.width||d!==e.height?createImageBitmap(e,i,r,l,d).then(h=>(e.close(),h)):e}_placementGrid(e,t,i,r){return t.columns!==void 0&&t.rows!==void 0?{cols:t.columns,rows:t.rows}:t.columns!==void 0?{cols:t.columns,rows:Math.max(1,Math.ceil(e.height/e.width*(t.columns*i)/r))}:t.rows!==void 0?{cols:Math.max(1,Math.ceil(e.width/e.height*(t.rows*r)/i)),rows:t.rows}:{cols:Math.ceil(e.width/i),rows:Math.ceil(e.height/r)}}async _placeVirtual(e,t,i=!1){let r=this._generation,s=()=>r===this._generation&&this._kittyStorage.getImage(e.id)===e,o;try{if(o=await this._createBitmap(e),!s())throw new Error("image decode canceled");let n=this._cropImage(o,t);o=n instanceof Promise?await n:n;let a=this._renderer.dimensions?.css.cell.width||D.width,l=this._renderer.dimensions?.css.cell.height||D.height,{cols:d,rows:h}=this._placementGrid(o,t,a,l);if(o.width*o.height>this._opts.pixelLimit)throw new Error("image exceeds pixel limit");if(!s())throw new Error("image decode canceled");return this._kittyStorage.addVirtualPlacement(e.id,t.placementId??0,o,d,h),o=void 0,i&&this._kittyStorage.discardVirtualPlacements(e.id,t.placementId??0),!0}catch{return o?.close(),i&&s()&&this._kittyStorage.discardVirtualPlacements(e.id),!1}}async _createBitmap(e){let t=new Uint8Array(await e.data.arrayBuffer());if(e.compression==="z"&&(t=await this._decompressZlib(t)),e.format===100){let E=de(t);if(E.mime!=="image/png"||!(E.width>0)||!(E.height>0)||E.width*E.height>this._opts.pixelLimit)throw new RangeError("PNG exceeds pixel limit or has invalid dimensions");let u=new Blob([t],{type:"image/png"});if(!window.createImageBitmap){let f=URL.createObjectURL(u),C=new Image;return new Promise((N,x)=>{C.addEventListener("load",()=>{URL.revokeObjectURL(f);let w=b.createCanvas(window.document,C.width,C.height);w.getContext("2d")?.drawImage(C,0,0),createImageBitmap(w).then(N).catch(x)}),C.addEventListener("error",()=>{URL.revokeObjectURL(f),x(new Error("Failed to load image"))}),C.src=f})}return createImageBitmap(u)}let i=e.width,r=e.height;if(!i||!r)throw new Error("Width and height required for raw pixel data");let s=e.format===32?4:3,o=i*r*s;if(t.length<o)throw new Error("Insufficient pixel data");let n=i*r;if(e.format===32)return createImageBitmap(new ImageData(new Uint8ClampedArray(t.buffer,t.byteOffset,n*4),i,r));let a=new Uint8ClampedArray(n*4),l=new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),d=new Uint32Array(a.buffer),h=n&-4,c=0,g=0;for(let E=0;E<h;E+=4){let u=l[c++],f=l[c++],C=l[c++];d[g++]=4278190080|u,d[g++]=4278190080|u>>>24|f<<8,d[g++]=4278190080|f>>>16|C<<16,d[g++]=4278190080|C>>>8}let I=h*3,p=h*4;for(let E=h;E<n;E++)a[p]=t[I],a[p+1]=t[I+1],a[p+2]=t[I+2],a[p+3]=255,I+=3,p+=4;return createImageBitmap(new ImageData(a,i,r))}async _decompressZlib(e){try{return await this._decompress(e,"deflate")}catch(t){if(t instanceof RangeError)throw t;return await this._decompress(e,"deflate-raw")}}async _decompress(e,t){let i=Math.min(this._opts.kittySizeLimit,this._opts.pixelLimit*4,this._opts.storageLimit*1e6),r=0,o=new ReadableStream({pull(h){if(r>=e.length){h.close();return}let c=Math.min(r+4096,e.length);h.enqueue(new Uint8Array(e.subarray(r,c))),r=c}}).pipeThrough(new DecompressionStream(t)).getReader(),n=[],a=0;try{for(;;){let{done:h,value:c}=await o.read();if(h)break;if(a+=c.byteLength,a>i)throw await o.cancel().catch(()=>{}),new RangeError("decompressed image exceeds byte limit");n.push(c)}}finally{o.releaseLock()}let l=new Uint8Array(a),d=0;for(let h of n)l.set(h,d),d+=h.length;return l}get images(){return this._kittyStorage.images}get _kittyIdToStorageId(){return this._kittyStorage.kittyIdToStorageId}get pendingTransmissions(){return this._pendingTransmissions}};var z=class z{constructor(e,t){this._storage=e;this._renderer=t;this._nextImageId=1;this._images=new Map;this._kittyIdToStorageId=new Map;this._storageIdToKittyId=new Map;this._virtualPlacements=new Map;this._virtualStorageIds=new Map;this._handleStorageImageDeleted=e=>{let t=this._virtualStorageIds.get(e);if(t){this._virtualStorageIds.delete(e);let r=this._virtualPlacements.get(t.kittyId);r?.delete(t.placementId),r?.size||this._virtualPlacements.delete(t.kittyId)}let i=this._storageIdToKittyId.get(e);i!==void 0&&(this._kittyIdToStorageId.delete(i),this._storageIdToKittyId.delete(e))};this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"};this._renderPlaceholderLine=(e,t,i)=>{if(this._virtualPlacements.size===0)return;let r=0,s;for(let o=0;o<=i;++o){let n=o<i?this._placeholderCell(e,o):void 0;r>0&&n!==void 0&&s!==void 0&&n.imageId===s.imageId&&n.placementId===s.placementId&&(n.location.row===0||n.location.row===s.location.row)&&(n.location.column===0||n.location.column===s.location.column+1)&&(n.location.highByte===0||n.location.highByte===s.location.highByte)?(r++,n.location.row=Math.max(s.location.row,1),n.location.column=s.location.column+1,n.location.highByte=Math.max(s.location.highByte,1)):(r>0&&s!==void 0&&this._drawPlaceholderRun(s,o-r,r,t),r=0,n!==void 0&&(r=1,n.location.row||(n.location.row=1),n.location.column||(n.location.column=1),n.location.highByte||(n.location.highByte=1))),s=n??s}};this._previousOnImageDeleted=this._storage.onImageDeleted,this._wrappedOnImageDeleted=i=>{this._previousOnImageDeleted?.(i),this._handleStorageImageDeleted(i)},this._storage.onImageDeleted=this._wrappedOnImageDeleted,this._storage.onRenderLine=this._renderPlaceholderLine}hidePlaceholderGlyphs(e){let t=e._core.buffer,i,r=e.buffer.active.viewportY;for(let s=r;s<r+e.rows;++s){let o=t.lines.get(s);if(o)for(let n=0;n<e.cols;++n)o.getFg(n)&1073741824||o.getCodePoint(n)!==V&&(!o.isCombined(n)||o.getString(n).codePointAt(0)!==V)||(i??=new J,o.loadCell(n,i),i.fg|=1073741824,o.setCell(n,i))}}reset(){this._nextImageId=1,this._images.clear(),this._kittyIdToStorageId.clear(),this._storageIdToKittyId.clear(),this._virtualPlacements.clear(),this._virtualStorageIds.clear()}dispose(){this.reset(),this._storage.onImageDeleted===this._wrappedOnImageDeleted&&(this._storage.onImageDeleted=this._previousOnImageDeleted),this._storage.onRenderLine===this._renderPlaceholderLine&&(this._storage.onRenderLine=void 0)}storeImage(e,t,i=!1){let r=e??this._nextImageId++;i||this._deleteVirtualPlacements(r);let s=this._kittyIdToStorageId.get(r);s!==void 0&&(this._storage.deleteImage(s),this._kittyIdToStorageId.delete(r),this._storageIdToKittyId.delete(s)),!this._images.has(r)&&this._images.size>=z._maxStoredImages&&this._evictUndisplayedImages();let o=this._storage.getLimit()*1e6;this._images.delete(r);let n=0;for(let a of this._images.values())n+=a.data.size;for(let a of[!1,!0])for(let[l,d]of this._images){if(n+t.data.size<=o)break;(this._kittyIdToStorageId.has(l)||this._virtualPlacements.has(l))===a&&(n-=d.data.size,this.deleteById(l))}return this._images.set(r,{...t,id:r}),r}addImage(e,t,i,r,s){let o=this._kittyIdToStorageId.get(e);o!==void 0&&this._storageIdToKittyId.delete(o),this._addImageOpts.scrolling=i,this._addImageOpts.layer=r,this._addImageOpts.zIndex=s;let n=this._storage.addImage(t,this._addImageOpts);this._kittyIdToStorageId.set(e,n),this._storageIdToKittyId.set(n,e)}getImage(e){return this._images.get(e)}addVirtualPlacement(e,t,i,r,s){let o=this._virtualPlacements.get(e)?.get(t);if(i.width*i.height*4>this._storage.getLimit()*1e6)throw new Error("virtual image exceeds storage limit");if(!o&&this._virtualStorageIds.size>=z._maxStoredImages)throw new Error("virtual placement limit exceeded");o&&this._storage.deleteImage(o.storageId);let n=this._storage.addUnplacedImage(i,{scrolling:!1,layer:"top",zIndex:0,cursorPos:"iip"}),a=this._virtualPlacements.get(e);a||(a=new Map,this._virtualPlacements.set(e,a)),a.set(t,{placementId:t,storageId:n,cols:r,rows:s}),this._virtualStorageIds.set(n,{kittyId:e,placementId:t}),this._renderer.refreshAll()}_virtualPlacementFor(e,t){let i=this._virtualPlacements.get(e);return t===0?i?.values().next().value:i?.get(t)}discardVirtualPlacements(e,t){this._deleteVirtualPlacements(e,void 0,t)}_deleteVirtualPlacements(e,t,i){let r=this._virtualPlacements.get(e);if(r)for(let s of[...r.values()])(t===void 0||t===s.placementId)&&s.placementId!==i&&this._storage.deleteImage(s.storageId)}deletePlacementsById(e,t){if(this._deleteVirtualPlacements(e,t),t!==void 0)return;let i=this._kittyIdToStorageId.get(e);i!==void 0&&(this._kittyIdToStorageId.delete(e),this._storageIdToKittyId.delete(i),this._storage.deleteImage(i))}deleteById(e,t){this.deletePlacementsById(e,t),!this._virtualPlacements.has(e)&&!this._kittyIdToStorageId.has(e)&&this._images.delete(e)}deletePhysicalPlacements(){for(let[e,t]of[...this._kittyIdToStorageId])this._kittyIdToStorageId.delete(e),this._storageIdToKittyId.delete(t),this._storage.deleteImage(t)}deleteAll(e=!1){e&&this.deletePhysicalPlacements();for(let t of[...this._images.keys()])(!e||!this._virtualPlacements.has(t))&&this.deleteById(t)}get images(){return this._images}get kittyIdToStorageId(){return this._kittyIdToStorageId}get lastImageId(){return this._nextImageId-1}_evictUndisplayedImages(){for(let[e]of this._images){if(this._images.size<=z._maxStoredImages/2)break;!this._kittyIdToStorageId.has(e)&&!this._virtualPlacements.has(e)&&(this._images.delete(e),this._virtualPlacements.delete(e))}}_placeholderCell(e,t){if(!e.isCombined(t)&&e.getCodePoint(t)!==V)return;let i=e.getString(t);if(i.codePointAt(0)!==V)return;let r=e.getFg(t),s=r&50331648,o=s===50331648?r&16777215:s===0?0:r&255;if(s===0)return;let n=0,a=e.getExtended(t)?.underlineColor??0;if(a>0){let d=a&50331648;n=d===50331648?a&16777215:d===0?0:a&255}let l=At(i);if(!(l.row<0||l.column<0||l.highByte<0||l.highByte>256))return{imageId:o,placementId:n,location:l}}_drawPlaceholderRun(e,t,i,r){let s=(e.imageId|e.location.highByte-1<<24)>>>0,o=this._virtualPlacementFor(s,e.placementId),n=o&&this._storage.getImageSpec(o.storageId),a=e.location.row-1,l=e.location.column-i;if(!o||!n||a<0||a>=o.rows||l<0)return;let d=Math.min(i,o.cols-l);d<=0||this._renderer.drawCellImage(n,o.cols,o.rows,a,l,d,t,r)}};z._maxStoredImages=256;var ge=z;var T=k(Ae());var Ce=k(dt()),ht=k(Pe());var zt=4194304,te=T.PALETTE_ANSI_256;te.set(T.PALETTE_VT340_COLOR);var qt=2,Je=new Map,Oe=!1;function Wt(A){Oe||(Oe=!0,(0,Ce.DecoderAsync)({memoryLimit:A,palette:te}).then(e=>ct(e,A),()=>{Oe=!1}))}function Xt(A){return Je.get(A)?.pop()??new Ce.Decoder({memoryLimit:A,palette:te})}function ct(A,e){A.memoryUsage>zt&&A.release();let t=Je.get(e)??[];t.length<qt&&(t.push(A),Je.set(e,t))}var _e=class{constructor(e,t,i){this._opts=e;this._storage=t;this._coreTerminal=i;this._size=0;this._aborted=!1;this._decMemoryLimit=0;this._palette=new Uint32Array(ht.LIMITS.PALETTE_SIZE);this._palette.set(te),Wt(this._opts.pixelLimit*4)}reset(){this._returnDecoder(),this._palette.fill(0),this._palette.set(te)}hook(e){this._size=0,this._aborted=!1,this._returnDecoder();let t=this._opts.pixelLimit*4;try{this._dec=Xt(t)}catch(r){console.warn(`SIXEL: could not allocate decoder - ${r}`),this._aborted=!0;return}this._decMemoryLimit=t;let i=e.params[1]===1?0:Zt(this._coreTerminal._core._inputHandler._curAttrData,this._coreTerminal._core._themeService?.colors);this._dec.init(i,this._palette,this._opts.sixelPaletteLimit)}_returnDecoder(){let e=this._dec;e&&(this._dec=void 0,this._palette.set(e.palette),ct(e,this._decMemoryLimit))}put(e,t,i){if(!(this._aborted||!this._dec)){if(this._size+=i-t,this._size>this._opts.sixelSizeLimit){console.warn("SIXEL: too much data, aborting"),this._aborted=!0,this._dec.release();return}try{this._dec.decode(e,t,i)}catch(r){console.warn(`SIXEL: error while decoding image - ${r}`),this._aborted=!0,this._dec.release()}}}unhook(e){try{return this._unhook(e)}finally{this._returnDecoder()}}_unhook(e){if(this._aborted||!e||!this._dec)return!0;let t=this._dec.width,i=this._dec.height;if(!t||!i)return i&&this._storage.advanceCursor(i),!0;let r=b.createCanvas(void 0,t,i);return r.getContext("2d")?.putImageData(new ImageData(this._dec.data8,t,i),0,0),this._storage.addImage(r),!0}};function Zt(A,e){let t=0;if(!e)return t;if(A.isInverse())if(A.isFgDefault())t=me(e.foreground.rgba);else if(A.isFgRGB()){let i=A.constructor.toColorRGB(A.getFgColor());t=(0,T.toRGBA8888)(...i)}else t=me(e.ansi[A.getFgColor()].rgba);else if(A.isBgDefault())t=me(e.background.rgba);else if(A.isBgRGB()){let i=A.constructor.toColorRGB(A.getBgColor());t=(0,T.toRGBA8888)(...i)}else t=me(e.ansi[A.getBgColor()].rgba);return t}function me(A){return T.BIG_ENDIAN?A:(A&255)<<24|(A>>>8&255)<<16|(A>>>16&255)<<8|A>>>24&255}var pe=class{constructor(e,t,i,r){this._storage=e;this._opts=t;this._renderer=i;this._terminal=r;this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"vt340"}}addImage(e){this._addImageOpts.scrolling=this._opts.sixelScrolling,this._storage.addImage(e,this._addImageOpts)}advanceCursor(e){if(this._opts.sixelScrolling){let t=this._renderer.cellSize;(t.width===-1||t.height===-1)&&(t=D);let i=Math.ceil(e/t.height);for(let r=1;r<i;++r)this._terminal._core._inputHandler.lineFeed()}}};var Ee=class{constructor(e){this._storage=e;this._addImageOpts={scrolling:!0,layer:"top",zIndex:0,cursorPos:"iip"}}addImage(e){this._storage.addImage(e,this._addImageOpts)}};var gt={enableSizeReports:!0,pixelLimit:16777216,sixelSupport:!0,sixelScrolling:!0,sixelPaletteLimit:4096,sixelSizeLimit:33554432,storageLimit:128,showPlaceholder:!0,iipSupport:!0,iipSizeLimit:33554432,kittySupport:!0,kittySizeLimit:33554432},It=4096;var ut=class{constructor(e){this._disposables=[];this._handlers=new Map;this._onImageAdded=new re;this.onImageAdded=this._onImageAdded.event;this._opts=Object.assign({},gt,e),this._defaultOpts=Object.assign({},gt,e)}dispose(){for(let e of this._handlers.values())e.reset();for(let e of this._disposables)e.dispose();this._disposables.length=0,this._handlers.clear(),this._onImageAdded.dispose()}_disposeLater(...e){for(let t of e)this._disposables.push(t)}activate(e){if(this._terminal=e,this._renderer=new b(e),this._storage=new oe(e,this._renderer,this._opts),this._storage.onImageAdded=()=>this._onImageAdded.fire(),this._opts.enableSizeReports){let t=e.options.windowOptions??{};t.getWinSizePixels=!0,t.getCellSizePixels=!0,t.getWinSizeChars=!0,e.options.windowOptions=t}if(this._disposeLater(this._renderer,this._storage,e.parser.registerCsiHandler({prefix:"?",final:"h"},t=>this._decset(t)),e.parser.registerCsiHandler({prefix:"?",final:"l"},t=>this._decrst(t)),e.parser.registerCsiHandler({final:"c"},t=>this._da1(t)),e.parser.registerCsiHandler({prefix:"?",final:"S"},t=>this._xtermGraphicsAttributes(t)),e.onRender(t=>this._storage?.render(t)),e.parser.registerCsiHandler({intermediates:"!",final:"p"},()=>this.reset()),e.parser.registerEscHandler({final:"c"},()=>this.reset()),e._core._inputHandler.onRequestReset(()=>this.reset()),e.buffer.onBufferChange(()=>this._storage?.wipeAlternate()),e.onResize(t=>this._storage?.viewportResize(t))),this._opts.sixelSupport){let t=new pe(this._storage,this._opts,this._renderer,e),i=new _e(this._opts,t,e);this._handlers.set("sixel",i),this._disposeLater(e._core._inputHandler._parser.registerDcsHandler({final:"q"},i))}if(this._opts.iipSupport){let t=new Ee(this._storage),i=new he(this._opts,this._renderer,t,e);this._handlers.set("iip",i),this._disposeLater(e._core._inputHandler._parser.registerOscHandler(1337,i))}if(this._opts.kittySupport){let t=new ge(this._storage,this._renderer),i=new ce(this._opts,this._renderer,t,e);this._handlers.set("kitty",i);let r=new se,s=()=>t.hidePlaceholderGlyphs(e);this._disposeLater(t,i,r,e.onWriteParsed(()=>{r.cancel(),s()}),e.onScroll(()=>r.set(s)),e.onResize(s),e._core._inputHandler._parser.registerApcHandler({final:"G"},i)),s()}}reset(){this._opts.sixelScrolling=this._defaultOpts.sixelScrolling,this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,this._storage?.reset();for(let e of this._handlers.values())e.reset();return!1}get storageLimit(){return this._storage?.getLimit()||-1}set storageLimit(e){this._storage?.setLimit(e),this._opts.storageLimit=e}get storageUsage(){return this._storage?this._storage.getUsage():-1}get showPlaceholder(){return this._opts.showPlaceholder}set showPlaceholder(e){this._opts.showPlaceholder=e,this._renderer?.showPlaceholder(e)}getImageAtBufferCell(e,t){return this._storage?.getImageAtBufferCell(e,t)}extractTileAtBufferCell(e,t){return this._storage?.extractTileAtBufferCell(e,t)}_report(e){this._terminal?._core.input(e,!1)}_decset(e){for(let t=0;t<e.length;++t)e[t]===80&&(this._opts.sixelScrolling=!1);return!1}_decrst(e){for(let t=0;t<e.length;++t)e[t]===80&&(this._opts.sixelScrolling=!0);return!1}_da1(e){return e[0]?!0:this._opts.sixelSupport?(this._report("\x1B[?62;4;9;22c"),!0):!1}_xtermGraphicsAttributes(e){if(e.length<2)return!0;if(e[0]===1)switch(e[1]){case 1:return this._report(`\x1B[?${e[0]};0;${this._opts.sixelPaletteLimit}S`),!0;case 2:this._opts.sixelPaletteLimit=this._defaultOpts.sixelPaletteLimit,this._report(`\x1B[?${e[0]};0;${this._opts.sixelPaletteLimit}S`);for(let t of this._handlers.values())t.reset();return!0;case 3:return e.length>2&&!(e[2]instanceof Array)&&e[2]<=It?(this._opts.sixelPaletteLimit=e[2],this._report(`\x1B[?${e[0]};0;${this._opts.sixelPaletteLimit}S`)):this._report(`\x1B[?${e[0]};2S`),!0;case 4:return this._report(`\x1B[?${e[0]};0;${It}S`),!0;default:return this._report(`\x1B[?${e[0]};2S`),!0}if(e[0]===2)switch(e[1]){case 1:let t=this._renderer?.dimensions?.css.canvas.width,i=this._renderer?.dimensions?.css.canvas.height;if(!t||!i){let s=D;t=(this._terminal?.cols||80)*s.width,i=(this._terminal?.rows||24)*s.height}if(t*i<this._opts.pixelLimit)this._report(`\x1B[?${e[0]};0;${t.toFixed(0)};${i.toFixed(0)}S`);else{let s=Math.floor(Math.sqrt(this._opts.pixelLimit));this._report(`\x1B[?${e[0]};0;${s};${s}S`)}return!0;case 4:let r=Math.floor(Math.sqrt(this._opts.pixelLimit));return this._report(`\x1B[?${e[0]};0;${r};${r}S`),!0;default:return this._report(`\x1B[?${e[0]};2S`),!0}return this._report(`\x1B[?${e[0]};1S`),!0}};export{ut as ImageAddon};
|
||
//# sourceMappingURL=addon-image.mjs.map
|
||
diff --git a/lib/addon-image.mjs.map b/lib/addon-image.mjs.map
|
||
index d7f129cec347ebb4e0cba04ccb4e5b505c965b17..9114641f3690cf6897d2490e3b6934a9fdddf6d7 100644
|
||
--- a/lib/addon-image.mjs.map
|
||
+++ b/lib/addon-image.mjs.map
|
||
@@ -1,7 +1,7 @@
|
||
{
|
||
"version": 3,
|
||
- "sources": ["../../../node_modules/sixel/src/Colors.ts", "../../../node_modules/inwasm-runtime/lib/index.cjs", "../../../node_modules/xterm-wasm-parts/lib/base64/Base64Decoder.wasm.js", "../../../node_modules/xterm-wasm-parts/lib/qoi/QoiDecoder.wasm.js", "../../../node_modules/sixel/src/wasm.ts", "../../../node_modules/sixel/src/Decoder.ts", "../../../src/common/Lifecycle.ts", "../../../src/common/Event.ts", "../src/ImageRenderer.ts", "../../../src/common/input/TextDecoder.ts", "../../../src/common/buffer/AttributeData.ts", "../../../src/common/buffer/CellData.ts", "../src/ImageStorage.ts", "../src/IIPHandler.ts", "../src/IIPHeaderParser.ts", "../src/IIPMetrics.ts", "../src/kitty/KittyGraphicsHandler.ts", "../src/kitty/KittyGraphicsTypes.ts", "../src/kitty/KittyImageStorage.ts", "../src/SixelHandler.ts", "../src/SixelImageStorage.ts", "../src/IIPImageStorage.ts", "../src/ImageAddon.ts"],
|
||
- "sourcesContent": [null, "\"use strict\";\n/**\n * Copyright (c) 2022, 2026 Joerg Breitbart\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InWasm = InWasm;\nlet z = (s) => {\n if (Uint8Array.fromBase64)\n return Uint8Array.fromBase64(s);\n if (typeof Buffer !== 'undefined')\n return Buffer.from(s, 'base64');\n const b = atob(s);\n const r = new Uint8Array(b.length);\n for (let i = 0; i < r.length; ++i)\n r[i] = b.charCodeAt(i);\n return r;\n};\nfunction InWasm(def) {\n if (def.d) {\n const { t, s, d } = def;\n let b;\n let m;\n const W = WebAssembly;\n if (t === 0 /* OutputType.INSTANCE */) {\n if (s)\n return (e) => new W.Instance(m || (m = new W.Module(b || (b = z(d)))), e);\n return (e) => m\n ? W.instantiate(m, e)\n : W.instantiate(b || (b = z(d)), e).then(r => (m = r.module) && r.instance);\n }\n if (t === 1 /* OutputType.MODULE */) {\n if (s)\n return () => m || (m = new W.Module(b || (b = z(d))));\n return () => m\n ? Promise.resolve(m)\n : W.compile(b || (b = z(d))).then(r => m = r);\n }\n if (s)\n return () => b || (b = z(d));\n return () => Promise.resolve(b || (b = z(d)));\n }\n if (typeof _wasmCtx === 'undefined')\n throw new Error('must run \"inwasm\"');\n _wasmCtx.add(def);\n}\n//# sourceMappingURL=index.js.map", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023, 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\n/**\n * wasm base64 decoder.\n */\nconst wasmDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#828e69684093b2c6:rdef-start:\"decode\"*/{s:1,t:0,d:'AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML'}/*inwasm#828e69684093b2c6:rdef-end:\"decode\"*/);\n// SIMD version (speedup ~1.4x, not covered by tests yet)\n/*\nconst wasmDecode = InWasm({\n name: 'decode',\n type: OutputType.INSTANCE,\n mode: OutputMode.SYNC,\n srctype: 'Clang-C',\n imports: {\n env: { memory: new WebAssembly.Memory({ initial: 1 }) }\n },\n exports: {\n dec: () => 0,\n end: () => 0\n },\n compile: {\n switches: ['-msimd128', '-Wl,-z,stack-size=0', '-Wl,--stack-first']\n },\n code: `\n #include <wasm_simd128.h>\n typedef struct {\n unsigned int wp;\n unsigned int sp;\n unsigned int dp;\n unsigned int e_size;\n unsigned int dummy[4];\n unsigned char data[0];\n } State;\n\n unsigned int *D0 = (unsigned int *) ${P32.D0 * 4};\n unsigned int *D1 = (unsigned int *) ${P32.D1 * 4};\n unsigned int *D2 = (unsigned int *) ${P32.D2 * 4};\n unsigned int *D3 = (unsigned int *) ${P32.D3 * 4};\n State *state = (State *) ${P32.STATE * 4};\n\n #define packed_byte(x) wasm_i8x16_splat((char) x)\n #define packed_dword(x) wasm_i32x4_splat(x)\n #define masked(x, mask) wasm_v128_and(x, wasm_i32x4_splat(mask))\n\n __attribute__((noinline)) int dec() {\n unsigned int nsp = (state->wp - 1) & ~3;\n unsigned char *src = state->data + state->sp;\n unsigned char *end = state->data + nsp;\n unsigned char *dst = state->data + state->dp;\n unsigned int error = 0;\n\n v128_t err = wasm_i8x16_splat(0);\n unsigned char *end16 = state->data + (nsp & ~15);\n while (src < end16) {\n v128_t data = wasm_v128_load((v128_t *) src);\n\n // wasm-simd rewrite of http://0x80.pl/notesen/2016-01-17-sse-base64-decoding.html#vector-lookup-pshufb\n const v128_t higher_nibble = wasm_u32x4_shr(data, 4) & packed_byte(0x0f);\n const char linv = 1;\n const char hinv = 0;\n\n const v128_t lower_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n linv, linv, 0x2b, 0x30,\n 0x41, 0x50, 0x61, 0x70,\n linv, linv, linv, linv,\n linv, linv, linv, linv\n );\n const v128_t upper_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n hinv, hinv, 0x2b, 0x39,\n 0x4f, 0x5a, 0x6f, 0x7a,\n hinv, hinv, hinv, hinv,\n hinv, hinv, hinv, hinv\n );\n // the difference between the shift and lower bound\n const v128_t shift_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n 0x00, 0x00, 0x3e - 0x2b, 0x34 - 0x30,\n 0x00 - 0x41, 0x0f - 0x50, 0x1a - 0x61, 0x29 - 0x70,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00\n );\n\n const v128_t upper_bound = wasm_i8x16_swizzle(upper_bound_LUT, higher_nibble);\n const v128_t lower_bound = wasm_i8x16_swizzle(lower_bound_LUT, higher_nibble);\n\n const v128_t below = wasm_i8x16_lt(data, lower_bound);\n const v128_t above = wasm_i8x16_gt(data, upper_bound);\n const v128_t eq_2f = wasm_i8x16_eq(data, packed_byte(0x2f));\n\n // in_range = not (below or above) or eq_2f\n // outside = not in_range = below or above and not eq_2f (from deMorgan law)\n const v128_t outside = wasm_v128_andnot(eq_2f, above | below);\n err = wasm_v128_or(err, outside);\n\n const v128_t shift = wasm_i8x16_swizzle(shift_LUT, higher_nibble);\n const v128_t t0 = wasm_i8x16_add(data, shift);\n v128_t v = wasm_i8x16_add(t0, wasm_v128_and(eq_2f, packed_byte(-3)));\n\n // pack bytes\n const v128_t ca = masked(v, 0x003f003f);\n const v128_t db = masked(v, 0x3f003f00);\n const v128_t t00 = wasm_v128_or(wasm_u32x4_shr(db, 8), wasm_i32x4_shl(ca, 6));\n v128_t res = wasm_v128_or(wasm_u32x4_shr(t00, 16), wasm_i32x4_shl(t00, 12));\n res = wasm_i8x16_swizzle(res, wasm_i8x16_const(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 16, 16, 16, 16));\n\n wasm_v128_store((v128_t *) dst, res);\n dst += 12;\n src += 16;\n }\n //if (wasm_i8x16_bitmask(err) != 0) return -1;\n if (wasm_v128_any_true(err)) return -1;\n\n // operate on 4-byte blocks\n while (src < end) {\n error |= *((unsigned int *) dst) = D0[src[0]] | D1[src[1]] | D2[src[2]] | D3[src[3]];\n dst += 3;\n src += 4;\n }\n if (error >> 24) return -1;\n state->sp = nsp;\n state->dp = dst - state->data;\n return 0;\n }\n\n int end() {\n int rem = state->wp - state->sp;\n if (rem > 4 && dec()) return -1;\n rem = state->wp - state->sp;\n if (rem < 2) return -1;\n\n unsigned char *src = state->data + state->sp;\n if (rem == 4) {\n if (src[3] == 61) rem--;\n if (src[2] == 61) rem--;\n }\n unsigned int accu = D0[src[0]] | D1[src[1]];\n int dp = 1;\n if (rem > 2) {\n accu |= D2[src[2]];\n dp++;\n if (rem == 4) {\n accu |= D3[src[3]];\n dp++;\n }\n }\n if (accu >> 24) return -1;\n *((unsigned int *) (state->data + state->dp)) = accu;\n state->dp += dp;\n return 0;\n }\n `\n});\n*/\n// base64 map\nconst MAP = new Uint8Array('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n .split('')\n .map(el => el.charCodeAt(0)));\n// init decoder maps in LE order\nconst D = new Uint32Array(1024);\nD.fill(0xFF000000);\nfor (let i = 0; i < MAP.length; ++i)\n D[MAP[i]] = i << 2;\nfor (let i = 0; i < MAP.length; ++i)\n D[256 + MAP[i]] = i >> 4 | ((i << 4) & 0xFF) << 8;\nfor (let i = 0; i < MAP.length; ++i)\n D[512 + MAP[i]] = (i >> 2) << 8 | ((i << 6) & 0xFF) << 16;\nfor (let i = 0; i < MAP.length; ++i)\n D[768 + MAP[i]] = i << 16;\nconst EMPTY = new Uint8Array(0);\n/**\n * base64 stream decoder.\n *\n * Features / assumptions:\n * - lazy chunkwise decoding\n * - errors out on any non base64 chars (no support for NL formatted base64)\n * - decodes in wasm\n * - inplace decoding to save memory\n * - supports a keepSize for lazy memory release\n */\nclass Base64Decoder {\n /**\n * @param keepSize Keep the wasm instance below this limit when calling `release()`.\n * @param maxBytes Max allowed bytes to allocate.\n * @param initialBytes Initial bytes to allocate.\n */\n constructor(keepSize, maxBytes, initialBytes) {\n this._inst = null;\n this._ended = true;\n this._bytes = 0;\n this.keepSize = keepSize !== null && keepSize !== void 0 ? keepSize : 1048576 /* Bytes.KEEP */;\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : 4294901760 /* Bytes.MAX */;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : 32768 /* Bytes.INITIAL */;\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw new Error('invalid byte settings');\n }\n }\n /**\n * Currently decoded bytes (borrowed).\n * Must be accessed before calling `release` or `init`.\n */\n get data8() {\n return this._inst ? this._d.subarray(0, this._m32[1282 /* P32.STATE_DP */]) : EMPTY;\n }\n /**\n * Release memory conditionally based on `keepSize`.\n * If memory gets released, also the wasm instance will be freed and recreated on next `init`,\n * otherwise the instance will be reused.\n */\n release() {\n if (!this._inst)\n return;\n if (this._bytes > this.keepSize) {\n this._inst = this._m32 = this._d = this._mem = null;\n }\n else {\n this._m32[1280 /* P32.STATE_WP */] = 0;\n this._m32[1281 /* P32.STATE_SP */] = 0;\n this._m32[1282 /* P32.STATE_DP */] = 0;\n }\n }\n /**\n * Initializes the decoder for new base64 data.\n * Must be called before doing any decoding attempts.\n * The method will either spawn a new wasm instance or grow\n * the needed memory of an existing instance.\n * @param maxBytes Max allowed bytes to allocate (overwrites ctor value).\n * @param initialBytes Initial bytes to allocate (overwrites ctor value).\n */\n init(maxBytes, initialBytes) {\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : this.maxBytes;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : Math.min(this._bytes, this.maxBytes);\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw Error('invalid byte settings');\n }\n let m = this._m32;\n const bytes = this._bytes + 5152 /* Bytes._DATA_OFFSET */;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmDecode({ env: { memory: this._mem } });\n m = new Uint32Array(this._mem.buffer, 0);\n m.set(D, 256 /* P32.D0 */);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n m = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n m[1280 /* P32.STATE_WP */] = 0;\n m[1281 /* P32.STATE_SP */] = 0;\n m[1282 /* P32.STATE_DP */] = 0;\n this._m32 = m;\n this._ended = false;\n }\n /**\n * Realloc memory. Realloc only happens, if the requested\n * size doesn't fit in the current memory.\n * The new size will be capped by `maxBytes`.\n * @param requested Bytes to be stored.\n */\n _realloc(requested) {\n const needed = this._m32[1280 /* P32.STATE_WP */] + requested;\n if (this._bytes < needed) {\n if (needed > this.maxBytes) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n let newSize = this._bytes;\n while ((newSize *= 2) < needed) { }\n newSize = Math.min(newSize, this.maxBytes);\n if (newSize < needed) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n if (newSize + 5152 /* Bytes._DATA_OFFSET */ > this._mem.buffer.byteLength) {\n const addPages = Math.ceil((newSize + 5152 /* Bytes._DATA_OFFSET */ - this._mem.buffer.byteLength) / 65536);\n this._mem.grow(addPages);\n this._m32 = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n this._bytes = newSize;\n }\n return 0 /* DecodeStatus.OK */;\n }\n /**\n * Put bytes in `data` into the decoder.\n * Additionally decodes the payload, if it reached 2^17 bytes.\n * The return value indicates the type of issue.\n * @param data Bytes to be loaded.\n */\n put(data) {\n if (!this._inst || this._ended) {\n return -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n if (this._realloc(data.length)) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n const m = this._m32;\n this._d.set(data, m[1280 /* P32.STATE_WP */]);\n m[1280 /* P32.STATE_WP */] += data.length;\n // max chunk in input handler is 2^17, try to run in \"tandem mode\"\n return m[1280 /* P32.STATE_WP */] - m[1281 /* P32.STATE_SP */] >= 131072\n ? this._inst.exports.dec()\n : 0 /* DecodeStatus.OK */;\n }\n /**\n * End the current decoding.\n * Also decodes leftover payload from previous put calls.\n */\n end() {\n this._ended = true;\n return this._inst\n ? this._inst.exports.end()\n : -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n /**\n * Bytes loaded into the decoder.\n */\n get loadedBytes() {\n return this._inst\n ? this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n /**\n * Free bytes to feed to the decoder.\n */\n get freeBytes() {\n return this._inst\n ? this.maxBytes - this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n}\nexports.default = Base64Decoder;\n//# sourceMappingURL=Base64Decoder.wasm.js.map", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\nconst wasmQoiDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#459f9e1bfb80b1a8:rdef-start:\"qoi_decode\"*/{s:1,t:0,d:'AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=='}/*inwasm#459f9e1bfb80b1a8:rdef-end:\"qoi_decode\"*/);\nclass QoiDecoder {\n constructor(keepSize) {\n this.keepSize = keepSize;\n this.width = 0;\n this.height = 0;\n }\n decode(d) {\n this.width = d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7];\n this.height = d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11];\n const pixels = this.width * this.height;\n const ib = pixels * 4;\n const dl = d.length;\n /**\n * byte/offset calculation:\n * To save some memory we dont reserve full memory for decoded + encoded,\n * but place encoded at the end of decoded plus 50% security distance\n * to avoid reads before writes positions:\n *\n * encoded < decoded (good compression)\n * enc ####################\n * dec #######################################\n * ^ ^\n * DST_P CHUNK_P\n *\n * encoded > decoded (degenerated compression, should not happen)\n * enc ##############################\n * dec ####################\n * ^ ^\n * DST_P CHUNK_P\n *\n * There is still a chance for overlapping r/w positions in case the compressed\n * data has very different pixel progression, yet the 50% security distance\n * should deal with that, as QOI will bloat data by 25% at max (RGB -> OP byte + RGB).\n * Since we always assume RGBA at decoding stage, the possible bloat reduces to 20% at max.\n */\n const bytes = Math.max(ib, dl) + (Math.min(ib, dl) >> 1) + 4096;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmQoiDecode({ env: { memory: this._mem } });\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n this._d = null;\n }\n if (!this._d) {\n this._d = new Uint8Array(this._mem.buffer);\n }\n // put src data at the end of memory, also align to 256\n const chunkP = (this._mem.buffer.byteLength - dl) & ~0xFF;\n this._d.set(d, chunkP);\n this._inst.exports.dec(chunkP, dl, pixels);\n return this._d.subarray(1024 /* P8.DST_P */, 1024 /* P8.DST_P */ + ib);\n }\n release() {\n if (!this._inst)\n return;\n if (this._mem.buffer.byteLength > this.keepSize) {\n this._inst = this._d = this._mem = null;\n }\n }\n}\nexports.default = QoiDecoder;\n//# sourceMappingURL=QoiDecoder.wasm.js.map", null, null, "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set<IDisposable>();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add<T extends IDisposable>(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register<T extends IDisposable>(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\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 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 * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent<T> {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter<T> {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent<T> | undefined;\n\n public get event(): IEvent<T> {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward<T>(from: IEvent<T>, to: Emitter<T>): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map<I, O>(event: IEvent<I>, map: (i: I) => O): IEvent<O> {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any<T>(...events: IEvent<T>[]): IEvent<T>;\n export function any(...events: IEvent<any>[]): IEvent<void>;\n export function any<T>(...events: IEvent<T>[]): IEvent<T> {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toRGBA8888 } from 'sixel/lib/Colors';\nimport { IDisposable } from '@xterm/xterm';\nimport { ICellSize, ImageLayer, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\n\nconst enum Constants {\n PLACEHOLDER_LENGTH = 4096,\n PLACEHOLDER_HEIGHT = 24\n}\n\n/**\n * ImageRenderer - terminal frontend extension:\n * - provide primitives for canvas, ImageData, Bitmap (static)\n * - add canvas layer to DOM (browser only for now)\n * - draw image tiles onRender\n */\nexport class ImageRenderer extends Disposable implements IDisposable {\n /** @deprecated Kept for backward compat \u2014 points to top layer canvas. */\n public get canvas(): HTMLCanvasElement | undefined { return this._layers.get('top')?.canvas; }\n private _layers = new Map<ImageLayer, CanvasRenderingContext2D>();\n private _placeholder: HTMLCanvasElement | undefined;\n private _placeholderBitmap: ImageBitmap | undefined;\n private _optionsRefresh = this._register(new MutableDisposable());\n private _oldOpen: ((parent: HTMLElement) => void) | undefined;\n private _renderService: IRenderService | undefined;\n private _oldSetRenderer: ((renderer: any) => void) | undefined;\n\n // drawing primitive - canvas\n public static createCanvas(localDocument: Document | undefined, width: number, height: number): HTMLCanvasElement {\n /**\n * NOTE: We normally dont care, from which document the canvas\n * gets created, so we can fall back to global document,\n * if the terminal has no document associated yet.\n * This way early image loads before calling .open keep working\n * (still discouraged though, as the metrics will be screwed up).\n * Only the DOM output canvas should be on the terminal's document,\n * which gets explicitly checked in `insertLayerToDom`.\n */\n const canvas = (localDocument ?? document).createElement('canvas');\n canvas.width = width | 0;\n canvas.height = height | 0;\n return canvas;\n }\n\n // drawing primitive - ImageData with optional buffer\n public static createImageData(ctx: CanvasRenderingContext2D, width: number, height: number, buffer?: ArrayBuffer): ImageData {\n if (typeof ImageData !== 'function') {\n const imgData = ctx.createImageData(width, height);\n if (buffer) {\n imgData.data.set(new Uint8ClampedArray(buffer, 0, width * height * 4));\n }\n return imgData;\n }\n return buffer\n ? new ImageData(new Uint8ClampedArray(buffer, 0, width * height * 4), width, height)\n : new ImageData(width, height);\n }\n\n // drawing primitive - ImageBitmap\n public static createImageBitmap(img: ImageBitmapSource): Promise<ImageBitmap | undefined> {\n if (typeof createImageBitmap !== 'function') {\n return Promise.resolve(undefined);\n }\n return createImageBitmap(img);\n }\n\n\n constructor(private _terminal: ITerminalExt) {\n super();\n this._oldOpen = this._terminal._core.open;\n this._terminal._core.open = (parent: HTMLElement): void => {\n this._oldOpen?.call(this._terminal._core, parent);\n this._open();\n };\n if (this._terminal._core.screenElement) {\n this._open();\n }\n // hack to spot fontSize changes\n this._optionsRefresh.value = this._terminal._core.optionsService.onOptionChange(option => {\n if (option === 'fontSize') {\n this.rescaleCanvas();\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n });\n this._register(toDisposable(() => {\n this.removeLayerFromDom();\n this.removeLayerFromDom('bottom');\n if (this._terminal._core && this._oldOpen) {\n this._terminal._core.open = this._oldOpen;\n this._oldOpen = undefined;\n }\n if (this._renderService && this._oldSetRenderer) {\n this._renderService.setRenderer = this._oldSetRenderer;\n this._oldSetRenderer = undefined;\n }\n this._renderService = undefined;\n this._layers.clear();\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }));\n }\n\n /**\n * Enable the placeholder.\n */\n public showPlaceholder(value: boolean): void {\n if (value) {\n if (!this._placeholder && this.cellSize.height !== -1) {\n this._createPlaceHolder(Math.max(this.cellSize.height + 1, Constants.PLACEHOLDER_HEIGHT));\n }\n } else {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n\n /**\n * Dimensions of the terminal.\n * Forwarded from internal render service.\n */\n public get dimensions(): IRenderDimensions | undefined {\n return this._terminal.dimensions;\n }\n\n /**\n * Current cell size (float).\n */\n public get cellSize(): ICellSize {\n return {\n width: this.dimensions?.css.cell.width || -1,\n height: this.dimensions?.css.cell.height || -1\n };\n }\n\n /**\n * Clear a region of the image layer canvas.\n */\n public clearLines(start: number, end: number, layer?: ImageLayer): void {\n const y = start * (this.dimensions?.css.cell.height || 0);\n const w = this.dimensions?.css.canvas.width || 0;\n const h = (end + 1 - start) * (this.dimensions?.css.cell.height || 0);\n if (!layer || layer === 'top') {\n this._layers.get('top')?.clearRect(0, y, w, h);\n }\n if (!layer || layer === 'bottom') {\n this._layers.get('bottom')?.clearRect(0, y, w, h);\n }\n }\n\n /**\n * Clear whole image canvas.\n */\n public clearAll(layer?: ImageLayer): void {\n if (!layer || layer === 'top') {\n const ctx = this._layers.get('top');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n if (!layer || layer === 'bottom') {\n const ctx = this._layers.get('bottom');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }\n\n /**\n * Draw neighboring tiles on the image layer canvas.\n */\n public draw(imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get(imgSpec.layer);\n if (!ctx) {\n return;\n }\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const cols = Math.ceil(img.width / width);\n\n const sx = (tileId % cols) * width;\n const sy = Math.floor(tileId / cols) * height;\n const dx = col * width;\n const dy = row * height;\n\n // safari bug: never access image source out of bounds\n const finalWidth = count * width + sx > img.width ? img.width - sx : count * width;\n const finalHeight = sy + height > img.height ? img.height - sy : height;\n\n // Floor all pixel offsets to get stable tile mapping without any overflows.\n // Note: For not pixel perfect aligned cells like in the DOM renderer\n // this will move a tile slightly to the top/left (subpixel range, thus ignore it).\n // FIX #34: avoid striping on displays with pixelDeviceRatio != 1 by ceiling height and width\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.ceil(finalWidth), Math.ceil(finalHeight),\n Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth), Math.ceil(finalHeight)\n );\n }\n\n /**\n * Extract a single tile from an image.\n */\n public extractTile(imgSpec: IImageSpec, tileId: number): HTMLCanvasElement | undefined {\n const { width, height } = this.cellSize;\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const cols = Math.ceil(img.width / width);\n const sx = (tileId % cols) * width;\n const sy = Math.floor(tileId / cols) * height;\n const finalWidth = width + sx > img.width ? img.width - sx : width;\n const finalHeight = sy + height > img.height ? img.height - sy : height;\n\n const canvas = ImageRenderer.createCanvas(this.document, finalWidth, finalHeight);\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.floor(finalWidth), Math.floor(finalHeight),\n 0, 0, Math.floor(finalWidth), Math.floor(finalHeight)\n );\n return canvas;\n }\n }\n\n /**\n * Draw a line with placeholder on the image layer canvas.\n */\n public drawPlaceholder(col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get('top');\n if (ctx) {\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n if (!this._placeholder) {\n this._createPlaceHolder(Math.max(height + 1, Constants.PLACEHOLDER_HEIGHT));\n } else if (height >= this._placeholder!.height) {\n this._createPlaceHolder(height + 1);\n }\n if (!this._placeholder) return;\n ctx.drawImage(\n this._placeholderBitmap ?? this._placeholder!,\n col * width,\n (row * height) % 2 ? 0 : 1, // needs %2 offset correction\n width * count,\n height,\n col * width,\n row * height,\n width * count,\n height\n );\n }\n }\n\n /**\n * Rescale image layer canvas if needed.\n * Checked once from `ImageStorage.render`.\n */\n public rescaleCanvas(): void {\n const w = this.dimensions?.css.canvas.width || 0;\n const h = this.dimensions?.css.canvas.height || 0;\n for (const ctx of this._layers.values()) {\n if (ctx.canvas.width !== w || ctx.canvas.height !== h) {\n ctx.canvas.width = w;\n ctx.canvas.height = h;\n }\n }\n }\n\n /**\n * Rescale image in storage if needed.\n */\n private _rescaleImage(spec: IImageSpec, currentWidth: number, currentHeight: number): void {\n if (currentWidth === spec.actualCellSize.width && currentHeight === spec.actualCellSize.height) {\n return;\n }\n const { width: originalWidth, height: originalHeight } = spec.origCellSize;\n if (currentWidth === originalWidth && currentHeight === originalHeight) {\n spec.actual = spec.orig;\n spec.actualCellSize.width = originalWidth;\n spec.actualCellSize.height = originalHeight;\n return;\n }\n const canvas = ImageRenderer.createCanvas(\n this.document,\n Math.ceil(spec.orig!.width * currentWidth / originalWidth),\n Math.ceil(spec.orig!.height * currentHeight / originalHeight)\n );\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(spec.orig!, 0, 0, canvas.width, canvas.height);\n spec.actual = canvas;\n spec.actualCellSize.width = currentWidth;\n spec.actualCellSize.height = currentHeight;\n }\n }\n\n /**\n * Lazy init for the renderer.\n */\n private _open(): void {\n this._renderService = this._terminal._core._renderService;\n this._oldSetRenderer = this._renderService.setRenderer.bind(this._renderService);\n this._renderService.setRenderer = (renderer: any) => {\n for (const key of [...this._layers.keys()]) {\n this.removeLayerFromDom(key);\n }\n this._oldSetRenderer?.call(this._renderService, renderer);\n };\n }\n\n public insertLayerToDom(layer: ImageLayer = 'top'): void {\n // make sure that the terminal is attached to a document and to DOM\n if (!this.document || !this._terminal._core.screenElement) {\n console.warn('image addon: cannot insert output canvas to DOM, missing document or screenElement');\n return;\n }\n if (this._layers.has(layer)) {\n return;\n }\n const canvas = ImageRenderer.createCanvas(\n this.document, this.dimensions?.css.canvas.width || 0,\n this.dimensions?.css.canvas.height || 0\n );\n canvas.classList.add(`xterm-image-layer-${layer}`);\n const screenElement = this._terminal._core.screenElement;\n // Use isolation to create a stacking context without overriding z-index,\n // which would conflict with integrators (e.g. VS Code) that set their\n // own z-index on the screen element.\n screenElement.style.isolation = 'isolate';\n if (layer === 'bottom') {\n // Use z-index:-1 so it paints behind non-positioned text elements.\n // The screen element needs to be a stacking context (via isolation)\n // to contain the negative z-index, otherwise it would go behind the\n // entire terminal.\n canvas.style.zIndex = '-1';\n screenElement.insertBefore(canvas, screenElement.firstChild);\n } else {\n // Explicit z-index ensures the image canvas reliably stacks above\n // the text layer (DOM renderer rows). z-index: 0 is below the\n // selection overlay (z-index: 1).\n canvas.style.zIndex = '0';\n screenElement.appendChild(canvas);\n }\n const ctx = canvas.getContext('2d', { alpha: true });\n if (!ctx) {\n canvas.remove();\n return;\n }\n this._layers.set(layer, ctx);\n this.clearAll(layer);\n }\n\n public removeLayerFromDom(layer: ImageLayer = 'top'): void {\n const ctx = this._layers.get(layer);\n if (ctx) {\n ctx.canvas.remove();\n this._layers.delete(layer);\n }\n }\n\n public hasLayer(layer: ImageLayer): boolean {\n return this._layers.has(layer);\n }\n\n private _createPlaceHolder(height: number = Constants.PLACEHOLDER_HEIGHT): void {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n\n // create blueprint to fill placeholder with\n const bWidth = 32; // must be 2^n\n const blueprint = ImageRenderer.createCanvas(this.document, bWidth, height);\n const ctx = blueprint.getContext('2d', { alpha: false });\n if (!ctx) return;\n const imgData = ImageRenderer.createImageData(ctx, bWidth, height);\n const d32 = new Uint32Array(imgData.data.buffer);\n const black = toRGBA8888(0, 0, 0);\n const white = toRGBA8888(255, 255, 255);\n d32.fill(black);\n for (let y = 0; y < height; ++y) {\n const shift = y % 2;\n const offset = y * bWidth;\n for (let x = 0; x < bWidth; x += 2) {\n d32[offset + x + shift] = white;\n }\n }\n ctx.putImageData(imgData, 0, 0);\n\n // create placeholder line, width aligned to blueprint width\n const width = (screen.width + bWidth - 1) & ~(bWidth - 1) || Constants.PLACEHOLDER_LENGTH;\n this._placeholder = ImageRenderer.createCanvas(this.document, width, height);\n const ctx2 = this._placeholder.getContext('2d', { alpha: false });\n if (!ctx2) {\n this._placeholder = undefined;\n return;\n }\n for (let i = 0; i < width; i += bWidth) {\n ctx2.drawImage(blueprint, i, 0);\n }\n ImageRenderer.createImageBitmap(this._placeholder).then(bitmap => this._placeholderBitmap = bitmap);\n }\n\n public get document(): Document | undefined {\n return this._terminal._core._coreBrowserService?.window.document;\n }\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;\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]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './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 public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\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 payload: Object | undefined;\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 public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\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 && this.payload === undefined;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\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 public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { ImageRenderer } from './ImageRenderer';\nimport type {\n ITerminalExt, IImageAddonOptions, IImageSpec, ICellSize, IAddImageOpts\n} from './Types';\nimport type { IBufferLine } from 'common/buffer/Types';\nimport { CellData } from 'common/buffer/CellData';\n\n// fallback default cell size\nexport const CELL_SIZE_DEFAULT: ICellSize = {\n width: 7,\n height: 14\n};\n\nclass ImageTileInfo {\n constructor(\n public imageId = -1,\n public tileId = -1) {\n }\n}\n\n/**\n * ImageStorage - extension of CoreTerminal:\n * - hold image data\n * - write/read image data to/from buffer\n *\n * TODO: image composition for overwrites\n */\nexport class ImageStorage implements IDisposable {\n // storage\n private _images: Map<number, IImageSpec> = new Map();\n // last used id\n private _lastId = 0;\n // last evicted id\n private _lowestId = 0;\n // whether a full clear happened before\n private _fullyCleared = false;\n // whether render should do a full clear\n private _needsFullClear = false;\n // hard limit of stored pixels (fallback limit of 10 MB)\n private _pixelLimit: number = 2500000;\n private _workCell: CellData = new CellData();\n\n private _viewportMetrics: { cols: number, rows: number };\n public onImageAdded: (() => void) | undefined;\n public onImageDeleted: ((storageId: number) => void) | undefined;\n\n constructor(\n private _terminal: ITerminalExt,\n private _renderer: ImageRenderer,\n private _opts: IImageAddonOptions\n ) {\n try {\n this.setLimit(this._opts.storageLimit);\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n }\n console.warn(`storageLimit is set to ${this.getLimit()} MB`);\n }\n this._viewportMetrics = {\n cols: this._terminal.cols,\n rows: this._terminal.rows\n };\n }\n\n public dispose(): void {\n this.reset();\n }\n\n public reset(): void {\n for (const spec of this._images.values()) {\n spec.marker?.dispose();\n }\n // NOTE: marker.dispose above already calls ImageBitmap.close\n // therefore we can just wipe the map here\n this._images.clear();\n this._renderer.clearAll();\n }\n\n public getLimit(): number {\n return this._pixelLimit * 4 / 1000000;\n }\n\n public setLimit(value: number): void {\n if (value < 0.5 || value > 1000) {\n throw RangeError('invalid storageLimit, should be at least 0.5 MB and not exceed 1G');\n }\n this._pixelLimit = (value / 4 * 1000000) >>> 0;\n this._evictOldest(0);\n }\n\n public getUsage(): number {\n return this._getStoredPixels() * 4 / 1000000;\n }\n\n private _getStoredPixels(): number {\n let storedPixels = 0;\n for (const spec of this._images.values()) {\n if (spec.orig) {\n storedPixels += spec.orig.width * spec.orig.height;\n if (spec.actual && spec.actual !== spec.orig) {\n storedPixels += spec.actual.width * spec.actual.height;\n }\n }\n }\n return storedPixels;\n }\n\n private _delImg(id: number): void {\n const spec = this._images.get(id);\n if (!spec) return;\n this._images.delete(id);\n // FIXME: really ugly workaround to get bitmaps deallocated :(\n if (window.ImageBitmap && spec.orig instanceof ImageBitmap) {\n spec.orig.close();\n }\n this.onImageDeleted?.(id);\n }\n\n /**\n * Wipe canvas and images on alternate buffer.\n */\n public wipeAlternate(): void {\n // remove all alternate tagged images\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate') {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n // mark canvas to be wiped on next render\n this._needsFullClear = true;\n this._fullyCleared = false;\n }\n\n /**\n * Delete an image by its internal storage ID.\n * Used by protocols that support explicit deletion (e.g. Kitty a=d).\n */\n public deleteImage(id: number): void {\n const spec = this._images.get(id);\n if (spec) {\n spec.marker?.dispose();\n this._delImg(id);\n }\n }\n\n /**\n * Method to add an image to the storage.\n * @param img - The image to add (canvas or bitmap).\n * @param opts - Options for addImage:\n * - scrolling: When true, cursor advances with the image.\n * When false, image is placed at ORIGIN and cursor does not move.\n * - layer: Which canvas layer to render on ('top' or 'bottom').\n * - zIndex: Z-index for image layering within the same layer.\n * - cursorPos: 'vt340' for bottom-left, 'iip' for bottom.right.\n * @returns The internal image ID assigned to the stored image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {\n // never allow storage to exceed memory limit\n this._evictOldest(img.width * img.height);\n\n // calc rows x cols needed to display the image\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const cols = Math.ceil(img.width / cellSize.width);\n const rows = Math.ceil(img.height / cellSize.height);\n\n const imageId = ++this._lastId;\n\n const buffer = this._terminal._core.buffer;\n const termCols = this._terminal.cols;\n const termRows = this._terminal.rows;\n const originX = buffer.x;\n const originY = buffer.y;\n let offset = originX;\n let tileCount = 0;\n\n if (!opts.scrolling) {\n buffer.x = 0;\n buffer.y = 0;\n offset = 0;\n }\n\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(buffer.y + buffer.ybase)!;\n for (let col = 0; col < cols; ++col) {\n if (offset + col >= termCols) break;\n this._writeToCell(line, offset + col, imageId, row * cols + col);\n tileCount++;\n }\n if (opts.scrolling) {\n if (row < rows - 1) this._terminal._core._inputHandler.lineFeed();\n } else {\n if (++buffer.y >= termRows) break;\n }\n buffer.x = offset;\n }\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n\n // cursor positioning modes\n if (opts.scrolling) {\n if (opts.cursorPos === 'iip') {\n buffer.x = Math.min(offset + cols, termCols);\n } else {\n buffer.x = offset;\n }\n } else {\n buffer.x = originX;\n buffer.y = originY;\n }\n\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.tileCount < 1) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n\n // eviction marker:\n // delete the image when the marker gets disposed\n const endMarker = this._terminal.registerMarker(0);\n endMarker?.onDispose(() => {\n const spec = this._images.get(imageId);\n if (spec) {\n this._delImg(imageId);\n }\n });\n\n // since markers do not work on alternate for some reason,\n // we evict images here manually\n if (this._terminal.buffer.active.type === 'alternate') {\n this._evictOnAlternate();\n }\n\n // create storage entry\n const imgSpec: IImageSpec = {\n orig: img,\n origCellSize: cellSize,\n actual: img,\n actualCellSize: { ...cellSize }, // clone needed, since later modified\n marker: endMarker || undefined,\n tileCount,\n bufferType: this._terminal.buffer.active.type,\n layer: opts.layer,\n zIndex: opts.zIndex\n };\n\n // finally add the image\n this._images.set(imageId, imgSpec);\n this.onImageAdded?.();\n return imageId;\n }\n\n\n /**\n * Render method. Collects buffer information and triggers\n * canvas updates.\n */\n // TODO: Should we move this to the ImageRenderer?\n public render(range: { start: number, end: number }): void {\n // Determine which layers have images\n let hasTopImages = false;\n let hasBottomImages = false;\n for (const spec of this._images.values()) {\n if (spec.layer === 'bottom') {\n hasBottomImages = true;\n } else {\n hasTopImages = true;\n }\n if (hasTopImages && hasBottomImages) break;\n }\n\n // Lazily insert layers that are needed\n if (hasTopImages && !this._renderer.hasLayer('top')) {\n this._renderer.insertLayerToDom('top');\n if (!this._renderer.hasLayer('top')) return;\n }\n if (hasBottomImages && !this._renderer.hasLayer('bottom')) {\n this._renderer.insertLayerToDom('bottom');\n }\n\n // rescale if needed\n this._renderer.rescaleCanvas();\n\n // exit early if we dont have any images to test for\n if (!this._images.size) {\n if (!this._fullyCleared) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n if (this._renderer.hasLayer('top')) {\n this._renderer.removeLayerFromDom('top');\n }\n if (this._renderer.hasLayer('bottom')) {\n this._renderer.removeLayerFromDom('bottom');\n }\n return;\n }\n\n // Remove layers no longer needed\n if (!hasTopImages && this._renderer.hasLayer('top')) {\n this._renderer.clearAll('top');\n this._renderer.removeLayerFromDom('top');\n }\n if (!hasBottomImages && this._renderer.hasLayer('bottom')) {\n this._renderer.clearAll('bottom');\n this._renderer.removeLayerFromDom('bottom');\n }\n\n // buffer switches force a full clear\n if (this._needsFullClear) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n\n const { start, end } = range;\n const buffer = this._terminal._core.buffer;\n const cols = this._terminal._core.cols;\n\n // clear drawing area\n this._renderer.clearLines(start, end);\n\n // Collect draw calls so we can sort by z-index (lower z drawn first).\n const drawCalls: { imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number }[] = [];\n const placeholderCalls: { col: number, row: number, count: number }[] = [];\n\n // walk all cells in viewport and collect tiles found\n for (let row = start; row <= end; ++row) {\n const line = buffer.lines.get(row + buffer.ydisp);\n if (!line) return;\n for (let col = 0; col < cols; ++col) {\n const e = line.getExtended(col)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (e.tileId !== -1) {\n const startTile = e.tileId;\n const startCol = col;\n let count = 1;\n /**\n * merge tiles to the right into a single draw call, if:\n * - not at end of line\n * - cell has same image id\n * - cell has consecutive tile id\n */\n while (++col < cols) {\n const nextE = line.getExtended(col)?.payload;\n if (!(nextE instanceof ImageTileInfo) || nextE.imageId !== imageId || nextE.tileId !== startTile + count) {\n break;\n }\n count++;\n }\n col--;\n if (imgSpec) {\n if (imgSpec.actual) {\n drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count });\n }\n } else if (this._opts.showPlaceholder) {\n placeholderCalls.push({ col: startCol, row, count });\n }\n this._fullyCleared = false;\n }\n }\n }\n }\n\n // Sort by z-index so lower z draws first (higher z renders on top)\n drawCalls.sort((a, b) => a.imgSpec.zIndex - b.imgSpec.zIndex);\n\n // Draw placeholders first (lowest priority)\n for (const call of placeholderCalls) {\n this._renderer.drawPlaceholder(call.col, call.row, call.count);\n }\n\n // Draw images in z-index order\n for (const call of drawCalls) {\n this._renderer.draw(call.imgSpec, call.tileId, call.col, call.row, call.count);\n }\n }\n\n public viewportResize(metrics: { cols: number, rows: number }): void {\n // exit early if we have nothing in storage\n if (!this._images.size) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // handle only viewport width enlargements, exit all other cases\n // TODO: needs patch for tile counter\n if (this._viewportMetrics.cols >= metrics.cols) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // walk scrollbuffer at old col width to find all possible expansion matches\n const buffer = this._terminal._core.buffer;\n const rows = buffer.lines.length;\n const oldCol = this._viewportMetrics.cols - 1;\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(row)!;\n const e = line.getExtended(oldCol)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (!imgSpec) {\n continue;\n }\n // found an image tile at oldCol, check if it qualifies for right exapansion\n const tilesPerRow = Math.ceil((imgSpec.actual?.width || 0) / imgSpec.actualCellSize.width);\n if ((e.tileId % tilesPerRow) + 1 >= tilesPerRow) {\n continue;\n }\n // expand only if right side is empty (nothing got wrapped from below)\n let hasData = false;\n for (let rightCol = oldCol + 1; rightCol > metrics.cols; ++rightCol) {\n if (line.hasContent(rightCol)) {\n hasData = true;\n break;\n }\n }\n if (hasData) {\n continue;\n }\n // do right expansion on terminal buffer\n const end = Math.min(metrics.cols, tilesPerRow - (e.tileId % tilesPerRow) + oldCol);\n let lastTile = e.tileId;\n for (let expandCol = oldCol + 1; expandCol < end; ++expandCol) {\n this._writeToCell(line, expandCol, imageId, ++lastTile);\n imgSpec.tileCount++;\n }\n }\n }\n // store new viewport metrics\n this._viewportMetrics = metrics;\n }\n\n /**\n * Retrieve original canvas at buffer position.\n */\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1) {\n const orig = this._images.get(e.imageId)?.orig;\n if (window.ImageBitmap && orig instanceof ImageBitmap) {\n const canvas = ImageRenderer.createCanvas(window.document, orig.width, orig.height);\n canvas.getContext('2d')?.drawImage(orig, 0, 0, orig.width, orig.height);\n return canvas;\n }\n return orig as HTMLCanvasElement;\n }\n }\n }\n\n /**\n * Extract active single tile at buffer position.\n */\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1 && e.tileId !== -1) {\n const spec = this._images.get(e.imageId);\n if (spec) {\n return this._renderer.extractTile(spec, e.tileId);\n }\n }\n }\n }\n\n // TODO: Do we need some blob offloading tricks here to avoid early eviction?\n // also see https://stackoverflow.com/questions/28307789/is-there-any-limitation-on-javascript-max-blob-size\n private _evictOldest(room: number): number {\n const used = this._getStoredPixels();\n let current = used;\n while (this._pixelLimit < current + room && this._images.size) {\n const spec = this._images.get(++this._lowestId);\n if (spec && spec.orig) {\n current -= spec.orig.width * spec.orig.height;\n if (spec.actual && spec.orig !== spec.actual) {\n current -= spec.actual.width * spec.actual.height;\n }\n spec.marker?.dispose();\n this._delImg(this._lowestId);\n }\n }\n return used - current;\n }\n\n private _writeToCell(line: IBufferLine, x: number, imageId: number, tileId: number): void {\n const workCell = this._workCell;\n line.loadCell(x, workCell);\n if (this._workCell.hasExtendedAttrs()) {\n const old = workCell.extended.payload;\n if (old instanceof ImageTileInfo) {\n // found an old ExtendedAttrsImage, since we know that\n // they are always isolated instances (single cell usage),\n // we can re-use it and just update their id entries\n const oldSpec = this._images.get(old.imageId);\n if (oldSpec) {\n // early eviction for in-viewport overwrites\n oldSpec.tileCount--;\n }\n old.imageId = imageId;\n old.tileId = tileId;\n return;\n }\n }\n // fall-through: always create new ExtendedAttrs entry\n const extattr = workCell.extended.clone();\n extattr.payload = new ImageTileInfo(imageId, tileId);\n workCell.extended = extattr;\n workCell.updateExtended();\n line.setCell(x, workCell);\n }\n\n private _evictOnAlternate(): void {\n // nullify tile count of all images on alternate buffer\n for (const spec of this._images.values()) {\n if (spec.bufferType === 'alternate') {\n spec.tileCount = 0;\n }\n }\n // re-count tiles on whole buffer\n const buffer = this._terminal._core.buffer;\n for (let y = 0; y < this._terminal.rows; ++y) {\n const line = buffer.lines.get(y);\n if (!line) {\n continue;\n }\n for (let x = 0; x < this._terminal.cols; ++x) {\n const payload = line.getExtended(x)?.payload;\n if (payload instanceof ImageTileInfo) {\n const spec = this._images.get(payload.imageId);\n if (spec) {\n spec.tileCount++;\n }\n }\n }\n }\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate' && !spec.tileCount) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IImageAddonOptions, IOscHandler, IResetHandler, ITerminalExt } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { CELL_SIZE_DEFAULT } from './ImageStorage';\nimport Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport QoiDecoder from 'xterm-wasm-parts/lib/qoi/QoiDecoder.wasm';\nimport { HeaderParser, IHeaderFields, HeaderState, SequenceType } from './IIPHeaderParser';\nimport { imageType, UNSUPPORTED_TYPE } from './IIPMetrics';\n\n// Local const enum mirror - esbuild can't inline const enums from external packages\nconst enum DecoderConst {\n // Limit held memory in base64 decoder (encoded bytes).\n KEEP_DATA = 4194304,\n // Initial buffer allocation for the decoder.\n INITIAL_DATA = 1048576,\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n OK = 0\n}\n\n// default IIP header values\nconst DEFAULT_HEADER: IHeaderFields = {\n type: SequenceType.INVALID,\n name: 'Unnamed file',\n size: 0,\n width: 'auto',\n height: 'auto',\n preserveAspectRatio: 1,\n inline: 0\n};\n\n\nexport class IIPHandler implements IOscHandler, IResetHandler {\n private _aborted = false;\n private _hp = new HeaderParser();\n private _header: IHeaderFields = DEFAULT_HEADER;\n private _dec: Base64Decoder;\n private _qoiDec: QoiDecoder;\n private _isMultipart = false;\n private _abortMulti = false;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _storage: IIPImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n const maxEncodedBytes = Math.ceil(this._opts.iipSizeLimit * 4 / 3);\n const initialBytes = Math.min(DecoderConst.INITIAL_DATA, maxEncodedBytes);\n this._dec = new Base64Decoder(DecoderConst.KEEP_DATA, maxEncodedBytes, initialBytes);\n this._qoiDec = new QoiDecoder(DecoderConst.KEEP_DATA);\n }\n\n public reset(): void {\n this._hp.reset();\n this._dec.release();\n this._qoiDec.release();\n }\n\n public start(): void {\n this._aborted = false;\n this._hp.reset();\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (this._hp.state === HeaderState.END) {\n if ((this._dec.put(data.subarray(start, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n }\n } else {\n const dataPos = this._hp.parse(data, start, end);\n if (dataPos === -1) {\n this._aborted = true;\n return;\n }\n if (dataPos > 0) {\n const seqType = this._hp.fields.type;\n if (seqType === SequenceType.FILE) {\n if (this._isMultipart) {\n this._isMultipart = false;\n this._abortMulti = false;\n this._dec.release();\n }\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n if (!this._header.inline) {\n this._aborted = true;\n return;\n }\n this._dec.init();\n } else if (this._abortMulti) {\n this._aborted = true;\n return;\n }\n if ((this._dec.put(data.subarray(dataPos, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n if (this._isMultipart) this._abortMulti = true;\n }\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted) return true;\n\n if (this._hp.state !== HeaderState.END) {\n if (this._hp.end()) return true;\n }\n const seqType = this._hp.fields.type;\n\n if (seqType === SequenceType.FILEPART) return true;\n\n if (seqType === SequenceType.REPORTCELLSIZE) {\n // OSC 1337 ; ReportCellSize=[height];[width];[scale] ST\n let w = CELL_SIZE_DEFAULT.width;\n let h = CELL_SIZE_DEFAULT.height;\n if (this._renderer.dimensions) {\n w = this._renderer.dimensions.css.canvas.width / this._coreTerminal.cols;\n h = this._renderer.dimensions.css.canvas.height / this._coreTerminal.rows;\n }\n const scale = this._coreTerminal._core._coreBrowserService?.dpr ?? 1;\n const report = `\\x1b]1337;ReportCellSize=${h.toFixed(3)};${w.toFixed(3)};${scale.toFixed(3)}\\x1b\\\\`;\n this._coreTerminal.input(report, false);\n return true;\n }\n\n if (seqType === SequenceType.MULTIPARTFILE) {\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n this._isMultipart = true;\n this._abortMulti = false;\n this._dec.release();\n this._dec.init();\n return true;\n }\n\n if (seqType === SequenceType.FILEEND) {\n if (!this._isMultipart) return true;\n this._isMultipart = false;\n if (this._abortMulti || this._header.type !== SequenceType.MULTIPARTFILE) return true;\n }\n\n // fallthrough for SequenceType.FILE & SequenceType.FILEEND\n\n let w = 0;\n let h = 0;\n\n // early exit condition chain\n let cond: number | boolean;\n let metrics = UNSUPPORTED_TYPE;\n if (cond = success) {\n if (cond = !this._dec.end()) {\n metrics = imageType(this._dec.data8);\n if (cond = metrics.mime !== 'unsupported') {\n w = metrics.width;\n h = metrics.height;\n if (cond = w && h && w * h < this._opts.pixelLimit) {\n [w, h] = this._resize(w, h).map(Math.floor);\n cond = w && h && w * h < this._opts.pixelLimit;\n } else {\n console.warn(`IIP: image dimension issue ${metrics.width}x${metrics.height}`);\n }\n } else {\n console.warn('IIP: unsupported image type');\n }\n } else {\n console.warn('IIP: error during BASE64 decoding');\n }\n }\n if (!cond) {\n this._dec.release();\n return true;\n }\n\n let blob: Blob | ImageData;\n if (metrics.mime === 'image/qoi') {\n const data = this._qoiDec.decode(this._dec.data8);\n blob = new ImageData(\n new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength),\n this._qoiDec.width,\n this._qoiDec.height\n );\n this._qoiDec.release();\n if (w === this._qoiDec.width && h === this._qoiDec.height) {\n // use fast-path if we don't need to rescale\n this._dec.release();\n const canvas = ImageRenderer.createCanvas(undefined, this._qoiDec.width, this._qoiDec.height);\n canvas.getContext('2d')?.putImageData(blob, 0, 0);\n this._storage.addImage(canvas);\n return true;\n }\n } else {\n blob = new Blob([this._dec.data8], { type: metrics.mime });\n }\n this._dec.release();\n return createImageBitmap(blob, { resizeWidth: w, resizeHeight: h })\n .then(bm => {\n this._storage.addImage(bm);\n return true;\n })\n .catch(e => {\n console.warn(`IIP: decoding error ${metrics.mime} ${metrics.width}x${metrics.height}`, e);\n return true;\n });\n }\n\n private _resize(w: number, h: number): [number, number] {\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n const width = this._renderer.dimensions?.css.canvas.width || cw * this._coreTerminal.cols;\n const height = this._renderer.dimensions?.css.canvas.height || ch * this._coreTerminal.rows;\n\n const rw = this._dim(this._header.width!, width, cw);\n const rh = this._dim(this._header.height!, height, ch);\n if (!rw && !rh) {\n const wf = width / w; // TODO: should this respect initial cursor offset?\n const hf = (height - ch) / h; // TODO: fix offset issues from float cell height\n const f = Math.min(wf, hf);\n return f < 1 ? [w * f, h * f] : [w, h];\n }\n return !rw\n ? [w * rh / h, rh]\n : this._header.preserveAspectRatio || !rw || !rh\n ? [rw, h * rw / w] : [rw, rh];\n }\n\n private _dim(s: string, total: number, cdim: number): number {\n if (s === 'auto') return 0;\n if (s.endsWith('%')) return parseInt(s.slice(0, -1), 10) * total / 100;\n if (s.endsWith('px')) return parseInt(s.slice(0, -2), 10);\n return parseInt(s, 10) * cdim;\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// eslint-disable-next-line\ndeclare const Buffer: any;\n\nexport const enum HeaderState {\n START = 0,\n ABORT = 1,\n KEY = 2,\n VALUE = 3,\n END = 4\n}\n\nexport const enum SequenceType {\n INVALID = 0,\n FILE = 1,\n MULTIPARTFILE = 2,\n FILEPART = 3,\n FILEEND = 4,\n REPORTCELLSIZE = 5\n}\n\nexport interface IHeaderFields {\n [key: string]: number | string | Uint32Array | null | undefined;\n // sequence type\n type: SequenceType;\n // base-64 encoded filename. Defaults to \"Unnamed file\".\n name: string;\n // File size in bytes. The file transfer will be canceled if this size is exceeded.\n size: number;\n /**\n * Optional width and height to render:\n * - N: N character cells.\n * - Npx: N pixels.\n * - N%: N percent of the session's width or height.\n * - auto: The image's inherent size will be used to determine an appropriate dimension.\n */\n width?: string;\n height?: string;\n // Optional, defaults to 1 respecting aspect ratio (width takes precedence).\n preserveAspectRatio?: number;\n // Optional, defaults to 0. If set to 1, the file will be displayed inline, else downloaded\n // (download not supported).\n inline?: number;\n}\n\n// field value decoders\n\n// ASCII bytes to string\nfunction toStr(data: Uint32Array): string {\n let s = '';\n for (let i = 0; i < data.length; ++i) {\n s += String.fromCharCode(data[i]);\n }\n return s;\n}\n\n// digits to integer\nfunction toInt(data: Uint32Array): number {\n let v = 0;\n for (let i = 0; i < data.length; ++i) {\n if (data[i] < 48 || data[i] > 57) {\n throw new Error('illegal char');\n }\n v = v * 10 + data[i] - 48;\n }\n return v;\n}\n\n// check for correct size entry\nfunction toSize(data: Uint32Array): string {\n const v = toStr(data);\n if (!v.match(/^((auto)|(\\d+?((px)|(%)){0,1}))$/)) {\n throw new Error('illegal size');\n }\n return v;\n}\n\n// name is base64 encoded utf-8\nfunction toName(data: Uint32Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(toStr(data), 'base64').toString();\n }\n const bs = atob(toStr(data));\n const b = new Uint8Array(bs.length);\n for (let i = 0; i < b.length; ++i) {\n b[i] = bs.charCodeAt(i);\n }\n return new TextDecoder().decode(b);\n}\n\nconst DECODERS: {[key: string]: (v: Uint32Array) => number | string} = {\n inline: toInt,\n size: toInt,\n name: toName,\n width: toSize,\n height: toSize,\n preserveAspectRatio: toInt\n};\n\n\n// sequence type markers\n// File\nconst FILE_MARKER = [70, 105, 108, 101];\n// MultipartFile\nconst MULTIPARTFILE_MARKER = [77, 117, 108, 116, 105, 112, 97, 114, 116, 70, 105, 108, 101];\n// FilePart\nconst FILEPART_MARKER = [70, 105, 108, 101, 80, 97, 114, 116];\n// FileEnd\nconst FILEEND_MARKER = [70, 105, 108, 101, 69, 110, 100];\n// ReportCellSize\nconst REPORTCELLSIZE_MARKER = [82, 101, 112, 111, 114, 116, 67, 101, 108, 108, 83, 105, 122, 101];\n\n// max allowed chars for sequence header\nconst MAX_FIELDCHARS = 1024;\n\n\nexport class HeaderParser {\n public state: HeaderState = HeaderState.START;\n private _buffer = new Uint32Array(MAX_FIELDCHARS);\n private _position = 0;\n private _key = '';\n public fields: {[key: string]: number | string | Uint32Array | null | undefined} = {};\n\n public reset(): void {\n this._buffer.fill(0);\n this.state = HeaderState.START;\n this._position = 0;\n this.fields = {};\n this._key = '';\n }\n\n public end(): number {\n if (this.state === HeaderState.START) {\n if (this._position === FILEEND_MARKER.length) {\n for (let k = 0; k < FILEEND_MARKER.length; ++k) {\n if (this._buffer[k] !== FILEEND_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEEND;\n this.state = HeaderState.END;\n return 0;\n }\n if (this._position === REPORTCELLSIZE_MARKER.length) {\n for (let k = 0; k < REPORTCELLSIZE_MARKER.length; ++k) {\n if (this._buffer[k] !== REPORTCELLSIZE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.REPORTCELLSIZE;\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n if (this.state === HeaderState.END) return 0;\n if (this.state === HeaderState.VALUE\n && this.fields.type === SequenceType.MULTIPARTFILE\n ) {\n if (!this._storeValue(this._position)) return this._a();\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n\n public parse(data: Uint32Array, start: number, end: number): number {\n let state = this.state;\n let pos = this._position;\n const buffer = this._buffer;\n if (state === HeaderState.ABORT || state === HeaderState.END) return -1;\n if (state === HeaderState.START && pos > 14) return -1;\n for (let i = start; i < end; ++i) {\n const c = data[i];\n switch (c) {\n case 59: // ;\n if (!this._storeValue(pos)) return this._a();\n state = HeaderState.KEY;\n pos = 0;\n break;\n case 61: // =\n if (state === HeaderState.START) {\n if (buffer[0] === 70) {\n // 'File' or 'FilePart'\n let k = 0;\n for (; k < FILE_MARKER.length; ++k) {\n if (buffer[k] !== FILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILE;\n if (pos === FILEPART_MARKER.length) {\n for (; k < FILEPART_MARKER.length; ++k) {\n if (buffer[k] !== FILEPART_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEPART;\n this.state = HeaderState.END;\n return i + 1;\n }\n } else if (buffer[0] === 77) {\n // 'MultipartFile'\n for (let k = 0; k < MULTIPARTFILE_MARKER.length; ++k) {\n if (buffer[k] !== MULTIPARTFILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.MULTIPARTFILE;\n } else {\n return this._a();\n }\n state = HeaderState.KEY;\n pos = 0;\n } else if (state === HeaderState.KEY) {\n if (!this._storeKey(pos)) return this._a();\n state = HeaderState.VALUE;\n pos = 0;\n } else if (state === HeaderState.VALUE) {\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n break;\n case 58: // :\n if (state === HeaderState.VALUE) {\n if (!this._storeValue(pos)) return this._a();\n }\n this.state = HeaderState.END;\n return i + 1;\n default:\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n }\n this.state = state;\n this._position = pos;\n return -2;\n }\n\n private _a(): number {\n this.fields.type = SequenceType.INVALID;\n this.state = HeaderState.ABORT;\n return -1;\n }\n\n private _storeKey(pos: number): boolean {\n const k = toStr(this._buffer.subarray(0, pos));\n if (k) {\n this._key = k;\n this.fields[k] = null;\n return true;\n }\n return false;\n }\n\n private _storeValue(pos: number): boolean {\n if (this._key) {\n try {\n const v = this._buffer.slice(0, pos);\n this.fields[this._key] = DECODERS[this._key] ? DECODERS[this._key](v) : v;\n } catch {\n return false;\n }\n return true;\n }\n return false;\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\nexport type ImageType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/qoi' | 'image/webp' | 'image/avif' | 'unsupported' | '';\n\nexport interface IMetrics {\n mime: ImageType;\n width: number;\n height: number;\n}\n\nexport const UNSUPPORTED_TYPE: IMetrics = {\n mime: 'unsupported',\n width: 0,\n height: 0\n};\n\nexport function imageType(d: Uint8Array): IMetrics {\n if (d.length < 32) {\n return UNSUPPORTED_TYPE;\n }\n const d32 = new Uint32Array(d.buffer, d.byteOffset, 8);\n // PNG: 89 50 4E 47 0D 0A 1A 0A (8 first bytes == magic number for PNG)\n // + first chunk must be IHDR\n if (d32[0] === 0x474E5089 && d32[1] === 0x0A1A0A0D && d32[3] === 0x52444849) {\n return {\n mime: 'image/png',\n width: d[16] << 24 | d[17] << 16 | d[18] << 8 | d[19],\n height: d[20] << 24 | d[21] << 16 | d[22] << 8 | d[23]\n };\n }\n // JPEG: FF D8 FF\n if (d[0] === 0xFF && d[1] === 0xD8 && d[2] === 0xFF) {\n const [width, height] = jpgSize(d);\n return { mime: 'image/jpeg', width, height };\n }\n // GIF: GIF87a or GIF89a\n if (d32[0] === 0x38464947 && (d[4] === 0x37 || d[4] === 0x39) && d[5] === 0x61) {\n return {\n mime: 'image/gif',\n width: d[7] << 8 | d[6],\n height: d[9] << 8 | d[8]\n };\n }\n // QOI: qoif\n if (d32[0] === 0x66696F71) {\n return {\n mime: 'image/qoi',\n width: d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7],\n height: d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11]\n };\n }\n // WEBP: RIFF | xxxx | WEBP | VP8x\n if (d32[0] === 0x46464952 && d32[2] === 0x50424557 && (d32[3] & 0xFFFFFF) === 0x385056) {\n switch (d[15]) {\n case 0x58: // Extended WebP VP8X --> \"X\"\n return {\n mime: 'image/webp',\n width: (d[24] | d[25] << 8 | d[26] << 16) + 1,\n height: (d[27] | d[28] << 8 | d[29] << 16) + 1\n };\n case 0x4C: // Lossless WebP VP8L --> \"L\"\n if (d[20] !== 0x2f) return UNSUPPORTED_TYPE;\n const dim = d[21] | d[22] << 8 | d[23] << 16 | d[24] << 24;\n return {\n mime: 'image/webp',\n width: (dim & 0x3FFF) + 1,\n height: (dim >>> 14 & 0x3FFF) + 1\n };\n case 0x20: // Lossy WebP VP8 --> \" \"\n if (d[23] !== 0x9d || d[24] !== 0x01 || d[25] !== 0x2a) return UNSUPPORTED_TYPE;\n return {\n mime: 'image/webp',\n width: (d[26] | d[27] << 8) & 0x3FFF,\n height: (d[28] | d[29] << 8) & 0x3FFF\n };\n }\n return UNSUPPORTED_TYPE;\n }\n // AVIF: Box size | ftyp | avif/avis\n if (d32[1] === 0x70797466 && (d32[2] === 0x66697661 || d32[2] === 0x73697661)) {\n let pos = -1;\n // search for ispe box within first 1024 bytes\n const limit = Math.min(d.length - 16, 1024);\n for (let i = 8; i < limit; i++) {\n // scan for ispe\n if (d[i] === 0x69 && d[i + 1] === 0x73 && d[i + 2] === 0x70 && d[i + 3] === 0x65) {\n pos = i;\n break;\n }\n }\n if (pos !== -1) {\n // dimensions are in BE at +8 (width) at +12 (height)\n const width =\n d[pos + 8] << 24 |\n d[pos + 9] << 16 |\n d[pos + 10] << 8 |\n d[pos + 11];\n const height =\n d[pos + 12] << 24 |\n d[pos + 13] << 16 |\n d[pos + 14] << 8 |\n d[pos + 15];\n if (width > 0 && height > 0) {\n return { mime: 'image/avif', width, height };\n }\n }\n return UNSUPPORTED_TYPE;\n }\n return UNSUPPORTED_TYPE;\n}\n\n\nfunction jpgSize(d: Uint8Array): [number, number] {\n const len = d.length;\n let i = 4;\n let blockLength = d[i] << 8 | d[i + 1];\n while (true) {\n i += blockLength;\n if (i >= len) {\n // exhausted without size info\n return [0, 0];\n }\n if (d[i] !== 0xFF) {\n return [0, 0];\n }\n if (d[i + 1] === 0xC0 || d[i + 1] === 0xC2) {\n if (i + 8 < len) {\n return [\n d[i + 7] << 8 | d[i + 8],\n d[i + 5] << 8 | d[i + 6]\n ];\n }\n return [0, 0];\n }\n i += 2;\n blockLength = d[i] << 8 | d[i + 1];\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types';\nimport { ImageRenderer } from '../ImageRenderer';\nimport { CELL_SIZE_DEFAULT } from '../ImageStorage';\nimport { KittyImageStorage } from './KittyImageStorage';\nimport Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport {\n KittyAction,\n KittyFormat,\n KittyCompression,\n IKittyCommand,\n IPendingTransmission,\n IKittyImageData,\n KittyPixelConstants,\n parseKittyCommand\n} from './KittyGraphicsTypes';\n\nconst enum Constants {\n // Memory limit for base64 decoder (4MB, same as IIPHandler)\n DECODER_KEEP_DATA = 4194304,\n DECODER_INITIAL_DATA = 4194304, // 4MB\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n DECODER_OK = 0,\n // Maximum control data size\n MAX_CONTROL_DATA_SIZE = 512,\n // Semicolon codepoint\n SEMICOLON = 0x3B\n}\n\nconst DECODER_OK = Constants.DECODER_OK as unknown as DecodeStatus.OK;\n\n// Kitty graphics protocol handler with streaming base64 decoding.\nexport class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable {\n private _aborted = false;\n private _decodeError = false;\n\n private _activeDecoder: Base64Decoder | null = null;\n private readonly _maxEncodedBytes: number;\n private readonly _initialEncodedBytes: number;\n\n // Streaming related states\n\n // True while receiving control data (before semicolon).\n private _inControlData = true;\n\n // Buffer for control data.\n private _controlData = new Uint32Array(Constants.MAX_CONTROL_DATA_SIZE);\n private _controlLength = 0;\n\n // Pre-calculated encoded size limit\n private _encodedSizeLimit = 0;\n private _totalEncodedSize = 0;\n\n // Parsed command. These are the control data before semicolon.\n private _parsedCommand: IKittyCommand | null = null;\n\n // Storage related states\n\n private _pendingTransmissions: Map<number, IPendingTransmission> = new Map();\n // Tracks the pending key of the most recently started chunked upload.\n // Per spec, subsequent chunks only need m= (and optionally q=), without i=.\n // When a chunk arrives with no i=, this key is used to find the pending upload.\n private _lastPendingKey: number | undefined;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _kittyStorage: KittyImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n // Convert decoded size limit -> max encoded bytes.\n this._maxEncodedBytes = Math.ceil(this._opts.kittySizeLimit * 4 / 3);\n // ensure we preallocate more than configured limit while using 4mb initial size.\n this._initialEncodedBytes = Math.min(Constants.DECODER_INITIAL_DATA, this._maxEncodedBytes);\n }\n\n public reset(): void {\n this._cleanupAllPending();\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n this._kittyStorage.reset();\n }\n\n public dispose(): void {\n this.reset();\n }\n\n private _removePendingEntry(key: number): void {\n this._pendingTransmissions.delete(key);\n if (this._lastPendingKey === key) {\n this._lastPendingKey = undefined;\n }\n }\n\n private _cleanupAllPending(): void {\n for (const pending of this._pendingTransmissions.values()) {\n pending.decoder.release();\n }\n this._pendingTransmissions.clear();\n this._lastPendingKey = undefined;\n }\n\n public start(): void {\n this._aborted = false;\n this._decodeError = false;\n this._inControlData = true;\n this._controlLength = 0;\n this._parsedCommand = null;\n // Pre-calculate encoded limit once: base64 is 4 bytes encoded \u2192 3 bytes decoded\n this._encodedSizeLimit = this._maxEncodedBytes;\n this._totalEncodedSize = 0;\n this._activeDecoder = null;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (!this._inControlData) {\n this._streamPayload(data, start, end);\n } else {\n // Scan for semicolon\n let controlEnd = end;\n for (let i = start; i < end; i++) {\n if (data[i] === Constants.SEMICOLON) {\n this._inControlData = false;\n controlEnd = i;\n break;\n }\n }\n\n // Copy control data\n const copyLength = controlEnd - start;\n if (this._controlLength + copyLength > Constants.MAX_CONTROL_DATA_SIZE) {\n this._aborted = true;\n return;\n }\n this._controlData.set(data.subarray(start, controlEnd), this._controlLength);\n this._controlLength += copyLength;\n\n if (!this._inControlData) {\n // Found semicolon - parse control data early for validation\n this._parsedCommand = parseKittyCommand(this._parseControlDataString());\n\n // Early validation: i+I conflict\n if (this._parsedCommand.id !== undefined && this._parsedCommand.imageNumber !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'EINVAL:cannot specify both i and I keys', this._parsedCommand.quiet ?? 0);\n this._aborted = true;\n return;\n }\n\n // Delete action doesn't need payload - skip streaming\n if (this._parsedCommand.action === KittyAction.DELETE) {\n return;\n }\n\n // Stream remaining as payload\n const payloadStart = controlEnd + 1;\n if (payloadStart < end) {\n this._streamPayload(data, payloadStart, end);\n }\n }\n }\n }\n\n // Stream payload bytes into the base64 decoder.\n private _streamPayload(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n // Check size limit (compare encoded bytes against pre-calculated limit)\n // Include cumulative size from pending transmission for multi-chunk images.\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = this._parsedCommand?.id ?? this._lastPendingKey ?? 0;\n const pending = this._pendingTransmissions.get(pendingKey);\n const previousEncodedSize = pending?.totalEncodedSize ?? 0;\n this._totalEncodedSize += end - start;\n const cumulativeEncodedSize = previousEncodedSize + this._totalEncodedSize;\n if (cumulativeEncodedSize > this._encodedSizeLimit) {\n const decoderToRelease = this._activeDecoder ?? pending?.decoder;\n if (decoderToRelease) {\n decoderToRelease.release();\n }\n this._activeDecoder = null;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n this._aborted = true;\n return;\n }\n\n if (this._decodeError) return;\n\n if (pending?.decoder && !this._activeDecoder) {\n this._activeDecoder = pending.decoder;\n }\n if (!this._activeDecoder) {\n this._activeDecoder = new Base64Decoder(Constants.DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes);\n this._activeDecoder.init();\n }\n\n if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_OK) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n this._decodeError = true;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted || !success) {\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n return true;\n }\n\n // No semicolon = no payload (delete, capability query)\n if (this._inControlData) {\n return this._handleNoPayloadCommand();\n }\n\n // Use command parsed early in put() - i+I already validated there\n const cmd = this._parsedCommand!;\n\n // Delete action was handled by skipping payload - just execute\n if (cmd.action === KittyAction.DELETE) {\n return this._handleDelete(cmd);\n }\n\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = cmd.id ?? this._lastPendingKey ?? 0;\n const isMoreComing = cmd.more === 1;\n const pending = this._pendingTransmissions.get(pendingKey);\n\n if (isMoreComing) {\n if (this._activeDecoder) {\n if (pending) {\n pending.totalEncodedSize += this._totalEncodedSize;\n pending.decodeError = pending.decodeError || this._decodeError;\n } else {\n this._pendingTransmissions.set(pendingKey, {\n cmd: { ...cmd },\n decoder: this._activeDecoder,\n totalEncodedSize: this._totalEncodedSize,\n decodeError: this._decodeError\n });\n }\n this._lastPendingKey = pendingKey;\n this._activeDecoder = null;\n }\n return true;\n }\n\n // Final chunk received \u2014 clear the last pending key\n if (pending) {\n this._lastPendingKey = undefined;\n }\n\n let decodeError = this._decodeError;\n let finalCmd = cmd;\n let decoder = this._activeDecoder;\n\n if (pending) {\n finalCmd = pending.cmd;\n decoder = pending.decoder;\n decodeError = decodeError || pending.decodeError;\n this._pendingTransmissions.delete(pendingKey);\n }\n\n let imageBytes = new Uint8Array(0);\n if (decoder) {\n if (decoder.end() !== DECODER_OK) {\n decodeError = true;\n }\n imageBytes = decoder.data8;\n }\n this._activeDecoder = null;\n\n // Handle command first \u2014 handlers create Blob/ImageData from imageBytes,\n // which copies the data. Only then is it safe to release the decoder's\n // wasm memory that imageBytes points into.\n const result = this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError);\n if (decoder) {\n decoder.release();\n }\n return result;\n }\n\n // Command handling\n\n private _parseControlDataString(): string {\n let str = '';\n for (let i = 0; i < this._controlLength; i++) {\n str += String.fromCodePoint(this._controlData[i]);\n }\n return str;\n }\n\n private _handleNoPayloadCommand(): boolean | Promise<boolean> {\n const cmd = parseKittyCommand(this._parseControlDataString());\n\n // Per spec: specifying both i and I is an error\n if (cmd.id !== undefined && cmd.imageNumber !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0);\n return true;\n }\n\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.DELETE:\n return this._handleDelete(cmd);\n case KittyAction.QUERY:\n this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0);\n return true;\n case KittyAction.PLACEMENT:\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handleCommandWithBytesAndCmd(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.TRANSMIT: {\n const result = this._handleTransmit(cmd, bytes, decodeError);\n // Only send response when _handleTransmit didn't already respond\n // (it handles unsupported transmission medium responses internally)\n if ((cmd.transmission ?? 'd') === 'd' && cmd.id !== undefined) {\n if (decodeError) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n } else if (bytes.length > 0) {\n this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0);\n }\n }\n return result;\n }\n case KittyAction.TRANSMIT_DISPLAY:\n return this._handleTransmitDisplay(cmd, bytes, decodeError);\n case KittyAction.QUERY:\n return this._handleQuery(cmd, bytes, decodeError);\n case KittyAction.PLACEMENT:\n // a=p ignores any payload \u2014 image data was already transmitted\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handlePlacement(cmd: IKittyCommand): boolean | Promise<boolean> {\n if (cmd.id === undefined) {\n return true;\n }\n const id = cmd.id;\n const image = this._kittyStorage.getImage(id);\n if (!image) {\n this._sendResponse(id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId);\n return true;\n }\n const result = this._displayImage(image, cmd);\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId);\n return true;\n });\n }\n\n private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {\n // TODO: Support file-based transmission modes (t=f, t=t, t=s)\n // Currently only supports direct transmission (t=d, the default).\n // - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path.\n // - t=t (temp file): Payload is base64-encoded path in temp directory. Terminal reads, deletes.\n // - t=s: Payload is base64-encoded POSIX shm name. Terminal reads from shared memory.\n // These modes require filesystem/IPC access not available in browsers. For Node.js/Electron:\n // 1. Check cmd.transmission (t key) before treating bytes as image data\n // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents\n // 3. For t=d: treat bytes as image data (current behavior)\n // When implementing, also update _handleQuery to accept these transmission mediums.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported transmission medium', cmd.quiet ?? 0);\n }\n return true;\n }\n\n if (decodeError || bytes.length === 0) return true;\n\n this._kittyStorage.storeImage(cmd.id, {\n data: new Blob([bytes as BlobPart]),\n width: cmd.width ?? 0,\n height: cmd.height ?? 0,\n format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100,\n compression: cmd.compression ?? ''\n });\n return true;\n }\n\n private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n if (decodeError) {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n }\n return true;\n }\n\n this._handleTransmit(cmd, bytes, decodeError);\n\n const id = cmd.id ?? this._kittyStorage.lastImageId;\n const image = this._kittyStorage.getImage(id);\n if (image) {\n const result = this._displayImage(image, cmd);\n if (cmd.id !== undefined) {\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0);\n return true;\n });\n }\n return result.then(() => true);\n }\n return true;\n }\n\n private _handleQuery(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {\n const id = cmd.id ?? 0;\n const quiet = cmd.quiet ?? 0;\n\n // Per spec: reject unsupported transmission mediums (only t=d is supported atm)\n // TODO: When filesystem support is added (Node.js/Electron), update this to accept\n // t=f (file), t=t (temp file), and t=s (shared memory) and respond OK for queries.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n this._sendResponse(id, 'EINVAL:unsupported transmission medium', quiet);\n return true;\n }\n\n // Check decode error first (invalid base64)\n if (decodeError) {\n this._sendResponse(id, 'EINVAL:invalid base64 data', quiet);\n return true;\n }\n\n // Capability query (no payload) - just respond OK\n if (bytes.length === 0) {\n this._sendResponse(id, 'OK', quiet);\n return true;\n }\n\n const format = cmd.format ?? KittyFormat.RGBA;\n\n if (format === KittyFormat.PNG) {\n this._sendResponse(id, 'OK', quiet);\n } else {\n const width = cmd.width ?? 0;\n const height = cmd.height ?? 0;\n\n if (!width || !height) {\n this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet);\n return true;\n }\n\n const bytesPerPixel = format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n this._sendResponse(id, `EINVAL:insufficient pixel data`, quiet);\n return true;\n }\n\n this._sendResponse(id, 'OK', quiet);\n }\n return true;\n }\n\n private _handleDelete(cmd: IKittyCommand): boolean {\n // Per spec: default delete selector is 'a' (delete all visible placements)\n const selector = cmd.deleteSelector ?? 'a';\n\n // TODO: Distinguish lowercase (delete placements only) from uppercase\n // (delete placements + free stored image data). Currently both variants\n // free everything since we don't separate stored data from placements.\n switch (selector) {\n case 'a':\n case 'A':\n this._cleanupAllPending();\n this._kittyStorage.deleteAll();\n break;\n case 'i':\n case 'I':\n // TODO: When placement id tracking is implemented (see TODO in\n // KittyImageStorage), d=i with p=<pid> should delete only that\n // specific placement, while d=i without p should delete all\n // placements for the image.\n if (cmd.id !== undefined) {\n const pending = this._pendingTransmissions.get(cmd.id);\n if (pending) {\n pending.decoder.release();\n }\n this._removePendingEntry(cmd.id);\n this._kittyStorage.deleteById(cmd.id);\n }\n break;\n default:\n // Unsupported selectors (c, n, p, q, r, x, y, z, f) \u2014 ignore for now\n break;\n }\n return true;\n }\n\n private _sendResponse(id: number, message: string, quiet: number, placementId?: number): void {\n const isOk = message === 'OK';\n if (isOk && quiet >= 1) return;\n if (!isOk && quiet >= 2) return;\n\n const pPart = placementId ? `,p=${placementId}` : '';\n const response = `\\x1b_Gi=${id}${pPart};${message}\\x1b\\\\`;\n this._coreTerminal._core.coreService.triggerDataEvent(response);\n }\n\n // Image display\n\n private _displayImage(image: IKittyImageData, cmd: IKittyCommand): Promise<boolean> {\n return this._decodeAndDisplay(image, cmd)\n .then(() => true)\n .catch(() => false);\n }\n\n private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise<void> {\n let bitmap: ImageBitmap | undefined = await this._createBitmap(image);\n\n try {\n const cropX = Math.max(0, cmd.x ?? 0);\n const cropY = Math.max(0, cmd.y ?? 0);\n const cropW = cmd.sourceWidth || (bitmap.width - cropX);\n const cropH = cmd.sourceHeight || (bitmap.height - cropY);\n\n const maxCropW = Math.max(0, bitmap.width - cropX);\n const maxCropH = Math.max(0, bitmap.height - cropY);\n const finalCropW = Math.max(0, Math.min(cropW, maxCropW));\n const finalCropH = Math.max(0, Math.min(cropH, maxCropH));\n\n if (finalCropW === 0 || finalCropH === 0) {\n throw new Error('invalid source rectangle');\n }\n\n if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) {\n const cropped = await createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH);\n bitmap.close();\n bitmap = cropped;\n }\n\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n\n // Per spec: c/r default to image's natural cell dimensions.\n // If only one of c/r is specified, compute the other from image aspect ratio.\n let imgCols: number;\n let imgRows: number;\n if (cmd.columns !== undefined && cmd.rows !== undefined) {\n imgCols = cmd.columns;\n imgRows = cmd.rows;\n } else if (cmd.columns !== undefined) {\n imgCols = cmd.columns;\n imgRows = Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (imgCols * cw) / ch));\n } else if (cmd.rows !== undefined) {\n imgRows = cmd.rows;\n imgCols = Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (imgRows * ch) / cw));\n } else {\n imgCols = Math.ceil(bitmap.width / cw);\n imgRows = Math.ceil(bitmap.height / ch);\n }\n\n let w = bitmap.width;\n let h = bitmap.height;\n\n // Scale bitmap to fit placement rectangle when c/r are specified\n if (cmd.columns !== undefined || cmd.rows !== undefined) {\n w = Math.round(imgCols * cw);\n h = Math.round(imgRows * ch);\n }\n\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n\n // Save cursor position before addImage modifies it\n const buffer = this._coreTerminal._core.buffer;\n const savedX = buffer.x;\n const savedY = buffer.y;\n const savedYbase = buffer.ybase;\n\n // Determine layer based on z-index: negative = behind text, 0+ = on top.\n // When z<0 we always use the bottom layer even without allowTransparency \u2014\n // the image will simply be hidden behind the opaque text background, which\n // is the correct behavior (client asked for \"behind text\").\n const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0;\n const layer: ImageLayer = wantsBottom ? 'bottom' : 'top';\n\n if (w !== bitmap.width || h !== bitmap.height) {\n const scaled = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h });\n bitmap.close();\n bitmap = scaled;\n }\n\n // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions\n const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1);\n const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1);\n if (xOffset !== 0 || yOffset !== 0) {\n // Per spec: X/Y is not added to c/r area. When c/r are explicit, the\n // total placement area remains c*cw \u00D7 r*ch pixels and the offset image\n // is clipped to fit. When c/r are unset, the padded canvas determines\n // the natural cell dimensions.\n const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : bitmap.width + xOffset;\n const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : bitmap.height + yOffset;\n const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH);\n const offsetCtx = offsetCanvas.getContext('2d');\n if (!offsetCtx) {\n throw new Error('Failed to create offset canvas context');\n }\n offsetCtx.drawImage(bitmap, xOffset, yOffset);\n\n const offsetBitmap = await createImageBitmap(offsetCanvas);\n offsetCanvas.width = offsetCanvas.height = 0;\n bitmap.close();\n bitmap = offsetBitmap;\n w = bitmap.width;\n h = bitmap.height;\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n if (cmd.columns === undefined) {\n imgCols = Math.ceil(bitmap.width / cw);\n }\n if (cmd.rows === undefined) {\n imgRows = Math.ceil(bitmap.height / ch);\n }\n }\n\n const zIndex = cmd.zIndex ?? 0;\n this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex);\n bitmap = undefined; // ownership transferred to storage\n\n // Kitty cursor movement\n // Per spec: cursor placed at first column after last image column,\n // on the last row of the image. C=1 means don't move cursor.\n if (cmd.cursorMovement === 1) {\n // C=1: restore cursor to position before image was placed\n const scrolled = buffer.ybase - savedYbase;\n buffer.x = savedX;\n // Can't restore cursor to scrollback?\n buffer.y = Math.max(savedY - scrolled, 0);\n } else {\n // Default (C=0): advance cursor horizontally past the image\n // addImage already positioned cursor on the last row via lineFeeds\n buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols);\n }\n } catch (e) {\n bitmap?.close();\n throw e;\n }\n }\n\n // Create ImageBitmap from already-decoded image data.\n private async _createBitmap(image: IKittyImageData): Promise<ImageBitmap> {\n let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer());\n\n if (image.compression === KittyCompression.ZLIB) {\n bytes = await this._decompressZlib(bytes);\n }\n\n if (image.format === KittyFormat.PNG) {\n const blob = new Blob([bytes as BlobPart], { type: 'image/png' });\n if (!window.createImageBitmap) {\n const url = URL.createObjectURL(blob);\n const img = new Image();\n return new Promise<ImageBitmap>((resolve, reject) => {\n img.addEventListener('load', () => {\n URL.revokeObjectURL(url);\n const canvas = ImageRenderer.createCanvas(window.document, img.width, img.height);\n canvas.getContext('2d')?.drawImage(img, 0, 0);\n createImageBitmap(canvas).then(resolve).catch(reject);\n });\n img.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n });\n img.src = url;\n });\n }\n return createImageBitmap(blob);\n }\n\n // Raw pixel data\n const width = image.width;\n const height = image.height;\n\n if (!width || !height) {\n throw new Error('Width and height required for raw pixel data');\n }\n\n const bytesPerPixel = image.format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n throw new Error('Insufficient pixel data');\n }\n\n const pixelCount = width * height;\n\n if (image.format === KittyFormat.RGBA) {\n // RGBA: use bytes directly \u2014 no copy needed\n return createImageBitmap(new ImageData(new Uint8ClampedArray(bytes.buffer as ArrayBuffer, bytes.byteOffset, pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA), width, height));\n }\n\n // RGB\u2192RGBA: interleave alpha using uint32 block processing (4 pixels per iteration).\n // 3 uint32 reads + 4 uint32 writes per 4 pixels vs 28 byte reads/writes \u2014 ~6x faster.\n // Assumes little-endian (all modern browsers/Node.js).\n const data = new Uint8ClampedArray(pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA);\n const src32 = new Uint32Array(bytes.buffer, bytes.byteOffset, Math.floor(bytes.byteLength / 4));\n const dst32 = new Uint32Array(data.buffer);\n const alignedPixels = pixelCount & ~3; // round down to multiple of 4\n\n let srcOffset = 0;\n let dstOffset = 0;\n for (let i = 0; i < alignedPixels; i += 4) {\n const b0 = src32[srcOffset++];\n const b1 = src32[srcOffset++];\n const b2 = src32[srcOffset++];\n // Little-endian: pixel bytes are [R,G,B] \u2192 uint32 ABGR layout\n dst32[dstOffset++] = 0xFF000000 | b0;\n dst32[dstOffset++] = 0xFF000000 | (b0 >>> 24) | (b1 << 8);\n dst32[dstOffset++] = 0xFF000000 | (b1 >>> 16) | (b2 << 16);\n dst32[dstOffset++] = 0xFF000000 | (b2 >>> 8);\n }\n\n // Handle remaining 1\u20133 pixels\n let srcByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n let dstByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n for (let i = alignedPixels; i < pixelCount; i++) {\n data[dstByte] = bytes[srcByte];\n data[dstByte + 1] = bytes[srcByte + 1];\n data[dstByte + 2] = bytes[srcByte + 2];\n data[dstByte + 3] = KittyPixelConstants.ALPHA_OPAQUE;\n srcByte += KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n dstByte += KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n }\n\n return createImageBitmap(new ImageData(data, width, height));\n }\n\n private async _decompressZlib(compressed: Uint8Array): Promise<Uint8Array> {\n try {\n return await this._decompress(compressed, 'deflate');\n } catch {\n return await this._decompress(compressed, 'deflate-raw');\n }\n }\n\n private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise<Uint8Array> {\n const ds = new DecompressionStream(format);\n const writer = ds.writable.getWriter();\n writer.write(compressed as BufferSource);\n writer.close();\n\n const chunks: Uint8Array[] = [];\n const reader = ds.readable.getReader();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._kittyStorage.images;\n }\n\n public get _kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyStorage.kittyIdToStorageId;\n }\n\n public get pendingTransmissions(): ReadonlyMap<number, IPendingTransmission> {\n return this._pendingTransmissions;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty graphics protocol types, constants, and parsing utilities.\n */\n\nimport type Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\n\n// Kitty graphics protocol action types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'.\nexport const enum KittyAction {\n TRANSMIT = 't',\n TRANSMIT_DISPLAY = 'T',\n QUERY = 'q',\n PLACEMENT = 'p',\n DELETE = 'd'\n}\n\n// Kitty graphics protocol format types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyFormat {\n RGB = 24,\n RGBA = 32,\n PNG = 100\n}\n\n// Kitty graphics protocol compression types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'.\nexport const enum KittyCompression {\n NONE = '',\n ZLIB = 'z'\n}\n\n// Kitty graphics protocol control data keys.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyKey {\n // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete)\n ACTION = 'a',\n // Image format (24=RGB, 32=RGBA, 100=PNG)\n FORMAT = 'f',\n // Image ID for referencing stored images\n ID = 'i',\n // Image number (alternative to ID, terminal assigns ID)\n IMAGE_NUMBER = 'I',\n // Source image width in pixels\n WIDTH = 's',\n // Source image height in pixels\n HEIGHT = 'v',\n // The left edge (in pixels) of the image area to display\n X_OFFSET = 'x',\n // The top edge (in pixels) of the image area to display\n Y_OFFSET = 'y',\n // Width (in pixels) of the source rectangle to display\n SOURCE_WIDTH = 'w',\n // Height (in pixels) of the source rectangle to display\n SOURCE_HEIGHT = 'h',\n // Horizontal offset (in pixels) within the first cell\n X_PLACEMENT_OFFSET = 'X',\n // Vertical offset (in pixels) within the first cell\n Y_PLACEMENT_OFFSET = 'Y',\n // Number of terminal columns to display the image over\n COLUMNS = 'c',\n // Number of terminal rows to display the image over\n ROWS = 'r',\n // More data flag (1=more chunks coming, 0=final chunk)\n MORE = 'm',\n // Compression type (z=zlib). This is essential for chunking larger images.\n COMPRESSION = 'o',\n // Quiet mode (1=suppress OK responses, 2=suppress error responses)\n QUIET = 'q',\n // Cursor movement policy (0=move cursor after image, 1=don't move cursor)\n CURSOR_MOVEMENT = 'C',\n // Z-index for image layering (negative = behind text, 0+ = on top)\n Z_INDEX = 'z',\n // Transmission medium (d=direct, f=file, t=temp file, s=shared memory)\n TRANSMISSION = 't',\n // Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) \u2014 only used when a=d\n DELETE_SELECTOR = 'd',\n // Placement ID for targeting specific placements\n PLACEMENT_ID = 'p'\n}\n\n// Pixel format constants\nexport const enum KittyPixelConstants {\n BYTES_PER_PIXEL_RGB = 3,\n BYTES_PER_PIXEL_RGBA = 4,\n ALPHA_OPAQUE = 255\n}\n\n// Parsed Kitty graphics command.\nexport interface IKittyCommand {\n action?: string;\n format?: number;\n id?: number;\n imageNumber?: number;\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n sourceWidth?: number;\n sourceHeight?: number;\n xOffset?: number;\n yOffset?: number;\n columns?: number;\n rows?: number;\n more?: number;\n quiet?: number;\n cursorMovement?: number;\n zIndex?: number;\n transmission?: string;\n deleteSelector?: string;\n placementId?: number;\n compression?: string;\n payload?: string;\n}\n\n// Pending chunked transmission state.\n// Stores metadata from the first chunk while accumulating decoded payload data.\nexport interface IPendingTransmission {\n // The parsed command from the first chunk (contains action, format, dimensions, etc.)\n cmd: IKittyCommand;\n // Decoder used across chunked payloads\n decoder: Base64Decoder;\n // Total encoded (base64) bytes received across all chunks - for size limit enforcement\n totalEncodedSize: number;\n // Whether any chunk has failed to decode\n decodeError: boolean;\n}\n\n// Stored Kitty image data.\nexport interface IKittyImageData {\n id: number;\n // Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit\n data: Blob;\n width: number;\n height: number;\n format: 24 | 32 | 100;\n compression?: string;\n}\n\n// Parses Kitty graphics control data into a command object.\nexport function parseKittyCommand(data: string): IKittyCommand {\n const cmd: IKittyCommand = {};\n const parts = data.split(',');\n\n for (const part of parts) {\n const eqIdx = part.indexOf('=');\n if (eqIdx === -1) continue;\n\n const key = part.substring(0, eqIdx);\n const value = part.substring(eqIdx + 1);\n\n // Handle string keys first\n if (key === KittyKey.ACTION) {\n cmd.action = value;\n continue;\n }\n if (key === KittyKey.COMPRESSION) {\n cmd.compression = value;\n continue;\n }\n if (key === KittyKey.TRANSMISSION) {\n cmd.transmission = value;\n continue;\n }\n if (key === KittyKey.DELETE_SELECTOR) {\n cmd.deleteSelector = value;\n continue;\n }\n const numValue = parseInt(value, 10);\n switch (key) {\n case KittyKey.FORMAT: cmd.format = numValue; break;\n case KittyKey.ID: cmd.id = numValue; break;\n case KittyKey.IMAGE_NUMBER: cmd.imageNumber = numValue; break;\n case KittyKey.WIDTH: cmd.width = numValue; break;\n case KittyKey.HEIGHT: cmd.height = numValue; break;\n case KittyKey.X_OFFSET: cmd.x = numValue; break;\n case KittyKey.Y_OFFSET: cmd.y = numValue; break;\n case KittyKey.SOURCE_WIDTH: cmd.sourceWidth = numValue; break;\n case KittyKey.SOURCE_HEIGHT: cmd.sourceHeight = numValue; break;\n case KittyKey.X_PLACEMENT_OFFSET: cmd.xOffset = numValue; break;\n case KittyKey.Y_PLACEMENT_OFFSET: cmd.yOffset = numValue; break;\n case KittyKey.COLUMNS: cmd.columns = numValue; break;\n case KittyKey.ROWS: cmd.rows = numValue; break;\n case KittyKey.MORE: cmd.more = numValue; break;\n case KittyKey.QUIET: cmd.quiet = numValue; break;\n case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break;\n case KittyKey.Z_INDEX: cmd.zIndex = numValue; break;\n case KittyKey.PLACEMENT_ID: cmd.placementId = numValue; break;\n }\n }\n\n return cmd;\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { ImageStorage } from '../ImageStorage';\nimport { ImageLayer, IAddImageOpts } from '../Types';\nimport { IKittyImageData } from './KittyGraphicsTypes';\n\n// Kitty-specific image storage controller.\n//\n// Wraps shared ImageStorage with kitty protocol semantics:\n// - tracks transmitted image payloads by kitty image id\n// - tracks kitty image id -> shared ImageStorage id mapping for displayed images\n// - mirrors shared-storage evictions into kitty maps\n// - applies protocol-level undisplayed-image eviction policy\nexport class KittyImageStorage implements IDisposable {\n private static readonly _maxStoredImages = 256;\n\n private _nextImageId = 1;\n private readonly _images: Map<number, IKittyImageData> = new Map();\n // TODO: Support multiple placements per image. The kitty spec identifies\n // placements by an (image id, placement id) pair \u2014 same i + different p\n // values should coexist, and same i + same p should replace the prior\n // placement. Currently we track only one storage entry per kitty image id,\n // so multiple placements of the same image overwrite each other. Fixing\n // this requires changing these maps to Map<number, Map<number, number>>\n // (kittyId \u2192 placementId \u2192 storageId) and updating addImage/deleteById\n // accordingly. The underlying shared ImageStorage would also need to\n // support multiple entries per logical image.\n private readonly _kittyIdToStorageId: Map<number, number> = new Map();\n private readonly _storageIdToKittyId: Map<number, number> = new Map();\n\n private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined;\n private readonly _wrappedOnImageDeleted: (storageId: number) => void;\n private readonly _handleStorageImageDeleted = (storageId: number): void => {\n const kittyId = this._storageIdToKittyId.get(storageId);\n if (kittyId !== undefined) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n this._images.delete(kittyId);\n }\n };\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n\n constructor(\n private readonly _storage: ImageStorage\n ) {\n this._previousOnImageDeleted = this._storage.onImageDeleted;\n this._wrappedOnImageDeleted = (storageId: number) => {\n this._previousOnImageDeleted?.(storageId);\n this._handleStorageImageDeleted(storageId);\n };\n this._storage.onImageDeleted = this._wrappedOnImageDeleted;\n }\n\n public reset(): void {\n this._nextImageId = 1;\n this._images.clear();\n this._kittyIdToStorageId.clear();\n this._storageIdToKittyId.clear();\n }\n\n public dispose(): void {\n this.reset();\n if (this._storage.onImageDeleted === this._wrappedOnImageDeleted) {\n this._storage.onImageDeleted = this._previousOnImageDeleted;\n }\n }\n\n public storeImage(id: number | undefined, imageData: Omit<IKittyImageData, 'id'>): number {\n const imageId = id ?? this._nextImageId++;\n\n const oldStorageId = this._kittyIdToStorageId.get(imageId);\n if (oldStorageId !== undefined) {\n this._storage.deleteImage(oldStorageId);\n this._kittyIdToStorageId.delete(imageId);\n this._storageIdToKittyId.delete(oldStorageId);\n }\n\n if (!this._images.has(imageId) && this._images.size >= KittyImageStorage._maxStoredImages) {\n this._evictUndisplayedImages();\n }\n\n this._images.set(imageId, {\n ...imageData,\n id: imageId\n });\n return imageId;\n }\n\n public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void {\n // Clean up stale reverse-mapping from a previous placement of the same\n // kitty image. The old shared-storage entry is kept (it may still be\n // visible on screen) but its reverse mapping is removed so that eviction\n // of the old entry won't incorrectly delete the kitty image data.\n const oldStorageId = this._kittyIdToStorageId.get(kittyId);\n if (oldStorageId !== undefined) {\n this._storageIdToKittyId.delete(oldStorageId);\n }\n this._addImageOpts.scrolling = scrolling;\n this._addImageOpts.layer = layer;\n this._addImageOpts.zIndex = zIndex;\n const storageId = this._storage.addImage(image, this._addImageOpts);\n this._kittyIdToStorageId.set(kittyId, storageId);\n this._storageIdToKittyId.set(storageId, kittyId);\n }\n\n public getImage(kittyId: number): IKittyImageData | undefined {\n return this._images.get(kittyId);\n }\n\n public deleteById(kittyId: number): void {\n this._images.delete(kittyId);\n const storageId = this._kittyIdToStorageId.get(kittyId);\n if (storageId !== undefined) {\n this._storage.deleteImage(storageId);\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n }\n }\n\n public deleteAll(): void {\n this._images.clear();\n for (const storageId of this._kittyIdToStorageId.values()) {\n this._storage.deleteImage(storageId);\n }\n this._kittyIdToStorageId.clear();\n this._storageIdToKittyId.clear();\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._images;\n }\n\n public get kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyIdToStorageId;\n }\n\n public get lastImageId(): number {\n return this._nextImageId - 1;\n }\n\n private _evictUndisplayedImages(): void {\n for (const [kittyId] of this._images) {\n if (this._images.size <= KittyImageStorage._maxStoredImages / 2) {\n break;\n }\n if (!this._kittyIdToStorageId.has(kittyId)) {\n this._images.delete(kittyId);\n }\n }\n }\n}\n", "/**\n * Copyright (c) 2020, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IDcsHandler, IParams, IImageAddonOptions, ITerminalExt, AttributeData, IResetHandler, ReadonlyColorSet } from './Types';\nimport { toRGBA8888, BIG_ENDIAN, PALETTE_ANSI_256, PALETTE_VT340_COLOR } from 'sixel/lib/Colors';\nimport { RGBA8888 } from 'sixel/lib/Types';\nimport { ImageRenderer } from './ImageRenderer';\n\nimport { DecoderAsync, Decoder } from 'sixel/lib/Decoder';\n\n// always free decoder ressources after decoding if it exceeds this limit\nconst MEM_PERMA_LIMIT = 4194304; // 1024 pixels * 1024 pixels * 4 channels = 4MB\n\n// custom default palette: VT340 (lower 16 colors) + ANSI256 (up to 256) + zeroed (up to 4096)\nconst DEFAULT_PALETTE = PALETTE_ANSI_256;\nDEFAULT_PALETTE.set(PALETTE_VT340_COLOR);\n\n\nexport class SixelHandler implements IDcsHandler, IResetHandler {\n private _size = 0;\n private _aborted = false;\n private _dec: Decoder | undefined;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _storage: SixelImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n DecoderAsync({\n memoryLimit: this._opts.pixelLimit * 4,\n palette: DEFAULT_PALETTE,\n paletteLimit: this._opts.sixelPaletteLimit\n }).then(d => this._dec = d);\n }\n\n public reset(): void {\n /**\n * reset sixel decoder to defaults:\n * - release all memory\n * - nullify palette (4096)\n * - apply default palette (256)\n */\n if (this._dec) {\n this._dec.release();\n // FIXME: missing interface on decoder to nullify full palette\n (this._dec as any)._palette.fill(0);\n this._dec.init(0, DEFAULT_PALETTE, this._opts.sixelPaletteLimit);\n }\n }\n\n public hook(params: IParams): void {\n this._size = 0;\n this._aborted = false;\n if (this._dec) {\n const fillColor = params.params[1] === 1 ? 0 : extractActiveBg(\n this._coreTerminal._core._inputHandler._curAttrData,\n this._coreTerminal._core._themeService?.colors);\n this._dec.init(fillColor, null, this._opts.sixelPaletteLimit);\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted || !this._dec) {\n return;\n }\n this._size += end - start;\n if (this._size > this._opts.sixelSizeLimit) {\n console.warn(`SIXEL: too much data, aborting`);\n this._aborted = true;\n this._dec.release();\n return;\n }\n try {\n this._dec.decode(data, start, end);\n } catch (e) {\n console.warn(`SIXEL: error while decoding image - ${e}`);\n this._aborted = true;\n this._dec.release();\n }\n }\n\n public unhook(success: boolean): boolean | Promise<boolean> {\n if (this._aborted || !success || !this._dec) {\n return true;\n }\n\n const width = this._dec.width;\n const height = this._dec.height;\n\n // partial fix for https://github.com/jerch/xterm-addon-image/issues/37\n if (!width || !height) {\n if (height) {\n this._storage.advanceCursor(height);\n }\n return true;\n }\n\n const canvas = ImageRenderer.createCanvas(undefined, width, height);\n canvas.getContext('2d')?.putImageData(new ImageData(this._dec.data8 as Uint8ClampedArray<ArrayBuffer>, width, height), 0, 0);\n if (this._dec.memoryUsage > MEM_PERMA_LIMIT) {\n this._dec.release();\n }\n this._storage.addImage(canvas);\n return true;\n }\n}\n\n\n/**\n * Some helpers to extract current terminal colors.\n */\n\n// get currently active background color from terminal\n// also respect INVERSE setting\nfunction extractActiveBg(attr: AttributeData, colors: ReadonlyColorSet | undefined): RGBA8888 {\n let bg = 0;\n if (!colors) {\n // FIXME: theme service is prolly not available yet,\n // happens if .open() was not called yet (bug in core?)\n return bg;\n }\n if (attr.isInverse()) {\n if (attr.isFgDefault()) {\n bg = convertLe(colors.foreground.rgba);\n } else if (attr.isFgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getFgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getFgColor()].rgba);\n }\n } else {\n if (attr.isBgDefault()) {\n bg = convertLe(colors.background.rgba);\n } else if (attr.isBgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getBgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getBgColor()].rgba);\n }\n }\n return bg;\n}\n\n// rgba values on the color managers are always in BE, thus convert to LE\nfunction convertLe(color: number): RGBA8888 {\n if (BIG_ENDIAN) return color;\n return (color & 0xFF) << 24 | (color >>> 8 & 0xFF) << 16 | (color >>> 16 & 0xFF) << 8 | color >>> 24 & 0xFF;\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { IImageAddonOptions, ITerminalExt, IAddImageOpts } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\n\n/**\n * Sixel-specific image storage controller.\n *\n * Wraps the shared ImageStorage with sixel protocol semantics:\n * - Cursor behavior governed by DECSET 80 (sixelScrolling option)\n * - advanceCursor for empty sixels carrying only height\n */\nexport class SixelImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'vt340' };\n constructor(\n private readonly _storage: ImageStorage,\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _terminal: ITerminalExt\n ) {}\n\n /**\n * Add a sixel image to storage.\n * Cursor behavior depends on the sixelScrolling option (DECSET 80).\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._addImageOpts.scrolling = this._opts.sixelScrolling;\n this._storage.addImage(img, this._addImageOpts);\n }\n\n /**\n * Only advance text cursor.\n * This is an edge case from empty sixels carrying only a height but no pixels.\n * Partially fixes https://github.com/jerch/xterm-addon-image/issues/37.\n */\n public advanceCursor(height: number): void {\n if (this._opts.sixelScrolling) {\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const rows = Math.ceil(height / cellSize.height);\n for (let i = 1; i < rows; ++i) {\n this._terminal._core._inputHandler.lineFeed();\n }\n }\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAddImageOpts } from './Types';\nimport { ImageStorage } from './ImageStorage';\n\n/**\n * IIP (iTerm Image Protocol) specific image storage controller.\n *\n * Wraps the shared ImageStorage with IIP protocol semantics:\n * - Always uses scrolling mode (cursor advances with image)\n */\nexport class IIPImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n constructor(\n private readonly _storage: ImageStorage\n ) {}\n\n /**\n * Add an IIP image to storage.\n * Always uses scrolling mode \u2014 cursor advances past the image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._storage.addImage(img, this._addImageOpts);\n }\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, IDisposable } from '@xterm/xterm';\nimport type { ImageAddon as IImageApi } from '@xterm/addon-image';\nimport { Emitter, type IEvent } from 'common/Event';\nimport { IIPHandler } from './IIPHandler';\nimport { ImageRenderer } from './ImageRenderer';\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { KittyGraphicsHandler } from './kitty/KittyGraphicsHandler';\nimport { KittyImageStorage } from './kitty/KittyImageStorage';\nimport { SixelHandler } from './SixelHandler';\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types';\n\n\n/**\n * Document VT features provided by this addon.\n *\n * @vt: #E[Supported via @xterm/addon-image.] DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q Pt ST\" \"Draw SIXEL image.\"\n *\n * Sixel support is provided by the addon @xterm/addon-image with these limitations:\n * - immediate coloring (no shared palette, allows high color settings of `img2sixel`)\n * - max. palette size of 4096 colors\n * - max. pixel width of 16K\n * - max. 25 MB per sixel sequence\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] OSC 1337 \"iTerm2 Commands\" \"OSC 1337 ; Pt BEL\" \"Custom iTerm2 commands.\"\n *\n * Only the inline image protocol (IIP) is supported by the addon @xterm/addon-image with\n * the following limitations:\n * - sequence:\n * - format: `OSC 1337 ; File=inline=1 ; size=<unencoded size> ; ... : <base64 payload> BEL`\n * - size param must be set and payload may not exceed CEIL(size * 4 / 3)\n * - strict base64 handling as of RFC4648 \u00A74 (standard alphabet, optional padding,\n * no separator bytes allowed)\n * - supported params: size, name, width, height, preserveAspectRatio\n * - image formats: PNG, JPEG and GIF\n * - no animation support (renders first image of a GIF)\n * - no multipart support\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image)\n * and [iTerm2 IIP docs](https://iterm2.com/documentation-images.html) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] APC KITTY_GRAPHICS \"Kitty Graphics\" \"APC G Pt ST\" \"Kitty Graphics Protocol.\"\n *\n * Kitty graphics support is provided by the addon @xterm/addon-image.\n * Note that while basic image output already works, this is still work in progress.\n */\n\n// default values of addon ctor options\nconst DEFAULT_OPTIONS: IImageAddonOptions = {\n enableSizeReports: true,\n pixelLimit: 16777216, // limit to 4096 * 4096 pixels\n sixelSupport: true,\n sixelScrolling: true,\n sixelPaletteLimit: 4096,\n sixelSizeLimit: 33554432,\n storageLimit: 128,\n showPlaceholder: true,\n iipSupport: true,\n iipSizeLimit: 33554432,\n kittySupport: true,\n kittySizeLimit: 33554432\n};\n\n// max palette size supported by the sixel lib (compile time setting)\nconst MAX_SIXEL_PALETTE_SIZE = 4096;\n\n// definitions for _xtermGraphicsAttributes sequence\nconst enum GaItem {\n COLORS = 1,\n SIXEL_GEO = 2,\n REGIS_GEO = 3\n}\nconst enum GaAction {\n READ = 1,\n SET_DEFAULT = 2,\n SET = 3,\n READ_MAX = 4\n}\nconst enum GaStatus {\n SUCCESS = 0,\n ITEM_ERROR = 1,\n ACTION_ERROR = 2,\n FAILURE = 3\n}\n\n\nexport class ImageAddon implements ITerminalAddon, IImageApi {\n private _opts: IImageAddonOptions;\n private _defaultOpts: IImageAddonOptions;\n private _storage: ImageStorage | undefined;\n private _renderer: ImageRenderer | undefined;\n private _disposables: IDisposable[] = [];\n private _terminal: ITerminalExt | undefined;\n private _handlers: Map<String, IResetHandler> = new Map();\n private readonly _onImageAdded = new Emitter<void>();\n public readonly onImageAdded: IEvent<void> = this._onImageAdded.event;\n\n constructor(opts?: Partial<IImageAddonOptions>) {\n this._opts = Object.assign({}, DEFAULT_OPTIONS, opts);\n this._defaultOpts = Object.assign({}, DEFAULT_OPTIONS, opts);\n }\n\n public dispose(): void {\n for (const obj of this._disposables) {\n obj.dispose();\n }\n this._disposables.length = 0;\n this._handlers.clear();\n this._onImageAdded.dispose();\n }\n\n private _disposeLater(...args: IDisposable[]): void {\n for (const obj of args) {\n this._disposables.push(obj);\n }\n }\n\n public activate(terminal: ITerminalExt): void {\n this._terminal = terminal;\n\n // internal data structures\n this._renderer = new ImageRenderer(terminal);\n this._storage = new ImageStorage(terminal, this._renderer, this._opts);\n this._storage.onImageAdded = () => this._onImageAdded.fire();\n\n // enable size reports\n if (this._opts.enableSizeReports) {\n const windowOps = terminal.options.windowOptions ?? {};\n windowOps.getWinSizePixels = true;\n windowOps.getCellSizePixels = true;\n windowOps.getWinSizeChars = true;\n terminal.options.windowOptions = windowOps;\n }\n\n this._disposeLater(\n this._renderer,\n this._storage,\n\n // DECSET/DECRST/DA1/XTSMGRAPHICS handlers\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this._decset(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this._decrst(params)),\n terminal.parser.registerCsiHandler({ final: 'c' }, params => this._da1(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'S' }, params => this._xtermGraphicsAttributes(params)),\n\n // render hook\n terminal.onRender(range => this._storage?.render(range)),\n\n /**\n * reset handlers covered:\n * - DECSTR\n * - RIS\n * - Terminal.reset()\n */\n terminal.parser.registerCsiHandler({ intermediates: '!', final: 'p' }, () => this.reset()),\n terminal.parser.registerEscHandler({ final: 'c' }, () => this.reset()),\n terminal._core._inputHandler.onRequestReset(() => this.reset()),\n\n // wipe canvas and delete alternate images on buffer switch\n terminal.buffer.onBufferChange(() => this._storage?.wipeAlternate()),\n\n // extend images to the right on resize\n terminal.onResize(metrics => this._storage?.viewportResize(metrics))\n );\n\n // SIXEL handler\n if (this._opts.sixelSupport) {\n const sixelStorage = new SixelImageStorage(this._storage!, this._opts, this._renderer!, terminal);\n const sixelHandler = new SixelHandler(this._opts, sixelStorage, terminal);\n this._handlers.set('sixel', sixelHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerDcsHandler({ final: 'q' }, sixelHandler)\n );\n }\n\n // iTerm IIP handler\n if (this._opts.iipSupport) {\n const iipStorage = new IIPImageStorage(this._storage!);\n const iipHandler = new IIPHandler(this._opts, this._renderer!, iipStorage, terminal);\n this._handlers.set('iip', iipHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerOscHandler(1337, iipHandler)\n );\n }\n\n // Kitty graphics handler\n if (this._opts.kittySupport) {\n const kittyStorage = new KittyImageStorage(this._storage!);\n const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, kittyStorage, terminal);\n this._handlers.set('kitty', kittyHandler);\n this._disposeLater(\n kittyStorage,\n kittyHandler,\n terminal._core._inputHandler._parser.registerApcHandler({ final: 'G' }, kittyHandler)\n );\n }\n }\n\n // Note: storageLimit is skipped here to not intoduce a surprising side effect.\n public reset(): boolean {\n // reset options customizable by sequences to defaults\n this._opts.sixelScrolling = this._defaultOpts.sixelScrolling;\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n // also clear image storage\n this._storage?.reset();\n // reset protocol handlers\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return false;\n }\n\n public get storageLimit(): number {\n return this._storage?.getLimit() || -1;\n }\n\n public set storageLimit(limit: number) {\n this._storage?.setLimit(limit);\n this._opts.storageLimit = limit;\n }\n\n public get storageUsage(): number {\n if (this._storage) {\n return this._storage.getUsage();\n }\n return -1;\n }\n\n public get showPlaceholder(): boolean {\n return this._opts.showPlaceholder;\n }\n\n public set showPlaceholder(value: boolean) {\n this._opts.showPlaceholder = value;\n this._renderer?.showPlaceholder(value);\n }\n\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.getImageAtBufferCell(x, y);\n }\n\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.extractTileAtBufferCell(x, y);\n }\n\n private _report(s: string): void {\n this._terminal?._core.input(s, false);\n }\n\n private _decset(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = false;\n break;\n }\n }\n return false;\n }\n\n private _decrst(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = true;\n break;\n }\n }\n return false;\n }\n\n // overload DA to return something more appropriate\n private _da1(params: (number | number[])[]): boolean {\n if (params[0]) {\n return true;\n }\n // reported features:\n // 62 - VT220\n // 4 - SIXEL support\n // 9 - charsets\n // 22 - ANSI colors\n if (this._opts.sixelSupport) {\n this._report(`\\x1b[?62;4;9;22c`);\n return true;\n }\n return false;\n }\n\n /**\n * Implementation of xterm's graphics attribute sequence.\n *\n * Supported features:\n * - read/change palette limits (max 4096 by sixel lib)\n * - read SIXEL canvas geometry (reports current window canvas or\n * squared pixelLimit if canvas > pixel limit)\n *\n * Everything else is deactivated.\n */\n private _xtermGraphicsAttributes(params: (number | number[])[]): boolean {\n if (params.length < 2) {\n return true;\n }\n if (params[0] === GaItem.COLORS) {\n switch (params[1]) {\n case GaAction.READ:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n return true;\n case GaAction.SET_DEFAULT:\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n // also reset protocol handlers for now\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return true;\n case GaAction.SET:\n if (params.length > 2 && !(params[2] instanceof Array) && params[2] <= MAX_SIXEL_PALETTE_SIZE) {\n this._opts.sixelPaletteLimit = params[2];\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n } else {\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n }\n return true;\n case GaAction.READ_MAX:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${MAX_SIXEL_PALETTE_SIZE}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n if (params[0] === GaItem.SIXEL_GEO) {\n switch (params[1]) {\n // we only implement read and read_max here\n case GaAction.READ:\n let width = this._renderer?.dimensions?.css.canvas.width;\n let height = this._renderer?.dimensions?.css.canvas.height;\n if (!width || !height) {\n // for some reason we have no working image renderer\n // --> fallback to default cell size\n const cellSize = CELL_SIZE_DEFAULT;\n width = (this._terminal?.cols || 80) * cellSize.width;\n height = (this._terminal?.rows || 24) * cellSize.height;\n }\n if (width * height < this._opts.pixelLimit) {\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${width.toFixed(0)};${height.toFixed(0)}S`);\n } else {\n // if we overflow pixelLimit report that squared instead\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n }\n return true;\n case GaAction.READ_MAX:\n // read_max returns pixelLimit as square area\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n // exit with error on ReGIS or any other requests\n this._report(`\\x1b[?${params[0]};${GaStatus.ITEM_ERROR}S`);\n return true;\n }\n}\n"],
|
||
- "mappings": "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",
|
||
- "names": ["exports", "red", "n", "green", "blue", "alpha", "toRGBA8888", "r", "g", "b", "a", "fromRGBA8888", "color", "nearestColorIndex", "palette", "min", "idx", "i", "dr", "dg", "db", "d", "clamp", "low", "high", "value", "h2c", "t1", "t2", "c", "HLStoRGB", "h", "l", "s", "v", "normalizeRGB", "normalizeHLS", "p", "require_lib", "__commonJSMin", "exports", "InWasm", "z", "b", "r", "def", "t", "s", "d", "m", "W", "e", "require_Base64Decoder_wasm", "__commonJSMin", "exports", "inwasm_runtime_1", "wasmDecode", "MAP", "el", "D", "i", "EMPTY", "Base64Decoder", "keepSize", "maxBytes", "initialBytes", "m", "bytes", "requested", "needed", "newSize", "addPages", "data", "require_QoiDecoder_wasm", "__commonJSMin", "exports", "inwasm_runtime_1", "wasmQoiDecode", "QoiDecoder", "keepSize", "d", "pixels", "ib", "dl", "bytes", "chunkP", "exports", "Colors_1", "wasm_1", "decodeBase64", "bytestring", "result", "WASM_BYTES", "WASM_MODULE", "NULL_CANVAS", "CallbackProxy", "width", "mode", "DEFAULT_OPTIONS", "DecoderAsync", "opts", "cbProxy", "importObj", "inst", "Decoder", "exports", "_instance", "_cbProxy", "module", "pixels", "offset", "additionalPixels", "newCanvas", "adv", "remaining", "c", "i", "fillColor", "palette", "paletteLimit", "truncate", "data", "start", "end", "p", "length", "j", "currentWidth", "escape", "final", "finalOffset", "bw", "currentHeight", "decode", "dec", "decodeAsync", "toDisposable", "fn", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "listeners", "len", "EventUtils", "forward", "from", "to", "e", "map", "i", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "import_Colors", "ImageRenderer", "_ImageRenderer", "Disposable", "_terminal", "MutableDisposable", "parent", "option", "toDisposable", "localDocument", "width", "height", "canvas", "ctx", "buffer", "imgData", "img", "value", "start", "end", "layer", "y", "w", "h", "imgSpec", "tileId", "col", "row", "count", "cols", "sx", "sy", "dx", "dy", "finalWidth", "finalHeight", "spec", "currentWidth", "currentHeight", "originalWidth", "originalHeight", "renderer", "key", "screenElement", "bWidth", "blueprint", "d32", "black", "white", "shift", "offset", "x", "ctx2", "i", "bitmap", "stringFromCodePoint", "codePoint", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "CELL_SIZE_DEFAULT", "ImageTileInfo", "imageId", "tileId", "ImageStorage", "_terminal", "_renderer", "_opts", "CellData", "e", "spec", "value", "storedPixels", "id", "zero", "img", "opts", "cellSize", "cols", "rows", "buffer", "termCols", "termRows", "originX", "originY", "offset", "tileCount", "row", "line", "col", "endMarker", "imgSpec", "range", "hasTopImages", "hasBottomImages", "start", "end", "drawCalls", "placeholderCalls", "startTile", "startCol", "count", "nextE", "a", "b", "call", "metrics", "oldCol", "tilesPerRow", "hasData", "rightCol", "lastTile", "expandCol", "x", "y", "orig", "canvas", "ImageRenderer", "room", "used", "current", "workCell", "old", "oldSpec", "extattr", "payload", "import_Base64Decoder", "import_QoiDecoder", "toStr", "data", "s", "i", "toInt", "v", "toSize", "toName", "bs", "b", "DECODERS", "FILE_MARKER", "MULTIPARTFILE_MARKER", "FILEPART_MARKER", "FILEEND_MARKER", "REPORTCELLSIZE_MARKER", "MAX_FIELDCHARS", "HeaderParser", "k", "start", "end", "state", "pos", "buffer", "c", "UNSUPPORTED_TYPE", "imageType", "d", "d32", "width", "height", "jpgSize", "dim", "pos", "limit", "i", "len", "blockLength", "DEFAULT_HEADER", "IIPHandler", "_opts", "_renderer", "_storage", "_coreTerminal", "HeaderParser", "maxEncodedBytes", "initialBytes", "Base64Decoder", "QoiDecoder", "data", "start", "end", "dataPos", "success", "seqType", "w", "CELL_SIZE_DEFAULT", "h", "scale", "report", "cond", "metrics", "UNSUPPORTED_TYPE", "imageType", "blob", "canvas", "ImageRenderer", "bm", "e", "cw", "ch", "width", "height", "rw", "rh", "wf", "hf", "f", "s", "total", "cdim", "import_Base64Decoder", "parseKittyCommand", "data", "cmd", "parts", "part", "eqIdx", "key", "value", "numValue", "DECODER_OK", "KittyGraphicsHandler", "_opts", "_renderer", "_kittyStorage", "_coreTerminal", "key", "pending", "data", "start", "end", "controlEnd", "i", "copyLength", "parseKittyCommand", "payloadStart", "pendingKey", "previousEncodedSize", "decoderToRelease", "Base64Decoder", "success", "cmd", "isMoreComing", "decodeError", "finalCmd", "decoder", "imageBytes", "result", "str", "bytes", "id", "image", "quiet", "format", "width", "height", "bytesPerPixel", "expectedBytes", "message", "placementId", "isOk", "pPart", "response", "bitmap", "cropX", "cropY", "cropW", "cropH", "maxCropW", "maxCropH", "finalCropW", "finalCropH", "cropped", "cw", "CELL_SIZE_DEFAULT", "ch", "imgCols", "imgRows", "w", "h", "buffer", "savedX", "savedY", "savedYbase", "layer", "scaled", "xOffset", "yOffset", "canvasW", "canvasH", "offsetCanvas", "ImageRenderer", "offsetCtx", "offsetBitmap", "zIndex", "scrolled", "e", "blob", "url", "img", "resolve", "reject", "canvas", "pixelCount", "src32", "dst32", "alignedPixels", "srcOffset", "dstOffset", "b0", "b1", "b2", "srcByte", "dstByte", "compressed", "ds", "writer", "chunks", "reader", "done", "value", "totalLength", "sum", "chunk", "offset", "_KittyImageStorage", "_storage", "storageId", "kittyId", "id", "imageData", "imageId", "oldStorageId", "image", "scrolling", "layer", "zIndex", "KittyImageStorage", "import_Colors", "import_Decoder", "MEM_PERMA_LIMIT", "DEFAULT_PALETTE", "SixelHandler", "_opts", "_storage", "_coreTerminal", "d", "params", "fillColor", "extractActiveBg", "data", "start", "end", "e", "success", "width", "height", "canvas", "ImageRenderer", "attr", "colors", "bg", "convertLe", "t", "color", "SixelImageStorage", "_storage", "_opts", "_renderer", "_terminal", "img", "height", "cellSize", "CELL_SIZE_DEFAULT", "rows", "i", "IIPImageStorage", "_storage", "img", "DEFAULT_OPTIONS", "MAX_SIXEL_PALETTE_SIZE", "ImageAddon", "opts", "Emitter", "DEFAULT_OPTIONS", "obj", "args", "terminal", "ImageRenderer", "ImageStorage", "windowOps", "params", "range", "metrics", "sixelStorage", "SixelImageStorage", "sixelHandler", "SixelHandler", "iipStorage", "IIPImageStorage", "iipHandler", "IIPHandler", "kittyStorage", "KittyImageStorage", "kittyHandler", "KittyGraphicsHandler", "handler", "limit", "value", "x", "y", "s", "i", "MAX_SIXEL_PALETTE_SIZE", "width", "height", "cellSize", "CELL_SIZE_DEFAULT"]
|
||
+ "sources": ["../../../node_modules/sixel/src/Colors.ts", "../../../node_modules/inwasm-runtime/lib/index.cjs", "../../../node_modules/xterm-wasm-parts/lib/base64/Base64Decoder.wasm.js", "../../../node_modules/xterm-wasm-parts/lib/qoi/QoiDecoder.wasm.js", "../../../node_modules/sixel/src/wasm.ts", "../../../node_modules/sixel/src/Decoder.ts", "../../../src/common/Lifecycle.ts", "../../../src/common/Event.ts", "../../../src/common/Async.ts", "../src/ImageRenderer.ts", "../../../src/common/input/TextDecoder.ts", "../../../src/common/buffer/AttributeData.ts", "../../../src/common/buffer/CellData.ts", "../src/ImageStorage.ts", "../src/IIPHandler.ts", "../src/IIPHeaderParser.ts", "../src/IIPMetrics.ts", "../src/kitty/KittyGraphicsHandler.ts", "../src/kitty/KittyGraphicsTypes.ts", "../src/kitty/KittyImageStorage.ts", "../src/SixelHandler.ts", "../src/SixelImageStorage.ts", "../src/IIPImageStorage.ts", "../src/ImageAddon.ts"],
|
||
+ "sourcesContent": [null, "\"use strict\";\n/**\n * Copyright (c) 2022, 2026 Joerg Breitbart\n * @license MIT\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InWasm = InWasm;\nlet z = (s) => {\n if (Uint8Array.fromBase64)\n return Uint8Array.fromBase64(s);\n if (typeof Buffer !== 'undefined')\n return Buffer.from(s, 'base64');\n const b = atob(s);\n const r = new Uint8Array(b.length);\n for (let i = 0; i < r.length; ++i)\n r[i] = b.charCodeAt(i);\n return r;\n};\nfunction InWasm(def) {\n if (def.d) {\n const { t, s, d } = def;\n let b;\n let m;\n const W = WebAssembly;\n if (t === 0 /* OutputType.INSTANCE */) {\n if (s)\n return (e) => new W.Instance(m || (m = new W.Module(b || (b = z(d)))), e);\n return (e) => m\n ? W.instantiate(m, e)\n : W.instantiate(b || (b = z(d)), e).then(r => (m = r.module) && r.instance);\n }\n if (t === 1 /* OutputType.MODULE */) {\n if (s)\n return () => m || (m = new W.Module(b || (b = z(d))));\n return () => m\n ? Promise.resolve(m)\n : W.compile(b || (b = z(d))).then(r => m = r);\n }\n if (s)\n return () => b || (b = z(d));\n return () => Promise.resolve(b || (b = z(d)));\n }\n if (typeof _wasmCtx === 'undefined')\n throw new Error('must run \"inwasm\"');\n _wasmCtx.add(def);\n}\n//# sourceMappingURL=index.js.map", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023, 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\n/**\n * wasm base64 decoder.\n */\nconst wasmDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#828e69684093b2c6:rdef-start:\"decode\"*/{s:1,t:0,d:'AGFzbQEAAAABBQFgAAF/Ag8BA2VudgZtZW1vcnkCAAEDAwIAAAcNAgNkZWMAAANlbmQAAQqLBgKZBAEKf0GIKCgCAEGgKGohAUGEKCgCACIDQaAoaiEAQYAoKAIAQQFrQXxxIgRBoChqIQUgBEEQayADSgRAIARBkChqIQMDQCABIABBA2otAABBAnQoAoAgIABBAmotAABBAnQoAoAYIABBAWotAABBAnQoAoAQIAAtAABBAnQoAoAIcnJyIgY2AgAgAUEDaiAAQQdqLQAAQQJ0KAKAICAAQQZqLQAAQQJ0KAKAGCAAQQVqLQAAQQJ0KAKAECAAQQRqLQAAQQJ0KAKACHJyciIHNgIAIAFBBmogAEELai0AAEECdCgCgCAgAEEKai0AAEECdCgCgBggAEEJai0AAEECdCgCgBAgAEEIai0AAEECdCgCgAhycnIiCDYCACABQQlqIABBD2otAABBAnQoAoAgIABBDmotAABBAnQoAoAYIABBDWotAABBAnQoAoAQIABBDGotAABBAnQoAoAIcnJyIgk2AgAgAiAGciAHciAIciAJciECIAFBDGohASAAQRBqIgAgA0kNAAsLIAAgBUkEQANAIAEgAEEDai0AAEECdCgCgCAgAEECai0AAEECdCgCgBggAEEBai0AAEECdCgCgBAgAC0AAEECdCgCgAhycnIiAzYCACACIANyIQIgAUEDaiEBIABBBGoiACAFSQ0ACwtBfyEAIAJB////B00Ef0GEKCAENgIAQYgoIAFBoChrNgIAQQAFQX8LC+0BAQR/AkBBgCgoAgAiAUGEKCgCACIAa0EFTgRAQX8hAxAADQFBgCgoAgAhAUGEKCgCACEAC0F/IQMgASAAayIBQQJIDQAgAC0AoShBAnQoAoAQIAAtAKAoQQJ0KAKACHIhAgJ/IAFBBEYEQEEDQQQgAC0AoyhBPUYbIAAtAKIoQT1GayEBC0EBIAFBA0kNABogAC0AoihBAnQoAoAYIAJyIQJBAiABQQRHDQAaIAAtAKMoQQJ0KAKAICACciECQQMLIQEgAkH///8HSw0AQQAhA0GIKCgCACIAIAI2AKAoQYgoIAAgAWo2AgALIAML'}/*inwasm#828e69684093b2c6:rdef-end:\"decode\"*/);\n// SIMD version (speedup ~1.4x, not covered by tests yet)\n/*\nconst wasmDecode = InWasm({\n name: 'decode',\n type: OutputType.INSTANCE,\n mode: OutputMode.SYNC,\n srctype: 'Clang-C',\n imports: {\n env: { memory: new WebAssembly.Memory({ initial: 1 }) }\n },\n exports: {\n dec: () => 0,\n end: () => 0\n },\n compile: {\n switches: ['-msimd128', '-Wl,-z,stack-size=0', '-Wl,--stack-first']\n },\n code: `\n #include <wasm_simd128.h>\n typedef struct {\n unsigned int wp;\n unsigned int sp;\n unsigned int dp;\n unsigned int e_size;\n unsigned int dummy[4];\n unsigned char data[0];\n } State;\n\n unsigned int *D0 = (unsigned int *) ${P32.D0 * 4};\n unsigned int *D1 = (unsigned int *) ${P32.D1 * 4};\n unsigned int *D2 = (unsigned int *) ${P32.D2 * 4};\n unsigned int *D3 = (unsigned int *) ${P32.D3 * 4};\n State *state = (State *) ${P32.STATE * 4};\n\n #define packed_byte(x) wasm_i8x16_splat((char) x)\n #define packed_dword(x) wasm_i32x4_splat(x)\n #define masked(x, mask) wasm_v128_and(x, wasm_i32x4_splat(mask))\n\n __attribute__((noinline)) int dec() {\n unsigned int nsp = (state->wp - 1) & ~3;\n unsigned char *src = state->data + state->sp;\n unsigned char *end = state->data + nsp;\n unsigned char *dst = state->data + state->dp;\n unsigned int error = 0;\n\n v128_t err = wasm_i8x16_splat(0);\n unsigned char *end16 = state->data + (nsp & ~15);\n while (src < end16) {\n v128_t data = wasm_v128_load((v128_t *) src);\n\n // wasm-simd rewrite of http://0x80.pl/notesen/2016-01-17-sse-base64-decoding.html#vector-lookup-pshufb\n const v128_t higher_nibble = wasm_u32x4_shr(data, 4) & packed_byte(0x0f);\n const char linv = 1;\n const char hinv = 0;\n\n const v128_t lower_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n linv, linv, 0x2b, 0x30,\n 0x41, 0x50, 0x61, 0x70,\n linv, linv, linv, linv,\n linv, linv, linv, linv\n );\n const v128_t upper_bound_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n hinv, hinv, 0x2b, 0x39,\n 0x4f, 0x5a, 0x6f, 0x7a,\n hinv, hinv, hinv, hinv,\n hinv, hinv, hinv, hinv\n );\n // the difference between the shift and lower bound\n const v128_t shift_LUT = wasm_i8x16_const(\n // order: 0 1 2 3 4 5 6 7 8 9 a b c d e f\n 0x00, 0x00, 0x3e - 0x2b, 0x34 - 0x30,\n 0x00 - 0x41, 0x0f - 0x50, 0x1a - 0x61, 0x29 - 0x70,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00\n );\n\n const v128_t upper_bound = wasm_i8x16_swizzle(upper_bound_LUT, higher_nibble);\n const v128_t lower_bound = wasm_i8x16_swizzle(lower_bound_LUT, higher_nibble);\n\n const v128_t below = wasm_i8x16_lt(data, lower_bound);\n const v128_t above = wasm_i8x16_gt(data, upper_bound);\n const v128_t eq_2f = wasm_i8x16_eq(data, packed_byte(0x2f));\n\n // in_range = not (below or above) or eq_2f\n // outside = not in_range = below or above and not eq_2f (from deMorgan law)\n const v128_t outside = wasm_v128_andnot(eq_2f, above | below);\n err = wasm_v128_or(err, outside);\n\n const v128_t shift = wasm_i8x16_swizzle(shift_LUT, higher_nibble);\n const v128_t t0 = wasm_i8x16_add(data, shift);\n v128_t v = wasm_i8x16_add(t0, wasm_v128_and(eq_2f, packed_byte(-3)));\n\n // pack bytes\n const v128_t ca = masked(v, 0x003f003f);\n const v128_t db = masked(v, 0x3f003f00);\n const v128_t t00 = wasm_v128_or(wasm_u32x4_shr(db, 8), wasm_i32x4_shl(ca, 6));\n v128_t res = wasm_v128_or(wasm_u32x4_shr(t00, 16), wasm_i32x4_shl(t00, 12));\n res = wasm_i8x16_swizzle(res, wasm_i8x16_const(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 16, 16, 16, 16));\n\n wasm_v128_store((v128_t *) dst, res);\n dst += 12;\n src += 16;\n }\n //if (wasm_i8x16_bitmask(err) != 0) return -1;\n if (wasm_v128_any_true(err)) return -1;\n\n // operate on 4-byte blocks\n while (src < end) {\n error |= *((unsigned int *) dst) = D0[src[0]] | D1[src[1]] | D2[src[2]] | D3[src[3]];\n dst += 3;\n src += 4;\n }\n if (error >> 24) return -1;\n state->sp = nsp;\n state->dp = dst - state->data;\n return 0;\n }\n\n int end() {\n int rem = state->wp - state->sp;\n if (rem > 4 && dec()) return -1;\n rem = state->wp - state->sp;\n if (rem < 2) return -1;\n\n unsigned char *src = state->data + state->sp;\n if (rem == 4) {\n if (src[3] == 61) rem--;\n if (src[2] == 61) rem--;\n }\n unsigned int accu = D0[src[0]] | D1[src[1]];\n int dp = 1;\n if (rem > 2) {\n accu |= D2[src[2]];\n dp++;\n if (rem == 4) {\n accu |= D3[src[3]];\n dp++;\n }\n }\n if (accu >> 24) return -1;\n *((unsigned int *) (state->data + state->dp)) = accu;\n state->dp += dp;\n return 0;\n }\n `\n});\n*/\n// base64 map\nconst MAP = new Uint8Array('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n .split('')\n .map(el => el.charCodeAt(0)));\n// init decoder maps in LE order\nconst D = new Uint32Array(1024);\nD.fill(0xFF000000);\nfor (let i = 0; i < MAP.length; ++i)\n D[MAP[i]] = i << 2;\nfor (let i = 0; i < MAP.length; ++i)\n D[256 + MAP[i]] = i >> 4 | ((i << 4) & 0xFF) << 8;\nfor (let i = 0; i < MAP.length; ++i)\n D[512 + MAP[i]] = (i >> 2) << 8 | ((i << 6) & 0xFF) << 16;\nfor (let i = 0; i < MAP.length; ++i)\n D[768 + MAP[i]] = i << 16;\nconst EMPTY = new Uint8Array(0);\n/**\n * base64 stream decoder.\n *\n * Features / assumptions:\n * - lazy chunkwise decoding\n * - errors out on any non base64 chars (no support for NL formatted base64)\n * - decodes in wasm\n * - inplace decoding to save memory\n * - supports a keepSize for lazy memory release\n */\nclass Base64Decoder {\n /**\n * @param keepSize Keep the wasm instance below this limit when calling `release()`.\n * @param maxBytes Max allowed bytes to allocate.\n * @param initialBytes Initial bytes to allocate.\n */\n constructor(keepSize, maxBytes, initialBytes) {\n this._inst = null;\n this._ended = true;\n this._bytes = 0;\n this.keepSize = keepSize !== null && keepSize !== void 0 ? keepSize : 1048576 /* Bytes.KEEP */;\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : 4294901760 /* Bytes.MAX */;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : 32768 /* Bytes.INITIAL */;\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw new Error('invalid byte settings');\n }\n }\n /**\n * Currently decoded bytes (borrowed).\n * Must be accessed before calling `release` or `init`.\n */\n get data8() {\n return this._inst ? this._d.subarray(0, this._m32[1282 /* P32.STATE_DP */]) : EMPTY;\n }\n /**\n * Release memory conditionally based on `keepSize`.\n * If memory gets released, also the wasm instance will be freed and recreated on next `init`,\n * otherwise the instance will be reused.\n */\n release() {\n if (!this._inst)\n return;\n if (this._bytes > this.keepSize) {\n this._inst = this._m32 = this._d = this._mem = null;\n }\n else {\n this._m32[1280 /* P32.STATE_WP */] = 0;\n this._m32[1281 /* P32.STATE_SP */] = 0;\n this._m32[1282 /* P32.STATE_DP */] = 0;\n }\n }\n /**\n * Initializes the decoder for new base64 data.\n * Must be called before doing any decoding attempts.\n * The method will either spawn a new wasm instance or grow\n * the needed memory of an existing instance.\n * @param maxBytes Max allowed bytes to allocate (overwrites ctor value).\n * @param initialBytes Initial bytes to allocate (overwrites ctor value).\n */\n init(maxBytes, initialBytes) {\n this.maxBytes = maxBytes !== null && maxBytes !== void 0 ? maxBytes : this.maxBytes;\n this._bytes = initialBytes !== null && initialBytes !== void 0 ? initialBytes : Math.min(this._bytes, this.maxBytes);\n if (this._bytes > this.maxBytes || this.maxBytes > 4294901760 /* Bytes.MAX */) {\n throw Error('invalid byte settings');\n }\n let m = this._m32;\n const bytes = this._bytes + 5152 /* Bytes._DATA_OFFSET */;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmDecode({ env: { memory: this._mem } });\n m = new Uint32Array(this._mem.buffer, 0);\n m.set(D, 256 /* P32.D0 */);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n m = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n m[1280 /* P32.STATE_WP */] = 0;\n m[1281 /* P32.STATE_SP */] = 0;\n m[1282 /* P32.STATE_DP */] = 0;\n this._m32 = m;\n this._ended = false;\n }\n /**\n * Realloc memory. Realloc only happens, if the requested\n * size doesn't fit in the current memory.\n * The new size will be capped by `maxBytes`.\n * @param requested Bytes to be stored.\n */\n _realloc(requested) {\n const needed = this._m32[1280 /* P32.STATE_WP */] + requested;\n if (this._bytes < needed) {\n if (needed > this.maxBytes) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n let newSize = this._bytes;\n while ((newSize *= 2) < needed) { }\n newSize = Math.min(newSize, this.maxBytes);\n if (newSize < needed) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n if (newSize + 5152 /* Bytes._DATA_OFFSET */ > this._mem.buffer.byteLength) {\n const addPages = Math.ceil((newSize + 5152 /* Bytes._DATA_OFFSET */ - this._mem.buffer.byteLength) / 65536);\n this._mem.grow(addPages);\n this._m32 = new Uint32Array(this._mem.buffer, 0);\n this._d = new Uint8Array(this._mem.buffer, 5152 /* Bytes._DATA_OFFSET */);\n }\n this._bytes = newSize;\n }\n return 0 /* DecodeStatus.OK */;\n }\n /**\n * Put bytes in `data` into the decoder.\n * Additionally decodes the payload, if it reached 2^17 bytes.\n * The return value indicates the type of issue.\n * @param data Bytes to be loaded.\n */\n put(data) {\n if (!this._inst || this._ended) {\n return -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n if (this._realloc(data.length)) {\n return -3 /* DecodeStatus.SIZE_EXCEEDED */;\n }\n const m = this._m32;\n this._d.set(data, m[1280 /* P32.STATE_WP */]);\n m[1280 /* P32.STATE_WP */] += data.length;\n // max chunk in input handler is 2^17, try to run in \"tandem mode\"\n return m[1280 /* P32.STATE_WP */] - m[1281 /* P32.STATE_SP */] >= 131072\n ? this._inst.exports.dec()\n : 0 /* DecodeStatus.OK */;\n }\n /**\n * End the current decoding.\n * Also decodes leftover payload from previous put calls.\n */\n end() {\n this._ended = true;\n return this._inst\n ? this._inst.exports.end()\n : -2 /* DecodeStatus.NOT_INITIALIZED */;\n }\n /**\n * Bytes loaded into the decoder.\n */\n get loadedBytes() {\n return this._inst\n ? this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n /**\n * Free bytes to feed to the decoder.\n */\n get freeBytes() {\n return this._inst\n ? this.maxBytes - this._m32[1280 /* P32.STATE_WP */]\n : 0;\n }\n}\nexports.default = Base64Decoder;\n//# sourceMappingURL=Base64Decoder.wasm.js.map", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nconst inwasm_runtime_1 = require(\"inwasm-runtime\");\nconst wasmQoiDecode = (0, inwasm_runtime_1.InWasm)(/*inwasm#459f9e1bfb80b1a8:rdef-start:\"qoi_decode\"*/{s:1,t:0,d:'AGFzbQEAAAABCgJgAABgA39/fwACDwEDZW52Bm1lbW9yeQIAAQMDAgABBwcBA2RlYwABCAEACu4EAgwAQQBBAEGAAvwLAAveBAEJf0EAQQBBgAL8CwAgAUEXTgRAIAAgAWpBCGshCkGACCEBIAJBAnRBgAhqIQsgAEEOaiEDQf8BIQZBACECA0AgA0EBaiEHIAMtAAAiCEE/cSEAAkACQCAIQcABcSIJRQRAIABBAnQiAC0AAyEGIAAtAAIhBCAALQABIQUgAC0AACECIAchAwwBCwJAIAhB/QFLDQAgCUHAAUcNACAFQQVsIAJBA2xqIARBB2xqIAZBC2xqQT9xQQJ0IgMgBDoAAiADIAU6AAEgAyACOgAAIANBA2ogBjoAAANAIAEgAjoAACABQQNqIAY6AAAgAUECaiAEOgAAIAFBAWogBToAACABQQRqIQEgAEUEQCAHIQMMBAsgAEEBayEAIAEgC0kNAAsgByEDDAILAn8CQAJAAkAgCEH+AWsOAgABAgsgAy0AAyEEIAMtAAIhBSADLQABIQIgA0EEagwCCyADKAIBIgJBGHYhBiACQRB2IQQgAkEIdiEFIANBBWoMAQsgCUGAAUcEQCAHIAlBwABHDQEaIAQgCEEDcWpBAmshBCACIABBBHZqQQJrIQIgBSAIQQJ2QQNxakECayEFIAcMAQsgBCAAQShrIgkgAy0AASIHQQ9xamohBCACIAdBBHYgCWpqIQIgACAFakEgayEFIANBAmoLIQMgBUEFbCACQQNsaiAEQQdsaiAGQQtsakE/cUECdCIAIAQ6AAIgACAFOgABIAAgAjoAACAAQQNqIAY6AAALIAEgBjoAAyABIAQ6AAIgASAFOgABIAEgAjoAACABQQRqIQELIAMgCkkNAAsLCw=='}/*inwasm#459f9e1bfb80b1a8:rdef-end:\"qoi_decode\"*/);\nclass QoiDecoder {\n constructor(keepSize) {\n this.keepSize = keepSize;\n this.width = 0;\n this.height = 0;\n }\n decode(d) {\n this.width = d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7];\n this.height = d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11];\n const pixels = this.width * this.height;\n const ib = pixels * 4;\n const dl = d.length;\n /**\n * byte/offset calculation:\n * To save some memory we dont reserve full memory for decoded + encoded,\n * but place encoded at the end of decoded plus 50% security distance\n * to avoid reads before writes positions:\n *\n * encoded < decoded (good compression)\n * enc ####################\n * dec #######################################\n * ^ ^\n * DST_P CHUNK_P\n *\n * encoded > decoded (degenerated compression, should not happen)\n * enc ##############################\n * dec ####################\n * ^ ^\n * DST_P CHUNK_P\n *\n * There is still a chance for overlapping r/w positions in case the compressed\n * data has very different pixel progression, yet the 50% security distance\n * should deal with that, as QOI will bloat data by 25% at max (RGB -> OP byte + RGB).\n * Since we always assume RGBA at decoding stage, the possible bloat reduces to 20% at max.\n */\n const bytes = Math.max(ib, dl) + (Math.min(ib, dl) >> 1) + 4096;\n if (!this._inst) {\n this._mem = new WebAssembly.Memory({ initial: Math.ceil(bytes / 65536) });\n this._inst = wasmQoiDecode({ env: { memory: this._mem } });\n }\n else if (this._mem.buffer.byteLength < bytes) {\n this._mem.grow(Math.ceil((bytes - this._mem.buffer.byteLength) / 65536));\n this._d = null;\n }\n if (!this._d) {\n this._d = new Uint8Array(this._mem.buffer);\n }\n // put src data at the end of memory, also align to 256\n const chunkP = (this._mem.buffer.byteLength - dl) & ~0xFF;\n this._d.set(d, chunkP);\n this._inst.exports.dec(chunkP, dl, pixels);\n return this._d.subarray(1024 /* P8.DST_P */, 1024 /* P8.DST_P */ + ib);\n }\n release() {\n if (!this._inst)\n return;\n if (this._mem.buffer.byteLength > this.keepSize) {\n this._inst = this._d = this._mem = null;\n }\n }\n}\nexports.default = QoiDecoder;\n//# sourceMappingURL=QoiDecoder.wasm.js.map", null, null, "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;\nexport function dispose<T extends IDisposable>(disposables: T[]): T[];\nexport function dispose<T extends IDisposable>(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set<IDisposable>();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add<T extends IDisposable>(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register<T extends IDisposable>(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\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 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 * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent<T> {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter<T> {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent<T> | undefined;\n\n public get event(): IEvent<T> {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward<T>(from: IEvent<T>, to: Emitter<T>): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map<I, O>(event: IEvent<I>, map: (i: I) => O): IEvent<O> {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any<T>(...events: IEvent<T>[]): IEvent<T>;\n export function any(...events: IEvent<any>[]): IEvent<void>;\n export function any<T>(...events: IEvent<T>[]): IEvent<T> {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toRGBA8888 } from 'sixel/lib/Colors';\nimport { IDisposable } from '@xterm/xterm';\nimport { ICellSize, ImageLayer, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types';\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\n\nconst enum Constants {\n PLACEHOLDER_LENGTH = 4096,\n PLACEHOLDER_HEIGHT = 24\n}\n\n/**\n * ImageRenderer - terminal frontend extension:\n * - provide primitives for canvas, ImageData, Bitmap (static)\n * - add canvas layer to DOM (browser only for now)\n * - draw image tiles onRender\n */\nexport class ImageRenderer extends Disposable implements IDisposable {\n /** @deprecated Kept for backward compat \u2014 points to top layer canvas. */\n public get canvas(): HTMLCanvasElement | undefined { return this._layers.get('top')?.canvas; }\n private _layers = new Map<ImageLayer, CanvasRenderingContext2D>();\n private _placeholder: HTMLCanvasElement | undefined;\n private _placeholderBitmap: ImageBitmap | undefined;\n private _optionsRefresh = this._register(new MutableDisposable());\n private _oldOpen: ((parent: HTMLElement) => void) | undefined;\n private _renderService: IRenderService | undefined;\n private _oldSetRenderer: ((renderer: any) => void) | undefined;\n\n // drawing primitive - canvas\n public static createCanvas(localDocument: Document | undefined, width: number, height: number): HTMLCanvasElement {\n /**\n * NOTE: We normally dont care, from which document the canvas\n * gets created, so we can fall back to global document,\n * if the terminal has no document associated yet.\n * This way early image loads before calling .open keep working\n * (still discouraged though, as the metrics will be screwed up).\n * Only the DOM output canvas should be on the terminal's document,\n * which gets explicitly checked in `insertLayerToDom`.\n */\n const canvas = (localDocument ?? document).createElement('canvas');\n canvas.width = width | 0;\n canvas.height = height | 0;\n return canvas;\n }\n\n // drawing primitive - ImageData with optional buffer\n public static createImageData(ctx: CanvasRenderingContext2D, width: number, height: number, buffer?: ArrayBuffer): ImageData {\n if (typeof ImageData !== 'function') {\n const imgData = ctx.createImageData(width, height);\n if (buffer) {\n imgData.data.set(new Uint8ClampedArray(buffer, 0, width * height * 4));\n }\n return imgData;\n }\n return buffer\n ? new ImageData(new Uint8ClampedArray(buffer, 0, width * height * 4), width, height)\n : new ImageData(width, height);\n }\n\n // drawing primitive - ImageBitmap\n public static createImageBitmap(img: ImageBitmapSource): Promise<ImageBitmap | undefined> {\n if (typeof createImageBitmap !== 'function') {\n return Promise.resolve(undefined);\n }\n return createImageBitmap(img);\n }\n\n\n constructor(private _terminal: ITerminalExt) {\n super();\n this._oldOpen = this._terminal._core.open;\n this._terminal._core.open = (parent: HTMLElement): void => {\n this._oldOpen?.call(this._terminal._core, parent);\n this._open();\n };\n if (this._terminal._core.screenElement) {\n this._open();\n }\n // hack to spot fontSize changes\n this._optionsRefresh.value = this._terminal._core.optionsService.onOptionChange(option => {\n if (option === 'fontSize') {\n this.rescaleCanvas();\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n });\n this._register(toDisposable(() => {\n this.removeLayerFromDom();\n this.removeLayerFromDom('bottom');\n if (this._terminal._core && this._oldOpen) {\n this._terminal._core.open = this._oldOpen;\n this._oldOpen = undefined;\n }\n if (this._renderService && this._oldSetRenderer) {\n this._renderService.setRenderer = this._oldSetRenderer;\n this._oldSetRenderer = undefined;\n }\n this._renderService = undefined;\n this._layers.clear();\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }));\n }\n\n /**\n * Enable the placeholder.\n */\n public showPlaceholder(value: boolean): void {\n if (value) {\n if (!this._placeholder && this.cellSize.height !== -1) {\n this._createPlaceHolder(Math.max(this.cellSize.height + 1, Constants.PLACEHOLDER_HEIGHT));\n }\n } else {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n this._placeholder = undefined;\n }\n this._renderService?.refreshRows(0, this._terminal.rows);\n }\n\n /**\n * Dimensions of the terminal.\n * Forwarded from internal render service.\n */\n public get dimensions(): IRenderDimensions | undefined {\n return this._terminal.dimensions;\n }\n\n /**\n * Current cell size (float).\n */\n public get cellSize(): ICellSize {\n return {\n width: this.dimensions?.css.cell.width || -1,\n height: this.dimensions?.css.cell.height || -1\n };\n }\n\n public refreshAll(): void {\n this._renderService?.refreshRows(0, this._terminal.rows - 1);\n }\n\n /**\n * Clear a region of the image layer canvas.\n */\n public clearLines(start: number, end: number, layer?: ImageLayer): void {\n const y = start * (this.dimensions?.css.cell.height || 0);\n const w = this.dimensions?.css.canvas.width || 0;\n const h = (end + 1 - start) * (this.dimensions?.css.cell.height || 0);\n if (!layer || layer === 'top') {\n this._layers.get('top')?.clearRect(0, y, w, h);\n }\n if (!layer || layer === 'bottom') {\n this._layers.get('bottom')?.clearRect(0, y, w, h);\n }\n }\n\n /**\n * Clear whole image canvas.\n */\n public clearAll(layer?: ImageLayer): void {\n if (!layer || layer === 'top') {\n const ctx = this._layers.get('top');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n if (!layer || layer === 'bottom') {\n const ctx = this._layers.get('bottom');\n ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }\n\n /**\n * Draw neighboring tiles on the image layer canvas.\n */\n public draw(imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get(imgSpec.layer);\n if (!ctx) {\n return;\n }\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const { width: sourceWidth, height: sourceHeight } = imgSpec.actualCellSize;\n const cols = Math.ceil(img.width / sourceWidth);\n\n const sx = (tileId % cols) * sourceWidth;\n const sy = Math.floor(tileId / cols) * sourceHeight;\n const dx = col * width;\n const dy = row * height;\n\n // safari bug: never access image source out of bounds\n const finalWidth = count * sourceWidth + sx > img.width ? img.width - sx : count * sourceWidth;\n const finalHeight = sy + sourceHeight > img.height ? img.height - sy : sourceHeight;\n\n // Floor all pixel offsets to get stable tile mapping without any overflows.\n // Note: For not pixel perfect aligned cells like in the DOM renderer\n // this will move a tile slightly to the top/left (subpixel range, thus ignore it).\n // FIX #34: avoid striping on displays with pixelDeviceRatio != 1 by ceiling height and width\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.ceil(finalWidth), Math.ceil(finalHeight),\n Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth * width / sourceWidth), Math.ceil(finalHeight * height / sourceHeight)\n );\n }\n\n // Fit the original source into the cell grid without distorting its aspect ratio.\n public drawCellImage(imgSpec: IImageSpec, boxCols: number, boxRows: number, gridRow: number, gridCol: number, count: number, col: number, row: number): void {\n const ctx = this._layers.get(imgSpec.layer);\n if (!ctx) {\n return;\n }\n const { width, height } = this.cellSize;\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n const img = imgSpec.orig;\n if (!img) {\n return;\n }\n\n const boxWidth = boxCols * width;\n const boxHeight = boxRows * height;\n const fitWidth = img.width * boxHeight > img.height * boxWidth;\n const scale = fitWidth\n ? boxWidth / Math.max(1, img.width)\n : boxHeight / Math.max(1, img.height);\n const xOffset = fitWidth ? 0 : (boxWidth - img.width * scale) / 2;\n const yOffset = fitWidth ? (boxHeight - img.height * scale) / 2 : 0;\n\n // Clip source and destination together so edge tiles are not stretched.\n let dx = col * width;\n let dy = row * height;\n let dw = count * width;\n let dh = height;\n let sx = (gridCol * width - xOffset) / scale;\n let sy = (gridRow * height - yOffset) / scale;\n let sw = dw / scale;\n let sh = dh / scale;\n if (sx < 0) {\n const clipped = -sx * scale;\n dx += clipped;\n dw -= clipped;\n sw += sx;\n sx = 0;\n }\n if (sy < 0) {\n const clipped = -sy * scale;\n dy += clipped;\n dh -= clipped;\n sh += sy;\n sy = 0;\n }\n if (sx + sw > img.width) {\n sw = img.width - sx;\n dw = sw * scale;\n }\n if (sy + sh > img.height) {\n sh = img.height - sy;\n dh = sh * scale;\n }\n if (sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {\n return;\n }\n ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n\n /**\n * Extract a single tile from an image.\n */\n public extractTile(imgSpec: IImageSpec, tileId: number): HTMLCanvasElement | undefined {\n const { width, height } = this.cellSize;\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n this._rescaleImage(imgSpec, width, height);\n const img = imgSpec.actual!;\n const { width: sourceWidth, height: sourceHeight } = imgSpec.actualCellSize;\n const cols = Math.ceil(img.width / sourceWidth);\n const sx = (tileId % cols) * sourceWidth;\n const sy = Math.floor(tileId / cols) * sourceHeight;\n const finalWidth = sourceWidth + sx > img.width ? img.width - sx : sourceWidth;\n const finalHeight = sy + sourceHeight > img.height ? img.height - sy : sourceHeight;\n\n const canvas = ImageRenderer.createCanvas(this.document, Math.ceil(finalWidth * width / sourceWidth), Math.ceil(finalHeight * height / sourceHeight));\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(\n img,\n Math.floor(sx), Math.floor(sy), Math.floor(finalWidth), Math.floor(finalHeight),\n 0, 0, canvas.width, canvas.height\n );\n return canvas;\n }\n }\n\n /**\n * Draw a line with placeholder on the image layer canvas.\n */\n public drawPlaceholder(col: number, row: number, count: number = 1): void {\n const ctx = this._layers.get('top');\n if (ctx) {\n const { width, height } = this.cellSize;\n\n // Don't try to draw anything, if we cannot get valid renderer metrics.\n if (width === -1 || height === -1) {\n return;\n }\n\n if (!this._placeholder) {\n this._createPlaceHolder(Math.max(height + 1, Constants.PLACEHOLDER_HEIGHT));\n } else if (height >= this._placeholder!.height) {\n this._createPlaceHolder(height + 1);\n }\n if (!this._placeholder) return;\n ctx.drawImage(\n this._placeholderBitmap ?? this._placeholder!,\n col * width,\n (row * height) % 2 ? 0 : 1, // needs %2 offset correction\n width * count,\n height,\n col * width,\n row * height,\n width * count,\n height\n );\n }\n }\n\n /**\n * Rescale image layer canvas if needed.\n * Checked once from `ImageStorage.render`.\n */\n public rescaleCanvas(): void {\n const w = this.dimensions?.css.canvas.width || 0;\n const h = this.dimensions?.css.canvas.height || 0;\n for (const ctx of this._layers.values()) {\n if (ctx.canvas.width !== w || ctx.canvas.height !== h) {\n ctx.canvas.width = w;\n ctx.canvas.height = h;\n }\n }\n }\n\n /**\n * Rescale image in storage if needed.\n */\n private _rescaleImage(spec: IImageSpec, currentWidth: number, currentHeight: number): void {\n if (currentWidth === spec.actualCellSize.width && currentHeight === spec.actualCellSize.height) {\n return;\n }\n const { width: originalWidth, height: originalHeight } = spec.origCellSize;\n if (currentWidth === originalWidth && currentHeight === originalHeight) {\n spec.actual = spec.orig;\n spec.actualCellSize.width = originalWidth;\n spec.actualCellSize.height = originalHeight;\n return;\n }\n const scaledWidth = Math.ceil(spec.orig!.width * currentWidth / originalWidth);\n const scaledHeight = Math.ceil(spec.orig!.height * currentHeight / originalHeight);\n // Upscale visible tiles directly; a full zoomed copy can dwarf the image budget.\n if (scaledWidth * scaledHeight > spec.orig!.width * spec.orig!.height) {\n spec.actual = spec.orig;\n spec.actualCellSize.width = originalWidth;\n spec.actualCellSize.height = originalHeight;\n return;\n }\n const canvas = ImageRenderer.createCanvas(this.document, scaledWidth, scaledHeight);\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(spec.orig!, 0, 0, canvas.width, canvas.height);\n spec.actual = canvas;\n spec.actualCellSize.width = currentWidth;\n spec.actualCellSize.height = currentHeight;\n }\n }\n\n /**\n * Lazy init for the renderer.\n */\n private _open(): void {\n this._renderService = this._terminal._core._renderService;\n this._oldSetRenderer = this._renderService.setRenderer.bind(this._renderService);\n this._renderService.setRenderer = (renderer: any) => {\n for (const key of [...this._layers.keys()]) {\n this.removeLayerFromDom(key);\n }\n this._oldSetRenderer?.call(this._renderService, renderer);\n };\n }\n\n public insertLayerToDom(layer: ImageLayer = 'top'): void {\n // make sure that the terminal is attached to a document and to DOM\n if (!this.document || !this._terminal._core.screenElement) {\n console.warn('image addon: cannot insert output canvas to DOM, missing document or screenElement');\n return;\n }\n if (this._layers.has(layer)) {\n return;\n }\n const canvas = ImageRenderer.createCanvas(\n this.document, this.dimensions?.css.canvas.width || 0,\n this.dimensions?.css.canvas.height || 0\n );\n canvas.classList.add(`xterm-image-layer-${layer}`);\n const screenElement = this._terminal._core.screenElement;\n // Use isolation to create a stacking context without overriding z-index,\n // which would conflict with integrators (e.g. VS Code) that set their\n // own z-index on the screen element.\n screenElement.style.isolation = 'isolate';\n if (layer === 'bottom') {\n // Use z-index:-1 so it paints behind non-positioned text elements.\n // The screen element needs to be a stacking context (via isolation)\n // to contain the negative z-index, otherwise it would go behind the\n // entire terminal.\n canvas.style.zIndex = '-1';\n screenElement.insertBefore(canvas, screenElement.firstChild);\n } else {\n // Explicit z-index ensures the image canvas reliably stacks above\n // the text layer (DOM renderer rows). z-index: 0 is below the\n // selection overlay (z-index: 1).\n canvas.style.zIndex = '0';\n screenElement.appendChild(canvas);\n }\n const ctx = canvas.getContext('2d', { alpha: true });\n if (!ctx) {\n canvas.remove();\n return;\n }\n this._layers.set(layer, ctx);\n this.clearAll(layer);\n }\n\n public removeLayerFromDom(layer: ImageLayer = 'top'): void {\n const ctx = this._layers.get(layer);\n if (ctx) {\n ctx.canvas.remove();\n this._layers.delete(layer);\n }\n }\n\n public hasLayer(layer: ImageLayer): boolean {\n return this._layers.has(layer);\n }\n\n private _createPlaceHolder(height: number = Constants.PLACEHOLDER_HEIGHT): void {\n this._placeholderBitmap?.close();\n this._placeholderBitmap = undefined;\n\n // create blueprint to fill placeholder with\n const bWidth = 32; // must be 2^n\n const blueprint = ImageRenderer.createCanvas(this.document, bWidth, height);\n const ctx = blueprint.getContext('2d', { alpha: false });\n if (!ctx) return;\n const imgData = ImageRenderer.createImageData(ctx, bWidth, height);\n const d32 = new Uint32Array(imgData.data.buffer);\n const black = toRGBA8888(0, 0, 0);\n const white = toRGBA8888(255, 255, 255);\n d32.fill(black);\n for (let y = 0; y < height; ++y) {\n const shift = y % 2;\n const offset = y * bWidth;\n for (let x = 0; x < bWidth; x += 2) {\n d32[offset + x + shift] = white;\n }\n }\n ctx.putImageData(imgData, 0, 0);\n\n // create placeholder line, width aligned to blueprint width\n const width = (screen.width + bWidth - 1) & ~(bWidth - 1) || Constants.PLACEHOLDER_LENGTH;\n this._placeholder = ImageRenderer.createCanvas(this.document, width, height);\n const ctx2 = this._placeholder.getContext('2d', { alpha: false });\n if (!ctx2) {\n this._placeholder = undefined;\n return;\n }\n for (let i = 0; i < width; i += bWidth) {\n ctx2.drawImage(blueprint, i, 0);\n }\n const placeholder = this._placeholder;\n ImageRenderer.createImageBitmap(placeholder).then(bitmap => {\n if (this._placeholder !== placeholder) bitmap?.close();\n else this._placeholderBitmap = bitmap;\n }).catch(() => {});\n }\n\n public get document(): Document | undefined {\n return this._terminal._core._coreBrowserService?.window.document;\n }\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;\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]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\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) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './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 public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\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 payload: Object | undefined;\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 public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\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 && this.payload === undefined;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\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 public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { ImageRenderer } from './ImageRenderer';\nimport type {\n ITerminalExt, IImageAddonOptions, IImageSpec, ICellSize, IAddImageOpts\n} from './Types';\nimport type { IBufferLine } from 'common/buffer/Types';\nimport { CellData } from 'common/buffer/CellData';\n\n// fallback default cell size\nexport const CELL_SIZE_DEFAULT: ICellSize = {\n width: 7,\n height: 14\n};\n\nclass ImageTileInfo {\n constructor(\n public imageId = -1,\n public tileId = -1) {\n }\n}\n\n/**\n * ImageStorage - extension of CoreTerminal:\n * - hold image data\n * - write/read image data to/from buffer\n *\n * TODO: image composition for overwrites\n */\nexport class ImageStorage implements IDisposable {\n // storage\n private _images: Map<number, IImageSpec> = new Map();\n // last used id\n private _lastId = 0;\n // last evicted id\n private _lowestId = 0;\n // whether a full clear happened before\n private _fullyCleared = false;\n // whether render should do a full clear\n private _needsFullClear = false;\n // hard limit of stored pixels (fallback limit of 10 MB)\n private _pixelLimit: number = 2500000;\n private _workCell: CellData = new CellData();\n\n private _viewportMetrics: { cols: number, rows: number };\n public onImageAdded: (() => void) | undefined;\n public onImageDeleted: ((storageId: number) => void) | undefined;\n // Placeholder cells carry image references in text and colors, not tile attributes.\n public onRenderLine: ((line: IBufferLine, row: number, cols: number) => void) | undefined;\n\n constructor(\n private _terminal: ITerminalExt,\n private _renderer: ImageRenderer,\n private _opts: IImageAddonOptions\n ) {\n try {\n this.setLimit(this._opts.storageLimit);\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n }\n console.warn(`storageLimit is set to ${this.getLimit()} MB`);\n }\n this._viewportMetrics = {\n cols: this._terminal.cols,\n rows: this._terminal.rows\n };\n }\n\n public dispose(): void {\n this.reset();\n }\n\n public reset(): void {\n for (const id of [...this._images.keys()]) {\n this.deleteImage(id);\n }\n this._renderer.clearAll();\n }\n\n public getLimit(): number {\n return this._pixelLimit * 4 / 1000000;\n }\n\n public setLimit(value: number): void {\n if (value < 0.5 || value > 1000) {\n throw RangeError('invalid storageLimit, should be at least 0.5 MB and not exceed 1G');\n }\n this._pixelLimit = (value / 4 * 1000000) >>> 0;\n this._evictOldest(0);\n }\n\n public getUsage(): number {\n return this._getStoredPixels() * 4 / 1000000;\n }\n\n private _getStoredPixels(): number {\n let storedPixels = 0;\n for (const spec of this._images.values()) {\n if (spec.orig) {\n storedPixels += spec.orig.width * spec.orig.height;\n if (spec.actual && spec.actual !== spec.orig) {\n storedPixels += spec.actual.width * spec.actual.height;\n }\n }\n }\n return storedPixels;\n }\n\n private _delImg(id: number): void {\n const spec = this._images.get(id);\n if (!spec) return;\n this._images.delete(id);\n // FIXME: really ugly workaround to get bitmaps deallocated :(\n if (window.ImageBitmap && spec.orig instanceof ImageBitmap) {\n spec.orig.close();\n }\n this.onImageDeleted?.(id);\n this._renderer.refreshAll();\n }\n\n /**\n * Wipe canvas and images on alternate buffer.\n */\n public wipeAlternate(): void {\n // remove all alternate tagged images\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate') {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n // mark canvas to be wiped on next render\n this._needsFullClear = true;\n this._fullyCleared = false;\n }\n\n /**\n * Delete an image by its internal storage ID.\n * Used by protocols that support explicit deletion (e.g. Kitty a=d).\n */\n public deleteImage(id: number): void {\n const spec = this._images.get(id);\n if (spec) {\n spec.marker?.dispose();\n this._delImg(id);\n }\n }\n\n public addUnplacedImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {\n // never allow storage to exceed memory limit\n this._evictOldest(img.width * img.height);\n\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n\n const imageId = ++this._lastId;\n this._images.set(imageId, {\n orig: img,\n origCellSize: cellSize,\n actual: img,\n actualCellSize: { ...cellSize },\n marker: undefined,\n tileCount: 0,\n virtual: true,\n bufferType: this._terminal.buffer.active.type,\n layer: opts.layer,\n zIndex: opts.zIndex\n });\n this.onImageAdded?.();\n return imageId;\n }\n\n public getImageSpec(id: number): IImageSpec | undefined {\n return this._images.get(id);\n }\n\n /**\n * Method to add an image to the storage.\n * @param img - The image to add (canvas or bitmap).\n * @param opts - Options for addImage:\n * - scrolling: When true, cursor advances with the image.\n * When false, image is placed at ORIGIN and cursor does not move.\n * - layer: Which canvas layer to render on ('top' or 'bottom').\n * - zIndex: Z-index for image layering within the same layer.\n * - cursorPos: 'vt340' for bottom-left, 'iip' for bottom.right.\n * @returns The internal image ID assigned to the stored image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {\n // never allow storage to exceed memory limit\n this._evictOldest(img.width * img.height);\n\n // calc rows x cols needed to display the image\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const cols = Math.ceil(img.width / cellSize.width);\n const rows = Math.ceil(img.height / cellSize.height);\n\n const imageId = ++this._lastId;\n\n const buffer = this._terminal._core.buffer;\n const termCols = this._terminal.cols;\n const termRows = this._terminal.rows;\n const originX = buffer.x;\n const originY = buffer.y;\n let offset = originX;\n let tileCount = 0;\n\n if (!opts.scrolling) {\n buffer.x = 0;\n buffer.y = 0;\n offset = 0;\n }\n\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(buffer.y + buffer.ybase)!;\n for (let col = 0; col < cols; ++col) {\n if (offset + col >= termCols) break;\n this._writeToCell(line, offset + col, imageId, row * cols + col);\n tileCount++;\n }\n if (opts.scrolling) {\n if (row < rows - 1) this._terminal._core._inputHandler.lineFeed();\n } else {\n if (++buffer.y >= termRows) break;\n }\n buffer.x = offset;\n }\n this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y);\n\n // cursor positioning modes\n if (opts.scrolling) {\n if (opts.cursorPos === 'iip') {\n buffer.x = Math.min(offset + cols, termCols);\n } else {\n buffer.x = offset;\n }\n } else {\n buffer.x = originX;\n buffer.y = originY;\n }\n\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.tileCount < 1 && !spec.virtual) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n\n // eviction marker:\n // delete the image when the marker gets disposed\n const endMarker = this._terminal.registerMarker(0);\n endMarker?.onDispose(() => {\n const spec = this._images.get(imageId);\n if (spec) {\n this._delImg(imageId);\n }\n });\n\n // since markers do not work on alternate for some reason,\n // we evict images here manually\n if (this._terminal.buffer.active.type === 'alternate') {\n this._evictOnAlternate();\n }\n\n // create storage entry\n const imgSpec: IImageSpec = {\n orig: img,\n origCellSize: cellSize,\n actual: img,\n actualCellSize: { ...cellSize }, // clone needed, since later modified\n marker: endMarker || undefined,\n tileCount,\n bufferType: this._terminal.buffer.active.type,\n layer: opts.layer,\n zIndex: opts.zIndex\n };\n\n // finally add the image\n this._images.set(imageId, imgSpec);\n this.onImageAdded?.();\n return imageId;\n }\n\n\n /**\n * Render method. Collects buffer information and triggers\n * canvas updates.\n */\n // TODO: Should we move this to the ImageRenderer?\n public render(range: { start: number, end: number }): void {\n // Determine which layers have images\n let hasTopImages = false;\n let hasBottomImages = false;\n for (const spec of this._images.values()) {\n if (spec.layer === 'bottom') {\n hasBottomImages = true;\n } else {\n hasTopImages = true;\n }\n if (hasTopImages && hasBottomImages) break;\n }\n\n // Lazily insert layers that are needed\n if (hasTopImages && !this._renderer.hasLayer('top')) {\n this._renderer.insertLayerToDom('top');\n if (!this._renderer.hasLayer('top')) return;\n }\n if (hasBottomImages && !this._renderer.hasLayer('bottom')) {\n this._renderer.insertLayerToDom('bottom');\n }\n\n // rescale if needed\n this._renderer.rescaleCanvas();\n\n // exit early if we dont have any images to test for\n if (!this._images.size) {\n if (!this._fullyCleared) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n if (this._renderer.hasLayer('top')) {\n this._renderer.removeLayerFromDom('top');\n }\n if (this._renderer.hasLayer('bottom')) {\n this._renderer.removeLayerFromDom('bottom');\n }\n return;\n }\n\n // Remove layers no longer needed\n if (!hasTopImages && this._renderer.hasLayer('top')) {\n this._renderer.clearAll('top');\n this._renderer.removeLayerFromDom('top');\n }\n if (!hasBottomImages && this._renderer.hasLayer('bottom')) {\n this._renderer.clearAll('bottom');\n this._renderer.removeLayerFromDom('bottom');\n }\n\n // buffer switches force a full clear\n if (this._needsFullClear) {\n this._renderer.clearAll();\n this._fullyCleared = true;\n this._needsFullClear = false;\n }\n\n const { start, end } = range;\n const buffer = this._terminal._core.buffer;\n const cols = this._terminal._core.cols;\n\n // clear drawing area\n this._renderer.clearLines(start, end);\n\n // Collect draw calls so we can sort by z-index (lower z drawn first).\n const drawCalls: { imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number }[] = [];\n const placeholderCalls: { col: number, row: number, count: number }[] = [];\n\n // walk all cells in viewport and collect tiles found\n for (let row = start; row <= end; ++row) {\n const line = buffer.lines.get(row + buffer.ydisp);\n if (!line) return;\n this.onRenderLine?.(line, row, cols);\n for (let col = 0; col < cols; ++col) {\n const e = line.getExtended(col)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (e.tileId !== -1) {\n const startTile = e.tileId;\n const startCol = col;\n let count = 1;\n /**\n * merge tiles to the right into a single draw call, if:\n * - not at end of line\n * - cell has same image id\n * - cell has consecutive tile id\n */\n while (++col < cols) {\n const nextE = line.getExtended(col)?.payload;\n if (!(nextE instanceof ImageTileInfo) || nextE.imageId !== imageId || nextE.tileId !== startTile + count) {\n break;\n }\n count++;\n }\n col--;\n if (imgSpec) {\n if (imgSpec.actual) {\n drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count });\n }\n } else if (this._opts.showPlaceholder) {\n placeholderCalls.push({ col: startCol, row, count });\n }\n this._fullyCleared = false;\n }\n }\n }\n }\n\n // Sort by z-index so lower z draws first (higher z renders on top)\n drawCalls.sort((a, b) => a.imgSpec.zIndex - b.imgSpec.zIndex);\n\n // Draw placeholders first (lowest priority)\n for (const call of placeholderCalls) {\n this._renderer.drawPlaceholder(call.col, call.row, call.count);\n }\n\n // Draw images in z-index order\n for (const call of drawCalls) {\n this._renderer.draw(call.imgSpec, call.tileId, call.col, call.row, call.count);\n }\n }\n\n public viewportResize(metrics: { cols: number, rows: number }): void {\n // exit early if we have nothing in storage\n if (!this._images.size) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // handle only viewport width enlargements, exit all other cases\n // TODO: needs patch for tile counter\n if (this._viewportMetrics.cols >= metrics.cols) {\n this._viewportMetrics = metrics;\n return;\n }\n\n // walk scrollbuffer at old col width to find all possible expansion matches\n const buffer = this._terminal._core.buffer;\n const rows = buffer.lines.length;\n const oldCol = this._viewportMetrics.cols - 1;\n for (let row = 0; row < rows; ++row) {\n const line = buffer.lines.get(row)!;\n const e = line.getExtended(oldCol)?.payload;\n if (e instanceof ImageTileInfo) {\n const imageId = e.imageId;\n if (imageId === undefined || imageId === -1) {\n continue;\n }\n const imgSpec = this._images.get(imageId);\n if (!imgSpec) {\n continue;\n }\n // found an image tile at oldCol, check if it qualifies for right exapansion\n const tilesPerRow = Math.ceil((imgSpec.actual?.width || 0) / imgSpec.actualCellSize.width);\n if ((e.tileId % tilesPerRow) + 1 >= tilesPerRow) {\n continue;\n }\n // expand only if right side is empty (nothing got wrapped from below)\n let hasData = false;\n for (let rightCol = oldCol + 1; rightCol > metrics.cols; ++rightCol) {\n if (line.hasContent(rightCol)) {\n hasData = true;\n break;\n }\n }\n if (hasData) {\n continue;\n }\n // do right expansion on terminal buffer\n const end = Math.min(metrics.cols, tilesPerRow - (e.tileId % tilesPerRow) + oldCol);\n let lastTile = e.tileId;\n for (let expandCol = oldCol + 1; expandCol < end; ++expandCol) {\n this._writeToCell(line, expandCol, imageId, ++lastTile);\n imgSpec.tileCount++;\n }\n }\n }\n // store new viewport metrics\n this._viewportMetrics = metrics;\n }\n\n /**\n * Retrieve original canvas at buffer position.\n */\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1) {\n const orig = this._images.get(e.imageId)?.orig;\n if (window.ImageBitmap && orig instanceof ImageBitmap) {\n const canvas = ImageRenderer.createCanvas(window.document, orig.width, orig.height);\n canvas.getContext('2d')?.drawImage(orig, 0, 0, orig.width, orig.height);\n return canvas;\n }\n return orig as HTMLCanvasElement;\n }\n }\n }\n\n /**\n * Extract active single tile at buffer position.\n */\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n const buffer = this._terminal._core.buffer;\n const line = buffer.lines.get(y);\n if (line) {\n const e = line.getExtended(x)?.payload;\n if (e instanceof ImageTileInfo && e.imageId && e.imageId !== -1 && e.tileId !== -1) {\n const spec = this._images.get(e.imageId);\n if (spec) {\n return this._renderer.extractTile(spec, e.tileId);\n }\n }\n }\n }\n\n // TODO: Do we need some blob offloading tricks here to avoid early eviction?\n // also see https://stackoverflow.com/questions/28307789/is-there-any-limitation-on-javascript-max-blob-size\n private _evictOldest(room: number): number {\n const used = this._getStoredPixels();\n let current = used;\n while (this._pixelLimit < current + room && this._images.size) {\n const spec = this._images.get(++this._lowestId);\n if (spec && spec.orig) {\n current -= spec.orig.width * spec.orig.height;\n if (spec.actual && spec.orig !== spec.actual) {\n current -= spec.actual.width * spec.actual.height;\n }\n spec.marker?.dispose();\n this._delImg(this._lowestId);\n }\n }\n return used - current;\n }\n\n private _writeToCell(line: IBufferLine, x: number, imageId: number, tileId: number): void {\n const workCell = this._workCell;\n line.loadCell(x, workCell);\n if (this._workCell.hasExtendedAttrs()) {\n const old = workCell.extended.payload;\n if (old instanceof ImageTileInfo) {\n // found an old ExtendedAttrsImage, since we know that\n // they are always isolated instances (single cell usage),\n // we can re-use it and just update their id entries\n const oldSpec = this._images.get(old.imageId);\n if (oldSpec) {\n // early eviction for in-viewport overwrites\n oldSpec.tileCount--;\n }\n old.imageId = imageId;\n old.tileId = tileId;\n return;\n }\n }\n // fall-through: always create new ExtendedAttrs entry\n const extattr = workCell.extended.clone();\n extattr.payload = new ImageTileInfo(imageId, tileId);\n workCell.extended = extattr;\n workCell.updateExtended();\n line.setCell(x, workCell);\n }\n\n private _evictOnAlternate(): void {\n // nullify tile count of all images on alternate buffer\n for (const spec of this._images.values()) {\n if (spec.bufferType === 'alternate') {\n spec.tileCount = 0;\n }\n }\n // re-count tiles on whole buffer\n const buffer = this._terminal._core.buffer;\n for (let y = 0; y < this._terminal.rows; ++y) {\n const line = buffer.lines.get(y);\n if (!line) {\n continue;\n }\n for (let x = 0; x < this._terminal.cols; ++x) {\n const payload = line.getExtended(x)?.payload;\n if (payload instanceof ImageTileInfo) {\n const spec = this._images.get(payload.imageId);\n if (spec) {\n spec.tileCount++;\n }\n }\n }\n }\n // deleted images with zero tile count\n const zero = [];\n for (const [id, spec] of this._images.entries()) {\n if (spec.bufferType === 'alternate' && !spec.tileCount && !spec.virtual) {\n spec.marker?.dispose();\n zero.push(id);\n }\n }\n for (const id of zero) {\n this._delImg(id);\n }\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IImageAddonOptions, IOscHandler, IResetHandler, ITerminalExt } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { CELL_SIZE_DEFAULT } from './ImageStorage';\nimport Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport QoiDecoder from 'xterm-wasm-parts/lib/qoi/QoiDecoder.wasm';\nimport { HeaderParser, IHeaderFields, HeaderState, SequenceType } from './IIPHeaderParser';\nimport { imageType, UNSUPPORTED_TYPE } from './IIPMetrics';\n\n// Local const enum mirror - esbuild can't inline const enums from external packages\nconst enum DecoderConst {\n // Held memory in base64/QOI decoders between images. Zero because each kept\n // decoder pins a wasm memory, and V8 caps those per process (~124 in a\n // sandboxed renderer), so idle terminals must not hold one.\n KEEP_DATA = 0,\n // Initial buffer allocation for the decoder.\n INITIAL_DATA = 1048576,\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n OK = 0\n}\n\n// default IIP header values\nconst DEFAULT_HEADER: IHeaderFields = {\n type: SequenceType.INVALID,\n name: 'Unnamed file',\n size: 0,\n width: 'auto',\n height: 'auto',\n preserveAspectRatio: 1,\n inline: 0\n};\n\n\nexport class IIPHandler implements IOscHandler, IResetHandler {\n private _generation = 0;\n private _aborted = false;\n private _hp = new HeaderParser();\n private _header: IHeaderFields = DEFAULT_HEADER;\n private _dec: Base64Decoder;\n private _qoiDec: QoiDecoder;\n private _isMultipart = false;\n private _abortMulti = false;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _storage: IIPImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n const maxEncodedBytes = Math.ceil(this._opts.iipSizeLimit * 4 / 3);\n const initialBytes = Math.min(DecoderConst.INITIAL_DATA, maxEncodedBytes);\n this._dec = new Base64Decoder(DecoderConst.KEEP_DATA, maxEncodedBytes, initialBytes);\n this._qoiDec = new QoiDecoder(DecoderConst.KEEP_DATA);\n }\n\n public reset(): void {\n this._generation++;\n this._hp.reset();\n this._dec.release();\n this._qoiDec.release();\n }\n\n public start(): void {\n this._aborted = false;\n this._hp.reset();\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (this._hp.state === HeaderState.END) {\n if ((this._dec.put(data.subarray(start, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n }\n } else {\n const dataPos = this._hp.parse(data, start, end);\n if (dataPos === -1) {\n this._aborted = true;\n return;\n }\n if (dataPos > 0) {\n const seqType = this._hp.fields.type;\n if (seqType === SequenceType.FILE) {\n if (this._isMultipart) {\n this._isMultipart = false;\n this._abortMulti = false;\n this._dec.release();\n }\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n if (!this._header.inline) {\n this._aborted = true;\n return;\n }\n if (!this._initDecoder()) {\n this._aborted = true;\n return;\n }\n } else if (this._abortMulti) {\n this._aborted = true;\n return;\n }\n if ((this._dec.put(data.subarray(dataPos, end)) as number) !== DecoderConst.OK) {\n this._dec.release();\n this._aborted = true;\n if (this._isMultipart) this._abortMulti = true;\n }\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted) return true;\n\n if (this._hp.state !== HeaderState.END) {\n if (this._hp.end()) return true;\n }\n const seqType = this._hp.fields.type;\n\n if (seqType === SequenceType.FILEPART) return true;\n\n if (seqType === SequenceType.REPORTCELLSIZE) {\n // OSC 1337 ; ReportCellSize=[height];[width];[scale] ST\n let w = CELL_SIZE_DEFAULT.width;\n let h = CELL_SIZE_DEFAULT.height;\n if (this._renderer.dimensions) {\n w = this._renderer.dimensions.css.canvas.width / this._coreTerminal.cols;\n h = this._renderer.dimensions.css.canvas.height / this._coreTerminal.rows;\n }\n const scale = this._coreTerminal._core._coreBrowserService?.dpr ?? 1;\n const report = `\\x1b]1337;ReportCellSize=${h.toFixed(3)};${w.toFixed(3)};${scale.toFixed(3)}\\x1b\\\\`;\n this._coreTerminal.input(report, false);\n return true;\n }\n\n if (seqType === SequenceType.MULTIPARTFILE) {\n this._header = Object.assign({}, DEFAULT_HEADER, this._hp.fields);\n this._isMultipart = true;\n this._abortMulti = false;\n this._dec.release();\n if (!this._initDecoder()) {\n this._abortMulti = true;\n }\n return true;\n }\n\n if (seqType === SequenceType.FILEEND) {\n if (!this._isMultipart) return true;\n this._isMultipart = false;\n if (this._abortMulti || this._header.type !== SequenceType.MULTIPARTFILE) return true;\n }\n\n // fallthrough for SequenceType.FILE & SequenceType.FILEEND\n\n let w = 0;\n let h = 0;\n\n // early exit condition chain\n let cond: number | boolean;\n let metrics = UNSUPPORTED_TYPE;\n if (cond = success) {\n if (cond = !this._dec.end()) {\n metrics = imageType(this._dec.data8);\n if (cond = metrics.mime !== 'unsupported') {\n w = metrics.width;\n h = metrics.height;\n if (cond = w && h && w * h < this._opts.pixelLimit) {\n [w, h] = this._resize(w, h).map(Math.floor);\n cond = w && h && w * h < this._opts.pixelLimit;\n } else {\n console.warn(`IIP: image dimension issue ${metrics.width}x${metrics.height}`);\n }\n } else {\n console.warn('IIP: unsupported image type');\n }\n } else {\n console.warn('IIP: error during BASE64 decoding');\n }\n }\n if (!cond) {\n this._dec.release();\n return true;\n }\n\n let blob: Blob | ImageData;\n if (metrics.mime === 'image/qoi') {\n let data: Uint8Array<ArrayBuffer>;\n try {\n data = this._qoiDec.decode(this._dec.data8);\n } catch (e) {\n console.warn('IIP: could not decode QOI image', e);\n this._dec.release();\n this._qoiDec.release();\n return true;\n }\n blob = new ImageData(\n new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength),\n this._qoiDec.width,\n this._qoiDec.height\n );\n this._qoiDec.release();\n if (w === this._qoiDec.width && h === this._qoiDec.height) {\n // use fast-path if we don't need to rescale\n this._dec.release();\n const canvas = ImageRenderer.createCanvas(undefined, this._qoiDec.width, this._qoiDec.height);\n canvas.getContext('2d')?.putImageData(blob, 0, 0);\n this._storage.addImage(canvas);\n return true;\n }\n } else {\n blob = new Blob([this._dec.data8], { type: metrics.mime });\n }\n this._dec.release();\n const generation = this._generation;\n return createImageBitmap(blob, { resizeWidth: w, resizeHeight: h })\n .then(bm => {\n if (generation !== this._generation) {\n bm.close();\n return true;\n }\n this._storage.addImage(bm);\n return true;\n })\n .catch(e => {\n console.warn(`IIP: decoding error ${metrics.mime} ${metrics.width}x${metrics.height}`, e);\n return true;\n });\n }\n\n // Why: wasm memory exhaustion must drop this image, not throw out of the parser and wedge the write queue.\n private _initDecoder(): boolean {\n try {\n this._dec.init();\n return true;\n } catch (e) {\n console.warn('IIP: could not allocate decoder', e);\n this._dec.release();\n return false;\n }\n }\n\n private _resize(w: number, h: number): [number, number] {\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n const width = this._renderer.dimensions?.css.canvas.width || cw * this._coreTerminal.cols;\n const height = this._renderer.dimensions?.css.canvas.height || ch * this._coreTerminal.rows;\n\n const rw = this._dim(this._header.width!, width, cw);\n const rh = this._dim(this._header.height!, height, ch);\n if (!rw && !rh) {\n const wf = width / w; // TODO: should this respect initial cursor offset?\n const hf = (height - ch) / h; // TODO: fix offset issues from float cell height\n const f = Math.min(wf, hf);\n return f < 1 ? [w * f, h * f] : [w, h];\n }\n return !rw\n ? [w * rh / h, rh]\n : this._header.preserveAspectRatio || !rw || !rh\n ? [rw, h * rw / w] : [rw, rh];\n }\n\n private _dim(s: string, total: number, cdim: number): number {\n if (s === 'auto') return 0;\n if (s.endsWith('%')) return parseInt(s.slice(0, -1), 10) * total / 100;\n if (s.endsWith('px')) return parseInt(s.slice(0, -2), 10);\n return parseInt(s, 10) * cdim;\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// eslint-disable-next-line\ndeclare const Buffer: any;\n\nexport const enum HeaderState {\n START = 0,\n ABORT = 1,\n KEY = 2,\n VALUE = 3,\n END = 4\n}\n\nexport const enum SequenceType {\n INVALID = 0,\n FILE = 1,\n MULTIPARTFILE = 2,\n FILEPART = 3,\n FILEEND = 4,\n REPORTCELLSIZE = 5\n}\n\nexport interface IHeaderFields {\n [key: string]: number | string | Uint32Array | null | undefined;\n // sequence type\n type: SequenceType;\n // base-64 encoded filename. Defaults to \"Unnamed file\".\n name: string;\n // File size in bytes. The file transfer will be canceled if this size is exceeded.\n size: number;\n /**\n * Optional width and height to render:\n * - N: N character cells.\n * - Npx: N pixels.\n * - N%: N percent of the session's width or height.\n * - auto: The image's inherent size will be used to determine an appropriate dimension.\n */\n width?: string;\n height?: string;\n // Optional, defaults to 1 respecting aspect ratio (width takes precedence).\n preserveAspectRatio?: number;\n // Optional, defaults to 0. If set to 1, the file will be displayed inline, else downloaded\n // (download not supported).\n inline?: number;\n}\n\n// field value decoders\n\n// ASCII bytes to string\nfunction toStr(data: Uint32Array): string {\n let s = '';\n for (let i = 0; i < data.length; ++i) {\n s += String.fromCharCode(data[i]);\n }\n return s;\n}\n\n// digits to integer\nfunction toInt(data: Uint32Array): number {\n let v = 0;\n for (let i = 0; i < data.length; ++i) {\n if (data[i] < 48 || data[i] > 57) {\n throw new Error('illegal char');\n }\n v = v * 10 + data[i] - 48;\n }\n return v;\n}\n\n// check for correct size entry\nfunction toSize(data: Uint32Array): string {\n const v = toStr(data);\n if (!v.match(/^((auto)|(\\d+?((px)|(%)){0,1}))$/)) {\n throw new Error('illegal size');\n }\n return v;\n}\n\n// name is base64 encoded utf-8\nfunction toName(data: Uint32Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(toStr(data), 'base64').toString();\n }\n const bs = atob(toStr(data));\n const b = new Uint8Array(bs.length);\n for (let i = 0; i < b.length; ++i) {\n b[i] = bs.charCodeAt(i);\n }\n return new TextDecoder().decode(b);\n}\n\nconst DECODERS: {[key: string]: (v: Uint32Array) => number | string} = {\n inline: toInt,\n size: toInt,\n name: toName,\n width: toSize,\n height: toSize,\n preserveAspectRatio: toInt\n};\n\n\n// sequence type markers\n// File\nconst FILE_MARKER = [70, 105, 108, 101];\n// MultipartFile\nconst MULTIPARTFILE_MARKER = [77, 117, 108, 116, 105, 112, 97, 114, 116, 70, 105, 108, 101];\n// FilePart\nconst FILEPART_MARKER = [70, 105, 108, 101, 80, 97, 114, 116];\n// FileEnd\nconst FILEEND_MARKER = [70, 105, 108, 101, 69, 110, 100];\n// ReportCellSize\nconst REPORTCELLSIZE_MARKER = [82, 101, 112, 111, 114, 116, 67, 101, 108, 108, 83, 105, 122, 101];\n\n// max allowed chars for sequence header\nconst MAX_FIELDCHARS = 1024;\n\n\nexport class HeaderParser {\n public state: HeaderState = HeaderState.START;\n private _buffer = new Uint32Array(MAX_FIELDCHARS);\n private _position = 0;\n private _key = '';\n public fields: {[key: string]: number | string | Uint32Array | null | undefined} = {};\n\n public reset(): void {\n this._buffer.fill(0);\n this.state = HeaderState.START;\n this._position = 0;\n this.fields = {};\n this._key = '';\n }\n\n public end(): number {\n if (this.state === HeaderState.START) {\n if (this._position === FILEEND_MARKER.length) {\n for (let k = 0; k < FILEEND_MARKER.length; ++k) {\n if (this._buffer[k] !== FILEEND_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEEND;\n this.state = HeaderState.END;\n return 0;\n }\n if (this._position === REPORTCELLSIZE_MARKER.length) {\n for (let k = 0; k < REPORTCELLSIZE_MARKER.length; ++k) {\n if (this._buffer[k] !== REPORTCELLSIZE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.REPORTCELLSIZE;\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n if (this.state === HeaderState.END) return 0;\n if (this.state === HeaderState.VALUE\n && this.fields.type === SequenceType.MULTIPARTFILE\n ) {\n if (!this._storeValue(this._position)) return this._a();\n this.state = HeaderState.END;\n return 0;\n }\n return this._a();\n }\n\n public parse(data: Uint32Array, start: number, end: number): number {\n let state = this.state;\n let pos = this._position;\n const buffer = this._buffer;\n if (state === HeaderState.ABORT || state === HeaderState.END) return -1;\n if (state === HeaderState.START && pos > 14) return -1;\n for (let i = start; i < end; ++i) {\n const c = data[i];\n switch (c) {\n case 59: // ;\n if (!this._storeValue(pos)) return this._a();\n state = HeaderState.KEY;\n pos = 0;\n break;\n case 61: // =\n if (state === HeaderState.START) {\n if (buffer[0] === 70) {\n // 'File' or 'FilePart'\n let k = 0;\n for (; k < FILE_MARKER.length; ++k) {\n if (buffer[k] !== FILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILE;\n if (pos === FILEPART_MARKER.length) {\n for (; k < FILEPART_MARKER.length; ++k) {\n if (buffer[k] !== FILEPART_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.FILEPART;\n this.state = HeaderState.END;\n return i + 1;\n }\n } else if (buffer[0] === 77) {\n // 'MultipartFile'\n for (let k = 0; k < MULTIPARTFILE_MARKER.length; ++k) {\n if (buffer[k] !== MULTIPARTFILE_MARKER[k]) return this._a();\n }\n this.fields['type'] = SequenceType.MULTIPARTFILE;\n } else {\n return this._a();\n }\n state = HeaderState.KEY;\n pos = 0;\n } else if (state === HeaderState.KEY) {\n if (!this._storeKey(pos)) return this._a();\n state = HeaderState.VALUE;\n pos = 0;\n } else if (state === HeaderState.VALUE) {\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n break;\n case 58: // :\n if (state === HeaderState.VALUE) {\n if (!this._storeValue(pos)) return this._a();\n }\n this.state = HeaderState.END;\n return i + 1;\n default:\n if (pos >= MAX_FIELDCHARS) return this._a();\n buffer[pos++] = c;\n }\n }\n this.state = state;\n this._position = pos;\n return -2;\n }\n\n private _a(): number {\n this.fields.type = SequenceType.INVALID;\n this.state = HeaderState.ABORT;\n return -1;\n }\n\n private _storeKey(pos: number): boolean {\n const k = toStr(this._buffer.subarray(0, pos));\n if (k) {\n this._key = k;\n this.fields[k] = null;\n return true;\n }\n return false;\n }\n\n private _storeValue(pos: number): boolean {\n if (this._key) {\n try {\n const v = this._buffer.slice(0, pos);\n this.fields[this._key] = DECODERS[this._key] ? DECODERS[this._key](v) : v;\n } catch {\n return false;\n }\n return true;\n }\n return false;\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\nexport type ImageType = 'image/png' | 'image/jpeg' | 'image/gif' | 'image/qoi' | 'image/webp' | 'image/avif' | 'unsupported' | '';\n\nexport interface IMetrics {\n mime: ImageType;\n width: number;\n height: number;\n}\n\nexport const UNSUPPORTED_TYPE: IMetrics = {\n mime: 'unsupported',\n width: 0,\n height: 0\n};\n\nexport function imageType(d: Uint8Array): IMetrics {\n if (d.length < 32) {\n return UNSUPPORTED_TYPE;\n }\n const d32 = new Uint32Array(d.buffer, d.byteOffset, 8);\n // PNG: 89 50 4E 47 0D 0A 1A 0A (8 first bytes == magic number for PNG)\n // + first chunk must be IHDR\n if (d32[0] === 0x474E5089 && d32[1] === 0x0A1A0A0D && d32[3] === 0x52444849) {\n return {\n mime: 'image/png',\n width: d[16] << 24 | d[17] << 16 | d[18] << 8 | d[19],\n height: d[20] << 24 | d[21] << 16 | d[22] << 8 | d[23]\n };\n }\n // JPEG: FF D8 FF\n if (d[0] === 0xFF && d[1] === 0xD8 && d[2] === 0xFF) {\n const [width, height] = jpgSize(d);\n return { mime: 'image/jpeg', width, height };\n }\n // GIF: GIF87a or GIF89a\n if (d32[0] === 0x38464947 && (d[4] === 0x37 || d[4] === 0x39) && d[5] === 0x61) {\n return {\n mime: 'image/gif',\n width: d[7] << 8 | d[6],\n height: d[9] << 8 | d[8]\n };\n }\n // QOI: qoif\n if (d32[0] === 0x66696F71) {\n return {\n mime: 'image/qoi',\n width: d[4] << 24 | d[5] << 16 | d[6] << 8 | d[7],\n height: d[8] << 24 | d[9] << 16 | d[10] << 8 | d[11]\n };\n }\n // WEBP: RIFF | xxxx | WEBP | VP8x\n if (d32[0] === 0x46464952 && d32[2] === 0x50424557 && (d32[3] & 0xFFFFFF) === 0x385056) {\n switch (d[15]) {\n case 0x58: // Extended WebP VP8X --> \"X\"\n return {\n mime: 'image/webp',\n width: (d[24] | d[25] << 8 | d[26] << 16) + 1,\n height: (d[27] | d[28] << 8 | d[29] << 16) + 1\n };\n case 0x4C: // Lossless WebP VP8L --> \"L\"\n if (d[20] !== 0x2f) return UNSUPPORTED_TYPE;\n const dim = d[21] | d[22] << 8 | d[23] << 16 | d[24] << 24;\n return {\n mime: 'image/webp',\n width: (dim & 0x3FFF) + 1,\n height: (dim >>> 14 & 0x3FFF) + 1\n };\n case 0x20: // Lossy WebP VP8 --> \" \"\n if (d[23] !== 0x9d || d[24] !== 0x01 || d[25] !== 0x2a) return UNSUPPORTED_TYPE;\n return {\n mime: 'image/webp',\n width: (d[26] | d[27] << 8) & 0x3FFF,\n height: (d[28] | d[29] << 8) & 0x3FFF\n };\n }\n return UNSUPPORTED_TYPE;\n }\n // AVIF: Box size | ftyp | avif/avis\n if (d32[1] === 0x70797466 && (d32[2] === 0x66697661 || d32[2] === 0x73697661)) {\n let pos = -1;\n // search for ispe box within first 1024 bytes\n const limit = Math.min(d.length - 16, 1024);\n for (let i = 8; i < limit; i++) {\n // scan for ispe\n if (d[i] === 0x69 && d[i + 1] === 0x73 && d[i + 2] === 0x70 && d[i + 3] === 0x65) {\n pos = i;\n break;\n }\n }\n if (pos !== -1) {\n // dimensions are in BE at +8 (width) at +12 (height)\n const width =\n d[pos + 8] << 24 |\n d[pos + 9] << 16 |\n d[pos + 10] << 8 |\n d[pos + 11];\n const height =\n d[pos + 12] << 24 |\n d[pos + 13] << 16 |\n d[pos + 14] << 8 |\n d[pos + 15];\n if (width > 0 && height > 0) {\n return { mime: 'image/avif', width, height };\n }\n }\n return UNSUPPORTED_TYPE;\n }\n return UNSUPPORTED_TYPE;\n}\n\n\nfunction jpgSize(d: Uint8Array): [number, number] {\n const len = d.length;\n let i = 4;\n let blockLength = d[i] << 8 | d[i + 1];\n while (true) {\n i += blockLength;\n if (i >= len) {\n // exhausted without size info\n return [0, 0];\n }\n if (d[i] !== 0xFF) {\n return [0, 0];\n }\n if (d[i + 1] === 0xC0 || d[i + 1] === 0xC2) {\n if (i + 8 < len) {\n return [\n d[i + 7] << 8 | d[i + 8],\n d[i + 5] << 8 | d[i + 6]\n ];\n }\n return [0, 0];\n }\n i += 2;\n blockLength = d[i] << 8 | d[i + 1];\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '@xterm/xterm';\nimport { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types';\nimport { ImageRenderer } from '../ImageRenderer';\nimport { CELL_SIZE_DEFAULT } from '../ImageStorage';\nimport { imageType } from '../IIPMetrics';\nimport { KittyImageStorage } from './KittyImageStorage';\nimport Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\nimport {\n KittyAction,\n KittyFormat,\n KittyCompression,\n IKittyCommand,\n IPendingTransmission,\n IKittyImageData,\n KittyPixelConstants,\n parseKittyCommand\n} from './KittyGraphicsTypes';\n\nconst enum Constants {\n // Memory limit for base64 decoder (4MB, same as IIPHandler)\n DECODER_KEEP_DATA = 4194304,\n DECODER_INITIAL_DATA = 4194304, // 4MB\n // Local mirror of const enum (esbuild can't inline const enums from external packages)\n DECODER_OK = 0,\n // Maximum control data size\n MAX_CONTROL_DATA_SIZE = 512,\n // Semicolon codepoint\n SEMICOLON = 0x3B\n}\n\nconst DECODER_OK = Constants.DECODER_OK as unknown as DecodeStatus.OK;\n\n// Kitty graphics protocol handler with streaming base64 decoding.\nexport class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable {\n private _aborted = false;\n private _generation = 0;\n private _decodeError = false;\n\n private _activeDecoder: Base64Decoder | null = null;\n private readonly _maxEncodedBytes: number;\n private readonly _initialEncodedBytes: number;\n\n // Streaming related states\n\n // True while receiving control data (before semicolon).\n private _inControlData = true;\n\n // Buffer for control data.\n private _controlData = new Uint32Array(Constants.MAX_CONTROL_DATA_SIZE);\n private _controlLength = 0;\n\n // Pre-calculated encoded size limit\n private _encodedSizeLimit = 0;\n private _totalEncodedSize = 0;\n\n // Parsed command. These are the control data before semicolon.\n private _parsedCommand: IKittyCommand | null = null;\n\n // Storage related states\n\n private _pendingTransmissions: Map<number, IPendingTransmission> = new Map();\n // Tracks the pending key of the most recently started chunked upload.\n // Per spec, subsequent chunks only need m= (and optionally q=), without i=.\n // When a chunk arrives with no i=, this key is used to find the pending upload.\n private _lastPendingKey: number | undefined;\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _kittyStorage: KittyImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n // Convert decoded size limit -> max encoded bytes.\n this._maxEncodedBytes = Math.ceil(this._opts.kittySizeLimit * 4 / 3);\n // ensure we preallocate more than configured limit while using 4mb initial size.\n this._initialEncodedBytes = Math.min(Constants.DECODER_INITIAL_DATA, this._maxEncodedBytes);\n }\n\n public reset(): void {\n this._generation++;\n this._cleanupAllPending();\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n this._kittyStorage.reset();\n }\n\n public dispose(): void {\n this.reset();\n }\n\n private _removePendingEntry(key: number): void {\n this._pendingTransmissions.delete(key);\n if (this._lastPendingKey === key) {\n this._lastPendingKey = undefined;\n }\n }\n\n private _cleanupAllPending(): void {\n for (const pending of this._pendingTransmissions.values()) {\n pending.decoder.release();\n }\n this._pendingTransmissions.clear();\n this._lastPendingKey = undefined;\n }\n\n public start(): void {\n this._aborted = false;\n this._decodeError = false;\n this._inControlData = true;\n this._controlLength = 0;\n this._parsedCommand = null;\n // Pre-calculate encoded limit once: base64 is 4 bytes encoded \u2192 3 bytes decoded\n this._encodedSizeLimit = this._maxEncodedBytes;\n this._totalEncodedSize = 0;\n this._activeDecoder = null;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n if (!this._inControlData) {\n this._streamPayload(data, start, end);\n } else {\n // Scan for semicolon\n let controlEnd = end;\n for (let i = start; i < end; i++) {\n if (data[i] === Constants.SEMICOLON) {\n this._inControlData = false;\n controlEnd = i;\n break;\n }\n }\n\n // Copy control data\n const copyLength = controlEnd - start;\n if (this._controlLength + copyLength > Constants.MAX_CONTROL_DATA_SIZE) {\n this._aborted = true;\n return;\n }\n this._controlData.set(data.subarray(start, controlEnd), this._controlLength);\n this._controlLength += copyLength;\n\n if (!this._inControlData) {\n // Found semicolon - parse control data early for validation\n this._parsedCommand = parseKittyCommand(this._parseControlDataString());\n\n // Early validation: i+I conflict\n if (this._parsedCommand.id !== undefined && this._parsedCommand.imageNumber !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'EINVAL:cannot specify both i and I keys', this._parsedCommand.quiet ?? 0);\n this._aborted = true;\n return;\n }\n\n // Delete action doesn't need payload - skip streaming\n if (this._parsedCommand.action === KittyAction.DELETE) {\n return;\n }\n\n // Stream remaining as payload\n const payloadStart = controlEnd + 1;\n if (payloadStart < end) {\n this._streamPayload(data, payloadStart, end);\n }\n }\n }\n }\n\n // Stream payload bytes into the base64 decoder.\n private _streamPayload(data: Uint32Array, start: number, end: number): void {\n if (this._aborted) return;\n\n // Check size limit (compare encoded bytes against pre-calculated limit)\n // Include cumulative size from pending transmission for multi-chunk images.\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = this._parsedCommand?.id ?? this._lastPendingKey ?? 0;\n const pending = this._pendingTransmissions.get(pendingKey);\n const previousEncodedSize = pending?.totalEncodedSize ?? 0;\n this._totalEncodedSize += end - start;\n const cumulativeEncodedSize = previousEncodedSize + this._totalEncodedSize;\n if (cumulativeEncodedSize > this._encodedSizeLimit) {\n const decoderToRelease = this._activeDecoder ?? pending?.decoder;\n if (decoderToRelease) {\n decoderToRelease.release();\n }\n this._activeDecoder = null;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n this._aborted = true;\n return;\n }\n\n if (this._decodeError) return;\n\n if (pending?.decoder && !this._activeDecoder) {\n this._activeDecoder = pending.decoder;\n }\n if (!this._activeDecoder) {\n // Budget WASM capacity, including one page of decoder state and rounding.\n const decoderCapacity = this._maxEncodedBytes + 131072;\n if (decoderCapacity > this._opts.storageLimit * 1000000) {\n this._aborted = true;\n if (this._parsedCommand?.id !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'ENOMEM:pending image budget exceeded', this._parsedCommand.quiet ?? 0);\n }\n return;\n }\n const maxPending = Math.max(1, Math.floor(this._opts.storageLimit * 1000000 / decoderCapacity));\n while (this._pendingTransmissions.size >= maxPending) {\n const oldest = this._pendingTransmissions.entries().next().value;\n if (!oldest) break;\n oldest[1].decoder.release();\n this._removePendingEntry(oldest[0]);\n if (oldest[1].cmd.id !== undefined) {\n this._sendResponse(oldest[1].cmd.id, 'ENOMEM:pending image budget exceeded', oldest[1].cmd.quiet ?? 0);\n }\n }\n const decoder = new Base64Decoder(Constants.DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes);\n try {\n decoder.init();\n } catch (e) {\n // Why: wasm memory exhaustion must drop this image, not throw out of the parser and wedge the write queue.\n console.warn('KITTY: could not allocate decoder', e);\n this._aborted = true;\n if (this._parsedCommand?.id !== undefined) {\n this._sendResponse(this._parsedCommand.id, 'ENOMEM:could not allocate decoder', this._parsedCommand.quiet ?? 0);\n }\n return;\n }\n this._activeDecoder = decoder;\n }\n\n if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_OK) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n this._decodeError = true;\n if (pending) {\n this._removePendingEntry(pendingKey);\n }\n }\n }\n\n public end(success: boolean): boolean | Promise<boolean> {\n if (this._aborted || !success) {\n if (this._activeDecoder) {\n this._activeDecoder.release();\n this._activeDecoder = null;\n }\n return true;\n }\n\n // No semicolon = no payload (delete, capability query)\n if (this._inControlData) {\n return this._handleNoPayloadCommand();\n }\n\n // Use command parsed early in put() - i+I already validated there\n const cmd = this._parsedCommand!;\n\n // Delete action was handled by skipping payload - just execute\n if (cmd.action === KittyAction.DELETE) {\n return this._handleDelete(cmd);\n }\n\n // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey.\n const pendingKey = cmd.id ?? this._lastPendingKey ?? 0;\n const isMoreComing = cmd.more === 1;\n const pending = this._pendingTransmissions.get(pendingKey);\n\n if (isMoreComing) {\n if (this._activeDecoder) {\n if (pending) {\n pending.totalEncodedSize += this._totalEncodedSize;\n pending.decodeError = pending.decodeError || this._decodeError;\n } else {\n this._pendingTransmissions.set(pendingKey, {\n cmd: { ...cmd },\n decoder: this._activeDecoder,\n totalEncodedSize: this._totalEncodedSize,\n decodeError: this._decodeError\n });\n }\n this._lastPendingKey = pendingKey;\n this._activeDecoder = null;\n }\n return true;\n }\n\n // Final chunk received \u2014 clear the last pending key\n if (pending) {\n this._lastPendingKey = undefined;\n }\n\n let decodeError = this._decodeError;\n let finalCmd = cmd;\n let decoder = this._activeDecoder;\n\n if (pending) {\n finalCmd = pending.cmd;\n decoder = pending.decoder;\n decodeError = decodeError || pending.decodeError;\n this._pendingTransmissions.delete(pendingKey);\n }\n\n let imageBytes = new Uint8Array(0);\n if (decoder) {\n if (decoder.end() !== DECODER_OK) {\n decodeError = true;\n }\n imageBytes = decoder.data8;\n }\n this._activeDecoder = null;\n\n // Handle command first \u2014 handlers create Blob/ImageData from imageBytes,\n // which copies the data. Only then is it safe to release the decoder's\n // wasm memory that imageBytes points into.\n const result = this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError);\n if (decoder) {\n decoder.release();\n }\n return result;\n }\n\n // Command handling\n\n private _parseControlDataString(): string {\n let str = '';\n for (let i = 0; i < this._controlLength; i++) {\n str += String.fromCodePoint(this._controlData[i]);\n }\n return str;\n }\n\n private _handleNoPayloadCommand(): boolean | Promise<boolean> {\n const cmd = parseKittyCommand(this._parseControlDataString());\n\n // Per spec: specifying both i and I is an error\n if (cmd.id !== undefined && cmd.imageNumber !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0);\n return true;\n }\n\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.DELETE:\n return this._handleDelete(cmd);\n case KittyAction.QUERY:\n this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0);\n return true;\n case KittyAction.PLACEMENT:\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handleCommandWithBytesAndCmd(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n const action = cmd.action ?? 't';\n\n switch (action) {\n case KittyAction.TRANSMIT: {\n const result = this._handleTransmit(cmd, bytes, decodeError);\n // Only send response when _handleTransmit didn't already respond\n // (it handles unsupported transmission medium responses internally)\n if ((cmd.transmission ?? 'd') === 'd' && cmd.id !== undefined) {\n if (decodeError) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n } else if (bytes.length > 0) {\n this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0);\n }\n }\n return result;\n }\n case KittyAction.TRANSMIT_DISPLAY:\n return this._handleTransmitDisplay(cmd, bytes, decodeError);\n case KittyAction.QUERY:\n return this._handleQuery(cmd, bytes, decodeError);\n case KittyAction.PLACEMENT:\n // a=p ignores any payload \u2014 image data was already transmitted\n return this._handlePlacement(cmd);\n default:\n // TODO: Implement remaining actions when needed:\n // - a=f (frame): animation frame operations\n // - a=a (animation): animation control\n // - a=c (compose): compose images\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0);\n }\n return true;\n }\n }\n\n private _handlePlacement(cmd: IKittyCommand): boolean | Promise<boolean> {\n if (cmd.id === undefined) {\n return true;\n }\n const id = cmd.id;\n const image = this._kittyStorage.getImage(id);\n if (!image) {\n this._sendResponse(id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId);\n return true;\n }\n const result = cmd.unicodePlaceholder === 1\n ? this._placeVirtual(image, cmd)\n : this._displayImage(image, cmd);\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId);\n return true;\n });\n }\n\n private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean, retainVirtual = false): boolean {\n // TODO: Support file-based transmission modes (t=f, t=t, t=s)\n // Currently only supports direct transmission (t=d, the default).\n // - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path.\n // - t=t (temp file): Payload is base64-encoded path in temp directory. Terminal reads, deletes.\n // - t=s: Payload is base64-encoded POSIX shm name. Terminal reads from shared memory.\n // These modes require filesystem/IPC access not available in browsers. For Node.js/Electron:\n // 1. Check cmd.transmission (t key) before treating bytes as image data\n // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents\n // 3. For t=d: treat bytes as image data (current behavior)\n // When implementing, also update _handleQuery to accept these transmission mediums.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:unsupported transmission medium', cmd.quiet ?? 0);\n }\n return true;\n }\n\n if (decodeError || bytes.length === 0) return true;\n\n this._kittyStorage.storeImage(cmd.id, {\n data: new Blob([bytes as BlobPart]),\n width: cmd.width ?? 0,\n height: cmd.height ?? 0,\n format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100,\n compression: cmd.compression ?? ''\n }, retainVirtual);\n return true;\n }\n\n private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise<boolean> {\n if (decodeError) {\n if (cmd.id !== undefined) {\n this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0);\n }\n return true;\n }\n\n const virtual = cmd.unicodePlaceholder === 1;\n this._handleTransmit(cmd, bytes, decodeError, virtual);\n\n const id = cmd.id ?? this._kittyStorage.lastImageId;\n const image = this._kittyStorage.getImage(id);\n if (image) {\n const result = virtual\n ? this._placeVirtual(image, cmd, true)\n : this._displayImage(image, cmd);\n if (cmd.id !== undefined) {\n return result.then(success => {\n this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0);\n return true;\n });\n }\n return result.then(() => true);\n }\n return true;\n }\n\n private _handleQuery(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {\n const id = cmd.id ?? 0;\n const quiet = cmd.quiet ?? 0;\n\n // Per spec: reject unsupported transmission mediums (only t=d is supported atm)\n // TODO: When filesystem support is added (Node.js/Electron), update this to accept\n // t=f (file), t=t (temp file), and t=s (shared memory) and respond OK for queries.\n const transmission = cmd.transmission ?? 'd';\n if (transmission !== 'd') {\n this._sendResponse(id, 'EINVAL:unsupported transmission medium', quiet);\n return true;\n }\n\n // Check decode error first (invalid base64)\n if (decodeError) {\n this._sendResponse(id, 'EINVAL:invalid base64 data', quiet);\n return true;\n }\n\n // Capability query (no payload) - just respond OK\n if (bytes.length === 0) {\n this._sendResponse(id, 'OK', quiet);\n return true;\n }\n\n const format = cmd.format ?? KittyFormat.RGBA;\n\n if (format === KittyFormat.PNG) {\n this._sendResponse(id, 'OK', quiet);\n } else {\n const width = cmd.width ?? 0;\n const height = cmd.height ?? 0;\n\n if (!width || !height) {\n this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet);\n return true;\n }\n\n const bytesPerPixel = format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n this._sendResponse(id, `EINVAL:insufficient pixel data`, quiet);\n return true;\n }\n\n this._sendResponse(id, 'OK', quiet);\n }\n return true;\n }\n\n private _handleDelete(cmd: IKittyCommand): boolean {\n // Per spec: default delete selector is 'a' (delete all visible placements)\n const selector = cmd.deleteSelector ?? 'a';\n\n switch (selector) {\n case 'a':\n this._kittyStorage.deletePhysicalPlacements();\n break;\n case 'A':\n this._cleanupAllPending();\n this._kittyStorage.deleteAll(true);\n break;\n case 'i':\n case 'I':\n if (cmd.id !== undefined) {\n if (selector === 'I') {\n const pending = this._pendingTransmissions.get(cmd.id);\n pending?.decoder.release();\n this._removePendingEntry(cmd.id);\n this._kittyStorage.deleteById(cmd.id, cmd.placementId);\n } else {\n this._kittyStorage.deletePlacementsById(cmd.id, cmd.placementId);\n }\n }\n break;\n default:\n // Unsupported selectors (c, n, p, q, r, x, y, z, f) \u2014 ignore for now\n break;\n }\n return true;\n }\n\n private _sendResponse(id: number, message: string, quiet: number, placementId?: number): void {\n const isOk = message === 'OK';\n if (isOk && quiet >= 1) return;\n if (!isOk && quiet >= 2) return;\n\n const pPart = placementId ? `,p=${placementId}` : '';\n const response = `\\x1b_Gi=${id}${pPart};${message}\\x1b\\\\`;\n this._coreTerminal._core.coreService.triggerDataEvent(response);\n }\n\n // Image display\n\n private _displayImage(image: IKittyImageData, cmd: IKittyCommand): Promise<boolean> {\n return this._decodeAndDisplay(image, cmd)\n .then(() => true)\n .catch(() => false);\n }\n\n private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise<void> {\n const generation = this._generation;\n let bitmap: ImageBitmap | undefined = await this._createBitmap(image);\n\n try {\n if (generation !== this._generation) throw new Error('image decode canceled');\n const cropped = this._cropImage(bitmap, cmd);\n bitmap = cropped instanceof Promise ? await cropped : cropped;\n\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n let { cols: imgCols, rows: imgRows } = this._placementGrid(bitmap, cmd, cw, ch);\n\n let w = bitmap.width;\n let h = bitmap.height;\n\n // Scale bitmap to fit placement rectangle when c/r are specified\n if (cmd.columns !== undefined || cmd.rows !== undefined) {\n w = Math.round(imgCols * cw);\n h = Math.round(imgRows * ch);\n }\n\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n\n // Save cursor position before addImage modifies it\n const buffer = this._coreTerminal._core.buffer;\n const savedX = buffer.x;\n const savedY = buffer.y;\n const savedYbase = buffer.ybase;\n\n // Determine layer based on z-index: negative = behind text, 0+ = on top.\n // When z<0 we always use the bottom layer even without allowTransparency \u2014\n // the image will simply be hidden behind the opaque text background, which\n // is the correct behavior (client asked for \"behind text\").\n const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0;\n const layer: ImageLayer = wantsBottom ? 'bottom' : 'top';\n\n if (w !== bitmap.width || h !== bitmap.height) {\n const scaled = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h });\n bitmap.close();\n bitmap = scaled;\n }\n\n // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions\n const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1);\n const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1);\n if (xOffset !== 0 || yOffset !== 0) {\n // Per spec: X/Y is not added to c/r area. When c/r are explicit, the\n // total placement area remains c*cw \u00D7 r*ch pixels and the offset image\n // is clipped to fit. When c/r are unset, the padded canvas determines\n // the natural cell dimensions.\n const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : bitmap.width + xOffset;\n const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : bitmap.height + yOffset;\n const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH);\n const offsetCtx = offsetCanvas.getContext('2d');\n if (!offsetCtx) {\n throw new Error('Failed to create offset canvas context');\n }\n offsetCtx.drawImage(bitmap, xOffset, yOffset);\n\n const offsetBitmap = await createImageBitmap(offsetCanvas);\n offsetCanvas.width = offsetCanvas.height = 0;\n bitmap.close();\n bitmap = offsetBitmap;\n w = bitmap.width;\n h = bitmap.height;\n if (w * h > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n if (cmd.columns === undefined) {\n imgCols = Math.ceil(bitmap.width / cw);\n }\n if (cmd.rows === undefined) {\n imgRows = Math.ceil(bitmap.height / ch);\n }\n }\n\n if (generation !== this._generation) throw new Error('image decode canceled');\n const zIndex = cmd.zIndex ?? 0;\n this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex);\n bitmap = undefined; // ownership transferred to storage\n\n // Kitty cursor movement\n // Per spec: cursor placed at first column after last image column,\n // on the last row of the image. C=1 means don't move cursor.\n if (cmd.cursorMovement === 1) {\n // C=1: restore cursor to position before image was placed\n const scrolled = buffer.ybase - savedYbase;\n buffer.x = savedX;\n // Can't restore cursor to scrollback?\n buffer.y = Math.max(savedY - scrolled, 0);\n } else {\n // Default (C=0): advance cursor horizontally past the image\n // addImage already positioned cursor on the last row via lineFeeds\n buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols);\n }\n } catch (e) {\n bitmap?.close();\n throw e;\n }\n }\n\n // Keep the uncropped path synchronous to preserve its parser scheduling.\n private _cropImage(bitmap: ImageBitmap, cmd: IKittyCommand): ImageBitmap | Promise<ImageBitmap> {\n const cropX = Math.max(0, cmd.x ?? 0);\n const cropY = Math.max(0, cmd.y ?? 0);\n const cropW = cmd.sourceWidth || (bitmap.width - cropX);\n const cropH = cmd.sourceHeight || (bitmap.height - cropY);\n\n const maxCropW = Math.max(0, bitmap.width - cropX);\n const maxCropH = Math.max(0, bitmap.height - cropY);\n const finalCropW = Math.max(0, Math.min(cropW, maxCropW));\n const finalCropH = Math.max(0, Math.min(cropH, maxCropH));\n\n if (finalCropW === 0 || finalCropH === 0) {\n throw new Error('invalid source rectangle');\n }\n\n if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) {\n return createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH).then(cropped => {\n bitmap.close();\n return cropped;\n });\n }\n return bitmap;\n }\n\n // An omitted grid dimension follows the source aspect ratio.\n private _placementGrid(bitmap: ImageBitmap, cmd: IKittyCommand, cw: number, ch: number): { cols: number; rows: number } {\n if (cmd.columns !== undefined && cmd.rows !== undefined) {\n return { cols: cmd.columns, rows: cmd.rows };\n }\n if (cmd.columns !== undefined) {\n return { cols: cmd.columns, rows: Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (cmd.columns * cw) / ch)) };\n }\n if (cmd.rows !== undefined) {\n return { cols: Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (cmd.rows * ch) / cw)), rows: cmd.rows };\n }\n return { cols: Math.ceil(bitmap.width / cw), rows: Math.ceil(bitmap.height / ch) };\n }\n\n private async _placeVirtual(image: IKittyImageData, cmd: IKittyCommand, replaces = false): Promise<boolean> {\n const generation = this._generation;\n const isCurrent = (): boolean => generation === this._generation && this._kittyStorage.getImage(image.id) === image;\n let bitmap: ImageBitmap | undefined;\n try {\n bitmap = await this._createBitmap(image);\n if (!isCurrent()) throw new Error('image decode canceled');\n const cropped = this._cropImage(bitmap, cmd);\n bitmap = cropped instanceof Promise ? await cropped : cropped;\n\n const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;\n const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;\n const { cols, rows } = this._placementGrid(bitmap, cmd, cw, ch);\n\n if (bitmap.width * bitmap.height > this._opts.pixelLimit) {\n throw new Error('image exceeds pixel limit');\n }\n\n if (!isCurrent()) throw new Error('image decode canceled');\n this._kittyStorage.addVirtualPlacement(image.id, cmd.placementId ?? 0, bitmap, cols, rows);\n bitmap = undefined; // ownership transferred to storage\n if (replaces) this._kittyStorage.discardVirtualPlacements(image.id, cmd.placementId ?? 0);\n return true;\n } catch {\n bitmap?.close();\n if (replaces && isCurrent()) this._kittyStorage.discardVirtualPlacements(image.id);\n return false;\n }\n }\n\n // Create ImageBitmap from already-decoded image data.\n private async _createBitmap(image: IKittyImageData): Promise<ImageBitmap> {\n let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer());\n\n if (image.compression === KittyCompression.ZLIB) {\n bytes = await this._decompressZlib(bytes);\n }\n\n if (image.format === KittyFormat.PNG) {\n const metrics = imageType(bytes);\n // IHDR dimensions are parsed with signed shifts, so a value >= 0x80000000 comes\n // back negative and a bare `>` pixel-limit test passes it; require positive.\n if (metrics.mime !== 'image/png' || !(metrics.width > 0) || !(metrics.height > 0) || metrics.width * metrics.height > this._opts.pixelLimit) {\n throw new RangeError('PNG exceeds pixel limit or has invalid dimensions');\n }\n const blob = new Blob([bytes as BlobPart], { type: 'image/png' });\n if (!window.createImageBitmap) {\n const url = URL.createObjectURL(blob);\n const img = new Image();\n return new Promise<ImageBitmap>((resolve, reject) => {\n img.addEventListener('load', () => {\n URL.revokeObjectURL(url);\n const canvas = ImageRenderer.createCanvas(window.document, img.width, img.height);\n canvas.getContext('2d')?.drawImage(img, 0, 0);\n createImageBitmap(canvas).then(resolve).catch(reject);\n });\n img.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n reject(new Error('Failed to load image'));\n });\n img.src = url;\n });\n }\n return createImageBitmap(blob);\n }\n\n // Raw pixel data\n const width = image.width;\n const height = image.height;\n\n if (!width || !height) {\n throw new Error('Width and height required for raw pixel data');\n }\n\n const bytesPerPixel = image.format === KittyFormat.RGBA ? KittyPixelConstants.BYTES_PER_PIXEL_RGBA : KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n const expectedBytes = width * height * bytesPerPixel;\n\n if (bytes.length < expectedBytes) {\n throw new Error('Insufficient pixel data');\n }\n\n const pixelCount = width * height;\n\n if (image.format === KittyFormat.RGBA) {\n // RGBA: use bytes directly \u2014 no copy needed\n return createImageBitmap(new ImageData(new Uint8ClampedArray(bytes.buffer as ArrayBuffer, bytes.byteOffset, pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA), width, height));\n }\n\n // RGB\u2192RGBA: interleave alpha using uint32 block processing (4 pixels per iteration).\n // 3 uint32 reads + 4 uint32 writes per 4 pixels vs 28 byte reads/writes \u2014 ~6x faster.\n // Assumes little-endian (all modern browsers/Node.js).\n const data = new Uint8ClampedArray(pixelCount * KittyPixelConstants.BYTES_PER_PIXEL_RGBA);\n const src32 = new Uint32Array(bytes.buffer, bytes.byteOffset, Math.floor(bytes.byteLength / 4));\n const dst32 = new Uint32Array(data.buffer);\n const alignedPixels = pixelCount & ~3; // round down to multiple of 4\n\n let srcOffset = 0;\n let dstOffset = 0;\n for (let i = 0; i < alignedPixels; i += 4) {\n const b0 = src32[srcOffset++];\n const b1 = src32[srcOffset++];\n const b2 = src32[srcOffset++];\n // Little-endian: pixel bytes are [R,G,B] \u2192 uint32 ABGR layout\n dst32[dstOffset++] = 0xFF000000 | b0;\n dst32[dstOffset++] = 0xFF000000 | (b0 >>> 24) | (b1 << 8);\n dst32[dstOffset++] = 0xFF000000 | (b1 >>> 16) | (b2 << 16);\n dst32[dstOffset++] = 0xFF000000 | (b2 >>> 8);\n }\n\n // Handle remaining 1\u20133 pixels\n let srcByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n let dstByte = alignedPixels * KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n for (let i = alignedPixels; i < pixelCount; i++) {\n data[dstByte] = bytes[srcByte];\n data[dstByte + 1] = bytes[srcByte + 1];\n data[dstByte + 2] = bytes[srcByte + 2];\n data[dstByte + 3] = KittyPixelConstants.ALPHA_OPAQUE;\n srcByte += KittyPixelConstants.BYTES_PER_PIXEL_RGB;\n dstByte += KittyPixelConstants.BYTES_PER_PIXEL_RGBA;\n }\n\n return createImageBitmap(new ImageData(data, width, height));\n }\n\n private async _decompressZlib(compressed: Uint8Array): Promise<Uint8Array> {\n try {\n return await this._decompress(compressed, 'deflate');\n } catch (error) {\n if (error instanceof RangeError) throw error;\n return await this._decompress(compressed, 'deflate-raw');\n }\n }\n\n private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise<Uint8Array> {\n const limit = Math.min(this._opts.kittySizeLimit, this._opts.pixelLimit * 4, this._opts.storageLimit * 1000000);\n let offsetIn = 0;\n // Bound inflation within one native transform before its output is budgeted.\n const source = new ReadableStream<BufferSource>({\n pull(controller) {\n if (offsetIn >= compressed.length) {\n controller.close();\n return;\n }\n const end = Math.min(offsetIn + 4096, compressed.length);\n controller.enqueue(new Uint8Array(compressed.subarray(offsetIn, end)));\n offsetIn = end;\n }\n });\n const reader = source.pipeThrough(new DecompressionStream(format)).getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n totalLength += value.byteLength;\n if (totalLength > limit) {\n await reader.cancel().catch(() => {});\n throw new RangeError('decompressed image exceeds byte limit');\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._kittyStorage.images;\n }\n\n public get _kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyStorage.kittyIdToStorageId;\n }\n\n public get pendingTransmissions(): ReadonlyMap<number, IPendingTransmission> {\n return this._pendingTransmissions;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty graphics protocol types, constants, and parsing utilities.\n */\n\nimport type Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';\n\n// Kitty graphics protocol action types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'.\nexport const enum KittyAction {\n TRANSMIT = 't',\n TRANSMIT_DISPLAY = 'T',\n QUERY = 'q',\n PLACEMENT = 'p',\n DELETE = 'd'\n}\n\n// Kitty graphics protocol format types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyFormat {\n RGB = 24,\n RGBA = 32,\n PNG = 100\n}\n\n// Kitty graphics protocol compression types.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'.\nexport const enum KittyCompression {\n NONE = '',\n ZLIB = 'z'\n}\n\n// Kitty graphics protocol control data keys.\n// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference\nexport const enum KittyKey {\n // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete)\n ACTION = 'a',\n // Image format (24=RGB, 32=RGBA, 100=PNG)\n FORMAT = 'f',\n // Image ID for referencing stored images\n ID = 'i',\n // Image number (alternative to ID, terminal assigns ID)\n IMAGE_NUMBER = 'I',\n // Source image width in pixels\n WIDTH = 's',\n // Source image height in pixels\n HEIGHT = 'v',\n // The left edge (in pixels) of the image area to display\n X_OFFSET = 'x',\n // The top edge (in pixels) of the image area to display\n Y_OFFSET = 'y',\n // Width (in pixels) of the source rectangle to display\n SOURCE_WIDTH = 'w',\n // Height (in pixels) of the source rectangle to display\n SOURCE_HEIGHT = 'h',\n // Horizontal offset (in pixels) within the first cell\n X_PLACEMENT_OFFSET = 'X',\n // Vertical offset (in pixels) within the first cell\n Y_PLACEMENT_OFFSET = 'Y',\n // Number of terminal columns to display the image over\n COLUMNS = 'c',\n // Number of terminal rows to display the image over\n ROWS = 'r',\n // More data flag (1=more chunks coming, 0=final chunk)\n MORE = 'm',\n // Compression type (z=zlib). This is essential for chunking larger images.\n COMPRESSION = 'o',\n // Quiet mode (1=suppress OK responses, 2=suppress error responses)\n QUIET = 'q',\n // Cursor movement policy (0=move cursor after image, 1=don't move cursor)\n CURSOR_MOVEMENT = 'C',\n // Z-index for image layering (negative = behind text, 0+ = on top)\n Z_INDEX = 'z',\n // Transmission medium (d=direct, f=file, t=temp file, s=shared memory)\n TRANSMISSION = 't',\n // Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) \u2014 only used when a=d\n DELETE_SELECTOR = 'd',\n // Placement ID for targeting specific placements\n PLACEMENT_ID = 'p',\n // U=1 creates a prototype for placeholder cells without placing cursor tiles.\n UNICODE_PLACEHOLDER = 'U'\n}\n\n// Pixel format constants\nexport const enum KittyPixelConstants {\n BYTES_PER_PIXEL_RGB = 3,\n BYTES_PER_PIXEL_RGBA = 4,\n ALPHA_OPAQUE = 255\n}\n\n// Parsed Kitty graphics command.\nexport interface IKittyCommand {\n action?: string;\n format?: number;\n id?: number;\n imageNumber?: number;\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n sourceWidth?: number;\n sourceHeight?: number;\n xOffset?: number;\n yOffset?: number;\n columns?: number;\n rows?: number;\n more?: number;\n quiet?: number;\n cursorMovement?: number;\n zIndex?: number;\n transmission?: string;\n deleteSelector?: string;\n placementId?: number;\n compression?: string;\n unicodePlaceholder?: number;\n payload?: string;\n}\n\n// Pending chunked transmission state.\n// Stores metadata from the first chunk while accumulating decoded payload data.\nexport interface IPendingTransmission {\n // The parsed command from the first chunk (contains action, format, dimensions, etc.)\n cmd: IKittyCommand;\n // Decoder used across chunked payloads\n decoder: Base64Decoder;\n // Total encoded (base64) bytes received across all chunks - for size limit enforcement\n totalEncodedSize: number;\n // Whether any chunk has failed to decode\n decodeError: boolean;\n}\n\n// Stored Kitty image data.\nexport interface IKittyImageData {\n id: number;\n // Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit\n data: Blob;\n width: number;\n height: number;\n format: 24 | 32 | 100;\n compression?: string;\n}\n\nexport interface IVirtualPlacement {\n placementId: number;\n storageId: number;\n cols: number;\n rows: number;\n}\n\n// Parses Kitty graphics control data into a command object.\nexport function parseKittyCommand(data: string): IKittyCommand {\n const cmd: IKittyCommand = {};\n const parts = data.split(',');\n\n for (const part of parts) {\n const eqIdx = part.indexOf('=');\n if (eqIdx === -1) continue;\n\n const key = part.substring(0, eqIdx);\n const value = part.substring(eqIdx + 1);\n\n // Handle string keys first\n if (key === KittyKey.ACTION) {\n cmd.action = value;\n continue;\n }\n if (key === KittyKey.COMPRESSION) {\n cmd.compression = value;\n continue;\n }\n if (key === KittyKey.TRANSMISSION) {\n cmd.transmission = value;\n continue;\n }\n if (key === KittyKey.DELETE_SELECTOR) {\n cmd.deleteSelector = value;\n continue;\n }\n const numValue = parseInt(value, 10);\n switch (key) {\n case KittyKey.FORMAT: cmd.format = numValue; break;\n case KittyKey.ID: cmd.id = numValue; break;\n case KittyKey.IMAGE_NUMBER: cmd.imageNumber = numValue; break;\n case KittyKey.WIDTH: cmd.width = numValue; break;\n case KittyKey.HEIGHT: cmd.height = numValue; break;\n case KittyKey.X_OFFSET: cmd.x = numValue; break;\n case KittyKey.Y_OFFSET: cmd.y = numValue; break;\n case KittyKey.SOURCE_WIDTH: cmd.sourceWidth = numValue; break;\n case KittyKey.SOURCE_HEIGHT: cmd.sourceHeight = numValue; break;\n case KittyKey.X_PLACEMENT_OFFSET: cmd.xOffset = numValue; break;\n case KittyKey.Y_PLACEMENT_OFFSET: cmd.yOffset = numValue; break;\n case KittyKey.COLUMNS: cmd.columns = numValue; break;\n case KittyKey.ROWS: cmd.rows = numValue; break;\n case KittyKey.MORE: cmd.more = numValue; break;\n case KittyKey.QUIET: cmd.quiet = numValue; break;\n case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break;\n case KittyKey.Z_INDEX: cmd.zIndex = numValue; break;\n case KittyKey.PLACEMENT_ID: cmd.placementId = numValue; break;\n case KittyKey.UNICODE_PLACEHOLDER: cmd.unicodePlaceholder = numValue; break;\n }\n }\n\n return cmd;\n}\n\n\n// Source patches can only name files included in the published package.\n\nexport const PLACEHOLDER_CHAR = 0x10EEEE;\n\n// Protocol table order; values are one-based so zero can mean an omitted diacritic.\nexport const PLACEHOLDER_DIACRITICS: readonly number[] = [\n 0x305, 0x30D, 0x30E, 0x310, 0x312, 0x33D, 0x33E, 0x33F, 0x346, 0x34A,\n 0x34B, 0x34C, 0x350, 0x351, 0x352, 0x357, 0x35B, 0x363, 0x364, 0x365,\n 0x366, 0x367, 0x368, 0x369, 0x36A, 0x36B, 0x36C, 0x36D, 0x36E, 0x36F,\n 0x483, 0x484, 0x485, 0x486, 0x487, 0x592, 0x593, 0x594, 0x595, 0x597,\n 0x598, 0x599, 0x59C, 0x59D, 0x59E, 0x59F, 0x5A0, 0x5A1, 0x5A8, 0x5A9,\n 0x5AB, 0x5AC, 0x5AF, 0x5C4, 0x610, 0x611, 0x612, 0x613, 0x614, 0x615,\n 0x616, 0x617, 0x657, 0x658, 0x659, 0x65A, 0x65B, 0x65D, 0x65E, 0x6D6,\n 0x6D7, 0x6D8, 0x6D9, 0x6DA, 0x6DB, 0x6DC, 0x6DF, 0x6E0, 0x6E1, 0x6E2,\n 0x6E4, 0x6E7, 0x6E8, 0x6EB, 0x6EC, 0x730, 0x732, 0x733, 0x735, 0x736,\n 0x73A, 0x73D, 0x73F, 0x740, 0x741, 0x743, 0x745, 0x747, 0x749, 0x74A,\n 0x7EB, 0x7EC, 0x7ED, 0x7EE, 0x7EF, 0x7F0, 0x7F1, 0x7F3, 0x816, 0x817,\n 0x818, 0x819, 0x81B, 0x81C, 0x81D, 0x81E, 0x81F, 0x820, 0x821, 0x822,\n 0x823, 0x825, 0x826, 0x827, 0x829, 0x82A, 0x82B, 0x82C, 0x82D, 0x951,\n 0x953, 0x954, 0xF82, 0xF83, 0xF86, 0xF87, 0x135D, 0x135E, 0x135F, 0x17DD,\n 0x193A, 0x1A17, 0x1A75, 0x1A76, 0x1A77, 0x1A78, 0x1A79, 0x1A7A, 0x1A7B, 0x1A7C,\n 0x1B6B, 0x1B6D, 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73, 0x1CD0, 0x1CD1,\n 0x1CD2, 0x1CDA, 0x1CDB, 0x1CE0, 0x1DC0, 0x1DC1, 0x1DC3, 0x1DC4, 0x1DC5, 0x1DC6,\n 0x1DC7, 0x1DC8, 0x1DC9, 0x1DCB, 0x1DCC, 0x1DD1, 0x1DD2, 0x1DD3, 0x1DD4, 0x1DD5,\n 0x1DD6, 0x1DD7, 0x1DD8, 0x1DD9, 0x1DDA, 0x1DDB, 0x1DDC, 0x1DDD, 0x1DDE, 0x1DDF,\n 0x1DE0, 0x1DE1, 0x1DE2, 0x1DE3, 0x1DE4, 0x1DE5, 0x1DE6, 0x1DFE, 0x20D0, 0x20D1,\n 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20DB, 0x20DC, 0x20E1, 0x20E7, 0x20E9, 0x20F0,\n 0x2CEF, 0x2CF0, 0x2CF1, 0x2DE0, 0x2DE1, 0x2DE2, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6,\n 0x2DE7, 0x2DE8, 0x2DE9, 0x2DEA, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, 0x2DEF, 0x2DF0,\n 0x2DF1, 0x2DF2, 0x2DF3, 0x2DF4, 0x2DF5, 0x2DF6, 0x2DF7, 0x2DF8, 0x2DF9, 0x2DFA,\n 0x2DFB, 0x2DFC, 0x2DFD, 0x2DFE, 0x2DFF, 0xA66F, 0xA67C, 0xA67D, 0xA6F0, 0xA6F1,\n 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, 0xA8E8, 0xA8E9,\n 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xAAB0, 0xAAB2,\n 0xAAB3, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xFE20, 0xFE21, 0xFE22, 0xFE23,\n 0xFE24, 0xFE25, 0xFE26, 0x10A0F, 0x10A38, 0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189,\n 0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244,\n];\n\nconst PLACEHOLDER_DIACRITIC_VALUES: Map<number, number> = new Map();\nfor (let i = 0; i < PLACEHOLDER_DIACRITICS.length; ++i) {\n PLACEHOLDER_DIACRITIC_VALUES.set(PLACEHOLDER_DIACRITICS[i], i + 1);\n}\n\n// Zero values may inherit from the preceding placeholder cell.\nexport interface IPlaceholderLocation {\n row: number;\n column: number;\n highByte: number;\n}\n\nfunction placeholderDiacriticValue(mark: string | undefined): number {\n return mark === undefined ? 0 : PLACEHOLDER_DIACRITIC_VALUES.get(mark.codePointAt(0) ?? -1) ?? -1;\n}\n\nexport function decodePlaceholderLocation(chars: string): IPlaceholderLocation {\n const [, row, column, highByte] = chars;\n return {\n row: placeholderDiacriticValue(row),\n column: placeholderDiacriticValue(column),\n highByte: placeholderDiacriticValue(highByte)\n };\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IBufferLine } from 'common/buffer/Types';\nimport { IDisposable } from '@xterm/xterm';\nimport { CellData } from 'common/buffer/CellData';\nimport { FgFlags } from 'common/buffer/Constants';\nimport { ImageRenderer } from '../ImageRenderer';\nimport { ImageStorage } from '../ImageStorage';\nimport { Attributes, ITerminalExt, ImageLayer, IAddImageOpts } from '../Types';\nimport { decodePlaceholderLocation, IKittyImageData, IPlaceholderLocation, IVirtualPlacement, PLACEHOLDER_CHAR } from './KittyGraphicsTypes';\n\ninterface IPlaceholderCell {\n imageId: number;\n placementId: number;\n location: IPlaceholderLocation;\n}\n\n// Kitty-specific image storage controller.\n//\n// Wraps shared ImageStorage with kitty protocol semantics:\n// - tracks transmitted image payloads by kitty image id\n// - tracks kitty image id -> shared ImageStorage id mapping for displayed images\n// - tracks virtual placements that U+10EEEE cells display\n// - mirrors shared-storage evictions into kitty maps\n// - applies protocol-level undisplayed-image eviction policy\nexport class KittyImageStorage implements IDisposable {\n private static readonly _maxStoredImages = 256;\n\n private _nextImageId = 1;\n private readonly _images: Map<number, IKittyImageData> = new Map();\n // TODO: Track physical placements by (image id, placement id), like virtual placements.\n private readonly _kittyIdToStorageId: Map<number, number> = new Map();\n private readonly _storageIdToKittyId: Map<number, number> = new Map();\n private readonly _virtualPlacements: Map<number, Map<number, IVirtualPlacement>> = new Map();\n private readonly _virtualStorageIds = new Map<number, { kittyId: number, placementId: number }>();\n\n private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined;\n private readonly _wrappedOnImageDeleted: (storageId: number) => void;\n private readonly _handleStorageImageDeleted = (storageId: number): void => {\n const virtual = this._virtualStorageIds.get(storageId);\n if (virtual) {\n this._virtualStorageIds.delete(storageId);\n const placements = this._virtualPlacements.get(virtual.kittyId);\n placements?.delete(virtual.placementId);\n if (!placements?.size) this._virtualPlacements.delete(virtual.kittyId);\n }\n const kittyId = this._storageIdToKittyId.get(storageId);\n if (kittyId !== undefined) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n }\n };\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n\n constructor(\n private readonly _storage: ImageStorage,\n private readonly _renderer: ImageRenderer\n ) {\n this._previousOnImageDeleted = this._storage.onImageDeleted;\n this._wrappedOnImageDeleted = (storageId: number) => {\n this._previousOnImageDeleted?.(storageId);\n this._handleStorageImageDeleted(storageId);\n };\n this._storage.onImageDeleted = this._wrappedOnImageDeleted;\n this._storage.onRenderLine = this._renderPlaceholderLine;\n }\n\n // Reserved placeholder text stays in the buffer but never draws as a glyph.\n public hidePlaceholderGlyphs(terminal: ITerminalExt): void {\n const buffer = terminal._core.buffer;\n let cell: CellData | undefined;\n const start = terminal.buffer.active.viewportY;\n for (let row = start; row < start + terminal.rows; ++row) {\n const line = buffer.lines.get(row);\n if (!line) continue;\n for (let col = 0; col < terminal.cols; ++col) {\n if (line.getFg(col) & FgFlags.INVISIBLE) continue;\n if (line.getCodePoint(col) !== PLACEHOLDER_CHAR\n && (!line.isCombined(col) || line.getString(col).codePointAt(0) !== PLACEHOLDER_CHAR)) continue;\n cell ??= new CellData();\n line.loadCell(col, cell);\n cell.fg |= FgFlags.INVISIBLE;\n line.setCell(col, cell);\n }\n }\n }\n\n public reset(): void {\n this._nextImageId = 1;\n this._images.clear();\n this._kittyIdToStorageId.clear();\n this._storageIdToKittyId.clear();\n this._virtualPlacements.clear();\n this._virtualStorageIds.clear();\n }\n\n public dispose(): void {\n this.reset();\n if (this._storage.onImageDeleted === this._wrappedOnImageDeleted) {\n this._storage.onImageDeleted = this._previousOnImageDeleted;\n }\n if (this._storage.onRenderLine === this._renderPlaceholderLine) {\n this._storage.onRenderLine = undefined;\n }\n }\n\n public storeImage(id: number | undefined, imageData: Omit<IKittyImageData, 'id'>, retainVirtual = false): number {\n const imageId = id ?? this._nextImageId++;\n\n if (!retainVirtual) this._deleteVirtualPlacements(imageId);\n const oldStorageId = this._kittyIdToStorageId.get(imageId);\n if (oldStorageId !== undefined) {\n this._storage.deleteImage(oldStorageId);\n this._kittyIdToStorageId.delete(imageId);\n this._storageIdToKittyId.delete(oldStorageId);\n }\n\n if (!this._images.has(imageId) && this._images.size >= KittyImageStorage._maxStoredImages) {\n this._evictUndisplayedImages();\n }\n\n // Encoded images awaiting placement are outside ImageStorage's pixel budget.\n // Unplaced payloads are evicted first so a new upload cannot erase a visible\n // image while abandoned blobs still hold budget; placed ones go only when\n // that is not enough, because the byte cap is a hard bound. The new image is\n // always stored, so an oversized one overshoots by at most one payload\n // (itself bounded by kittySizeLimit) rather than being dropped after an OK ack.\n const byteLimit = this._storage.getLimit() * 1000000;\n this._images.delete(imageId);\n let retainedBytes = 0;\n for (const image of this._images.values()) retainedBytes += image.data.size;\n for (const evictPlaced of [false, true]) {\n for (const [oldestId, image] of this._images) {\n if (retainedBytes + imageData.data.size <= byteLimit) break;\n if ((this._kittyIdToStorageId.has(oldestId) || this._virtualPlacements.has(oldestId)) !== evictPlaced) continue;\n retainedBytes -= image.data.size;\n this.deleteById(oldestId);\n }\n }\n\n this._images.set(imageId, {\n ...imageData,\n id: imageId\n });\n return imageId;\n }\n\n public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void {\n // Clean up stale reverse-mapping from a previous placement of the same\n // kitty image. The old shared-storage entry is kept (it may still be\n // visible on screen) but its reverse mapping is removed so that eviction\n // of the old entry won't incorrectly delete the kitty image data.\n const oldStorageId = this._kittyIdToStorageId.get(kittyId);\n if (oldStorageId !== undefined) {\n this._storageIdToKittyId.delete(oldStorageId);\n }\n this._addImageOpts.scrolling = scrolling;\n this._addImageOpts.layer = layer;\n this._addImageOpts.zIndex = zIndex;\n const storageId = this._storage.addImage(image, this._addImageOpts);\n this._kittyIdToStorageId.set(kittyId, storageId);\n this._storageIdToKittyId.set(storageId, kittyId);\n }\n\n public getImage(kittyId: number): IKittyImageData | undefined {\n return this._images.get(kittyId);\n }\n\n // Fit prototypes at render time so each placement holds only the source pixels.\n public addVirtualPlacement(kittyId: number, placementId: number, image: HTMLCanvasElement | ImageBitmap, cols: number, rows: number): void {\n const previous = this._virtualPlacements.get(kittyId)?.get(placementId);\n if (image.width * image.height * 4 > this._storage.getLimit() * 1000000) throw new Error('virtual image exceeds storage limit');\n if (!previous && this._virtualStorageIds.size >= KittyImageStorage._maxStoredImages) throw new Error('virtual placement limit exceeded');\n if (previous) this._storage.deleteImage(previous.storageId);\n const storageId = this._storage.addUnplacedImage(image, { scrolling: false, layer: 'top', zIndex: 0, cursorPos: 'iip' });\n let placements = this._virtualPlacements.get(kittyId);\n if (!placements) {\n placements = new Map();\n this._virtualPlacements.set(kittyId, placements);\n }\n placements.set(placementId, { placementId, storageId, cols, rows });\n this._virtualStorageIds.set(storageId, { kittyId, placementId });\n this._renderer.refreshAll();\n }\n\n private _virtualPlacementFor(kittyId: number, placementId: number): IVirtualPlacement | undefined {\n const placements = this._virtualPlacements.get(kittyId);\n return placementId === 0 ? placements?.values().next().value : placements?.get(placementId);\n }\n\n public discardVirtualPlacements(kittyId: number, keepPlacementId?: number): void {\n this._deleteVirtualPlacements(kittyId, undefined, keepPlacementId);\n }\n\n private _deleteVirtualPlacements(kittyId: number, placementId?: number, keepPlacementId?: number): void {\n const placements = this._virtualPlacements.get(kittyId);\n if (!placements) return;\n for (const placement of [...placements.values()]) {\n if ((placementId === undefined || placementId === placement.placementId) && placement.placementId !== keepPlacementId) {\n this._storage.deleteImage(placement.storageId);\n }\n }\n }\n\n public deletePlacementsById(kittyId: number, placementId?: number): void {\n this._deleteVirtualPlacements(kittyId, placementId);\n if (placementId !== undefined) return;\n const storageId = this._kittyIdToStorageId.get(kittyId);\n if (storageId !== undefined) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n this._storage.deleteImage(storageId);\n }\n }\n\n public deleteById(kittyId: number, placementId?: number): void {\n this.deletePlacementsById(kittyId, placementId);\n if (!this._virtualPlacements.has(kittyId) && !this._kittyIdToStorageId.has(kittyId)) {\n this._images.delete(kittyId);\n }\n }\n\n public deletePhysicalPlacements(): void {\n for (const [kittyId, storageId] of [...this._kittyIdToStorageId]) {\n this._kittyIdToStorageId.delete(kittyId);\n this._storageIdToKittyId.delete(storageId);\n this._storage.deleteImage(storageId);\n }\n }\n\n public deleteAll(preserveVirtual = false): void {\n if (preserveVirtual) this.deletePhysicalPlacements();\n for (const kittyId of [...this._images.keys()]) {\n if (!preserveVirtual || !this._virtualPlacements.has(kittyId)) this.deleteById(kittyId);\n }\n }\n\n public get images(): ReadonlyMap<number, IKittyImageData> {\n return this._images;\n }\n\n public get kittyIdToStorageId(): ReadonlyMap<number, number> {\n return this._kittyIdToStorageId;\n }\n\n public get lastImageId(): number {\n return this._nextImageId - 1;\n }\n\n private _evictUndisplayedImages(): void {\n for (const [kittyId] of this._images) {\n if (this._images.size <= KittyImageStorage._maxStoredImages / 2) {\n break;\n }\n if (!this._kittyIdToStorageId.has(kittyId) && !this._virtualPlacements.has(kittyId)) {\n this._images.delete(kittyId);\n this._virtualPlacements.delete(kittyId);\n }\n }\n }\n\n // Omitted diacritics inherit only from a consecutive matching placeholder.\n private readonly _renderPlaceholderLine = (line: IBufferLine, row: number, cols: number): void => {\n if (this._virtualPlacements.size === 0) {\n return;\n }\n let runLength = 0;\n let previous: IPlaceholderCell | undefined;\n for (let col = 0; col <= cols; ++col) {\n const cell = col < cols ? this._placeholderCell(line, col) : undefined;\n if (runLength > 0 && cell !== undefined && previous !== undefined\n && cell.imageId === previous.imageId\n && cell.placementId === previous.placementId\n && (cell.location.row === 0 || cell.location.row === previous.location.row)\n && (cell.location.column === 0 || cell.location.column === previous.location.column + 1)\n && (cell.location.highByte === 0 || cell.location.highByte === previous.location.highByte)) {\n runLength++;\n cell.location.row = Math.max(previous.location.row, 1);\n cell.location.column = previous.location.column + 1;\n cell.location.highByte = Math.max(previous.location.highByte, 1);\n } else {\n if (runLength > 0 && previous !== undefined) {\n this._drawPlaceholderRun(previous, col - runLength, runLength, row);\n }\n runLength = 0;\n if (cell !== undefined) {\n runLength = 1;\n if (!cell.location.row) cell.location.row = 1;\n if (!cell.location.column) cell.location.column = 1;\n if (!cell.location.highByte) cell.location.highByte = 1;\n }\n }\n previous = cell ?? previous;\n }\n };\n\n private _placeholderCell(line: IBufferLine, col: number): IPlaceholderCell | undefined {\n if (!line.isCombined(col) && line.getCodePoint(col) !== PLACEHOLDER_CHAR) {\n return undefined;\n }\n const chars = line.getString(col);\n if (chars.codePointAt(0) !== PLACEHOLDER_CHAR) {\n return undefined;\n }\n\n const fg = line.getFg(col);\n const fgMode = fg & Attributes.CM_MASK;\n const imageId = fgMode === Attributes.CM_RGB\n ? fg & Attributes.RGB_MASK\n : fgMode === 0 ? 0 : fg & Attributes.PCOLOR_MASK;\n if (fgMode === 0) {\n return undefined;\n }\n\n // Placement IDs use underline color without an underline style.\n let placementId = 0;\n const underlineColor = line.getExtended(col)?.underlineColor ?? 0;\n if (underlineColor > 0) {\n const underlineMode = underlineColor & Attributes.CM_MASK;\n placementId = underlineMode === Attributes.CM_RGB\n ? underlineColor & Attributes.RGB_MASK\n : underlineMode === 0 ? 0 : underlineColor & Attributes.PCOLOR_MASK;\n }\n\n const location = decodePlaceholderLocation(chars);\n if (location.row < 0 || location.column < 0 || location.highByte < 0 || location.highByte > 256) return undefined;\n return { imageId, placementId, location };\n }\n\n private _drawPlaceholderRun(cell: IPlaceholderCell, startCol: number, count: number, row: number): void {\n const imageId = (cell.imageId | ((cell.location.highByte - 1) << 24)) >>> 0;\n const placement = this._virtualPlacementFor(imageId, cell.placementId);\n const spec = placement && this._storage.getImageSpec(placement.storageId);\n // `column` is 1-based and holds the last cell of the run.\n const gridRow = cell.location.row - 1;\n const gridCol = cell.location.column - count;\n if (!placement || !spec || gridRow < 0 || gridRow >= placement.rows || gridCol < 0) {\n return;\n }\n // Cells past the placement's box show nothing.\n const tiles = Math.min(count, placement.cols - gridCol);\n if (tiles <= 0) {\n return;\n }\n this._renderer.drawCellImage(spec, placement.cols, placement.rows, gridRow, gridCol, tiles, startCol, row);\n }\n}\n", "/**\n * Copyright (c) 2020, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IDcsHandler, IParams, IImageAddonOptions, ITerminalExt, AttributeData, IResetHandler, ReadonlyColorSet } from './Types';\nimport { toRGBA8888, BIG_ENDIAN, PALETTE_ANSI_256, PALETTE_VT340_COLOR } from 'sixel/lib/Colors';\nimport { RGBA8888 } from 'sixel/lib/Types';\nimport { ImageRenderer } from './ImageRenderer';\n\nimport { DecoderAsync, Decoder } from 'sixel/lib/Decoder';\nimport { LIMITS } from 'sixel/lib/wasm';\n\n// always free decoder ressources after decoding if it exceeds this limit\nconst MEM_PERMA_LIMIT = 4194304; // 1024 pixels * 1024 pixels * 4 channels = 4MB\n\n// custom default palette: VT340 (lower 16 colors) + ANSI256 (up to 256) + zeroed (up to 4096)\nconst DEFAULT_PALETTE = PALETTE_ANSI_256;\nDEFAULT_PALETTE.set(PALETTE_VT340_COLOR);\n\n// Why pooled: every decoder owns a wasm memory, and V8 caps live wasm memories\n// per process (~124 in a sandboxed renderer). Terminals borrow a decoder only\n// while a SIXEL sequence is open, so idle terminals hold none.\nconst MAX_IDLE_DECODERS = 2;\nconst idleDecoders = new Map<number, Decoder[]>();\nlet poolPrimed = false;\n\nfunction primeDecoderPool(memoryLimit: number): void {\n if (poolPrimed) return;\n poolPrimed = true;\n // Async compile once, off the parser's hot path; later decoders reuse the cached module.\n DecoderAsync({ memoryLimit, palette: DEFAULT_PALETTE }).then(\n d => releaseDecoder(d, memoryLimit),\n () => { poolPrimed = false; }\n );\n}\n\nfunction acquireDecoder(memoryLimit: number): Decoder {\n return idleDecoders.get(memoryLimit)?.pop() ?? new Decoder({ memoryLimit, palette: DEFAULT_PALETTE });\n}\n\nfunction releaseDecoder(dec: Decoder, memoryLimit: number): void {\n if (dec.memoryUsage > MEM_PERMA_LIMIT) {\n dec.release();\n }\n const idle = idleDecoders.get(memoryLimit) ?? [];\n if (idle.length < MAX_IDLE_DECODERS) {\n idle.push(dec);\n idleDecoders.set(memoryLimit, idle);\n }\n}\n\n\nexport class SixelHandler implements IDcsHandler, IResetHandler {\n private _size = 0;\n private _aborted = false;\n private _dec: Decoder | undefined;\n private _decMemoryLimit = 0;\n // Color registers outlive a single image, so they live here rather than in a pooled decoder.\n private readonly _palette = new Uint32Array(LIMITS.PALETTE_SIZE);\n\n constructor(\n private readonly _opts: IImageAddonOptions,\n private readonly _storage: SixelImageStorage,\n private readonly _coreTerminal: ITerminalExt\n ) {\n this._palette.set(DEFAULT_PALETTE);\n primeDecoderPool(this._opts.pixelLimit * 4);\n }\n\n public reset(): void {\n this._returnDecoder();\n this._palette.fill(0);\n this._palette.set(DEFAULT_PALETTE);\n }\n\n public hook(params: IParams): void {\n this._size = 0;\n this._aborted = false;\n this._returnDecoder();\n const memoryLimit = this._opts.pixelLimit * 4;\n try {\n this._dec = acquireDecoder(memoryLimit);\n } catch (e) {\n // Why: exhausting wasm memory must drop this image, not throw out of the parser and wedge the write queue.\n console.warn(`SIXEL: could not allocate decoder - ${e}`);\n this._aborted = true;\n return;\n }\n this._decMemoryLimit = memoryLimit;\n const fillColor = params.params[1] === 1 ? 0 : extractActiveBg(\n this._coreTerminal._core._inputHandler._curAttrData,\n this._coreTerminal._core._themeService?.colors);\n this._dec.init(fillColor, this._palette, this._opts.sixelPaletteLimit);\n }\n\n private _returnDecoder(): void {\n const dec = this._dec;\n if (!dec) return;\n this._dec = undefined;\n this._palette.set(dec.palette);\n releaseDecoder(dec, this._decMemoryLimit);\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._aborted || !this._dec) {\n return;\n }\n this._size += end - start;\n if (this._size > this._opts.sixelSizeLimit) {\n console.warn(`SIXEL: too much data, aborting`);\n this._aborted = true;\n this._dec.release();\n return;\n }\n try {\n this._dec.decode(data, start, end);\n } catch (e) {\n console.warn(`SIXEL: error while decoding image - ${e}`);\n this._aborted = true;\n this._dec.release();\n }\n }\n\n public unhook(success: boolean): boolean | Promise<boolean> {\n try {\n return this._unhook(success);\n } finally {\n this._returnDecoder();\n }\n }\n\n private _unhook(success: boolean): boolean {\n if (this._aborted || !success || !this._dec) {\n return true;\n }\n\n const width = this._dec.width;\n const height = this._dec.height;\n\n // partial fix for https://github.com/jerch/xterm-addon-image/issues/37\n if (!width || !height) {\n if (height) {\n this._storage.advanceCursor(height);\n }\n return true;\n }\n\n const canvas = ImageRenderer.createCanvas(undefined, width, height);\n canvas.getContext('2d')?.putImageData(new ImageData(this._dec.data8 as Uint8ClampedArray<ArrayBuffer>, width, height), 0, 0);\n this._storage.addImage(canvas);\n return true;\n }\n}\n\n\n/**\n * Some helpers to extract current terminal colors.\n */\n\n// get currently active background color from terminal\n// also respect INVERSE setting\nfunction extractActiveBg(attr: AttributeData, colors: ReadonlyColorSet | undefined): RGBA8888 {\n let bg = 0;\n if (!colors) {\n // FIXME: theme service is prolly not available yet,\n // happens if .open() was not called yet (bug in core?)\n return bg;\n }\n if (attr.isInverse()) {\n if (attr.isFgDefault()) {\n bg = convertLe(colors.foreground.rgba);\n } else if (attr.isFgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getFgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getFgColor()].rgba);\n }\n } else {\n if (attr.isBgDefault()) {\n bg = convertLe(colors.background.rgba);\n } else if (attr.isBgRGB()) {\n const t = (attr.constructor as typeof AttributeData).toColorRGB(attr.getBgColor());\n bg = toRGBA8888(...t);\n } else {\n bg = convertLe(colors.ansi[attr.getBgColor()].rgba);\n }\n }\n return bg;\n}\n\n// rgba values on the color managers are always in BE, thus convert to LE\nfunction convertLe(color: number): RGBA8888 {\n if (BIG_ENDIAN) return color;\n return (color & 0xFF) << 24 | (color >>> 8 & 0xFF) << 16 | (color >>> 16 & 0xFF) << 8 | color >>> 24 & 0xFF;\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { IImageAddonOptions, ITerminalExt, IAddImageOpts } from './Types';\nimport { ImageRenderer } from './ImageRenderer';\n\n/**\n * Sixel-specific image storage controller.\n *\n * Wraps the shared ImageStorage with sixel protocol semantics:\n * - Cursor behavior governed by DECSET 80 (sixelScrolling option)\n * - advanceCursor for empty sixels carrying only height\n */\nexport class SixelImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'vt340' };\n constructor(\n private readonly _storage: ImageStorage,\n private readonly _opts: IImageAddonOptions,\n private readonly _renderer: ImageRenderer,\n private readonly _terminal: ITerminalExt\n ) {}\n\n /**\n * Add a sixel image to storage.\n * Cursor behavior depends on the sixelScrolling option (DECSET 80).\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._addImageOpts.scrolling = this._opts.sixelScrolling;\n this._storage.addImage(img, this._addImageOpts);\n }\n\n /**\n * Only advance text cursor.\n * This is an edge case from empty sixels carrying only a height but no pixels.\n * Partially fixes https://github.com/jerch/xterm-addon-image/issues/37.\n */\n public advanceCursor(height: number): void {\n if (this._opts.sixelScrolling) {\n let cellSize = this._renderer.cellSize;\n if (cellSize.width === -1 || cellSize.height === -1) {\n cellSize = CELL_SIZE_DEFAULT;\n }\n const rows = Math.ceil(height / cellSize.height);\n for (let i = 1; i < rows; ++i) {\n this._terminal._core._inputHandler.lineFeed();\n }\n }\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAddImageOpts } from './Types';\nimport { ImageStorage } from './ImageStorage';\n\n/**\n * IIP (iTerm Image Protocol) specific image storage controller.\n *\n * Wraps the shared ImageStorage with IIP protocol semantics:\n * - Always uses scrolling mode (cursor advances with image)\n */\nexport class IIPImageStorage {\n private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };\n constructor(\n private readonly _storage: ImageStorage\n ) {}\n\n /**\n * Add an IIP image to storage.\n * Always uses scrolling mode \u2014 cursor advances past the image.\n */\n public addImage(img: HTMLCanvasElement | ImageBitmap): void {\n this._storage.addImage(img, this._addImageOpts);\n }\n}\n", "/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, IDisposable } from '@xterm/xterm';\nimport type { ImageAddon as IImageApi } from '@xterm/addon-image';\nimport { Emitter, type IEvent } from 'common/Event';\nimport { MicrotaskTimer } from 'common/Async';\nimport { IIPHandler } from './IIPHandler';\nimport { ImageRenderer } from './ImageRenderer';\nimport { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';\nimport { KittyGraphicsHandler } from './kitty/KittyGraphicsHandler';\nimport { KittyImageStorage } from './kitty/KittyImageStorage';\nimport { SixelHandler } from './SixelHandler';\nimport { SixelImageStorage } from './SixelImageStorage';\nimport { IIPImageStorage } from './IIPImageStorage';\nimport { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types';\n\n\n/**\n * Document VT features provided by this addon.\n *\n * @vt: #E[Supported via @xterm/addon-image.] DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q Pt ST\" \"Draw SIXEL image.\"\n *\n * Sixel support is provided by the addon @xterm/addon-image with these limitations:\n * - immediate coloring (no shared palette, allows high color settings of `img2sixel`)\n * - max. palette size of 4096 colors\n * - max. pixel width of 16K\n * - max. 25 MB per sixel sequence\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] OSC 1337 \"iTerm2 Commands\" \"OSC 1337 ; Pt BEL\" \"Custom iTerm2 commands.\"\n *\n * Only the inline image protocol (IIP) is supported by the addon @xterm/addon-image with\n * the following limitations:\n * - sequence:\n * - format: `OSC 1337 ; File=inline=1 ; size=<unencoded size> ; ... : <base64 payload> BEL`\n * - size param must be set and payload may not exceed CEIL(size * 4 / 3)\n * - strict base64 handling as of RFC4648 \u00A74 (standard alphabet, optional padding,\n * no separator bytes allowed)\n * - supported params: size, name, width, height, preserveAspectRatio\n * - image formats: PNG, JPEG and GIF\n * - no animation support (renders first image of a GIF)\n * - no multipart support\n * - VT340 cursor positioning (begin of last sixel data row)\n *\n * See [addon readme](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image)\n * and [iTerm2 IIP docs](https://iterm2.com/documentation-images.html) for more details.\n *\n *\n * @vt: #E[Supported via @xterm/addon-image.] APC KITTY_GRAPHICS \"Kitty Graphics\" \"APC G Pt ST\" \"Kitty Graphics Protocol.\"\n *\n * Kitty graphics support is provided by the addon @xterm/addon-image.\n * Note that while basic image output already works, this is still work in progress.\n */\n\n// default values of addon ctor options\nconst DEFAULT_OPTIONS: IImageAddonOptions = {\n enableSizeReports: true,\n pixelLimit: 16777216, // limit to 4096 * 4096 pixels\n sixelSupport: true,\n sixelScrolling: true,\n sixelPaletteLimit: 4096,\n sixelSizeLimit: 33554432,\n storageLimit: 128,\n showPlaceholder: true,\n iipSupport: true,\n iipSizeLimit: 33554432,\n kittySupport: true,\n kittySizeLimit: 33554432\n};\n\n// max palette size supported by the sixel lib (compile time setting)\nconst MAX_SIXEL_PALETTE_SIZE = 4096;\n\n// definitions for _xtermGraphicsAttributes sequence\nconst enum GaItem {\n COLORS = 1,\n SIXEL_GEO = 2,\n REGIS_GEO = 3\n}\nconst enum GaAction {\n READ = 1,\n SET_DEFAULT = 2,\n SET = 3,\n READ_MAX = 4\n}\nconst enum GaStatus {\n SUCCESS = 0,\n ITEM_ERROR = 1,\n ACTION_ERROR = 2,\n FAILURE = 3\n}\n\n\nexport class ImageAddon implements ITerminalAddon, IImageApi {\n private _opts: IImageAddonOptions;\n private _defaultOpts: IImageAddonOptions;\n private _storage: ImageStorage | undefined;\n private _renderer: ImageRenderer | undefined;\n private _disposables: IDisposable[] = [];\n private _terminal: ITerminalExt | undefined;\n private _handlers: Map<String, IResetHandler> = new Map();\n private readonly _onImageAdded = new Emitter<void>();\n public readonly onImageAdded: IEvent<void> = this._onImageAdded.event;\n\n constructor(opts?: Partial<IImageAddonOptions>) {\n this._opts = Object.assign({}, DEFAULT_OPTIONS, opts);\n this._defaultOpts = Object.assign({}, DEFAULT_OPTIONS, opts);\n }\n\n public dispose(): void {\n for (const handler of this._handlers.values()) handler.reset();\n for (const obj of this._disposables) {\n obj.dispose();\n }\n this._disposables.length = 0;\n this._handlers.clear();\n this._onImageAdded.dispose();\n }\n\n private _disposeLater(...args: IDisposable[]): void {\n for (const obj of args) {\n this._disposables.push(obj);\n }\n }\n\n public activate(terminal: ITerminalExt): void {\n this._terminal = terminal;\n\n // internal data structures\n this._renderer = new ImageRenderer(terminal);\n this._storage = new ImageStorage(terminal, this._renderer, this._opts);\n this._storage.onImageAdded = () => this._onImageAdded.fire();\n\n // enable size reports\n if (this._opts.enableSizeReports) {\n const windowOps = terminal.options.windowOptions ?? {};\n windowOps.getWinSizePixels = true;\n windowOps.getCellSizePixels = true;\n windowOps.getWinSizeChars = true;\n terminal.options.windowOptions = windowOps;\n }\n\n this._disposeLater(\n this._renderer,\n this._storage,\n\n // DECSET/DECRST/DA1/XTSMGRAPHICS handlers\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this._decset(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this._decrst(params)),\n terminal.parser.registerCsiHandler({ final: 'c' }, params => this._da1(params)),\n terminal.parser.registerCsiHandler({ prefix: '?', final: 'S' }, params => this._xtermGraphicsAttributes(params)),\n\n // render hook\n terminal.onRender(range => this._storage?.render(range)),\n\n /**\n * reset handlers covered:\n * - DECSTR\n * - RIS\n * - Terminal.reset()\n */\n terminal.parser.registerCsiHandler({ intermediates: '!', final: 'p' }, () => this.reset()),\n terminal.parser.registerEscHandler({ final: 'c' }, () => this.reset()),\n terminal._core._inputHandler.onRequestReset(() => this.reset()),\n\n // wipe canvas and delete alternate images on buffer switch\n terminal.buffer.onBufferChange(() => this._storage?.wipeAlternate()),\n\n // extend images to the right on resize\n terminal.onResize(metrics => this._storage?.viewportResize(metrics))\n );\n\n // SIXEL handler\n if (this._opts.sixelSupport) {\n const sixelStorage = new SixelImageStorage(this._storage!, this._opts, this._renderer!, terminal);\n const sixelHandler = new SixelHandler(this._opts, sixelStorage, terminal);\n this._handlers.set('sixel', sixelHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerDcsHandler({ final: 'q' }, sixelHandler)\n );\n }\n\n // iTerm IIP handler\n if (this._opts.iipSupport) {\n const iipStorage = new IIPImageStorage(this._storage!);\n const iipHandler = new IIPHandler(this._opts, this._renderer!, iipStorage, terminal);\n this._handlers.set('iip', iipHandler);\n this._disposeLater(\n terminal._core._inputHandler._parser.registerOscHandler(1337, iipHandler)\n );\n }\n\n // Kitty graphics handler\n if (this._opts.kittySupport) {\n const kittyStorage = new KittyImageStorage(this._storage!, this._renderer!);\n const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, kittyStorage, terminal);\n this._handlers.set('kitty', kittyHandler);\n const scrollMask = new MicrotaskTimer();\n const hide = (): void => kittyStorage.hidePlaceholderGlyphs(terminal);\n this._disposeLater(\n kittyStorage,\n kittyHandler,\n scrollMask,\n terminal.onWriteParsed(() => { scrollMask.cancel(); hide(); }),\n terminal.onScroll(() => scrollMask.set(hide)),\n terminal.onResize(hide),\n terminal._core._inputHandler._parser.registerApcHandler({ final: 'G' }, kittyHandler)\n );\n hide();\n }\n }\n\n // Note: storageLimit is skipped here to not intoduce a surprising side effect.\n public reset(): boolean {\n // reset options customizable by sequences to defaults\n this._opts.sixelScrolling = this._defaultOpts.sixelScrolling;\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n // also clear image storage\n this._storage?.reset();\n // reset protocol handlers\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return false;\n }\n\n public get storageLimit(): number {\n return this._storage?.getLimit() || -1;\n }\n\n public set storageLimit(limit: number) {\n this._storage?.setLimit(limit);\n this._opts.storageLimit = limit;\n }\n\n public get storageUsage(): number {\n if (this._storage) {\n return this._storage.getUsage();\n }\n return -1;\n }\n\n public get showPlaceholder(): boolean {\n return this._opts.showPlaceholder;\n }\n\n public set showPlaceholder(value: boolean) {\n this._opts.showPlaceholder = value;\n this._renderer?.showPlaceholder(value);\n }\n\n public getImageAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.getImageAtBufferCell(x, y);\n }\n\n public extractTileAtBufferCell(x: number, y: number): HTMLCanvasElement | undefined {\n return this._storage?.extractTileAtBufferCell(x, y);\n }\n\n private _report(s: string): void {\n this._terminal?._core.input(s, false);\n }\n\n private _decset(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = false;\n break;\n }\n }\n return false;\n }\n\n private _decrst(params: (number | number[])[]): boolean {\n for (let i = 0; i < params.length; ++i) {\n switch (params[i]) {\n case 80:\n this._opts.sixelScrolling = true;\n break;\n }\n }\n return false;\n }\n\n // overload DA to return something more appropriate\n private _da1(params: (number | number[])[]): boolean {\n if (params[0]) {\n return true;\n }\n // reported features:\n // 62 - VT220\n // 4 - SIXEL support\n // 9 - charsets\n // 22 - ANSI colors\n if (this._opts.sixelSupport) {\n this._report(`\\x1b[?62;4;9;22c`);\n return true;\n }\n return false;\n }\n\n /**\n * Implementation of xterm's graphics attribute sequence.\n *\n * Supported features:\n * - read/change palette limits (max 4096 by sixel lib)\n * - read SIXEL canvas geometry (reports current window canvas or\n * squared pixelLimit if canvas > pixel limit)\n *\n * Everything else is deactivated.\n */\n private _xtermGraphicsAttributes(params: (number | number[])[]): boolean {\n if (params.length < 2) {\n return true;\n }\n if (params[0] === GaItem.COLORS) {\n switch (params[1]) {\n case GaAction.READ:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n return true;\n case GaAction.SET_DEFAULT:\n this._opts.sixelPaletteLimit = this._defaultOpts.sixelPaletteLimit;\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n // also reset protocol handlers for now\n for (const handler of this._handlers.values()) {\n handler.reset();\n }\n return true;\n case GaAction.SET:\n if (params.length > 2 && !(params[2] instanceof Array) && params[2] <= MAX_SIXEL_PALETTE_SIZE) {\n this._opts.sixelPaletteLimit = params[2];\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${this._opts.sixelPaletteLimit}S`);\n } else {\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n }\n return true;\n case GaAction.READ_MAX:\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${MAX_SIXEL_PALETTE_SIZE}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n if (params[0] === GaItem.SIXEL_GEO) {\n switch (params[1]) {\n // we only implement read and read_max here\n case GaAction.READ:\n let width = this._renderer?.dimensions?.css.canvas.width;\n let height = this._renderer?.dimensions?.css.canvas.height;\n if (!width || !height) {\n // for some reason we have no working image renderer\n // --> fallback to default cell size\n const cellSize = CELL_SIZE_DEFAULT;\n width = (this._terminal?.cols || 80) * cellSize.width;\n height = (this._terminal?.rows || 24) * cellSize.height;\n }\n if (width * height < this._opts.pixelLimit) {\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${width.toFixed(0)};${height.toFixed(0)}S`);\n } else {\n // if we overflow pixelLimit report that squared instead\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n }\n return true;\n case GaAction.READ_MAX:\n // read_max returns pixelLimit as square area\n const x = Math.floor(Math.sqrt(this._opts.pixelLimit));\n this._report(`\\x1b[?${params[0]};${GaStatus.SUCCESS};${x};${x}S`);\n return true;\n default:\n this._report(`\\x1b[?${params[0]};${GaStatus.ACTION_ERROR}S`);\n return true;\n }\n }\n // exit with error on ReGIS or any other requests\n this._report(`\\x1b[?${params[0]};${GaStatus.ITEM_ERROR}S`);\n return true;\n }\n}\n"],
|
||
+ "mappings": "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AAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAAO,IAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAC/D,KAAO,KAAO,KAAO,KAAO,KAAO,KAAO,KAAQ,KAAQ,KAAQ,KAClE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxE,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAA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",
|
||
+ "names": ["exports", "red", "n", "green", "blue", "alpha", "toRGBA8888", "r", "g", "b", "a", "fromRGBA8888", "color", "nearestColorIndex", "palette", "min", "idx", "i", "dr", "dg", "db", "d", "clamp", "low", "high", "value", "h2c", "t1", "t2", "c", "HLStoRGB", "h", "l", "s", "v", "normalizeRGB", "normalizeHLS", "p", "require_lib", "__commonJSMin", "exports", "InWasm", "z", "s", "b", "r", "def", "t", "d", "m", "W", "e", "require_Base64Decoder_wasm", "__commonJSMin", "exports", "inwasm_runtime_1", "wasmDecode", "MAP", "el", "D", "i", "EMPTY", "Base64Decoder", "keepSize", "maxBytes", "initialBytes", "m", "bytes", "requested", "needed", "newSize", "addPages", "data", "require_QoiDecoder_wasm", "__commonJSMin", "exports", "inwasm_runtime_1", "wasmQoiDecode", "QoiDecoder", "keepSize", "d", "pixels", "ib", "dl", "bytes", "chunkP", "exports", "Colors_1", "wasm_1", "decodeBase64", "s", "bytestring", "result", "WASM_BYTES", "WASM_MODULE", "NULL_CANVAS", "CallbackProxy", "width", "mode", "DEFAULT_OPTIONS", "DecoderAsync", "opts", "cbProxy", "importObj", "inst", "Decoder", "exports", "_instance", "_cbProxy", "module", "pixels", "offset", "additionalPixels", "newCanvas", "adv", "remaining", "c", "i", "fillColor", "palette", "paletteLimit", "truncate", "data", "start", "end", "p", "length", "j", "currentWidth", "escape", "final", "finalOffset", "bw", "currentHeight", "decode", "dec", "decodeAsync", "toDisposable", "fn", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "listeners", "len", "EventUtils", "forward", "from", "to", "e", "map", "i", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "MicrotaskTimer", "runner", "import_Colors", "ImageRenderer", "_ImageRenderer", "Disposable", "_terminal", "MutableDisposable", "parent", "option", "toDisposable", "localDocument", "width", "height", "canvas", "ctx", "buffer", "imgData", "img", "value", "start", "end", "layer", "y", "w", "h", "imgSpec", "tileId", "col", "row", "count", "sourceWidth", "sourceHeight", "cols", "sx", "sy", "dx", "dy", "finalWidth", "finalHeight", "boxCols", "boxRows", "gridRow", "gridCol", "boxWidth", "boxHeight", "fitWidth", "scale", "xOffset", "yOffset", "dw", "dh", "sw", "sh", "clipped", "spec", "currentWidth", "currentHeight", "originalWidth", "originalHeight", "scaledWidth", "scaledHeight", "renderer", "key", "screenElement", "bWidth", "blueprint", "d32", "black", "white", "shift", "offset", "x", "ctx2", "i", "placeholder", "bitmap", "stringFromCodePoint", "codePoint", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "CELL_SIZE_DEFAULT", "ImageTileInfo", "imageId", "tileId", "ImageStorage", "_terminal", "_renderer", "_opts", "CellData", "e", "id", "value", "storedPixels", "spec", "zero", "img", "opts", "cellSize", "cols", "rows", "buffer", "termCols", "termRows", "originX", "originY", "offset", "tileCount", "row", "line", "col", "endMarker", "imgSpec", "range", "hasTopImages", "hasBottomImages", "start", "end", "drawCalls", "placeholderCalls", "startTile", "startCol", "count", "nextE", "a", "b", "call", "metrics", "oldCol", "tilesPerRow", "hasData", "rightCol", "lastTile", "expandCol", "x", "y", "orig", "canvas", "ImageRenderer", "room", "used", "current", "workCell", "old", "oldSpec", "extattr", "payload", "import_Base64Decoder", "import_QoiDecoder", "toStr", "data", "s", "i", "toInt", "v", "toSize", "toName", "bs", "b", "DECODERS", "FILE_MARKER", "MULTIPARTFILE_MARKER", "FILEPART_MARKER", "FILEEND_MARKER", "REPORTCELLSIZE_MARKER", "MAX_FIELDCHARS", "HeaderParser", "k", "start", "end", "state", "pos", "buffer", "c", "UNSUPPORTED_TYPE", "imageType", "d", "d32", "width", "height", "jpgSize", "dim", "pos", "limit", "i", "len", "blockLength", "DEFAULT_HEADER", "IIPHandler", "_opts", "_renderer", "_storage", "_coreTerminal", "HeaderParser", "maxEncodedBytes", "initialBytes", "Base64Decoder", "QoiDecoder", "data", "start", "end", "dataPos", "success", "seqType", "w", "CELL_SIZE_DEFAULT", "h", "scale", "report", "cond", "metrics", "UNSUPPORTED_TYPE", "imageType", "blob", "e", "canvas", "ImageRenderer", "generation", "bm", "cw", "ch", "width", "height", "rw", "rh", "wf", "hf", "f", "s", "total", "cdim", "import_Base64Decoder", "parseKittyCommand", "data", "cmd", "parts", "part", "eqIdx", "key", "value", "numValue", "PLACEHOLDER_CHAR", "PLACEHOLDER_DIACRITICS", "PLACEHOLDER_DIACRITIC_VALUES", "i", "placeholderDiacriticValue", "mark", "decodePlaceholderLocation", "chars", "row", "column", "highByte", "DECODER_OK", "KittyGraphicsHandler", "_opts", "_renderer", "_kittyStorage", "_coreTerminal", "key", "pending", "data", "start", "end", "controlEnd", "i", "copyLength", "parseKittyCommand", "payloadStart", "pendingKey", "previousEncodedSize", "decoderToRelease", "decoderCapacity", "maxPending", "oldest", "decoder", "Base64Decoder", "e", "success", "cmd", "isMoreComing", "decodeError", "finalCmd", "imageBytes", "result", "str", "bytes", "id", "image", "retainVirtual", "virtual", "quiet", "format", "width", "height", "bytesPerPixel", "expectedBytes", "selector", "message", "placementId", "isOk", "pPart", "response", "generation", "bitmap", "cropped", "cw", "CELL_SIZE_DEFAULT", "ch", "imgCols", "imgRows", "w", "buffer", "savedX", "savedY", "savedYbase", "layer", "scaled", "xOffset", "yOffset", "canvasW", "canvasH", "offsetCanvas", "ImageRenderer", "offsetCtx", "offsetBitmap", "zIndex", "scrolled", "cropX", "cropY", "cropW", "cropH", "maxCropW", "maxCropH", "finalCropW", "finalCropH", "replaces", "isCurrent", "cols", "rows", "metrics", "imageType", "blob", "url", "img", "resolve", "reject", "canvas", "pixelCount", "src32", "dst32", "alignedPixels", "srcOffset", "dstOffset", "b0", "b1", "b2", "srcByte", "dstByte", "compressed", "error", "limit", "offsetIn", "reader", "controller", "chunks", "totalLength", "done", "value", "offset", "chunk", "_KittyImageStorage", "_storage", "_renderer", "storageId", "virtual", "placements", "kittyId", "line", "row", "cols", "runLength", "previous", "col", "cell", "terminal", "buffer", "start", "PLACEHOLDER_CHAR", "CellData", "id", "imageData", "retainVirtual", "imageId", "oldStorageId", "byteLimit", "retainedBytes", "image", "evictPlaced", "oldestId", "scrolling", "layer", "zIndex", "placementId", "rows", "keepPlacementId", "placement", "preserveVirtual", "chars", "fg", "fgMode", "underlineColor", "underlineMode", "location", "decodePlaceholderLocation", "startCol", "count", "spec", "gridRow", "gridCol", "tiles", "KittyImageStorage", "import_Colors", "import_Decoder", "import_wasm", "MEM_PERMA_LIMIT", "DEFAULT_PALETTE", "MAX_IDLE_DECODERS", "idleDecoders", "poolPrimed", "primeDecoderPool", "memoryLimit", "d", "releaseDecoder", "acquireDecoder", "dec", "idle", "SixelHandler", "_opts", "_storage", "_coreTerminal", "params", "e", "fillColor", "extractActiveBg", "data", "start", "end", "success", "width", "height", "canvas", "ImageRenderer", "attr", "colors", "bg", "convertLe", "t", "color", "SixelImageStorage", "_storage", "_opts", "_renderer", "_terminal", "img", "height", "cellSize", "CELL_SIZE_DEFAULT", "rows", "i", "IIPImageStorage", "_storage", "img", "DEFAULT_OPTIONS", "MAX_SIXEL_PALETTE_SIZE", "ImageAddon", "opts", "Emitter", "DEFAULT_OPTIONS", "handler", "obj", "args", "terminal", "ImageRenderer", "ImageStorage", "windowOps", "params", "range", "metrics", "sixelStorage", "SixelImageStorage", "sixelHandler", "SixelHandler", "iipStorage", "IIPImageStorage", "iipHandler", "IIPHandler", "kittyStorage", "KittyImageStorage", "kittyHandler", "KittyGraphicsHandler", "scrollMask", "MicrotaskTimer", "hide", "limit", "value", "x", "y", "s", "i", "MAX_SIXEL_PALETTE_SIZE", "width", "height", "cellSize", "CELL_SIZE_DEFAULT"]
|
||
}
|
||
diff --git a/src/IIPHandler.ts b/src/IIPHandler.ts
|
||
index 559b907416eb38318f439d060d7f89311ed34c7e..73cedbe99f831bffd202697cc8ba80a46a39cb99 100644
|
||
--- a/src/IIPHandler.ts
|
||
+++ b/src/IIPHandler.ts
|
||
@@ -13,8 +13,10 @@ import { imageType, UNSUPPORTED_TYPE } from './IIPMetrics';
|
||
|
||
// Local const enum mirror - esbuild can't inline const enums from external packages
|
||
const enum DecoderConst {
|
||
- // Limit held memory in base64 decoder (encoded bytes).
|
||
- KEEP_DATA = 4194304,
|
||
+ // Held memory in base64/QOI decoders between images. Zero because each kept
|
||
+ // decoder pins a wasm memory, and V8 caps those per process (~124 in a
|
||
+ // sandboxed renderer), so idle terminals must not hold one.
|
||
+ KEEP_DATA = 0,
|
||
// Initial buffer allocation for the decoder.
|
||
INITIAL_DATA = 1048576,
|
||
// Local mirror of const enum (esbuild can't inline const enums from external packages)
|
||
@@ -34,6 +36,7 @@ const DEFAULT_HEADER: IHeaderFields = {
|
||
|
||
|
||
export class IIPHandler implements IOscHandler, IResetHandler {
|
||
+ private _generation = 0;
|
||
private _aborted = false;
|
||
private _hp = new HeaderParser();
|
||
private _header: IHeaderFields = DEFAULT_HEADER;
|
||
@@ -55,6 +58,7 @@ export class IIPHandler implements IOscHandler, IResetHandler {
|
||
}
|
||
|
||
public reset(): void {
|
||
+ this._generation++;
|
||
this._hp.reset();
|
||
this._dec.release();
|
||
this._qoiDec.release();
|
||
@@ -92,7 +96,10 @@ export class IIPHandler implements IOscHandler, IResetHandler {
|
||
this._aborted = true;
|
||
return;
|
||
}
|
||
- this._dec.init();
|
||
+ if (!this._initDecoder()) {
|
||
+ this._aborted = true;
|
||
+ return;
|
||
+ }
|
||
} else if (this._abortMulti) {
|
||
this._aborted = true;
|
||
return;
|
||
@@ -135,7 +142,9 @@ export class IIPHandler implements IOscHandler, IResetHandler {
|
||
this._isMultipart = true;
|
||
this._abortMulti = false;
|
||
this._dec.release();
|
||
- this._dec.init();
|
||
+ if (!this._initDecoder()) {
|
||
+ this._abortMulti = true;
|
||
+ }
|
||
return true;
|
||
}
|
||
|
||
@@ -179,7 +188,15 @@ export class IIPHandler implements IOscHandler, IResetHandler {
|
||
|
||
let blob: Blob | ImageData;
|
||
if (metrics.mime === 'image/qoi') {
|
||
- const data = this._qoiDec.decode(this._dec.data8);
|
||
+ let data: Uint8Array<ArrayBuffer>;
|
||
+ try {
|
||
+ data = this._qoiDec.decode(this._dec.data8);
|
||
+ } catch (e) {
|
||
+ console.warn('IIP: could not decode QOI image', e);
|
||
+ this._dec.release();
|
||
+ this._qoiDec.release();
|
||
+ return true;
|
||
+ }
|
||
blob = new ImageData(
|
||
new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength),
|
||
this._qoiDec.width,
|
||
@@ -198,8 +215,13 @@ export class IIPHandler implements IOscHandler, IResetHandler {
|
||
blob = new Blob([this._dec.data8], { type: metrics.mime });
|
||
}
|
||
this._dec.release();
|
||
+ const generation = this._generation;
|
||
return createImageBitmap(blob, { resizeWidth: w, resizeHeight: h })
|
||
.then(bm => {
|
||
+ if (generation !== this._generation) {
|
||
+ bm.close();
|
||
+ return true;
|
||
+ }
|
||
this._storage.addImage(bm);
|
||
return true;
|
||
})
|
||
@@ -209,6 +231,18 @@ export class IIPHandler implements IOscHandler, IResetHandler {
|
||
});
|
||
}
|
||
|
||
+ // Why: wasm memory exhaustion must drop this image, not throw out of the parser and wedge the write queue.
|
||
+ private _initDecoder(): boolean {
|
||
+ try {
|
||
+ this._dec.init();
|
||
+ return true;
|
||
+ } catch (e) {
|
||
+ console.warn('IIP: could not allocate decoder', e);
|
||
+ this._dec.release();
|
||
+ return false;
|
||
+ }
|
||
+ }
|
||
+
|
||
private _resize(w: number, h: number): [number, number] {
|
||
const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;
|
||
const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;
|
||
diff --git a/src/ImageAddon.ts b/src/ImageAddon.ts
|
||
index 8fd39543118cd420e36c1614c1af370b6c7bbfbb..fcabb492ab1e21853f7c473f8c4d085e1ab12414 100644
|
||
--- a/src/ImageAddon.ts
|
||
+++ b/src/ImageAddon.ts
|
||
@@ -6,6 +6,7 @@
|
||
import type { ITerminalAddon, IDisposable } from '@xterm/xterm';
|
||
import type { ImageAddon as IImageApi } from '@xterm/addon-image';
|
||
import { Emitter, type IEvent } from 'common/Event';
|
||
+import { MicrotaskTimer } from 'common/Async';
|
||
import { IIPHandler } from './IIPHandler';
|
||
import { ImageRenderer } from './ImageRenderer';
|
||
import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';
|
||
@@ -113,6 +114,7 @@ export class ImageAddon implements ITerminalAddon, IImageApi {
|
||
}
|
||
|
||
public dispose(): void {
|
||
+ for (const handler of this._handlers.values()) handler.reset();
|
||
for (const obj of this._disposables) {
|
||
obj.dispose();
|
||
}
|
||
@@ -196,14 +198,21 @@ export class ImageAddon implements ITerminalAddon, IImageApi {
|
||
|
||
// Kitty graphics handler
|
||
if (this._opts.kittySupport) {
|
||
- const kittyStorage = new KittyImageStorage(this._storage!);
|
||
+ const kittyStorage = new KittyImageStorage(this._storage!, this._renderer!);
|
||
const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, kittyStorage, terminal);
|
||
this._handlers.set('kitty', kittyHandler);
|
||
+ const scrollMask = new MicrotaskTimer();
|
||
+ const hide = (): void => kittyStorage.hidePlaceholderGlyphs(terminal);
|
||
this._disposeLater(
|
||
kittyStorage,
|
||
kittyHandler,
|
||
+ scrollMask,
|
||
+ terminal.onWriteParsed(() => { scrollMask.cancel(); hide(); }),
|
||
+ terminal.onScroll(() => scrollMask.set(hide)),
|
||
+ terminal.onResize(hide),
|
||
terminal._core._inputHandler._parser.registerApcHandler({ final: 'G' }, kittyHandler)
|
||
);
|
||
+ hide();
|
||
}
|
||
}
|
||
|
||
diff --git a/src/ImageRenderer.ts b/src/ImageRenderer.ts
|
||
index 5854efaec1fdf9dfcb886023542998a563b6d2f2..85448368ec3d65e4f718ac4991a34d6a3fa0ca7d 100644
|
||
--- a/src/ImageRenderer.ts
|
||
+++ b/src/ImageRenderer.ts
|
||
@@ -140,6 +140,10 @@ export class ImageRenderer extends Disposable implements IDisposable {
|
||
};
|
||
}
|
||
|
||
+ public refreshAll(): void {
|
||
+ this._renderService?.refreshRows(0, this._terminal.rows - 1);
|
||
+ }
|
||
+
|
||
/**
|
||
* Clear a region of the image layer canvas.
|
||
*/
|
||
@@ -186,16 +190,17 @@ export class ImageRenderer extends Disposable implements IDisposable {
|
||
|
||
this._rescaleImage(imgSpec, width, height);
|
||
const img = imgSpec.actual!;
|
||
- const cols = Math.ceil(img.width / width);
|
||
+ const { width: sourceWidth, height: sourceHeight } = imgSpec.actualCellSize;
|
||
+ const cols = Math.ceil(img.width / sourceWidth);
|
||
|
||
- const sx = (tileId % cols) * width;
|
||
- const sy = Math.floor(tileId / cols) * height;
|
||
+ const sx = (tileId % cols) * sourceWidth;
|
||
+ const sy = Math.floor(tileId / cols) * sourceHeight;
|
||
const dx = col * width;
|
||
const dy = row * height;
|
||
|
||
// safari bug: never access image source out of bounds
|
||
- const finalWidth = count * width + sx > img.width ? img.width - sx : count * width;
|
||
- const finalHeight = sy + height > img.height ? img.height - sy : height;
|
||
+ const finalWidth = count * sourceWidth + sx > img.width ? img.width - sx : count * sourceWidth;
|
||
+ const finalHeight = sy + sourceHeight > img.height ? img.height - sy : sourceHeight;
|
||
|
||
// Floor all pixel offsets to get stable tile mapping without any overflows.
|
||
// Note: For not pixel perfect aligned cells like in the DOM renderer
|
||
@@ -204,10 +209,72 @@ export class ImageRenderer extends Disposable implements IDisposable {
|
||
ctx.drawImage(
|
||
img,
|
||
Math.floor(sx), Math.floor(sy), Math.ceil(finalWidth), Math.ceil(finalHeight),
|
||
- Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth), Math.ceil(finalHeight)
|
||
+ Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth * width / sourceWidth), Math.ceil(finalHeight * height / sourceHeight)
|
||
);
|
||
}
|
||
|
||
+ // Fit the original source into the cell grid without distorting its aspect ratio.
|
||
+ public drawCellImage(imgSpec: IImageSpec, boxCols: number, boxRows: number, gridRow: number, gridCol: number, count: number, col: number, row: number): void {
|
||
+ const ctx = this._layers.get(imgSpec.layer);
|
||
+ if (!ctx) {
|
||
+ return;
|
||
+ }
|
||
+ const { width, height } = this.cellSize;
|
||
+ // Don't try to draw anything, if we cannot get valid renderer metrics.
|
||
+ if (width === -1 || height === -1) {
|
||
+ return;
|
||
+ }
|
||
+ const img = imgSpec.orig;
|
||
+ if (!img) {
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ const boxWidth = boxCols * width;
|
||
+ const boxHeight = boxRows * height;
|
||
+ const fitWidth = img.width * boxHeight > img.height * boxWidth;
|
||
+ const scale = fitWidth
|
||
+ ? boxWidth / Math.max(1, img.width)
|
||
+ : boxHeight / Math.max(1, img.height);
|
||
+ const xOffset = fitWidth ? 0 : (boxWidth - img.width * scale) / 2;
|
||
+ const yOffset = fitWidth ? (boxHeight - img.height * scale) / 2 : 0;
|
||
+
|
||
+ // Clip source and destination together so edge tiles are not stretched.
|
||
+ let dx = col * width;
|
||
+ let dy = row * height;
|
||
+ let dw = count * width;
|
||
+ let dh = height;
|
||
+ let sx = (gridCol * width - xOffset) / scale;
|
||
+ let sy = (gridRow * height - yOffset) / scale;
|
||
+ let sw = dw / scale;
|
||
+ let sh = dh / scale;
|
||
+ if (sx < 0) {
|
||
+ const clipped = -sx * scale;
|
||
+ dx += clipped;
|
||
+ dw -= clipped;
|
||
+ sw += sx;
|
||
+ sx = 0;
|
||
+ }
|
||
+ if (sy < 0) {
|
||
+ const clipped = -sy * scale;
|
||
+ dy += clipped;
|
||
+ dh -= clipped;
|
||
+ sh += sy;
|
||
+ sy = 0;
|
||
+ }
|
||
+ if (sx + sw > img.width) {
|
||
+ sw = img.width - sx;
|
||
+ dw = sw * scale;
|
||
+ }
|
||
+ if (sy + sh > img.height) {
|
||
+ sh = img.height - sy;
|
||
+ dh = sh * scale;
|
||
+ }
|
||
+ if (sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {
|
||
+ return;
|
||
+ }
|
||
+ ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);
|
||
+ }
|
||
+
|
||
/**
|
||
* Extract a single tile from an image.
|
||
*/
|
||
@@ -219,19 +286,20 @@ export class ImageRenderer extends Disposable implements IDisposable {
|
||
}
|
||
this._rescaleImage(imgSpec, width, height);
|
||
const img = imgSpec.actual!;
|
||
- const cols = Math.ceil(img.width / width);
|
||
- const sx = (tileId % cols) * width;
|
||
- const sy = Math.floor(tileId / cols) * height;
|
||
- const finalWidth = width + sx > img.width ? img.width - sx : width;
|
||
- const finalHeight = sy + height > img.height ? img.height - sy : height;
|
||
-
|
||
- const canvas = ImageRenderer.createCanvas(this.document, finalWidth, finalHeight);
|
||
+ const { width: sourceWidth, height: sourceHeight } = imgSpec.actualCellSize;
|
||
+ const cols = Math.ceil(img.width / sourceWidth);
|
||
+ const sx = (tileId % cols) * sourceWidth;
|
||
+ const sy = Math.floor(tileId / cols) * sourceHeight;
|
||
+ const finalWidth = sourceWidth + sx > img.width ? img.width - sx : sourceWidth;
|
||
+ const finalHeight = sy + sourceHeight > img.height ? img.height - sy : sourceHeight;
|
||
+
|
||
+ const canvas = ImageRenderer.createCanvas(this.document, Math.ceil(finalWidth * width / sourceWidth), Math.ceil(finalHeight * height / sourceHeight));
|
||
const ctx = canvas.getContext('2d');
|
||
if (ctx) {
|
||
ctx.drawImage(
|
||
img,
|
||
Math.floor(sx), Math.floor(sy), Math.floor(finalWidth), Math.floor(finalHeight),
|
||
- 0, 0, Math.floor(finalWidth), Math.floor(finalHeight)
|
||
+ 0, 0, canvas.width, canvas.height
|
||
);
|
||
return canvas;
|
||
}
|
||
@@ -299,11 +367,16 @@ export class ImageRenderer extends Disposable implements IDisposable {
|
||
spec.actualCellSize.height = originalHeight;
|
||
return;
|
||
}
|
||
- const canvas = ImageRenderer.createCanvas(
|
||
- this.document,
|
||
- Math.ceil(spec.orig!.width * currentWidth / originalWidth),
|
||
- Math.ceil(spec.orig!.height * currentHeight / originalHeight)
|
||
- );
|
||
+ const scaledWidth = Math.ceil(spec.orig!.width * currentWidth / originalWidth);
|
||
+ const scaledHeight = Math.ceil(spec.orig!.height * currentHeight / originalHeight);
|
||
+ // Upscale visible tiles directly; a full zoomed copy can dwarf the image budget.
|
||
+ if (scaledWidth * scaledHeight > spec.orig!.width * spec.orig!.height) {
|
||
+ spec.actual = spec.orig;
|
||
+ spec.actualCellSize.width = originalWidth;
|
||
+ spec.actualCellSize.height = originalHeight;
|
||
+ return;
|
||
+ }
|
||
+ const canvas = ImageRenderer.createCanvas(this.document, scaledWidth, scaledHeight);
|
||
const ctx = canvas.getContext('2d');
|
||
if (ctx) {
|
||
ctx.drawImage(spec.orig!, 0, 0, canvas.width, canvas.height);
|
||
@@ -415,7 +488,11 @@ export class ImageRenderer extends Disposable implements IDisposable {
|
||
for (let i = 0; i < width; i += bWidth) {
|
||
ctx2.drawImage(blueprint, i, 0);
|
||
}
|
||
- ImageRenderer.createImageBitmap(this._placeholder).then(bitmap => this._placeholderBitmap = bitmap);
|
||
+ const placeholder = this._placeholder;
|
||
+ ImageRenderer.createImageBitmap(placeholder).then(bitmap => {
|
||
+ if (this._placeholder !== placeholder) bitmap?.close();
|
||
+ else this._placeholderBitmap = bitmap;
|
||
+ }).catch(() => {});
|
||
}
|
||
|
||
public get document(): Document | undefined {
|
||
diff --git a/src/ImageStorage.ts b/src/ImageStorage.ts
|
||
index 5dfca3f69fb5fcb5104ded9853b29111f926fe76..189288f0cab7a50ffc2b255c0c8f4e18d3065147 100644
|
||
--- a/src/ImageStorage.ts
|
||
+++ b/src/ImageStorage.ts
|
||
@@ -49,6 +49,8 @@ export class ImageStorage implements IDisposable {
|
||
private _viewportMetrics: { cols: number, rows: number };
|
||
public onImageAdded: (() => void) | undefined;
|
||
public onImageDeleted: ((storageId: number) => void) | undefined;
|
||
+ // Placeholder cells carry image references in text and colors, not tile attributes.
|
||
+ public onRenderLine: ((line: IBufferLine, row: number, cols: number) => void) | undefined;
|
||
|
||
constructor(
|
||
private _terminal: ITerminalExt,
|
||
@@ -74,12 +76,9 @@ export class ImageStorage implements IDisposable {
|
||
}
|
||
|
||
public reset(): void {
|
||
- for (const spec of this._images.values()) {
|
||
- spec.marker?.dispose();
|
||
+ for (const id of [...this._images.keys()]) {
|
||
+ this.deleteImage(id);
|
||
}
|
||
- // NOTE: marker.dispose above already calls ImageBitmap.close
|
||
- // therefore we can just wipe the map here
|
||
- this._images.clear();
|
||
this._renderer.clearAll();
|
||
}
|
||
|
||
@@ -121,6 +120,7 @@ export class ImageStorage implements IDisposable {
|
||
spec.orig.close();
|
||
}
|
||
this.onImageDeleted?.(id);
|
||
+ this._renderer.refreshAll();
|
||
}
|
||
|
||
/**
|
||
@@ -155,6 +155,36 @@ export class ImageStorage implements IDisposable {
|
||
}
|
||
}
|
||
|
||
+ public addUnplacedImage(img: HTMLCanvasElement | ImageBitmap, opts: IAddImageOpts): number {
|
||
+ // never allow storage to exceed memory limit
|
||
+ this._evictOldest(img.width * img.height);
|
||
+
|
||
+ let cellSize = this._renderer.cellSize;
|
||
+ if (cellSize.width === -1 || cellSize.height === -1) {
|
||
+ cellSize = CELL_SIZE_DEFAULT;
|
||
+ }
|
||
+
|
||
+ const imageId = ++this._lastId;
|
||
+ this._images.set(imageId, {
|
||
+ orig: img,
|
||
+ origCellSize: cellSize,
|
||
+ actual: img,
|
||
+ actualCellSize: { ...cellSize },
|
||
+ marker: undefined,
|
||
+ tileCount: 0,
|
||
+ virtual: true,
|
||
+ bufferType: this._terminal.buffer.active.type,
|
||
+ layer: opts.layer,
|
||
+ zIndex: opts.zIndex
|
||
+ });
|
||
+ this.onImageAdded?.();
|
||
+ return imageId;
|
||
+ }
|
||
+
|
||
+ public getImageSpec(id: number): IImageSpec | undefined {
|
||
+ return this._images.get(id);
|
||
+ }
|
||
+
|
||
/**
|
||
* Method to add an image to the storage.
|
||
* @param img - The image to add (canvas or bitmap).
|
||
@@ -226,7 +256,7 @@ export class ImageStorage implements IDisposable {
|
||
// deleted images with zero tile count
|
||
const zero = [];
|
||
for (const [id, spec] of this._images.entries()) {
|
||
- if (spec.tileCount < 1) {
|
||
+ if (spec.tileCount < 1 && !spec.virtual) {
|
||
spec.marker?.dispose();
|
||
zero.push(id);
|
||
}
|
||
@@ -349,6 +379,7 @@ export class ImageStorage implements IDisposable {
|
||
for (let row = start; row <= end; ++row) {
|
||
const line = buffer.lines.get(row + buffer.ydisp);
|
||
if (!line) return;
|
||
+ this.onRenderLine?.(line, row, cols);
|
||
for (let col = 0; col < cols; ++col) {
|
||
const e = line.getExtended(col)?.payload;
|
||
if (e instanceof ImageTileInfo) {
|
||
@@ -571,7 +602,7 @@ export class ImageStorage implements IDisposable {
|
||
// deleted images with zero tile count
|
||
const zero = [];
|
||
for (const [id, spec] of this._images.entries()) {
|
||
- if (spec.bufferType === 'alternate' && !spec.tileCount) {
|
||
+ if (spec.bufferType === 'alternate' && !spec.tileCount && !spec.virtual) {
|
||
spec.marker?.dispose();
|
||
zero.push(id);
|
||
}
|
||
diff --git a/src/SixelHandler.ts b/src/SixelHandler.ts
|
||
index 1af2d85bcdd541ed60b1e707f6186a91f1bbf1b2..0711a122ea43d5212a2851add9e744b65550ec85 100644
|
||
--- a/src/SixelHandler.ts
|
||
+++ b/src/SixelHandler.ts
|
||
@@ -10,6 +10,7 @@ import { RGBA8888 } from 'sixel/lib/Types';
|
||
import { ImageRenderer } from './ImageRenderer';
|
||
|
||
import { DecoderAsync, Decoder } from 'sixel/lib/Decoder';
|
||
+import { LIMITS } from 'sixel/lib/wasm';
|
||
|
||
// always free decoder ressources after decoding if it exceeds this limit
|
||
const MEM_PERMA_LIMIT = 4194304; // 1024 pixels * 1024 pixels * 4 channels = 4MB
|
||
@@ -18,48 +19,88 @@ const MEM_PERMA_LIMIT = 4194304; // 1024 pixels * 1024 pixels * 4 channels = 4MB
|
||
const DEFAULT_PALETTE = PALETTE_ANSI_256;
|
||
DEFAULT_PALETTE.set(PALETTE_VT340_COLOR);
|
||
|
||
+// Why pooled: every decoder owns a wasm memory, and V8 caps live wasm memories
|
||
+// per process (~124 in a sandboxed renderer). Terminals borrow a decoder only
|
||
+// while a SIXEL sequence is open, so idle terminals hold none.
|
||
+const MAX_IDLE_DECODERS = 2;
|
||
+const idleDecoders = new Map<number, Decoder[]>();
|
||
+let poolPrimed = false;
|
||
+
|
||
+function primeDecoderPool(memoryLimit: number): void {
|
||
+ if (poolPrimed) return;
|
||
+ poolPrimed = true;
|
||
+ // Async compile once, off the parser's hot path; later decoders reuse the cached module.
|
||
+ DecoderAsync({ memoryLimit, palette: DEFAULT_PALETTE }).then(
|
||
+ d => releaseDecoder(d, memoryLimit),
|
||
+ () => { poolPrimed = false; }
|
||
+ );
|
||
+}
|
||
+
|
||
+function acquireDecoder(memoryLimit: number): Decoder {
|
||
+ return idleDecoders.get(memoryLimit)?.pop() ?? new Decoder({ memoryLimit, palette: DEFAULT_PALETTE });
|
||
+}
|
||
+
|
||
+function releaseDecoder(dec: Decoder, memoryLimit: number): void {
|
||
+ if (dec.memoryUsage > MEM_PERMA_LIMIT) {
|
||
+ dec.release();
|
||
+ }
|
||
+ const idle = idleDecoders.get(memoryLimit) ?? [];
|
||
+ if (idle.length < MAX_IDLE_DECODERS) {
|
||
+ idle.push(dec);
|
||
+ idleDecoders.set(memoryLimit, idle);
|
||
+ }
|
||
+}
|
||
+
|
||
|
||
export class SixelHandler implements IDcsHandler, IResetHandler {
|
||
private _size = 0;
|
||
private _aborted = false;
|
||
private _dec: Decoder | undefined;
|
||
+ private _decMemoryLimit = 0;
|
||
+ // Color registers outlive a single image, so they live here rather than in a pooled decoder.
|
||
+ private readonly _palette = new Uint32Array(LIMITS.PALETTE_SIZE);
|
||
|
||
constructor(
|
||
private readonly _opts: IImageAddonOptions,
|
||
private readonly _storage: SixelImageStorage,
|
||
private readonly _coreTerminal: ITerminalExt
|
||
) {
|
||
- DecoderAsync({
|
||
- memoryLimit: this._opts.pixelLimit * 4,
|
||
- palette: DEFAULT_PALETTE,
|
||
- paletteLimit: this._opts.sixelPaletteLimit
|
||
- }).then(d => this._dec = d);
|
||
+ this._palette.set(DEFAULT_PALETTE);
|
||
+ primeDecoderPool(this._opts.pixelLimit * 4);
|
||
}
|
||
|
||
public reset(): void {
|
||
- /**
|
||
- * reset sixel decoder to defaults:
|
||
- * - release all memory
|
||
- * - nullify palette (4096)
|
||
- * - apply default palette (256)
|
||
- */
|
||
- if (this._dec) {
|
||
- this._dec.release();
|
||
- // FIXME: missing interface on decoder to nullify full palette
|
||
- (this._dec as any)._palette.fill(0);
|
||
- this._dec.init(0, DEFAULT_PALETTE, this._opts.sixelPaletteLimit);
|
||
- }
|
||
+ this._returnDecoder();
|
||
+ this._palette.fill(0);
|
||
+ this._palette.set(DEFAULT_PALETTE);
|
||
}
|
||
|
||
public hook(params: IParams): void {
|
||
this._size = 0;
|
||
this._aborted = false;
|
||
- if (this._dec) {
|
||
- const fillColor = params.params[1] === 1 ? 0 : extractActiveBg(
|
||
- this._coreTerminal._core._inputHandler._curAttrData,
|
||
- this._coreTerminal._core._themeService?.colors);
|
||
- this._dec.init(fillColor, null, this._opts.sixelPaletteLimit);
|
||
+ this._returnDecoder();
|
||
+ const memoryLimit = this._opts.pixelLimit * 4;
|
||
+ try {
|
||
+ this._dec = acquireDecoder(memoryLimit);
|
||
+ } catch (e) {
|
||
+ // Why: exhausting wasm memory must drop this image, not throw out of the parser and wedge the write queue.
|
||
+ console.warn(`SIXEL: could not allocate decoder - ${e}`);
|
||
+ this._aborted = true;
|
||
+ return;
|
||
}
|
||
+ this._decMemoryLimit = memoryLimit;
|
||
+ const fillColor = params.params[1] === 1 ? 0 : extractActiveBg(
|
||
+ this._coreTerminal._core._inputHandler._curAttrData,
|
||
+ this._coreTerminal._core._themeService?.colors);
|
||
+ this._dec.init(fillColor, this._palette, this._opts.sixelPaletteLimit);
|
||
+ }
|
||
+
|
||
+ private _returnDecoder(): void {
|
||
+ const dec = this._dec;
|
||
+ if (!dec) return;
|
||
+ this._dec = undefined;
|
||
+ this._palette.set(dec.palette);
|
||
+ releaseDecoder(dec, this._decMemoryLimit);
|
||
}
|
||
|
||
public put(data: Uint32Array, start: number, end: number): void {
|
||
@@ -83,6 +124,14 @@ export class SixelHandler implements IDcsHandler, IResetHandler {
|
||
}
|
||
|
||
public unhook(success: boolean): boolean | Promise<boolean> {
|
||
+ try {
|
||
+ return this._unhook(success);
|
||
+ } finally {
|
||
+ this._returnDecoder();
|
||
+ }
|
||
+ }
|
||
+
|
||
+ private _unhook(success: boolean): boolean {
|
||
if (this._aborted || !success || !this._dec) {
|
||
return true;
|
||
}
|
||
@@ -100,9 +149,6 @@ export class SixelHandler implements IDcsHandler, IResetHandler {
|
||
|
||
const canvas = ImageRenderer.createCanvas(undefined, width, height);
|
||
canvas.getContext('2d')?.putImageData(new ImageData(this._dec.data8 as Uint8ClampedArray<ArrayBuffer>, width, height), 0, 0);
|
||
- if (this._dec.memoryUsage > MEM_PERMA_LIMIT) {
|
||
- this._dec.release();
|
||
- }
|
||
this._storage.addImage(canvas);
|
||
return true;
|
||
}
|
||
diff --git a/src/Types.ts b/src/Types.ts
|
||
index 04328420c2bae02010bb4c9adb3fd341aed56c0c..7c4929058e1cd469515d607861ef68894b1c0854 100644
|
||
--- a/src/Types.ts
|
||
+++ b/src/Types.ts
|
||
@@ -103,6 +103,7 @@ export interface IImageSpec {
|
||
actualCellSize: ICellSize;
|
||
marker: IMarker | undefined;
|
||
tileCount: number;
|
||
+ virtual?: boolean;
|
||
bufferType: 'alternate' | 'normal';
|
||
layer: ImageLayer;
|
||
zIndex: number;
|
||
diff --git a/src/kitty/KittyGraphicsHandler.ts b/src/kitty/KittyGraphicsHandler.ts
|
||
index de889dfff75d9ecc8ab47a025e6989ffe75bb202..7de3b740021dae5e8900a51bdec51b4a738b6561 100644
|
||
--- a/src/kitty/KittyGraphicsHandler.ts
|
||
+++ b/src/kitty/KittyGraphicsHandler.ts
|
||
@@ -7,6 +7,7 @@ import { IDisposable } from '@xterm/xterm';
|
||
import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types';
|
||
import { ImageRenderer } from '../ImageRenderer';
|
||
import { CELL_SIZE_DEFAULT } from '../ImageStorage';
|
||
+import { imageType } from '../IIPMetrics';
|
||
import { KittyImageStorage } from './KittyImageStorage';
|
||
import Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm';
|
||
import {
|
||
@@ -37,6 +38,7 @@ const DECODER_OK = Constants.DECODER_OK as unknown as DecodeStatus.OK;
|
||
// Kitty graphics protocol handler with streaming base64 decoding.
|
||
export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable {
|
||
private _aborted = false;
|
||
+ private _generation = 0;
|
||
private _decodeError = false;
|
||
|
||
private _activeDecoder: Base64Decoder | null = null;
|
||
@@ -80,6 +82,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
}
|
||
|
||
public reset(): void {
|
||
+ this._generation++;
|
||
this._cleanupAllPending();
|
||
if (this._activeDecoder) {
|
||
this._activeDecoder.release();
|
||
@@ -200,8 +203,38 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
this._activeDecoder = pending.decoder;
|
||
}
|
||
if (!this._activeDecoder) {
|
||
- this._activeDecoder = new Base64Decoder(Constants.DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes);
|
||
- this._activeDecoder.init();
|
||
+ // Budget WASM capacity, including one page of decoder state and rounding.
|
||
+ const decoderCapacity = this._maxEncodedBytes + 131072;
|
||
+ if (decoderCapacity > this._opts.storageLimit * 1000000) {
|
||
+ this._aborted = true;
|
||
+ if (this._parsedCommand?.id !== undefined) {
|
||
+ this._sendResponse(this._parsedCommand.id, 'ENOMEM:pending image budget exceeded', this._parsedCommand.quiet ?? 0);
|
||
+ }
|
||
+ return;
|
||
+ }
|
||
+ const maxPending = Math.max(1, Math.floor(this._opts.storageLimit * 1000000 / decoderCapacity));
|
||
+ while (this._pendingTransmissions.size >= maxPending) {
|
||
+ const oldest = this._pendingTransmissions.entries().next().value;
|
||
+ if (!oldest) break;
|
||
+ oldest[1].decoder.release();
|
||
+ this._removePendingEntry(oldest[0]);
|
||
+ if (oldest[1].cmd.id !== undefined) {
|
||
+ this._sendResponse(oldest[1].cmd.id, 'ENOMEM:pending image budget exceeded', oldest[1].cmd.quiet ?? 0);
|
||
+ }
|
||
+ }
|
||
+ const decoder = new Base64Decoder(Constants.DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes);
|
||
+ try {
|
||
+ decoder.init();
|
||
+ } catch (e) {
|
||
+ // Why: wasm memory exhaustion must drop this image, not throw out of the parser and wedge the write queue.
|
||
+ console.warn('KITTY: could not allocate decoder', e);
|
||
+ this._aborted = true;
|
||
+ if (this._parsedCommand?.id !== undefined) {
|
||
+ this._sendResponse(this._parsedCommand.id, 'ENOMEM:could not allocate decoder', this._parsedCommand.quiet ?? 0);
|
||
+ }
|
||
+ return;
|
||
+ }
|
||
+ this._activeDecoder = decoder;
|
||
}
|
||
|
||
if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_OK) {
|
||
@@ -382,14 +415,16 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
this._sendResponse(id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId);
|
||
return true;
|
||
}
|
||
- const result = this._displayImage(image, cmd);
|
||
+ const result = cmd.unicodePlaceholder === 1
|
||
+ ? this._placeVirtual(image, cmd)
|
||
+ : this._displayImage(image, cmd);
|
||
return result.then(success => {
|
||
this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId);
|
||
return true;
|
||
});
|
||
}
|
||
|
||
- private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean {
|
||
+ private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean, retainVirtual = false): boolean {
|
||
// TODO: Support file-based transmission modes (t=f, t=t, t=s)
|
||
// Currently only supports direct transmission (t=d, the default).
|
||
// - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path.
|
||
@@ -416,7 +451,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
height: cmd.height ?? 0,
|
||
format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100,
|
||
compression: cmd.compression ?? ''
|
||
- });
|
||
+ }, retainVirtual);
|
||
return true;
|
||
}
|
||
|
||
@@ -428,12 +463,15 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
return true;
|
||
}
|
||
|
||
- this._handleTransmit(cmd, bytes, decodeError);
|
||
+ const virtual = cmd.unicodePlaceholder === 1;
|
||
+ this._handleTransmit(cmd, bytes, decodeError, virtual);
|
||
|
||
const id = cmd.id ?? this._kittyStorage.lastImageId;
|
||
const image = this._kittyStorage.getImage(id);
|
||
if (image) {
|
||
- const result = this._displayImage(image, cmd);
|
||
+ const result = virtual
|
||
+ ? this._placeVirtual(image, cmd, true)
|
||
+ : this._displayImage(image, cmd);
|
||
if (cmd.id !== undefined) {
|
||
return result.then(success => {
|
||
this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0);
|
||
@@ -500,28 +538,25 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
// Per spec: default delete selector is 'a' (delete all visible placements)
|
||
const selector = cmd.deleteSelector ?? 'a';
|
||
|
||
- // TODO: Distinguish lowercase (delete placements only) from uppercase
|
||
- // (delete placements + free stored image data). Currently both variants
|
||
- // free everything since we don't separate stored data from placements.
|
||
switch (selector) {
|
||
case 'a':
|
||
+ this._kittyStorage.deletePhysicalPlacements();
|
||
+ break;
|
||
case 'A':
|
||
this._cleanupAllPending();
|
||
- this._kittyStorage.deleteAll();
|
||
+ this._kittyStorage.deleteAll(true);
|
||
break;
|
||
case 'i':
|
||
case 'I':
|
||
- // TODO: When placement id tracking is implemented (see TODO in
|
||
- // KittyImageStorage), d=i with p=<pid> should delete only that
|
||
- // specific placement, while d=i without p should delete all
|
||
- // placements for the image.
|
||
if (cmd.id !== undefined) {
|
||
- const pending = this._pendingTransmissions.get(cmd.id);
|
||
- if (pending) {
|
||
- pending.decoder.release();
|
||
+ if (selector === 'I') {
|
||
+ const pending = this._pendingTransmissions.get(cmd.id);
|
||
+ pending?.decoder.release();
|
||
+ this._removePendingEntry(cmd.id);
|
||
+ this._kittyStorage.deleteById(cmd.id, cmd.placementId);
|
||
+ } else {
|
||
+ this._kittyStorage.deletePlacementsById(cmd.id, cmd.placementId);
|
||
}
|
||
- this._removePendingEntry(cmd.id);
|
||
- this._kittyStorage.deleteById(cmd.id);
|
||
}
|
||
break;
|
||
default:
|
||
@@ -550,49 +585,17 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
}
|
||
|
||
private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise<void> {
|
||
+ const generation = this._generation;
|
||
let bitmap: ImageBitmap | undefined = await this._createBitmap(image);
|
||
|
||
try {
|
||
- const cropX = Math.max(0, cmd.x ?? 0);
|
||
- const cropY = Math.max(0, cmd.y ?? 0);
|
||
- const cropW = cmd.sourceWidth || (bitmap.width - cropX);
|
||
- const cropH = cmd.sourceHeight || (bitmap.height - cropY);
|
||
-
|
||
- const maxCropW = Math.max(0, bitmap.width - cropX);
|
||
- const maxCropH = Math.max(0, bitmap.height - cropY);
|
||
- const finalCropW = Math.max(0, Math.min(cropW, maxCropW));
|
||
- const finalCropH = Math.max(0, Math.min(cropH, maxCropH));
|
||
-
|
||
- if (finalCropW === 0 || finalCropH === 0) {
|
||
- throw new Error('invalid source rectangle');
|
||
- }
|
||
-
|
||
- if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) {
|
||
- const cropped = await createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH);
|
||
- bitmap.close();
|
||
- bitmap = cropped;
|
||
- }
|
||
+ if (generation !== this._generation) throw new Error('image decode canceled');
|
||
+ const cropped = this._cropImage(bitmap, cmd);
|
||
+ bitmap = cropped instanceof Promise ? await cropped : cropped;
|
||
|
||
const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;
|
||
const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;
|
||
-
|
||
- // Per spec: c/r default to image's natural cell dimensions.
|
||
- // If only one of c/r is specified, compute the other from image aspect ratio.
|
||
- let imgCols: number;
|
||
- let imgRows: number;
|
||
- if (cmd.columns !== undefined && cmd.rows !== undefined) {
|
||
- imgCols = cmd.columns;
|
||
- imgRows = cmd.rows;
|
||
- } else if (cmd.columns !== undefined) {
|
||
- imgCols = cmd.columns;
|
||
- imgRows = Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (imgCols * cw) / ch));
|
||
- } else if (cmd.rows !== undefined) {
|
||
- imgRows = cmd.rows;
|
||
- imgCols = Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (imgRows * ch) / cw));
|
||
- } else {
|
||
- imgCols = Math.ceil(bitmap.width / cw);
|
||
- imgRows = Math.ceil(bitmap.height / ch);
|
||
- }
|
||
+ let { cols: imgCols, rows: imgRows } = this._placementGrid(bitmap, cmd, cw, ch);
|
||
|
||
let w = bitmap.width;
|
||
let h = bitmap.height;
|
||
@@ -660,6 +663,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
}
|
||
}
|
||
|
||
+ if (generation !== this._generation) throw new Error('image decode canceled');
|
||
const zIndex = cmd.zIndex ?? 0;
|
||
this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex);
|
||
bitmap = undefined; // ownership transferred to storage
|
||
@@ -684,6 +688,75 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
}
|
||
}
|
||
|
||
+ // Keep the uncropped path synchronous to preserve its parser scheduling.
|
||
+ private _cropImage(bitmap: ImageBitmap, cmd: IKittyCommand): ImageBitmap | Promise<ImageBitmap> {
|
||
+ const cropX = Math.max(0, cmd.x ?? 0);
|
||
+ const cropY = Math.max(0, cmd.y ?? 0);
|
||
+ const cropW = cmd.sourceWidth || (bitmap.width - cropX);
|
||
+ const cropH = cmd.sourceHeight || (bitmap.height - cropY);
|
||
+
|
||
+ const maxCropW = Math.max(0, bitmap.width - cropX);
|
||
+ const maxCropH = Math.max(0, bitmap.height - cropY);
|
||
+ const finalCropW = Math.max(0, Math.min(cropW, maxCropW));
|
||
+ const finalCropH = Math.max(0, Math.min(cropH, maxCropH));
|
||
+
|
||
+ if (finalCropW === 0 || finalCropH === 0) {
|
||
+ throw new Error('invalid source rectangle');
|
||
+ }
|
||
+
|
||
+ if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) {
|
||
+ return createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH).then(cropped => {
|
||
+ bitmap.close();
|
||
+ return cropped;
|
||
+ });
|
||
+ }
|
||
+ return bitmap;
|
||
+ }
|
||
+
|
||
+ // An omitted grid dimension follows the source aspect ratio.
|
||
+ private _placementGrid(bitmap: ImageBitmap, cmd: IKittyCommand, cw: number, ch: number): { cols: number; rows: number } {
|
||
+ if (cmd.columns !== undefined && cmd.rows !== undefined) {
|
||
+ return { cols: cmd.columns, rows: cmd.rows };
|
||
+ }
|
||
+ if (cmd.columns !== undefined) {
|
||
+ return { cols: cmd.columns, rows: Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (cmd.columns * cw) / ch)) };
|
||
+ }
|
||
+ if (cmd.rows !== undefined) {
|
||
+ return { cols: Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (cmd.rows * ch) / cw)), rows: cmd.rows };
|
||
+ }
|
||
+ return { cols: Math.ceil(bitmap.width / cw), rows: Math.ceil(bitmap.height / ch) };
|
||
+ }
|
||
+
|
||
+ private async _placeVirtual(image: IKittyImageData, cmd: IKittyCommand, replaces = false): Promise<boolean> {
|
||
+ const generation = this._generation;
|
||
+ const isCurrent = (): boolean => generation === this._generation && this._kittyStorage.getImage(image.id) === image;
|
||
+ let bitmap: ImageBitmap | undefined;
|
||
+ try {
|
||
+ bitmap = await this._createBitmap(image);
|
||
+ if (!isCurrent()) throw new Error('image decode canceled');
|
||
+ const cropped = this._cropImage(bitmap, cmd);
|
||
+ bitmap = cropped instanceof Promise ? await cropped : cropped;
|
||
+
|
||
+ const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width;
|
||
+ const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height;
|
||
+ const { cols, rows } = this._placementGrid(bitmap, cmd, cw, ch);
|
||
+
|
||
+ if (bitmap.width * bitmap.height > this._opts.pixelLimit) {
|
||
+ throw new Error('image exceeds pixel limit');
|
||
+ }
|
||
+
|
||
+ if (!isCurrent()) throw new Error('image decode canceled');
|
||
+ this._kittyStorage.addVirtualPlacement(image.id, cmd.placementId ?? 0, bitmap, cols, rows);
|
||
+ bitmap = undefined; // ownership transferred to storage
|
||
+ if (replaces) this._kittyStorage.discardVirtualPlacements(image.id, cmd.placementId ?? 0);
|
||
+ return true;
|
||
+ } catch {
|
||
+ bitmap?.close();
|
||
+ if (replaces && isCurrent()) this._kittyStorage.discardVirtualPlacements(image.id);
|
||
+ return false;
|
||
+ }
|
||
+ }
|
||
+
|
||
// Create ImageBitmap from already-decoded image data.
|
||
private async _createBitmap(image: IKittyImageData): Promise<ImageBitmap> {
|
||
let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer());
|
||
@@ -693,6 +766,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
}
|
||
|
||
if (image.format === KittyFormat.PNG) {
|
||
+ const metrics = imageType(bytes);
|
||
+ // IHDR dimensions are parsed with signed shifts, so a value >= 0x80000000 comes
|
||
+ // back negative and a bare `>` pixel-limit test passes it; require positive.
|
||
+ if (metrics.mime !== 'image/png' || !(metrics.width > 0) || !(metrics.height > 0) || metrics.width * metrics.height > this._opts.pixelLimit) {
|
||
+ throw new RangeError('PNG exceeds pixel limit or has invalid dimensions');
|
||
+ }
|
||
const blob = new Blob([bytes as BlobPart], { type: 'image/png' });
|
||
if (!window.createImageBitmap) {
|
||
const url = URL.createObjectURL(blob);
|
||
@@ -775,27 +854,45 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos
|
||
private async _decompressZlib(compressed: Uint8Array): Promise<Uint8Array> {
|
||
try {
|
||
return await this._decompress(compressed, 'deflate');
|
||
- } catch {
|
||
+ } catch (error) {
|
||
+ if (error instanceof RangeError) throw error;
|
||
return await this._decompress(compressed, 'deflate-raw');
|
||
}
|
||
}
|
||
|
||
private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise<Uint8Array> {
|
||
- const ds = new DecompressionStream(format);
|
||
- const writer = ds.writable.getWriter();
|
||
- writer.write(compressed as BufferSource);
|
||
- writer.close();
|
||
-
|
||
+ const limit = Math.min(this._opts.kittySizeLimit, this._opts.pixelLimit * 4, this._opts.storageLimit * 1000000);
|
||
+ let offsetIn = 0;
|
||
+ // Bound inflation within one native transform before its output is budgeted.
|
||
+ const source = new ReadableStream<BufferSource>({
|
||
+ pull(controller) {
|
||
+ if (offsetIn >= compressed.length) {
|
||
+ controller.close();
|
||
+ return;
|
||
+ }
|
||
+ const end = Math.min(offsetIn + 4096, compressed.length);
|
||
+ controller.enqueue(new Uint8Array(compressed.subarray(offsetIn, end)));
|
||
+ offsetIn = end;
|
||
+ }
|
||
+ });
|
||
+ const reader = source.pipeThrough(new DecompressionStream(format)).getReader();
|
||
const chunks: Uint8Array[] = [];
|
||
- const reader = ds.readable.getReader();
|
||
-
|
||
- while (true) {
|
||
- const { done, value } = await reader.read();
|
||
- if (done) break;
|
||
- chunks.push(value);
|
||
+ let totalLength = 0;
|
||
+ try {
|
||
+ while (true) {
|
||
+ const { done, value } = await reader.read();
|
||
+ if (done) break;
|
||
+ totalLength += value.byteLength;
|
||
+ if (totalLength > limit) {
|
||
+ await reader.cancel().catch(() => {});
|
||
+ throw new RangeError('decompressed image exceeds byte limit');
|
||
+ }
|
||
+ chunks.push(value);
|
||
+ }
|
||
+ } finally {
|
||
+ reader.releaseLock();
|
||
}
|
||
|
||
- const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
||
const result = new Uint8Array(totalLength);
|
||
let offset = 0;
|
||
for (const chunk of chunks) {
|
||
diff --git a/src/kitty/KittyGraphicsTypes.ts b/src/kitty/KittyGraphicsTypes.ts
|
||
index 4288dd0a4180eca8f3ae28ec0805f834b2a0a629..77ddbf365cd76fdc9b109e5ac497a261d2c76293 100644
|
||
--- a/src/kitty/KittyGraphicsTypes.ts
|
||
+++ b/src/kitty/KittyGraphicsTypes.ts
|
||
@@ -78,7 +78,9 @@ export const enum KittyKey {
|
||
// Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) — only used when a=d
|
||
DELETE_SELECTOR = 'd',
|
||
// Placement ID for targeting specific placements
|
||
- PLACEMENT_ID = 'p'
|
||
+ PLACEMENT_ID = 'p',
|
||
+ // U=1 creates a prototype for placeholder cells without placing cursor tiles.
|
||
+ UNICODE_PLACEHOLDER = 'U'
|
||
}
|
||
|
||
// Pixel format constants
|
||
@@ -112,6 +114,7 @@ export interface IKittyCommand {
|
||
deleteSelector?: string;
|
||
placementId?: number;
|
||
compression?: string;
|
||
+ unicodePlaceholder?: number;
|
||
payload?: string;
|
||
}
|
||
|
||
@@ -139,6 +142,13 @@ export interface IKittyImageData {
|
||
compression?: string;
|
||
}
|
||
|
||
+export interface IVirtualPlacement {
|
||
+ placementId: number;
|
||
+ storageId: number;
|
||
+ cols: number;
|
||
+ rows: number;
|
||
+}
|
||
+
|
||
// Parses Kitty graphics control data into a command object.
|
||
export function parseKittyCommand(data: string): IKittyCommand {
|
||
const cmd: IKittyCommand = {};
|
||
@@ -188,8 +198,73 @@ export function parseKittyCommand(data: string): IKittyCommand {
|
||
case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break;
|
||
case KittyKey.Z_INDEX: cmd.zIndex = numValue; break;
|
||
case KittyKey.PLACEMENT_ID: cmd.placementId = numValue; break;
|
||
+ case KittyKey.UNICODE_PLACEHOLDER: cmd.unicodePlaceholder = numValue; break;
|
||
}
|
||
}
|
||
|
||
return cmd;
|
||
}
|
||
+
|
||
+
|
||
+// Source patches can only name files included in the published package.
|
||
+
|
||
+export const PLACEHOLDER_CHAR = 0x10EEEE;
|
||
+
|
||
+// Protocol table order; values are one-based so zero can mean an omitted diacritic.
|
||
+export const PLACEHOLDER_DIACRITICS: readonly number[] = [
|
||
+ 0x305, 0x30D, 0x30E, 0x310, 0x312, 0x33D, 0x33E, 0x33F, 0x346, 0x34A,
|
||
+ 0x34B, 0x34C, 0x350, 0x351, 0x352, 0x357, 0x35B, 0x363, 0x364, 0x365,
|
||
+ 0x366, 0x367, 0x368, 0x369, 0x36A, 0x36B, 0x36C, 0x36D, 0x36E, 0x36F,
|
||
+ 0x483, 0x484, 0x485, 0x486, 0x487, 0x592, 0x593, 0x594, 0x595, 0x597,
|
||
+ 0x598, 0x599, 0x59C, 0x59D, 0x59E, 0x59F, 0x5A0, 0x5A1, 0x5A8, 0x5A9,
|
||
+ 0x5AB, 0x5AC, 0x5AF, 0x5C4, 0x610, 0x611, 0x612, 0x613, 0x614, 0x615,
|
||
+ 0x616, 0x617, 0x657, 0x658, 0x659, 0x65A, 0x65B, 0x65D, 0x65E, 0x6D6,
|
||
+ 0x6D7, 0x6D8, 0x6D9, 0x6DA, 0x6DB, 0x6DC, 0x6DF, 0x6E0, 0x6E1, 0x6E2,
|
||
+ 0x6E4, 0x6E7, 0x6E8, 0x6EB, 0x6EC, 0x730, 0x732, 0x733, 0x735, 0x736,
|
||
+ 0x73A, 0x73D, 0x73F, 0x740, 0x741, 0x743, 0x745, 0x747, 0x749, 0x74A,
|
||
+ 0x7EB, 0x7EC, 0x7ED, 0x7EE, 0x7EF, 0x7F0, 0x7F1, 0x7F3, 0x816, 0x817,
|
||
+ 0x818, 0x819, 0x81B, 0x81C, 0x81D, 0x81E, 0x81F, 0x820, 0x821, 0x822,
|
||
+ 0x823, 0x825, 0x826, 0x827, 0x829, 0x82A, 0x82B, 0x82C, 0x82D, 0x951,
|
||
+ 0x953, 0x954, 0xF82, 0xF83, 0xF86, 0xF87, 0x135D, 0x135E, 0x135F, 0x17DD,
|
||
+ 0x193A, 0x1A17, 0x1A75, 0x1A76, 0x1A77, 0x1A78, 0x1A79, 0x1A7A, 0x1A7B, 0x1A7C,
|
||
+ 0x1B6B, 0x1B6D, 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73, 0x1CD0, 0x1CD1,
|
||
+ 0x1CD2, 0x1CDA, 0x1CDB, 0x1CE0, 0x1DC0, 0x1DC1, 0x1DC3, 0x1DC4, 0x1DC5, 0x1DC6,
|
||
+ 0x1DC7, 0x1DC8, 0x1DC9, 0x1DCB, 0x1DCC, 0x1DD1, 0x1DD2, 0x1DD3, 0x1DD4, 0x1DD5,
|
||
+ 0x1DD6, 0x1DD7, 0x1DD8, 0x1DD9, 0x1DDA, 0x1DDB, 0x1DDC, 0x1DDD, 0x1DDE, 0x1DDF,
|
||
+ 0x1DE0, 0x1DE1, 0x1DE2, 0x1DE3, 0x1DE4, 0x1DE5, 0x1DE6, 0x1DFE, 0x20D0, 0x20D1,
|
||
+ 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20DB, 0x20DC, 0x20E1, 0x20E7, 0x20E9, 0x20F0,
|
||
+ 0x2CEF, 0x2CF0, 0x2CF1, 0x2DE0, 0x2DE1, 0x2DE2, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6,
|
||
+ 0x2DE7, 0x2DE8, 0x2DE9, 0x2DEA, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, 0x2DEF, 0x2DF0,
|
||
+ 0x2DF1, 0x2DF2, 0x2DF3, 0x2DF4, 0x2DF5, 0x2DF6, 0x2DF7, 0x2DF8, 0x2DF9, 0x2DFA,
|
||
+ 0x2DFB, 0x2DFC, 0x2DFD, 0x2DFE, 0x2DFF, 0xA66F, 0xA67C, 0xA67D, 0xA6F0, 0xA6F1,
|
||
+ 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, 0xA8E8, 0xA8E9,
|
||
+ 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xAAB0, 0xAAB2,
|
||
+ 0xAAB3, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xFE20, 0xFE21, 0xFE22, 0xFE23,
|
||
+ 0xFE24, 0xFE25, 0xFE26, 0x10A0F, 0x10A38, 0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189,
|
||
+ 0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244,
|
||
+];
|
||
+
|
||
+const PLACEHOLDER_DIACRITIC_VALUES: Map<number, number> = new Map();
|
||
+for (let i = 0; i < PLACEHOLDER_DIACRITICS.length; ++i) {
|
||
+ PLACEHOLDER_DIACRITIC_VALUES.set(PLACEHOLDER_DIACRITICS[i], i + 1);
|
||
+}
|
||
+
|
||
+// Zero values may inherit from the preceding placeholder cell.
|
||
+export interface IPlaceholderLocation {
|
||
+ row: number;
|
||
+ column: number;
|
||
+ highByte: number;
|
||
+}
|
||
+
|
||
+function placeholderDiacriticValue(mark: string | undefined): number {
|
||
+ return mark === undefined ? 0 : PLACEHOLDER_DIACRITIC_VALUES.get(mark.codePointAt(0) ?? -1) ?? -1;
|
||
+}
|
||
+
|
||
+export function decodePlaceholderLocation(chars: string): IPlaceholderLocation {
|
||
+ const [, row, column, highByte] = chars;
|
||
+ return {
|
||
+ row: placeholderDiacriticValue(row),
|
||
+ column: placeholderDiacriticValue(column),
|
||
+ highByte: placeholderDiacriticValue(highByte)
|
||
+ };
|
||
+}
|
||
diff --git a/src/kitty/KittyImageStorage.ts b/src/kitty/KittyImageStorage.ts
|
||
index 1f5c09ec9e2700f8f6dbd8436a1802217dfc99ef..2a0df51c965c4e2c4c6f1935c129052cadf12153 100644
|
||
--- a/src/kitty/KittyImageStorage.ts
|
||
+++ b/src/kitty/KittyImageStorage.ts
|
||
@@ -3,16 +3,27 @@
|
||
* @license MIT
|
||
*/
|
||
|
||
+import type { IBufferLine } from 'common/buffer/Types';
|
||
import { IDisposable } from '@xterm/xterm';
|
||
+import { CellData } from 'common/buffer/CellData';
|
||
+import { FgFlags } from 'common/buffer/Constants';
|
||
+import { ImageRenderer } from '../ImageRenderer';
|
||
import { ImageStorage } from '../ImageStorage';
|
||
-import { ImageLayer, IAddImageOpts } from '../Types';
|
||
-import { IKittyImageData } from './KittyGraphicsTypes';
|
||
+import { Attributes, ITerminalExt, ImageLayer, IAddImageOpts } from '../Types';
|
||
+import { decodePlaceholderLocation, IKittyImageData, IPlaceholderLocation, IVirtualPlacement, PLACEHOLDER_CHAR } from './KittyGraphicsTypes';
|
||
+
|
||
+interface IPlaceholderCell {
|
||
+ imageId: number;
|
||
+ placementId: number;
|
||
+ location: IPlaceholderLocation;
|
||
+}
|
||
|
||
// Kitty-specific image storage controller.
|
||
//
|
||
// Wraps shared ImageStorage with kitty protocol semantics:
|
||
// - tracks transmitted image payloads by kitty image id
|
||
// - tracks kitty image id -> shared ImageStorage id mapping for displayed images
|
||
+// - tracks virtual placements that U+10EEEE cells display
|
||
// - mirrors shared-storage evictions into kitty maps
|
||
// - applies protocol-level undisplayed-image eviction policy
|
||
export class KittyImageStorage implements IDisposable {
|
||
@@ -20,32 +31,33 @@ export class KittyImageStorage implements IDisposable {
|
||
|
||
private _nextImageId = 1;
|
||
private readonly _images: Map<number, IKittyImageData> = new Map();
|
||
- // TODO: Support multiple placements per image. The kitty spec identifies
|
||
- // placements by an (image id, placement id) pair — same i + different p
|
||
- // values should coexist, and same i + same p should replace the prior
|
||
- // placement. Currently we track only one storage entry per kitty image id,
|
||
- // so multiple placements of the same image overwrite each other. Fixing
|
||
- // this requires changing these maps to Map<number, Map<number, number>>
|
||
- // (kittyId → placementId → storageId) and updating addImage/deleteById
|
||
- // accordingly. The underlying shared ImageStorage would also need to
|
||
- // support multiple entries per logical image.
|
||
+ // TODO: Track physical placements by (image id, placement id), like virtual placements.
|
||
private readonly _kittyIdToStorageId: Map<number, number> = new Map();
|
||
private readonly _storageIdToKittyId: Map<number, number> = new Map();
|
||
+ private readonly _virtualPlacements: Map<number, Map<number, IVirtualPlacement>> = new Map();
|
||
+ private readonly _virtualStorageIds = new Map<number, { kittyId: number, placementId: number }>();
|
||
|
||
private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined;
|
||
private readonly _wrappedOnImageDeleted: (storageId: number) => void;
|
||
private readonly _handleStorageImageDeleted = (storageId: number): void => {
|
||
+ const virtual = this._virtualStorageIds.get(storageId);
|
||
+ if (virtual) {
|
||
+ this._virtualStorageIds.delete(storageId);
|
||
+ const placements = this._virtualPlacements.get(virtual.kittyId);
|
||
+ placements?.delete(virtual.placementId);
|
||
+ if (!placements?.size) this._virtualPlacements.delete(virtual.kittyId);
|
||
+ }
|
||
const kittyId = this._storageIdToKittyId.get(storageId);
|
||
if (kittyId !== undefined) {
|
||
this._kittyIdToStorageId.delete(kittyId);
|
||
this._storageIdToKittyId.delete(storageId);
|
||
- this._images.delete(kittyId);
|
||
}
|
||
};
|
||
private _addImageOpts: IAddImageOpts = { scrolling: true, layer: 'top', zIndex: 0, cursorPos: 'iip' };
|
||
|
||
constructor(
|
||
- private readonly _storage: ImageStorage
|
||
+ private readonly _storage: ImageStorage,
|
||
+ private readonly _renderer: ImageRenderer
|
||
) {
|
||
this._previousOnImageDeleted = this._storage.onImageDeleted;
|
||
this._wrappedOnImageDeleted = (storageId: number) => {
|
||
@@ -53,6 +65,27 @@ export class KittyImageStorage implements IDisposable {
|
||
this._handleStorageImageDeleted(storageId);
|
||
};
|
||
this._storage.onImageDeleted = this._wrappedOnImageDeleted;
|
||
+ this._storage.onRenderLine = this._renderPlaceholderLine;
|
||
+ }
|
||
+
|
||
+ // Reserved placeholder text stays in the buffer but never draws as a glyph.
|
||
+ public hidePlaceholderGlyphs(terminal: ITerminalExt): void {
|
||
+ const buffer = terminal._core.buffer;
|
||
+ let cell: CellData | undefined;
|
||
+ const start = terminal.buffer.active.viewportY;
|
||
+ for (let row = start; row < start + terminal.rows; ++row) {
|
||
+ const line = buffer.lines.get(row);
|
||
+ if (!line) continue;
|
||
+ for (let col = 0; col < terminal.cols; ++col) {
|
||
+ if (line.getFg(col) & FgFlags.INVISIBLE) continue;
|
||
+ if (line.getCodePoint(col) !== PLACEHOLDER_CHAR
|
||
+ && (!line.isCombined(col) || line.getString(col).codePointAt(0) !== PLACEHOLDER_CHAR)) continue;
|
||
+ cell ??= new CellData();
|
||
+ line.loadCell(col, cell);
|
||
+ cell.fg |= FgFlags.INVISIBLE;
|
||
+ line.setCell(col, cell);
|
||
+ }
|
||
+ }
|
||
}
|
||
|
||
public reset(): void {
|
||
@@ -60,6 +93,8 @@ export class KittyImageStorage implements IDisposable {
|
||
this._images.clear();
|
||
this._kittyIdToStorageId.clear();
|
||
this._storageIdToKittyId.clear();
|
||
+ this._virtualPlacements.clear();
|
||
+ this._virtualStorageIds.clear();
|
||
}
|
||
|
||
public dispose(): void {
|
||
@@ -67,11 +102,15 @@ export class KittyImageStorage implements IDisposable {
|
||
if (this._storage.onImageDeleted === this._wrappedOnImageDeleted) {
|
||
this._storage.onImageDeleted = this._previousOnImageDeleted;
|
||
}
|
||
+ if (this._storage.onRenderLine === this._renderPlaceholderLine) {
|
||
+ this._storage.onRenderLine = undefined;
|
||
+ }
|
||
}
|
||
|
||
- public storeImage(id: number | undefined, imageData: Omit<IKittyImageData, 'id'>): number {
|
||
+ public storeImage(id: number | undefined, imageData: Omit<IKittyImageData, 'id'>, retainVirtual = false): number {
|
||
const imageId = id ?? this._nextImageId++;
|
||
|
||
+ if (!retainVirtual) this._deleteVirtualPlacements(imageId);
|
||
const oldStorageId = this._kittyIdToStorageId.get(imageId);
|
||
if (oldStorageId !== undefined) {
|
||
this._storage.deleteImage(oldStorageId);
|
||
@@ -83,6 +122,25 @@ export class KittyImageStorage implements IDisposable {
|
||
this._evictUndisplayedImages();
|
||
}
|
||
|
||
+ // Encoded images awaiting placement are outside ImageStorage's pixel budget.
|
||
+ // Unplaced payloads are evicted first so a new upload cannot erase a visible
|
||
+ // image while abandoned blobs still hold budget; placed ones go only when
|
||
+ // that is not enough, because the byte cap is a hard bound. The new image is
|
||
+ // always stored, so an oversized one overshoots by at most one payload
|
||
+ // (itself bounded by kittySizeLimit) rather than being dropped after an OK ack.
|
||
+ const byteLimit = this._storage.getLimit() * 1000000;
|
||
+ this._images.delete(imageId);
|
||
+ let retainedBytes = 0;
|
||
+ for (const image of this._images.values()) retainedBytes += image.data.size;
|
||
+ for (const evictPlaced of [false, true]) {
|
||
+ for (const [oldestId, image] of this._images) {
|
||
+ if (retainedBytes + imageData.data.size <= byteLimit) break;
|
||
+ if ((this._kittyIdToStorageId.has(oldestId) || this._virtualPlacements.has(oldestId)) !== evictPlaced) continue;
|
||
+ retainedBytes -= image.data.size;
|
||
+ this.deleteById(oldestId);
|
||
+ }
|
||
+ }
|
||
+
|
||
this._images.set(imageId, {
|
||
...imageData,
|
||
id: imageId
|
||
@@ -111,23 +169,73 @@ export class KittyImageStorage implements IDisposable {
|
||
return this._images.get(kittyId);
|
||
}
|
||
|
||
- public deleteById(kittyId: number): void {
|
||
- this._images.delete(kittyId);
|
||
+ // Fit prototypes at render time so each placement holds only the source pixels.
|
||
+ public addVirtualPlacement(kittyId: number, placementId: number, image: HTMLCanvasElement | ImageBitmap, cols: number, rows: number): void {
|
||
+ const previous = this._virtualPlacements.get(kittyId)?.get(placementId);
|
||
+ if (image.width * image.height * 4 > this._storage.getLimit() * 1000000) throw new Error('virtual image exceeds storage limit');
|
||
+ if (!previous && this._virtualStorageIds.size >= KittyImageStorage._maxStoredImages) throw new Error('virtual placement limit exceeded');
|
||
+ if (previous) this._storage.deleteImage(previous.storageId);
|
||
+ const storageId = this._storage.addUnplacedImage(image, { scrolling: false, layer: 'top', zIndex: 0, cursorPos: 'iip' });
|
||
+ let placements = this._virtualPlacements.get(kittyId);
|
||
+ if (!placements) {
|
||
+ placements = new Map();
|
||
+ this._virtualPlacements.set(kittyId, placements);
|
||
+ }
|
||
+ placements.set(placementId, { placementId, storageId, cols, rows });
|
||
+ this._virtualStorageIds.set(storageId, { kittyId, placementId });
|
||
+ this._renderer.refreshAll();
|
||
+ }
|
||
+
|
||
+ private _virtualPlacementFor(kittyId: number, placementId: number): IVirtualPlacement | undefined {
|
||
+ const placements = this._virtualPlacements.get(kittyId);
|
||
+ return placementId === 0 ? placements?.values().next().value : placements?.get(placementId);
|
||
+ }
|
||
+
|
||
+ public discardVirtualPlacements(kittyId: number, keepPlacementId?: number): void {
|
||
+ this._deleteVirtualPlacements(kittyId, undefined, keepPlacementId);
|
||
+ }
|
||
+
|
||
+ private _deleteVirtualPlacements(kittyId: number, placementId?: number, keepPlacementId?: number): void {
|
||
+ const placements = this._virtualPlacements.get(kittyId);
|
||
+ if (!placements) return;
|
||
+ for (const placement of [...placements.values()]) {
|
||
+ if ((placementId === undefined || placementId === placement.placementId) && placement.placementId !== keepPlacementId) {
|
||
+ this._storage.deleteImage(placement.storageId);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ public deletePlacementsById(kittyId: number, placementId?: number): void {
|
||
+ this._deleteVirtualPlacements(kittyId, placementId);
|
||
+ if (placementId !== undefined) return;
|
||
const storageId = this._kittyIdToStorageId.get(kittyId);
|
||
if (storageId !== undefined) {
|
||
- this._storage.deleteImage(storageId);
|
||
this._kittyIdToStorageId.delete(kittyId);
|
||
this._storageIdToKittyId.delete(storageId);
|
||
+ this._storage.deleteImage(storageId);
|
||
}
|
||
}
|
||
|
||
- public deleteAll(): void {
|
||
- this._images.clear();
|
||
- for (const storageId of this._kittyIdToStorageId.values()) {
|
||
+ public deleteById(kittyId: number, placementId?: number): void {
|
||
+ this.deletePlacementsById(kittyId, placementId);
|
||
+ if (!this._virtualPlacements.has(kittyId) && !this._kittyIdToStorageId.has(kittyId)) {
|
||
+ this._images.delete(kittyId);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ public deletePhysicalPlacements(): void {
|
||
+ for (const [kittyId, storageId] of [...this._kittyIdToStorageId]) {
|
||
+ this._kittyIdToStorageId.delete(kittyId);
|
||
+ this._storageIdToKittyId.delete(storageId);
|
||
this._storage.deleteImage(storageId);
|
||
}
|
||
- this._kittyIdToStorageId.clear();
|
||
- this._storageIdToKittyId.clear();
|
||
+ }
|
||
+
|
||
+ public deleteAll(preserveVirtual = false): void {
|
||
+ if (preserveVirtual) this.deletePhysicalPlacements();
|
||
+ for (const kittyId of [...this._images.keys()]) {
|
||
+ if (!preserveVirtual || !this._virtualPlacements.has(kittyId)) this.deleteById(kittyId);
|
||
+ }
|
||
}
|
||
|
||
public get images(): ReadonlyMap<number, IKittyImageData> {
|
||
@@ -147,9 +255,96 @@ export class KittyImageStorage implements IDisposable {
|
||
if (this._images.size <= KittyImageStorage._maxStoredImages / 2) {
|
||
break;
|
||
}
|
||
- if (!this._kittyIdToStorageId.has(kittyId)) {
|
||
+ if (!this._kittyIdToStorageId.has(kittyId) && !this._virtualPlacements.has(kittyId)) {
|
||
this._images.delete(kittyId);
|
||
+ this._virtualPlacements.delete(kittyId);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ // Omitted diacritics inherit only from a consecutive matching placeholder.
|
||
+ private readonly _renderPlaceholderLine = (line: IBufferLine, row: number, cols: number): void => {
|
||
+ if (this._virtualPlacements.size === 0) {
|
||
+ return;
|
||
+ }
|
||
+ let runLength = 0;
|
||
+ let previous: IPlaceholderCell | undefined;
|
||
+ for (let col = 0; col <= cols; ++col) {
|
||
+ const cell = col < cols ? this._placeholderCell(line, col) : undefined;
|
||
+ if (runLength > 0 && cell !== undefined && previous !== undefined
|
||
+ && cell.imageId === previous.imageId
|
||
+ && cell.placementId === previous.placementId
|
||
+ && (cell.location.row === 0 || cell.location.row === previous.location.row)
|
||
+ && (cell.location.column === 0 || cell.location.column === previous.location.column + 1)
|
||
+ && (cell.location.highByte === 0 || cell.location.highByte === previous.location.highByte)) {
|
||
+ runLength++;
|
||
+ cell.location.row = Math.max(previous.location.row, 1);
|
||
+ cell.location.column = previous.location.column + 1;
|
||
+ cell.location.highByte = Math.max(previous.location.highByte, 1);
|
||
+ } else {
|
||
+ if (runLength > 0 && previous !== undefined) {
|
||
+ this._drawPlaceholderRun(previous, col - runLength, runLength, row);
|
||
+ }
|
||
+ runLength = 0;
|
||
+ if (cell !== undefined) {
|
||
+ runLength = 1;
|
||
+ if (!cell.location.row) cell.location.row = 1;
|
||
+ if (!cell.location.column) cell.location.column = 1;
|
||
+ if (!cell.location.highByte) cell.location.highByte = 1;
|
||
+ }
|
||
}
|
||
+ previous = cell ?? previous;
|
||
+ }
|
||
+ };
|
||
+
|
||
+ private _placeholderCell(line: IBufferLine, col: number): IPlaceholderCell | undefined {
|
||
+ if (!line.isCombined(col) && line.getCodePoint(col) !== PLACEHOLDER_CHAR) {
|
||
+ return undefined;
|
||
+ }
|
||
+ const chars = line.getString(col);
|
||
+ if (chars.codePointAt(0) !== PLACEHOLDER_CHAR) {
|
||
+ return undefined;
|
||
+ }
|
||
+
|
||
+ const fg = line.getFg(col);
|
||
+ const fgMode = fg & Attributes.CM_MASK;
|
||
+ const imageId = fgMode === Attributes.CM_RGB
|
||
+ ? fg & Attributes.RGB_MASK
|
||
+ : fgMode === 0 ? 0 : fg & Attributes.PCOLOR_MASK;
|
||
+ if (fgMode === 0) {
|
||
+ return undefined;
|
||
+ }
|
||
+
|
||
+ // Placement IDs use underline color without an underline style.
|
||
+ let placementId = 0;
|
||
+ const underlineColor = line.getExtended(col)?.underlineColor ?? 0;
|
||
+ if (underlineColor > 0) {
|
||
+ const underlineMode = underlineColor & Attributes.CM_MASK;
|
||
+ placementId = underlineMode === Attributes.CM_RGB
|
||
+ ? underlineColor & Attributes.RGB_MASK
|
||
+ : underlineMode === 0 ? 0 : underlineColor & Attributes.PCOLOR_MASK;
|
||
+ }
|
||
+
|
||
+ const location = decodePlaceholderLocation(chars);
|
||
+ if (location.row < 0 || location.column < 0 || location.highByte < 0 || location.highByte > 256) return undefined;
|
||
+ return { imageId, placementId, location };
|
||
+ }
|
||
+
|
||
+ private _drawPlaceholderRun(cell: IPlaceholderCell, startCol: number, count: number, row: number): void {
|
||
+ const imageId = (cell.imageId | ((cell.location.highByte - 1) << 24)) >>> 0;
|
||
+ const placement = this._virtualPlacementFor(imageId, cell.placementId);
|
||
+ const spec = placement && this._storage.getImageSpec(placement.storageId);
|
||
+ // `column` is 1-based and holds the last cell of the run.
|
||
+ const gridRow = cell.location.row - 1;
|
||
+ const gridCol = cell.location.column - count;
|
||
+ if (!placement || !spec || gridRow < 0 || gridRow >= placement.rows || gridCol < 0) {
|
||
+ return;
|
||
+ }
|
||
+ // Cells past the placement's box show nothing.
|
||
+ const tiles = Math.min(count, placement.cols - gridCol);
|
||
+ if (tiles <= 0) {
|
||
+ return;
|
||
}
|
||
+ this._renderer.drawCellImage(spec, placement.cols, placement.rows, gridRow, gridCol, tiles, startCol, row);
|
||
}
|
||
}
|