@jsenv/terminal-recorder 1.5.53 → 1.5.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/jsenv_terminal_recorder_node_modules.js +3 -2
  2. package/package.json +5 -5
  3. package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +24 -3
  4. package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/dependency_status/client/dependency_status.js +233 -2
  5. package/src/.jsenv/chrome@149.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/page_switcher/client/page_switcher.js +136 -13
  6. package/src/.jsenv/chrome@149.0.0/xterm.html +5 -1
  7. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
  8. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +28 -0
  9. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
  10. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +176 -0
  11. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs +101 -0
  12. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs.map +1623 -0
  13. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css +267 -0
  14. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
  15. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
  16. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/plugins/autoreload_on_server_restart/client/autoreload_on_server_restart.js +133 -0
  17. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/frontend/custom-elements-redefine/src/main.js +217 -0
  18. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1607 -0
  19. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/client_monitoring/client/client_reporter.js +578 -0
  20. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/dependency_status/client/dependency_status.js +290 -0
  21. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js +49 -0
  22. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/page_switcher/client/page_switcher.js +854 -0
  23. package/src/.jsenv/chrome@151.0.0/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/server_events/client/server_events_client.js +461 -0
  24. package/src/.jsenv/chrome@151.0.0/gif_encoder.js +400 -0
  25. package/src/.jsenv/chrome@151.0.0/gif_encoder.js.map +11 -0
  26. package/src/.jsenv/chrome@151.0.0/lzw_encoder.js +253 -0
  27. package/src/.jsenv/chrome@151.0.0/neuquant.js +498 -0
  28. package/src/.jsenv/chrome@151.0.0/terminal_recorder.js +384 -0
  29. package/src/.jsenv/chrome@151.0.0/terminal_recorder.js.map +11 -0
  30. package/src/.jsenv/chrome@151.0.0/xterm.html +88 -0
  31. package/src/.jsenv/chrome@151.0.0/xterm.html@L11C7-L15C16.js +5 -0
  32. package/src/.jsenv/chrome@151.0.0/xterm.html@L14C5-L18C14.js +5 -0
  33. package/src/.jsenv/chrome@151.0.0/xterm.html@L17C7-L21C16.js +5 -0
  34. package/src/.jsenv/chrome@151.0.0/xterm.html@L19C5-L24C14.js +7 -0
  35. package/src/.jsenv/chrome@151.0.0/xterm.html@L19C5-L24C14.js.map +11 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ *
5
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
6
+ * @license MIT
7
+ *
8
+ * Originally forked from (with the author's permission):
9
+ * Fabrice Bellard's javascript vt100 for jslinux:
10
+ * http://bellard.org/jslinux/
11
+ * Copyright (c) 2011 Fabrice Bellard
12
+ */
13
+ /*---------------------------------------------------------------------------------------------
14
+ * Copyright (c) Microsoft Corporation. All rights reserved.
15
+ * Licensed under the MIT License. See License.txt in the project root for license information.
16
+ *--------------------------------------------------------------------------------------------*/
17
+ var m=0,p=0,g=0,b=0;var I;(r=>{function u(t,a,s,i){return i!==void 0?`#${B(t)}${B(a)}${B(s)}${B(i)}`:`#${B(t)}${B(a)}${B(s)}`}r.toCss=u;function o(t,a,s,i=255){return(t<<24|a<<16|s<<8|i)>>>0}r.toRgba=o;function e(t,a,s,i){return{css:r.toCss(t,a,s,i),rgba:r.toRgba(t,a,s,i)}}r.toColor=e})(I||={});var $;(i=>{function u(n,l){if(b=(l.rgba&255)/255,b===1)return{css:l.css,rgba:l.rgba};let f=l.rgba>>24&255,d=l.rgba>>16&255,c=l.rgba>>8&255,C=n.rgba>>24&255,h=n.rgba>>16&255,x=n.rgba>>8&255;m=C+Math.round((f-C)*b),p=h+Math.round((d-h)*b),g=x+Math.round((c-x)*b);let R=I.toCss(m,p,g),L=I.toRgba(m,p,g);return{css:R,rgba:L}}i.blend=u;function o(n){return(n.rgba&255)===255}i.isOpaque=o;function e(n,l,f){let d=y.ensureContrastRatio(n.rgba,l.rgba,f);if(d)return I.toColor(d>>24&255,d>>16&255,d>>8&255)}i.ensureContrastRatio=e;function r(n){let l=(n.rgba|255)>>>0;return[m,p,g]=y.toChannels(l),{css:I.toCss(m,p,g),rgba:l}}i.opaque=r;function t(n,l){return b=Math.round(l*255),[m,p,g]=y.toChannels(n.rgba),{css:I.toCss(m,p,g,b),rgba:I.toRgba(m,p,g,b)}}i.opacity=t;function a(n,l){return b=n.rgba&255,t(n,b*l/255)}i.multiplyOpacity=a;function s(n){return[n.rgba>>24&255,n.rgba>>16&255,n.rgba>>8&255]}i.toColorRGB=s})($||={});var _;(r=>{let u,o;try{let t=document.createElement("canvas");t.width=1,t.height=1;let a=t.getContext("2d",{willReadFrequently:!0});a&&(u=a,u.globalCompositeOperation="copy",o=u.createLinearGradient(0,0,1,1))}catch{}function e(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return m=parseInt(t.slice(1,2).repeat(2),16),p=parseInt(t.slice(2,3).repeat(2),16),g=parseInt(t.slice(3,4).repeat(2),16),I.toColor(m,p,g);case 5:return m=parseInt(t.slice(1,2).repeat(2),16),p=parseInt(t.slice(2,3).repeat(2),16),g=parseInt(t.slice(3,4).repeat(2),16),b=parseInt(t.slice(4,5).repeat(2),16),I.toColor(m,p,g,b);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}let a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return m=parseInt(a[1]),p=parseInt(a[2]),g=parseInt(a[3]),b=Math.round((a[5]===void 0?1:parseFloat(a[5]))*255),I.toColor(m,p,g,b);if(!u||!o)throw new Error("css.toColor: Unsupported css format");if(u.fillStyle=o,u.fillStyle=t,typeof u.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(u.fillRect(0,0,1,1),[m,p,g,b]=u.getImageData(0,0,1,1).data,b!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:I.toRgba(m,p,g,b),css:t}}r.toColor=e})(_||={});var v;(e=>{function u(r){return o(r>>16&255,r>>8&255,r&255)}e.relativeLuminance=u;function o(r,t,a){let s=r/255,i=t/255,n=a/255,l=s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),d=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4);return l*.2126+f*.7152+d*.0722}e.relativeLuminance2=o})(v||={});var y;(a=>{function u(s,i){if(b=(i&255)/255,b===1)return i;let n=i>>24&255,l=i>>16&255,f=i>>8&255,d=s>>24&255,c=s>>16&255,C=s>>8&255;return m=d+Math.round((n-d)*b),p=c+Math.round((l-c)*b),g=C+Math.round((f-C)*b),I.toRgba(m,p,g)}a.blend=u;function o(s,i,n){let l=v.relativeLuminance(s>>8),f=v.relativeLuminance(i>>8);if(F(l,f)<n){if(f<l){let h=e(s,i,n),x=F(l,v.relativeLuminance(h>>8));if(x<n){let R=r(s,i,n),L=F(l,v.relativeLuminance(R>>8));return x>L?h:R}return h}let c=r(s,i,n),C=F(l,v.relativeLuminance(c>>8));if(C<n){let h=e(s,i,n),x=F(l,v.relativeLuminance(h>>8));return C>x?c:h}return c}}a.ensureContrastRatio=o;function e(s,i,n){let l=s>>24&255,f=s>>16&255,d=s>>8&255,c=i>>24&255,C=i>>16&255,h=i>>8&255,x=F(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));for(;x<n&&(c>0||C>0||h>0);)c-=Math.max(0,Math.ceil(c*.1)),C-=Math.max(0,Math.ceil(C*.1)),h-=Math.max(0,Math.ceil(h*.1)),x=F(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));return(c<<24|C<<16|h<<8|255)>>>0}a.reduceLuminance=e;function r(s,i,n){let l=s>>24&255,f=s>>16&255,d=s>>8&255,c=i>>24&255,C=i>>16&255,h=i>>8&255,x=F(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));for(;x<n&&(c<255||C<255||h<255);)c=Math.min(255,c+Math.ceil((255-c)*.1)),C=Math.min(255,C+Math.ceil((255-C)*.1)),h=Math.min(255,h+Math.ceil((255-h)*.1)),x=F(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));return(c<<24|C<<16|h<<8|255)>>>0}a.increaseLuminance=r;function t(s){return[s>>24&255,s>>16&255,s>>8&255,s&255]}a.toChannels=t})(y||={});function B(u){let o=u.toString(16);return o.length<2?"0"+o:o}function F(u,o){return u<o?(o+.05)/(u+.05):(u+.05)/(o+.05)}var E=Object.freeze((()=>{let u=[_.toColor("#2e3436"),_.toColor("#cc0000"),_.toColor("#4e9a06"),_.toColor("#c4a000"),_.toColor("#3465a4"),_.toColor("#75507b"),_.toColor("#06989a"),_.toColor("#d3d7cf"),_.toColor("#555753"),_.toColor("#ef2929"),_.toColor("#8ae234"),_.toColor("#fce94f"),_.toColor("#729fcf"),_.toColor("#ad7fa8"),_.toColor("#34e2e2"),_.toColor("#eeeeec")],o=[0,95,135,175,215,255];for(let e=0;e<216;e++){let r=o[e/36%6|0],t=o[e/6%6|0],a=o[e%6];u.push({css:I.toCss(r,t,a),rgba:I.toRgba(r,t,a)})}for(let e=0;e<24;e++){let r=8+e*10;u.push({css:I.toCss(r,r,r),rgba:I.toRgba(r,r,r)})}return u})());function A(u,o,e){return Math.max(o,Math.min(u,e))}function O(u){switch(u){case"&":return"&amp;";case"<":return"&lt;"}return u}var S=class{constructor(o){this._buffer=o}serialize(o,e){let r=this._buffer.getNullCell(),t=this._buffer.getNullCell(),a=r,s=o.start.y,i=o.end.y,n=o.start.x,l=o.end.x;this._beforeSerialize(i-s,s,i);for(let f=s;f<=i;f++){let d=this._buffer.getLine(f);if(d){let c=f===o.start.y?n:0,C=f===o.end.y?l:d.length;for(let h=c;h<C;h++){let x=d.getCell(h,a===r?t:r);if(!x){console.warn(`Can't get cell at row=${f}, col=${h}`);continue}this._nextCell(x,a,f,h),a=x}}this._rowEnd(f,f===i)}return this._afterSerialize(),this._serializeString(e)}_nextCell(o,e,r,t){}_rowEnd(o,e){}_beforeSerialize(o,e,r){}_afterSerialize(){}_serializeString(o){return""}};function T(u,o){return u.getFgColorMode()===o.getFgColorMode()&&u.getFgColor()===o.getFgColor()}function w(u,o){return u.getBgColorMode()===o.getBgColorMode()&&u.getBgColor()===o.getBgColor()}function z(u,o){return u.isInverse()===o.isInverse()&&u.isBold()===o.isBold()&&u.isUnderline()===o.isUnderline()&&u.isOverline()===o.isOverline()&&u.isBlink()===o.isBlink()&&u.isInvisible()===o.isInvisible()&&u.isItalic()===o.isItalic()&&u.isDim()===o.isDim()&&u.isStrikethrough()===o.isStrikethrough()}var k=class extends S{constructor(e,r){super(e);this._terminal=r;this._rowIndex=0;this._allRows=new Array;this._allRowSeparators=new Array;this._currentRow="";this._nullCellCount=0;this._cursorStyle=this._buffer.getNullCell();this._cursorStyleRow=0;this._cursorStyleCol=0;this._backgroundCell=this._buffer.getNullCell();this._firstRow=0;this._lastCursorRow=0;this._lastCursorCol=0;this._lastContentCursorRow=0;this._lastContentCursorCol=0;this._thisRowLastChar=this._buffer.getNullCell();this._thisRowLastSecondChar=this._buffer.getNullCell();this._nextRowFirstChar=this._buffer.getNullCell()}_beforeSerialize(e,r,t){this._allRows=new Array(e),this._lastContentCursorRow=r,this._lastCursorRow=r,this._firstRow=r}_rowEnd(e,r){this._nullCellCount>0&&!w(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let t="";if(!r){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let a=this._buffer.getLine(e),s=this._buffer.getLine(e+1);if(!s.isWrapped)t=`\r
18
+ `,this._lastCursorRow=e+1,this._lastCursorCol=0;else{t="";let i=a.getCell(a.length-1,this._thisRowLastChar),n=a.getCell(a.length-2,this._thisRowLastSecondChar),l=s.getCell(0,this._nextRowFirstChar),f=l.getWidth()>1,d=!1;(l.getChars()&&f?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||i.getWidth()===0)&&w(i,l)&&(d=!0),f&&(n.getChars()||n.getWidth()===0)&&w(i,l)&&w(n,l)&&(d=!0)),d||(t="-".repeat(this._nullCellCount+1),t+="\x1B[1D\x1B[1X",this._nullCellCount>0&&(t+="\x1B[A",t+=`\x1B[${a.length-this._nullCellCount}C`,t+=`\x1B[${this._nullCellCount}X`,t+=`\x1B[${a.length-this._nullCellCount}D`,t+="\x1B[B"),this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0)}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=t,this._currentRow="",this._nullCellCount=0}_diffStyle(e,r){let t=[],a=!T(e,r),s=!w(e,r),i=!z(e,r);if(a||s||i)if(e.isAttributeDefault())r.isAttributeDefault()||t.push(0);else{if(a){let n=e.getFgColor();e.isFgRGB()?t.push(38,2,n>>>16&255,n>>>8&255,n&255):e.isFgPalette()?n>=16?t.push(38,5,n):t.push(n&8?90+(n&7):30+(n&7)):t.push(39)}if(s){let n=e.getBgColor();e.isBgRGB()?t.push(48,2,n>>>16&255,n>>>8&255,n&255):e.isBgPalette()?n>=16?t.push(48,5,n):t.push(n&8?100+(n&7):40+(n&7)):t.push(49)}i&&(e.isInverse()!==r.isInverse()&&t.push(e.isInverse()?7:27),e.isBold()!==r.isBold()&&t.push(e.isBold()?1:22),e.isUnderline()!==r.isUnderline()&&t.push(e.isUnderline()?4:24),e.isOverline()!==r.isOverline()&&t.push(e.isOverline()?53:55),e.isBlink()!==r.isBlink()&&t.push(e.isBlink()?5:25),e.isInvisible()!==r.isInvisible()&&t.push(e.isInvisible()?8:28),e.isItalic()!==r.isItalic()&&t.push(e.isItalic()?3:23),e.isDim()!==r.isDim()&&t.push(e.isDim()?2:22),e.isStrikethrough()!==r.isStrikethrough()&&t.push(e.isStrikethrough()?9:29))}return t}_nextCell(e,r,t,a){if(e.getWidth()===0)return;let i=e.getChars()==="",n=this._diffStyle(e,this._cursorStyle);if(i?!w(this._cursorStyle,e):n.length>0){this._nullCellCount>0&&(w(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=t,this._lastContentCursorCol=this._lastCursorCol=a,this._currentRow+=`\x1B[${n.join(";")}m`;let f=this._buffer.getLine(t);f!==void 0&&(f.getCell(a,this._cursorStyle),this._cursorStyleRow=t,this._cursorStyleCol=a)}i?this._nullCellCount+=e.getWidth():(this._nullCellCount>0&&(w(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=e.getChars(),this._lastContentCursorRow=this._lastCursorRow=t,this._lastContentCursorCol=this._lastCursorCol=a+e.getWidth())}_serializeString(e){let r=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(r=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let t="";for(let i=0;i<r;i++)t+=this._allRows[i],i+1<r&&(t+=this._allRowSeparators[i]);if(!e){let i=this._buffer.baseY+this._buffer.cursorY,n=this._buffer.cursorX,l=i!==this._lastCursorRow||n!==this._lastCursorCol,f=c=>{c>0?t+=`\x1B[${c}C`:c<0&&(t+=`\x1B[${-c}D`)};l&&((c=>{c>0?t+=`\x1B[${c}B`:c<0&&(t+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(n-this._lastCursorCol))}let a=this._terminal._core._inputHandler._curAttrData,s=this._diffStyle(a,this._cursorStyle);return s.length>0&&(t+=`\x1B[${s.join(";")}m`),t}},D=class{activate(o){this._terminal=o}_serializeBufferByScrollback(o,e,r){let t=e.length,a=r===void 0?t:A(r+o.rows,0,t);return this._serializeBufferByRange(o,e,{start:t-a,end:t-1},!1)}_serializeBufferByRange(o,e,r,t){return new k(e,o).serialize({start:{x:0,y:typeof r.start=="number"?r.start:r.start.line},end:{x:o.cols,y:typeof r.end=="number"?r.end:r.end.line}},t)}_serializeBufferAsHTML(o,e){let r=o.buffer.active,t=new M(r,o,e),a=e.onlySelection??!1,s=e.range;if(s)return t.serialize({start:{x:s.startCol,y:(typeof s.startLine=="number",s.startLine)},end:{x:o.cols,y:(typeof s.endLine=="number",s.endLine)}});if(!a){let n=r.length,l=e.scrollback,f=l===void 0?n:A(l+o.rows,0,n);return t.serialize({start:{x:0,y:n-f},end:{x:o.cols,y:n-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?t.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeModes(o){let e="",r=o.modes;if(r.applicationCursorKeysMode&&(e+="\x1B[?1h"),r.applicationKeypadMode&&(e+="\x1B[?66h"),r.bracketedPasteMode&&(e+="\x1B[?2004h"),r.insertMode&&(e+="\x1B[4h"),r.originMode&&(e+="\x1B[?6h"),r.reverseWraparoundMode&&(e+="\x1B[?45h"),r.sendFocusMode&&(e+="\x1B[?1004h"),r.wraparoundMode===!1&&(e+="\x1B[?7l"),r.mouseTrackingMode!=="none")switch(r.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return e}serialize(o){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=o?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,o.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,o?.scrollback);if(!o?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let r=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${r}`}return o?.excludeModes||(e+=this._serializeModes(this._terminal)),e}serializeAsHTML(o){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,o||{})}dispose(){}},M=class extends S{constructor(e,r,t){super(e);this._terminal=r;this._options=t;this._currentRow="";this._htmlContent="";r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=E}_padStart(e,r,t){return r=r>>0,t=t??" ",e.length>r?e:(r-=e.length,r>t.length&&(t+=t.repeat(r/t.length)),t.slice(0,r)+e)}_beforeSerialize(e,r,t){this._htmlContent+="<html><body><!--StartFragment--><pre>";let a="#000000",s="#ffffff";(this._options.includeGlobalBackground??!1)&&(a=this._terminal.options.theme?.foreground??"#ffffff",s=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+a+";"),i.push("background-color: "+s+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="<div style='"+i.join(" ")+"'>"}_afterSerialize(){this._htmlContent+="</div>",this._htmlContent+="</pre><!--EndFragment--></body></html>"}_rowEnd(e,r){this._htmlContent+="<div><span>"+this._currentRow+"</span></div>",this._currentRow=""}_getHexColor(e,r){let t=r?e.getFgColor():e.getBgColor();if(r?e.isFgRGB():e.isBgRGB())return"#"+[t>>16&255,t>>8&255,t&255].map(s=>this._padStart(s.toString(16),2,"0")).join("");if(r?e.isFgPalette():e.isBgPalette())return this._ansiColors[t].css}_diffStyle(e,r){let t=[],a=!T(e,r),s=!w(e,r),i=!z(e,r);if(a||s||i){let n=this._getHexColor(e,!0);n&&t.push("color: "+n+";");let l=this._getHexColor(e,!1);return l&&t.push("background-color: "+l+";"),e.isInverse()&&t.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&t.push("font-weight: bold;"),e.isUnderline()&&e.isOverline()?t.push("text-decoration: overline underline;"):e.isUnderline()?t.push("text-decoration: underline;"):e.isOverline()&&t.push("text-decoration: overline;"),e.isBlink()&&t.push("text-decoration: blink;"),e.isInvisible()&&t.push("visibility: hidden;"),e.isItalic()&&t.push("font-style: italic;"),e.isDim()&&t.push("opacity: 0.5;"),e.isStrikethrough()&&t.push("text-decoration: line-through;"),t}}_nextCell(e,r,t,a){if(e.getWidth()===0)return;let i=e.getChars()==="",n=this._diffStyle(e,r);n&&(this._currentRow+=n.length===0?"</span><span>":"</span><span style='"+n.join(" ")+"'>"),i?this._currentRow+=" ":this._currentRow+=O(e.getChars())}_serializeString(){return this._htmlContent}};export{M as HTMLSerializeHandler,D as SerializeAddon};
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9zcmMvY29tbW9uL0NvbG9yLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL3NyYy9icm93c2VyL1R5cGVzLnRzIiwiZmlsZTovLy9Vc2Vycy9kbWFpbC9Eb2N1bWVudHMvZGV2L2pzZW52L2NvcmUvbm9kZV9tb2R1bGVzL0B4dGVybS9hZGRvbi1zZXJpYWxpemUvc3JjL1NlcmlhbGl6ZUFkZG9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNvbG9yLCBJQ29sb3JSR0IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5sZXQgJHIgPSAwO1xubGV0ICRnID0gMDtcbmxldCAkYiA9IDA7XG5sZXQgJGEgPSAwO1xuXG5leHBvcnQgY29uc3QgTlVMTF9DT0xPUjogSUNvbG9yID0ge1xuICBjc3M6ICcjMDAwMDAwMDAnLFxuICByZ2JhOiAwXG59O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY2hhbm5lbHNcIiAoaW5kaXZpZHVhbCBjb2xvciBjaGFubmVscyBhcyBudW1iZXJzKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjaGFubmVscyB7XG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NzcyhyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX0ke3RvUGFkZGVkSGV4KGEpfWA7XG4gICAgfVxuICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9SZ2JhKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDB4RkYpOiBudW1iZXIge1xuICAgIC8vIE5vdGU6IFRoZSBhZ2dyZWdhdGVkIG51bWJlciBpcyBSR0JBMzIgKEJFKSwgdGh1cyBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gQUJHUjMyXG4gICAgLy8gb24gTEUgc3lzdGVtcywgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIGZvciBkaXJlY3QgMzItYml0IGJ1ZmZlciB3cml0ZXMuXG4gICAgLy8gPj4+IDAgZm9yY2VzIGFuIHVuc2lnbmVkIGludFxuICAgIHJldHVybiAociA8PCAyNCB8IGcgPDwgMTYgfCBiIDw8IDggfCBhKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIsIGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIsIGEpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIGBJQ29sb3JgLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNvbG9yIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgICRhID0gKGZnLnJnYmEgJiAweEZGKSAvIDI1NTtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogZmcuY3NzLFxuICAgICAgICByZ2JhOiBmZy5yZ2JhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgY29uc3QgY3NzID0gY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYik7XG4gICAgY29uc3QgcmdiYSA9IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgICByZXR1cm4geyBjc3MsIHJnYmEgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc09wYXF1ZShjb2xvcjogSUNvbG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2xvci5yZ2JhICYgMHhGRikgPT09IDB4RkY7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZzogSUNvbG9yLCBmZzogSUNvbG9yLCByYXRpbzogbnVtYmVyKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSByZ2JhLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmcucmdiYSwgZmcucmdiYSwgcmF0aW8pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcihcbiAgICAgIChyZXN1bHQgPj4gMjQgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gMTYgJiAweEZGKSxcbiAgICAgIChyZXN1bHQgPj4gOCAgJiAweEZGKVxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3Ige1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IChjb2xvci5yZ2JhIHwgMHhGRikgPj4+IDA7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKHJnYmFDb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiksXG4gICAgICByZ2JhOiByZ2JhQ29sb3JcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYWNpdHkoY29sb3I6IElDb2xvciwgb3BhY2l0eTogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IE1hdGgucm91bmQob3BhY2l0eSAqIDB4RkYpO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhjb2xvci5yZ2JhKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiLCAkYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseU9wYWNpdHkoY29sb3I6IElDb2xvciwgZmFjdG9yOiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gY29sb3IucmdiYSAmIDB4RkY7XG4gICAgcmV0dXJuIG9wYWNpdHkoY29sb3IsICgkYSAqIGZhY3RvcikgLyAweEZGKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yUkdCKGNvbG9yOiBJQ29sb3IpOiBJQ29sb3JSR0Ige1xuICAgIHJldHVybiBbKGNvbG9yLnJnYmEgPj4gMjQpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gMTYpICYgMHhGRiwgKGNvbG9yLnJnYmEgPj4gOCkgJiAweEZGXTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwiY3NzXCIgKHN0cmluZzogJyNyZ2InLCAnI3JnYmEnLCAnI3JyZ2diYicsXG4gKiAnI3JyZ2diYmFhJykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY3NzIHtcbiAgLy8gQXR0ZW1wdCB0byBzZXQgZ2V0IHRoZSBzaGFyZWQgY2FudmFzIGNvbnRleHRcbiAgbGV0ICRjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IHVuZGVmaW5lZDtcbiAgbGV0ICRsaXRtdXNDb2xvcjogQ2FudmFzR3JhZGllbnQgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgZmlyc3Qgd2luZG93LCBzbyBkb2N1bWVudCBzaG91bGQgYmUgY29ycmVjdFxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgJGN0eCA9IGN0eDtcbiAgICAgICRjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2NvcHknO1xuICAgICAgJGxpdG11c0NvbG9yID0gJGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAxLCAxKTtcbiAgICB9XG4gIH1cbiAgY2F0Y2gge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNzcyBzdHJpbmcgdG8gYW4gSUNvbG9yLCB0aGlzIHNob3VsZCBoYW5kbGUgYWxsIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCB3aWxsXG4gICAqIHRocm93IGlmIGl0J3MgaW52YWxpZC4gVGhlIGlkZWFsIGZvcm1hdCB0byB1c2UgaXMgYCNycmdnYmJbYWFdYCBhcyBpdCdzIHRoZSBmYXN0ZXN0IHRvIHBhcnNlLlxuICAgKlxuICAgKiBPbmx5IGAjcmdiW2FdYCwgYCNycmdnYmJbYWFdYCwgYHJnYigpYCBhbmQgYHJnYmEoKWAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIHdoZW4gcnVuIGluIGEgTm9kZVxuICAgKiBlbnZpcm9ubWVudC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NvbG9yKGNzczogc3RyaW5nKTogSUNvbG9yIHtcbiAgICAvLyBGb3JtYXRzOiAjcmdiW2FdIGFuZCAjcnJnZ2JiW2FhXVxuICAgIGlmIChjc3MubWF0Y2goLyNbXFxkYS1mXXszLDh9L2kpKSB7XG4gICAgICBzd2l0Y2ggKGNzcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSA0OiB7IC8vICNyZ2JcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6IHsgLy8gI3JnYmFcbiAgICAgICAgICAkciA9IHBhcnNlSW50KGNzcy5zbGljZSgxLCAyKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkZyA9IHBhcnNlSW50KGNzcy5zbGljZSgyLCAzKS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYiA9IHBhcnNlSW50KGNzcy5zbGljZSgzLCA0KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICAkYSA9IHBhcnNlSW50KGNzcy5zbGljZSg0LCA1KS5yZXBlYXQoMiksIDE2KTtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA3OiAvLyAjcnJnZ2JiXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IChwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA8PCA4IHwgMHhGRikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIDk6IC8vICNycmdnYmJhYVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiBwYXJzZUludChjc3Muc2xpY2UoMSksIDE2KSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0czogcmdiKCkgb3IgcmdiYSgpXG4gICAgY29uc3QgcmdiYU1hdGNoID0gY3NzLm1hdGNoKC9yZ2JhP1xcKFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqKCxcXHMqKDB8MXxcXGQ/XFwuKFxcZCspKVxccyopP1xcKS8pO1xuICAgIGlmIChyZ2JhTWF0Y2gpIHtcbiAgICAgICRyID0gcGFyc2VJbnQocmdiYU1hdGNoWzFdKTtcbiAgICAgICRnID0gcGFyc2VJbnQocmdiYU1hdGNoWzJdKTtcbiAgICAgICRiID0gcGFyc2VJbnQocmdiYU1hdGNoWzNdKTtcbiAgICAgICRhID0gTWF0aC5yb3VuZCgocmdiYU1hdGNoWzVdID09PSB1bmRlZmluZWQgPyAxIDogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNV0pKSAqIDB4RkYpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGlzIGF2YWlsYWJsZSBmb3IgY2FudmFzLWJhc2VkIGNvbG9yIHBhcnNpbmdcbiAgICBpZiAoISRjdHggfHwgISRsaXRtdXNDb2xvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciB1c2luZyBjYW52YXMgZmlsbFN0eWxlXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI2ZpbGwtYW5kLXN0cm9rZS1zdHlsZXNcbiAgICAkY3R4LmZpbGxTdHlsZSA9ICRsaXRtdXNDb2xvcjtcbiAgICAkY3R4LmZpbGxTdHlsZSA9IGNzcztcbiAgICBpZiAodHlwZW9mICRjdHguZmlsbFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgICRjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgWyRyLCAkZywgJGIsICRhXSA9ICRjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgaXMgbm9uLXRyYW5zcGFyZW50IGFzIGNvbG9yIGh1ZSBnZXRzIGxvc3Qgd2hlbiBkcmF3biB0byB0aGUgY2FudmFzXG4gICAgaWYgKCRhICE9PSAweEZGKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgY29sb3IgZnJvbSB0aGUgY2FudmFzJyBmaWxsU3R5bGUgcHJvcGVydHkgd2hpY2ggZXhwb3NlcyB0aGUgY29sb3IgdmFsdWUgaW4gcmdiYSgpXG4gICAgLy8gZm9ybWF0XG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NhbnZhcy5odG1sI3NlcmlhbGlzYXRpb24tb2YtYS1jb2xvclxuICAgIHJldHVybiB7XG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgY3NzXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiXCIgKG51bWJlcjogMHhycmdnYmIpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gcmdiIFRoZSBjb2xvciB0byB1c2UuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZShyZ2I6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlbGF0aXZlTHVtaW5hbmNlMihcbiAgICAgIChyZ2IgPj4gMTYpICYgMHhGRixcbiAgICAgIChyZ2IgPj4gOCApICYgMHhGRixcbiAgICAgIChyZ2IgICAgICApICYgMHhGRik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHIgVGhlIHJlZCBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGIgVGhlIGJsdWUgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlMihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBycyA9IHIgLyAyNTU7XG4gICAgY29uc3QgZ3MgPSBnIC8gMjU1O1xuICAgIGNvbnN0IGJzID0gYiAvIDI1NTtcbiAgICBjb25zdCByciA9IHJzIDw9IDAuMDM5MjggPyBycyAvIDEyLjkyIDogTWF0aC5wb3coKHJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmcgPSBncyA8PSAwLjAzOTI4ID8gZ3MgLyAxMi45MiA6IE1hdGgucG93KChncyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJiID0gYnMgPD0gMC4wMzkyOCA/IGJzIC8gMTIuOTIgOiBNYXRoLnBvdygoYnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gcnIgKiAwLjIxMjYgKyByZyAqIDAuNzE1MiArIHJiICogMC4wNzIyO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JhXCIgKG51bWJlcjogMHhycmdnYmJhYSkuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiYSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAkYSA9IChmZyAmIDB4RkYpIC8gMHhGRjtcbiAgICBpZiAoJGEgPT09IDEpIHtcbiAgICAgIHJldHVybiBmZztcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgZmdCID0gKGZnID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmcgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIHJldHVybiBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBmb3JlZ3JvdW5kIGNvbG9yIGFuZCBhIGJhY2tncm91bmQgY29sb3IsIGVpdGhlciBpbmNyZWFzZSBvciByZWR1Y2UgdGhlIGx1bWluYW5jZSBvZiB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbnRyYXN0IHJhdGlvIGlzIG1ldC4gSWYgcHVyZSB3aGl0ZSBvciBibGFjayBpcyBoaXRcbiAgICogd2l0aG91dCB0aGUgY29udHJhc3QgcmF0aW8gYmVpbmcgbWV0LCBnbyB0aGUgb3RoZXIgZGlyZWN0aW9uIHVzaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIGFuZCB0YWtlIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHJlc3VsdCBkZXBlbmRpbmcgb24gd2hpY2ggaGFzIHRoZSBoaWdoZXJcbiAgICogY29udHJhc3QgcmF0aW8uXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGFscmVhZHkgbWV0LlxuICAgKlxuICAgKiBAcGFyYW0gYmdSZ2JhIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gZmdSZ2JhIFRoZSBmb3JlZ3JvdW5kIGNvbG9yIGluIHJnYmEgZm9ybWF0LlxuICAgKiBAcGFyYW0gcmF0aW8gVGhlIGNvbnRyYXN0IHJhdGlvIHRvIGFjaGlldmUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29udHJhc3RSYXRpbyhiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShiZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgZmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGZnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBjciA9IGNvbnRyYXN0UmF0aW8oYmdMLCBmZ0wpO1xuICAgIGlmIChjciA8IHJhdGlvKSB7XG4gICAgICBpZiAoZmdMIDwgYmdMKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEEgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QiA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRBID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QiA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0QVJhdGlvID4gcmVzdWx0QlJhdGlvID8gcmVzdWx0QSA6IHJlc3VsdEI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gcmVkdWNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSID4gMCB8fCBmZ0cgPiAwIHx8IGZnQiA+IDApKSB7XG4gICAgICAvLyBSZWR1Y2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdSICogMC4xKSk7XG4gICAgICBmZ0cgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnRyAqIDAuMSkpO1xuICAgICAgZmdCIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0IgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIGluY3JlYXNpbmcgbHVtaW5hbmNlIGFzIGNvbnZlcnRpbmcgdG9cbiAgICAvLyBIU0wgYW5kIGJhY2sgaXMgZXhwZW5zaXZlXG4gICAgY29uc3QgYmdSID0gKGJnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBiZ0IgPSAoYmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGZnUiA9IChmZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBsZXQgZmdHID0gKGZnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGxldCBmZ0IgPSAoZmdSZ2JhID4+ICA4KSAmIDB4RkY7XG4gICAgbGV0IGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB3aGlsZSAoY3IgPCByYXRpbyAmJiAoZmdSIDwgMHhGRiB8fCBmZ0cgPCAweEZGIHx8IGZnQiA8IDB4RkYpKSB7XG4gICAgICAvLyBJbmNyZWFzZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSID0gTWF0aC5taW4oMHhGRiwgZmdSICsgTWF0aC5jZWlsKCgyNTUgLSBmZ1IpICogMC4xKSk7XG4gICAgICBmZ0cgPSBNYXRoLm1pbigweEZGLCBmZ0cgKyBNYXRoLmNlaWwoKDI1NSAtIGZnRykgKiAwLjEpKTtcbiAgICAgIGZnQiA9IE1hdGgubWluKDB4RkYsIGZnQiArIE1hdGguY2VpbCgoMjU1IC0gZmdCKSAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9DaGFubmVscyh2YWx1ZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbKHZhbHVlID4+IDI0KSAmIDB4RkYsICh2YWx1ZSA+PiAxNikgJiAweEZGLCAodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRlZEhleChjOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gYy50b1N0cmluZygxNik7XG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAnMCcgKyBzIDogcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byByZWxhdGl2ZSBsdW1pbmFuY2UgdmFsdWVzLlxuICogQHBhcmFtIGwxIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAcGFyYW0gbDIgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0UmF0aW8obDE6IG51bWJlciwgbDI6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChsMSA8IGwyKSB7XG4gICAgcmV0dXJuIChsMiArIDAuMDUpIC8gKGwxICsgMC4wNSk7XG4gIH1cbiAgcmV0dXJuIChsMSArIDAuMDUpIC8gKGwyICsgMC4wNSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENoYXJEYXRhLCBJQ29sb3IsIElDb3JlVGVybWluYWwsIElUZXJtaW5hbE9wdGlvbnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUsIFRlcm1pbmFsIGFzIElUZXJtaW5hbEFwaSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBjaGFubmVscywgY3NzIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICd2cy9iYXNlL2NvbW1vbi9ldmVudCc7XG5cbi8qKlxuICogQSBwb3J0aW9uIG9mIHRoZSBwdWJsaWMgQVBJIHRoYXQgYXJlIGltcGxlbWVudGVkIGlkZW50aWFsbHkgaW50ZXJuYWxseSBhbmQgc2ltcGx5IHBhc3NlZCB0aHJvdWdoLlxuICovXG50eXBlIEludGVybmFsUGFzc3Rocm91Z2hBcGlzID0gT21pdDxJVGVybWluYWxBcGksICdidWZmZXInIHwgJ3BhcnNlcicgfCAndW5pY29kZScgfCAnbW9kZXMnIHwgJ3dyaXRlbG4nIHwgJ2xvYWRBZGRvbic+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElUZXJtaW5hbCBleHRlbmRzIEludGVybmFsUGFzc3Rocm91Z2hBcGlzLCBJQ29yZVRlcm1pbmFsIHtcbiAgc2NyZWVuRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIGJyb3dzZXI6IElCcm93c2VyO1xuICBidWZmZXI6IElCdWZmZXI7XG4gIGxpbmtpZmllcjogSUxpbmtpZmllcjIgfCB1bmRlZmluZWQ7XG4gIG9wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIG9uQmx1cjogRXZlbnQ8dm9pZD47XG4gIG9uRm9jdXM6IEV2ZW50PHZvaWQ+O1xuICBvbkExMXlDaGFyOiBFdmVudDxzdHJpbmc+O1xuICBvbkExMXlUYWI6IEV2ZW50PG51bWJlcj47XG4gIG9uV2lsbE9wZW46IEV2ZW50PEhUTUxFbGVtZW50PjtcblxuICBjYW5jZWwoZXY6IE1vdXNlRXZlbnQgfCBXaGVlbEV2ZW50IHwgS2V5Ym9hcmRFdmVudCB8IElucHV0RXZlbnQsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4gfCB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBDdXN0b21LZXlFdmVudEhhbmRsZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW47XG5leHBvcnQgdHlwZSBDdXN0b21XaGVlbEV2ZW50SGFuZGxlciA9IChldmVudDogV2hlZWxFdmVudCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTGluZURhdGEgPSBDaGFyRGF0YVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb3NpdGlvbkhlbHBlciB7XG4gIHJlYWRvbmx5IGlzQ29tcG9zaW5nOiBib29sZWFuO1xuICBjb21wb3NpdGlvbnN0YXJ0KCk6IHZvaWQ7XG4gIGNvbXBvc2l0aW9udXBkYXRlKGV2OiBDb21wb3NpdGlvbkV2ZW50KTogdm9pZDtcbiAgY29tcG9zaXRpb25lbmQoKTogdm9pZDtcbiAgdXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cyhkb250UmVjdXJzZT86IGJvb2xlYW4pOiB2b2lkO1xuICBrZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnJvd3NlciB7XG4gIGlzTm9kZTogYm9vbGVhbjtcbiAgdXNlckFnZW50OiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIGlzRmlyZWZveDogYm9vbGVhbjtcbiAgaXNNYWM6IGJvb2xlYW47XG4gIGlzSXBhZDogYm9vbGVhbjtcbiAgaXNJcGhvbmU6IGJvb2xlYW47XG4gIGlzV2luZG93czogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29sb3JTZXQge1xuICBmb3JlZ3JvdW5kOiBJQ29sb3I7XG4gIGJhY2tncm91bmQ6IElDb2xvcjtcbiAgY3Vyc29yOiBJQ29sb3I7XG4gIGN1cnNvckFjY2VudDogSUNvbG9yO1xuICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudDogSUNvbG9yO1xuICAvKiogVGhlIHNlbGVjdGlvbiBibGVuZGVkIG9uIHRvcCBvZiBiYWNrZ3JvdW5kLiAqL1xuICBzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlOiBJQ29sb3I7XG4gIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50OiBJQ29sb3I7XG4gIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZTogSUNvbG9yO1xuICBzY3JvbGxiYXJTbGlkZXJCYWNrZ3JvdW5kOiBJQ29sb3I7XG4gIHNjcm9sbGJhclNsaWRlckhvdmVyQmFja2dyb3VuZDogSUNvbG9yO1xuICBzY3JvbGxiYXJTbGlkZXJBY3RpdmVCYWNrZ3JvdW5kOiBJQ29sb3I7XG4gIG92ZXJ2aWV3UnVsZXJCb3JkZXI6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG4gIC8qKiBNYXBzIG9yaWdpbmFsIGNvbG9ycyB0byBjb2xvcnMgdGhhdCByZXNwZWN0IG1pbmltdW0gY29udHJhc3QgcmF0aW8uICovXG4gIGNvbnRyYXN0Q2FjaGU6IElDb2xvckNvbnRyYXN0Q2FjaGU7XG4gIC8qKiBNYXBzIG9yaWdpbmFsIGNvbG9ycyB0byBjb2xvcnMgdGhhdCByZXNwZWN0IF9oYWxmXyBvZiB0aGUgbWluaW11bSBjb250cmFzdCByYXRpby4gKi9cbiAgaGFsZkNvbnRyYXN0Q2FjaGU6IElDb2xvckNvbnRyYXN0Q2FjaGU7XG59XG5cbmV4cG9ydCB0eXBlIFJlYWRvbmx5Q29sb3JTZXQgPSBSZWFkb25seTxPbWl0PElDb2xvclNldCwgJ2Fuc2knPj4gJiB7IGFuc2k6IFJlYWRvbmx5PFBpY2s8SUNvbG9yU2V0LCAnYW5zaSc+WydhbnNpJ10+IH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gIGNsZWFyKCk6IHZvaWQ7XG4gIHNldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQ7XG4gIGdldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgc2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IElDb2xvciB8IG51bGwpOiB2b2lkO1xuICBnZXRDb2xvcihiZzogbnVtYmVyLCBmZzogbnVtYmVyKTogSUNvbG9yIHwgbnVsbCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFydGlhbENvbG9yU2V0IHtcbiAgZm9yZWdyb3VuZDogSUNvbG9yO1xuICBiYWNrZ3JvdW5kOiBJQ29sb3I7XG4gIGN1cnNvcj86IElDb2xvcjtcbiAgY3Vyc29yQWNjZW50PzogSUNvbG9yO1xuICBzZWxlY3Rpb25CYWNrZ3JvdW5kPzogSUNvbG9yO1xuICBhbnNpOiBJQ29sb3JbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlld3BvcnQgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7XG4gIHNjcm9sbEJhcldpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbExpbmVzOiBFdmVudDx7IGFtb3VudDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50OiBib29sZWFuIH0+O1xuICBzeW5jU2Nyb2xsQXJlYShpbW1lZGlhdGU/OiBib29sZWFuLCBmb3JjZT86IGJvb2xlYW4pOiB2b2lkO1xuICBnZXRMaW5lc1Njcm9sbGVkKGV2OiBXaGVlbEV2ZW50KTogbnVtYmVyO1xuICBnZXRCdWZmZXJFbGVtZW50cyhzdGFydExpbmU6IG51bWJlciwgZW5kTGluZT86IG51bWJlcik6IHsgYnVmZmVyRWxlbWVudHM6IEhUTUxFbGVtZW50W10sIGN1cnNvckVsZW1lbnQ/OiBIVE1MRWxlbWVudCB9O1xuICBoYW5kbGVXaGVlbChldjogV2hlZWxFdmVudCk6IGJvb2xlYW47XG4gIGhhbmRsZVRvdWNoU3RhcnQoZXY6IFRvdWNoRXZlbnQpOiB2b2lkO1xuICBoYW5kbGVUb3VjaE1vdmUoZXY6IFRvdWNoRXZlbnQpOiBib29sZWFuO1xuICBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIpOiB2b2lkOyAgLy8gdG9kbyBhcGkgbmFtZT9cbiAgcmVzZXQoKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGlua2lmaWVyRXZlbnQge1xuICB4MTogbnVtYmVyO1xuICB5MTogbnVtYmVyO1xuICB4MjogbnVtYmVyO1xuICB5MjogbnVtYmVyO1xuICBjb2xzOiBudW1iZXI7XG4gIGZnOiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJTGlua1N0YXRlIHtcbiAgZGVjb3JhdGlvbnM6IElMaW5rRGVjb3JhdGlvbnM7XG4gIGlzSG92ZXJlZDogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmtXaXRoU3RhdGUge1xuICBsaW5rOiBJTGluaztcbiAgc3RhdGU/OiBJTGlua1N0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaW5raWZpZXIyIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBvblNob3dMaW5rVW5kZXJsaW5lOiBFdmVudDxJTGlua2lmaWVyRXZlbnQ+O1xuICBvbkhpZGVMaW5rVW5kZXJsaW5lOiBFdmVudDxJTGlua2lmaWVyRXZlbnQ+O1xuICByZWFkb25seSBjdXJyZW50TGluazogSUxpbmtXaXRoU3RhdGUgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmsge1xuICByYW5nZTogSUJ1ZmZlclJhbmdlO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlY29yYXRpb25zPzogSUxpbmtEZWNvcmF0aW9ucztcbiAgYWN0aXZhdGUoZXZlbnQ6IE1vdXNlRXZlbnQsIHRleHQ6IHN0cmluZyk6IHZvaWQ7XG4gIGhvdmVyPyhldmVudDogTW91c2VFdmVudCwgdGV4dDogc3RyaW5nKTogdm9pZDtcbiAgbGVhdmU/KGV2ZW50OiBNb3VzZUV2ZW50LCB0ZXh0OiBzdHJpbmcpOiB2b2lkO1xuICBkaXNwb3NlPygpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaW5rRGVjb3JhdGlvbnMge1xuICBwb2ludGVyQ3Vyc29yOiBib29sZWFuO1xuICB1bmRlcmxpbmU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1ZmZlclJhbmdlIHtcbiAgc3RhcnQ6IElCdWZmZXJDZWxsUG9zaXRpb247XG4gIGVuZDogSUJ1ZmZlckNlbGxQb3NpdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnVmZmVyQ2VsbFBvc2l0aW9uIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIENoYXJhY3RlckpvaW5lckhhbmRsZXIgPSAodGV4dDogc3RyaW5nKSA9PiBbbnVtYmVyLCBudW1iZXJdW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXJhY3RlckpvaW5lciB7XG4gIGlkOiBudW1iZXI7XG4gIGhhbmRsZXI6IENoYXJhY3RlckpvaW5lckhhbmRsZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlckRlYm91bmNlciBleHRlbmRzIElEaXNwb3NhYmxlIHtcbiAgcmVmcmVzaChyb3dTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkLCByb3dFbmQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcm93Q291bnQ6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlckRlYm91bmNlcldpdGhDYWxsYmFjayBleHRlbmRzIElSZW5kZXJEZWJvdW5jZXIge1xuICBhZGRSZWZyZXNoQ2FsbGJhY2soY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCdWZmZXJFbGVtZW50UHJvdmlkZXIge1xuICBwcm92aWRlQnVmZmVyRWxlbWVudHMoKTogRG9jdW1lbnRGcmFnbWVudCB8IEhUTUxFbGVtZW50O1xufVxuXG4vLyBBbiBJSUZFIHRvIGdlbmVyYXRlIERFRkFVTFRfQU5TSV9DT0xPUlMuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTlNJX0NPTE9SUyA9IE9iamVjdC5mcmVlemUoKCgpID0+IHtcbiAgY29uc3QgY29sb3JzID0gW1xuICAgIC8vIGRhcms6XG4gICAgY3NzLnRvQ29sb3IoJyMyZTM0MzYnKSxcbiAgICBjc3MudG9Db2xvcignI2NjMDAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNGU5YTA2JyksXG4gICAgY3NzLnRvQ29sb3IoJyNjNGEwMDAnKSxcbiAgICBjc3MudG9Db2xvcignIzM0NjVhNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjNzU1MDdiJyksXG4gICAgY3NzLnRvQ29sb3IoJyMwNjk4OWEnKSxcbiAgICBjc3MudG9Db2xvcignI2QzZDdjZicpLFxuICAgIC8vIGJyaWdodDpcbiAgICBjc3MudG9Db2xvcignIzU1NTc1MycpLFxuICAgIGNzcy50b0NvbG9yKCcjZWYyOTI5JyksXG4gICAgY3NzLnRvQ29sb3IoJyM4YWUyMzQnKSxcbiAgICBjc3MudG9Db2xvcignI2ZjZTk0ZicpLFxuICAgIGNzcy50b0NvbG9yKCcjNzI5ZmNmJyksXG4gICAgY3NzLnRvQ29sb3IoJyNhZDdmYTgnKSxcbiAgICBjc3MudG9Db2xvcignIzM0ZTJlMicpLFxuICAgIGNzcy50b0NvbG9yKCcjZWVlZWVjJylcbiAgXTtcblxuICAvLyBGaWxsIGluIHRoZSByZW1haW5pbmcgMjQwIEFOU0kgY29sb3JzLlxuICAvLyBHZW5lcmF0ZSBjb2xvcnMgKDE2LTIzMSlcbiAgY29uc3QgdiA9IFsweDAwLCAweDVmLCAweDg3LCAweGFmLCAweGQ3LCAweGZmXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMTY7IGkrKykge1xuICAgIGNvbnN0IHIgPSB2WyhpIC8gMzYpICUgNiB8IDBdO1xuICAgIGNvbnN0IGcgPSB2WyhpIC8gNikgJSA2IHwgMF07XG4gICAgY29uc3QgYiA9IHZbaSAlIDZdO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYilcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGdyZXlzICgyMzItMjU1KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICBjb25zdCBjID0gOCArIGkgKiAxMDtcbiAgICBjb2xvcnMucHVzaCh7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKGMsIGMsIGMpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKGMsIGMsIGMpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufSkoKSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIChFWFBFUklNRU5UQUwpIFRoaXMgQWRkb24gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElCdWZmZXIsIElCdWZmZXJDZWxsLCBJQnVmZmVyUmFuZ2UsIElUZXJtaW5hbEFkZG9uLCBUZXJtaW5hbCB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgdHlwZSB7IElIVE1MU2VyaWFsaXplT3B0aW9ucywgU2VyaWFsaXplQWRkb24gYXMgSVNlcmlhbGl6ZUFwaSwgSVNlcmlhbGl6ZU9wdGlvbnMsIElTZXJpYWxpemVSYW5nZSB9IGZyb20gJ0B4dGVybS9hZGRvbi1zZXJpYWxpemUnO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0FOU0lfQ09MT1JTIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5cbmZ1bmN0aW9uIGNvbnN0cmFpbih2YWx1ZTogbnVtYmVyLCBsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KGxvdywgTWF0aC5taW4odmFsdWUsIGhpZ2gpKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlSFRNTENoYXIoYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAnJic6IHJldHVybiAnJmFtcDsnO1xuICAgIGNhc2UgJzwnOiByZXR1cm4gJyZsdDsnO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vLyBUT0RPOiBSZWZpbmUgdGhpcyB0ZW1wbGF0ZSBjbGFzcyBsYXRlclxuYWJzdHJhY3QgY2xhc3MgQmFzZVNlcmlhbGl6ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2J1ZmZlcjogSUJ1ZmZlclxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemUocmFuZ2U6IElCdWZmZXJSYW5nZSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAvLyB3ZSBuZWVkIHR3byBvZiB0aGVtIHRvIGZsaXAgYmV0d2VlbiBvbGQgYW5kIG5ldyBjZWxsXG4gICAgY29uc3QgY2VsbDEgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgICBjb25zdCBjZWxsMiA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICAgIGxldCBvbGRDZWxsID0gY2VsbDE7XG5cbiAgICBjb25zdCBzdGFydFJvdyA9IHJhbmdlLnN0YXJ0Lnk7XG4gICAgY29uc3QgZW5kUm93ID0gcmFuZ2UuZW5kLnk7XG4gICAgY29uc3Qgc3RhcnRDb2x1bW4gPSByYW5nZS5zdGFydC54O1xuICAgIGNvbnN0IGVuZENvbHVtbiA9IHJhbmdlLmVuZC54O1xuXG4gICAgdGhpcy5fYmVmb3JlU2VyaWFsaXplKGVuZFJvdyAtIHN0YXJ0Um93LCBzdGFydFJvdywgZW5kUm93KTtcblxuICAgIGZvciAobGV0IHJvdyA9IHN0YXJ0Um93OyByb3cgPD0gZW5kUm93OyByb3crKykge1xuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdyk7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBjb25zdCBzdGFydExpbmVDb2x1bW4gPSByb3cgPT09IHJhbmdlLnN0YXJ0LnkgPyBzdGFydENvbHVtbiA6IDA7XG4gICAgICAgIGNvbnN0IGVuZExpbmVDb2x1bW4gPSByb3cgPT09IHJhbmdlLmVuZC55ID8gZW5kQ29sdW1uOiBsaW5lLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgY29sID0gc3RhcnRMaW5lQ29sdW1uOyBjb2wgPCBlbmRMaW5lQ29sdW1uOyBjb2wrKykge1xuICAgICAgICAgIGNvbnN0IGMgPSBsaW5lLmdldENlbGwoY29sLCBvbGRDZWxsID09PSBjZWxsMSA/IGNlbGwyIDogY2VsbDEpO1xuICAgICAgICAgIGlmICghYykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDYW4ndCBnZXQgY2VsbCBhdCByb3c9JHtyb3d9LCBjb2w9JHtjb2x9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbmV4dENlbGwoYywgb2xkQ2VsbCwgcm93LCBjb2wpO1xuICAgICAgICAgIG9sZENlbGwgPSBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9yb3dFbmQocm93LCByb3cgPT09IGVuZFJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWZ0ZXJTZXJpYWxpemUoKTtcblxuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfcm93RW5kKHJvdzogbnVtYmVyLCBpc0xhc3RSb3c6IGJvb2xlYW4pOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbj86IGJvb2xlYW4pOiBzdHJpbmcgeyByZXR1cm4gJyc7IH1cbn1cblxuZnVuY3Rpb24gZXF1YWxGZyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5nZXRGZ0NvbG9yTW9kZSgpID09PSBjZWxsMi5nZXRGZ0NvbG9yTW9kZSgpXG4gICAgJiYgY2VsbDEuZ2V0RmdDb2xvcigpID09PSBjZWxsMi5nZXRGZ0NvbG9yKCk7XG59XG5cbmZ1bmN0aW9uIGVxdWFsQmcoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuZ2V0QmdDb2xvck1vZGUoKSA9PT0gY2VsbDIuZ2V0QmdDb2xvck1vZGUoKVxuICAgICYmIGNlbGwxLmdldEJnQ29sb3IoKSA9PT0gY2VsbDIuZ2V0QmdDb2xvcigpO1xufVxuXG5mdW5jdGlvbiBlcXVhbEZsYWdzKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmlzSW52ZXJzZSgpID09PSBjZWxsMi5pc0ludmVyc2UoKVxuICAgICYmIGNlbGwxLmlzQm9sZCgpID09PSBjZWxsMi5pc0JvbGQoKVxuICAgICYmIGNlbGwxLmlzVW5kZXJsaW5lKCkgPT09IGNlbGwyLmlzVW5kZXJsaW5lKClcbiAgICAmJiBjZWxsMS5pc092ZXJsaW5lKCkgPT09IGNlbGwyLmlzT3ZlcmxpbmUoKVxuICAgICYmIGNlbGwxLmlzQmxpbmsoKSA9PT0gY2VsbDIuaXNCbGluaygpXG4gICAgJiYgY2VsbDEuaXNJbnZpc2libGUoKSA9PT0gY2VsbDIuaXNJbnZpc2libGUoKVxuICAgICYmIGNlbGwxLmlzSXRhbGljKCkgPT09IGNlbGwyLmlzSXRhbGljKClcbiAgICAmJiBjZWxsMS5pc0RpbSgpID09PSBjZWxsMi5pc0RpbSgpXG4gICAgJiYgY2VsbDEuaXNTdHJpa2V0aHJvdWdoKCkgPT09IGNlbGwyLmlzU3RyaWtldGhyb3VnaCgpO1xufVxuXG5jbGFzcyBTdHJpbmdTZXJpYWxpemVIYW5kbGVyIGV4dGVuZHMgQmFzZVNlcmlhbGl6ZUhhbmRsZXIge1xuICBwcml2YXRlIF9yb3dJbmRleDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfYWxsUm93czogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIF9hbGxSb3dTZXBhcmF0b3JzOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2N1cnJlbnRSb3c6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9udWxsQ2VsbENvdW50OiBudW1iZXIgPSAwO1xuXG4gIC8vIHdlIGNhbiBzZWUgYSBmdWxsIGNvbG9yZWQgY2VsbCBhbmQgYSBudWxsIGNlbGwgdGhhdCBvbmx5IGhhdmUgYmFja2dyb3VuZCB0aGUgc2FtZSBzdHlsZVxuICAvLyBidXQgdGhlIGluZm9ybWF0aW9uIGlzbid0IHByZXNlcnZlZCBieSBudWxsIGNlbGwgaXRzZWxmXG4gIC8vIHNvIHdlZSBuZWVkIHRvIHJlY29yZCBpdCB3aGVuIHJlcXVpcmVkLlxuICBwcml2YXRlIF9jdXJzb3JTdHlsZTogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcblxuICAvLyB3aGVyZSBleGFjdCB0aGUgY3Vyc29yIHN0eWxlcyBjb21lcyBmcm9tXG4gIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgY29weSB0aGUgY2VsbCBkaXJlY3RseVxuICAvLyBzbyB3ZSByZW1lbWJlciB3aGVyZSB0aGUgY29udGVudCBjb21lcyBmcm9tIGluc3RlYWRcbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGVSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2N1cnNvclN0eWxlQ29sOiBudW1iZXIgPSAwO1xuXG4gIC8vIHRoaXMgaXMgYSBudWxsIGNlbGwgZm9yIHJlZmVyZW5jZSBmb3IgY2hlY2tpbmcgd2hldGhlciBiYWNrZ3JvdW5kIGlzIGVtcHR5IG9yIG5vdFxuICBwcml2YXRlIF9iYWNrZ3JvdW5kQ2VsbDogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcblxuICBwcml2YXRlIF9maXJzdFJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdEN1cnNvclJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdEN1cnNvckNvbDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdENvbnRlbnRDdXJzb3JSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50Q3Vyc29yQ29sOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1ZmZlcjogSUJ1ZmZlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWxcbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYmVmb3JlU2VyaWFsaXplKHJvd3M6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxSb3dzID0gbmV3IEFycmF5PHN0cmluZz4ocm93cyk7XG4gICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSBzdGFydDtcbiAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gc3RhcnQ7XG4gICAgdGhpcy5fZmlyc3RSb3cgPSBzdGFydDtcbiAgfVxuXG4gIHByaXZhdGUgX3RoaXNSb3dMYXN0Q2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJpdmF0ZSBfdGhpc1Jvd0xhc3RTZWNvbmRDaGFyOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICBwcml2YXRlIF9uZXh0Um93Rmlyc3RDaGFyOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gaWYgdGhlcmUgaXMgY29sb3JmdWwgZW1wdHkgY2VsbCBhdCBsaW5lIGVuZCwgd2hlIG11c3QgcGFkIGl0IGJhY2ssIG9yIHRoZSB0aGUgY29sb3IgYmxvY2tcbiAgICAvLyB3aWxsIG1pc3NpbmdcbiAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDAgJiYgIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgLy8gdXNlIGNsZWFyIHJpZ2h0IHRvIHNldCBiYWNrZ3JvdW5kLlxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgfVxuXG4gICAgbGV0IHJvd1NlcGFyYXRvciA9ICcnO1xuXG4gICAgLy8gaGFuZGxlIHJvdyBzZXBhcmF0b3JcbiAgICBpZiAoIWlzTGFzdFJvdykge1xuICAgICAgLy8gRW5hYmxlIEJDRVxuICAgICAgaWYgKHJvdyAtIHRoaXMuX2ZpcnN0Um93ID49IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyLmdldExpbmUodGhpcy5fY3Vyc29yU3R5bGVSb3cpPy5nZXRDZWxsKHRoaXMuX2N1cnNvclN0eWxlQ29sLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIGN1cnJlbnQgbGluZVxuICAgICAgY29uc3QgY3VycmVudExpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpITtcbiAgICAgIC8vIEZldGNoIG5leHQgbGluZVxuICAgICAgY29uc3QgbmV4dExpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cgKyAxKSE7XG5cbiAgICAgIGlmICghbmV4dExpbmUuaXNXcmFwcGVkKSB7XG4gICAgICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBsaW5lIGJyZWFrXG4gICAgICAgIHJvd1NlcGFyYXRvciA9ICdcXHJcXG4nO1xuICAgICAgICAvLyB3ZSBzZW5kZWQgdGhlIGVudGVyXG4gICAgICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd1NlcGFyYXRvciA9ICcnO1xuICAgICAgICBjb25zdCB0aGlzUm93TGFzdENoYXIgPSBjdXJyZW50TGluZS5nZXRDZWxsKGN1cnJlbnRMaW5lLmxlbmd0aCAtIDEsIHRoaXMuX3RoaXNSb3dMYXN0Q2hhcikhO1xuICAgICAgICBjb25zdCB0aGlzUm93TGFzdFNlY29uZENoYXIgPSBjdXJyZW50TGluZS5nZXRDZWxsKGN1cnJlbnRMaW5lLmxlbmd0aCAtIDIsIHRoaXMuX3RoaXNSb3dMYXN0U2Vjb25kQ2hhcikhO1xuICAgICAgICBjb25zdCBuZXh0Um93Rmlyc3RDaGFyID0gbmV4dExpbmUuZ2V0Q2VsbCgwLCB0aGlzLl9uZXh0Um93Rmlyc3RDaGFyKSE7XG4gICAgICAgIGNvbnN0IGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoID0gbmV4dFJvd0ZpcnN0Q2hhci5nZXRXaWR0aCgpID4gMTtcblxuICAgICAgICAvLyB2YWxpZGF0ZSB3aGV0aGVyIHRoaXMgbGluZSB3cmFwIGlzIGV2ZXIgcG9zc2libGVcbiAgICAgICAgLy8gd2hpY2ggbWVhbiB3aGV0aGVyIGN1cnNvciBjYW4gcGxhY2VkIGF0IGEgb3ZlcmZsb3cgcG9zaXRpb24gKHggPT09IHJvdykgbmF0dXJhbGx5XG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIHlvdSBtdXN0IG91dHB1dCBjaGFyYWN0ZXIgdG8gY2F1c2Ugb3ZlcmZsb3csIGNvbnRyb2wgc2VxdWVuY2UgY2FuJ3QgZG8gdGhpc1xuICAgICAgICAgIG5leHRSb3dGaXJzdENoYXIuZ2V0Q2hhcnMoKSAmJlxuICAgICAgICAgICAgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggPyB0aGlzLl9udWxsQ2VsbENvdW50IDw9IDEgOiB0aGlzLl9udWxsQ2VsbENvdW50IDw9IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgY2hhcmFjdGVyIGNhbid0IGJlIG51bGwsXG4gICAgICAgICAgICAvLyB5b3UgY2FuJ3QgdXNlIGNvbnRyb2wgc2VxdWVuY2UgdG8gbW92ZSBjdXJzb3IgdG8gKHggPT09IHJvdylcbiAgICAgICAgICAgICh0aGlzUm93TGFzdENoYXIuZ2V0Q2hhcnMoKSB8fCB0aGlzUm93TGFzdENoYXIuZ2V0V2lkdGgoKSA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIG9mIHRoZSBmaXJzdCB3cmFwcGVkIGNlbGwgYWxzbyBhZmZlY3RzIEJDRVxuICAgICAgICAgICAgLy8gc28gd2UgbWFyayBpdCBhcyBpbnZhbGlkIHRvIHNpbXBseSB0aGUgcHJvY2VzcyB0byBkZXRlcm1pbmUgbGluZSBzZXBhcmF0b3JcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gdGhlIHNlY29uZCB0byBsYXN0IGNoYXJhY3RlciBjYW4ndCBiZSBudWxsIGlmIHRoZSBuZXh0IGxpbmUgc3RhcnRzIHdpdGggQ0pLLFxuICAgICAgICAgICAgLy8geW91IGNhbid0IHVzZSBjb250cm9sIHNlcXVlbmNlIHRvIG1vdmUgY3Vyc29yIHRvICh4ID09PSByb3cpXG4gICAgICAgICAgICBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCAmJlxuICAgICAgICAgICAgKHRoaXNSb3dMYXN0U2Vjb25kQ2hhci5nZXRDaGFycygpIHx8IHRoaXNSb3dMYXN0U2Vjb25kQ2hhci5nZXRXaWR0aCgpID09PSAwKSAmJlxuICAgICAgICAgICAgLy8gY2hhbmdlIGJhY2tncm91bmQgb2YgdGhlIGZpcnN0IHdyYXBwZWQgY2VsbCBhbHNvIGFmZmVjdHMgQkNFXG4gICAgICAgICAgICAvLyBzbyB3ZSBtYXJrIGl0IGFzIGludmFsaWQgdG8gc2ltcGx5IHRoZSBwcm9jZXNzIHRvIGRldGVybWluZSBsaW5lIHNlcGFyYXRvclxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdENoYXIsIG5leHRSb3dGaXJzdENoYXIpICYmXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0U2Vjb25kQ2hhciwgbmV4dFJvd0ZpcnN0Q2hhcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgIC8vIGZvcmNlIHRoZSB3cmFwIHdpdGggbWFnaWNcbiAgICAgICAgICAvLyBpbnNlcnQgZW5vdWdoIGNoYXJhY3RlciB0byBmb3JjZSB0aGUgd3JhcFxuICAgICAgICAgIHJvd1NlcGFyYXRvciA9ICctJy5yZXBlYXQodGhpcy5fbnVsbENlbGxDb3VudCArIDEpO1xuICAgICAgICAgIC8vIG1vdmUgYmFjayBhbmQgZXJhc2UgbmV4dCBsaW5lIGhlYWRcbiAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gJ1xcdTAwMWJbMURcXHUwMDFiWzFYJztcblxuICAgICAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAgICAgLy8gZG8gdGhlc2UgYmVjYXVzZSB3ZSBmaWxsZWQgdGhlIGxhc3Qgc2V2ZXJhbCBudWxsIHNsb3QsIHdoaWNoIHdlIHNob3VsZG4ndFxuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiW0EnO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7Y3VycmVudExpbmUubGVuZ3RoIC0gdGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHtjdXJyZW50TGluZS5sZW5ndGggLSB0aGlzLl9udWxsQ2VsbENvdW50fURgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiW0InO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoaXMgaXMgY29udGVudCBhbmQgbmVlZCB0aGUgYmUgc2VyaWFsaXplZCBldmVuIGl0IGlzIGludmlzaWJsZS5cbiAgICAgICAgICAvLyB3aXRob3V0IHRoaXMsIHdyYXAgd2lsbCBiZSBtaXNzaW5nIGZyb20gb3V0cHV0cy5cbiAgICAgICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2wgPSAwO1xuXG4gICAgICAgICAgLy8gZm9yY2UgY29tbWl0IHRoZSBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FsbFJvd3NbdGhpcy5fcm93SW5kZXhdID0gdGhpcy5fY3VycmVudFJvdztcbiAgICB0aGlzLl9hbGxSb3dTZXBhcmF0b3JzW3RoaXMuX3Jvd0luZGV4KytdID0gcm93U2VwYXJhdG9yO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgX2RpZmZTdHlsZShjZWxsOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZ3JTZXE6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGlmIChjZWxsLmlzQXR0cmlidXRlRGVmYXVsdCgpKSB7XG4gICAgICAgIGlmICghb2xkQ2VsbC5pc0F0dHJpYnV0ZURlZmF1bHQoKSkge1xuICAgICAgICAgIHNnclNlcS5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmdDaGFuZ2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBjZWxsLmdldEZnQ29sb3IoKTtcbiAgICAgICAgICBpZiAoY2VsbC5pc0ZnUkdCKCkpIHsgc2dyU2VxLnB1c2goMzgsIDIsIChjb2xvciA+Pj4gMTYpICYgMHhGRiwgKGNvbG9yID4+PiA4KSAmIDB4RkYsIGNvbG9yICYgMHhGRik7IH1cbiAgICAgICAgICBlbHNlIGlmIChjZWxsLmlzRmdQYWxldHRlKCkpIHtcbiAgICAgICAgICAgIGlmIChjb2xvciA+PSAxNikgeyBzZ3JTZXEucHVzaCgzOCwgNSwgY29sb3IpOyB9XG4gICAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goY29sb3IgJiA4ID8gOTAgKyAoY29sb3IgJiA3KSA6IDMwICsgKGNvbG9yICYgNykpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaCgzOSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmdDaGFuZ2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBjZWxsLmdldEJnQ29sb3IoKTtcbiAgICAgICAgICBpZiAoY2VsbC5pc0JnUkdCKCkpIHsgc2dyU2VxLnB1c2goNDgsIDIsIChjb2xvciA+Pj4gMTYpICYgMHhGRiwgKGNvbG9yID4+PiA4KSAmIDB4RkYsIGNvbG9yICYgMHhGRik7IH1cbiAgICAgICAgICBlbHNlIGlmIChjZWxsLmlzQmdQYWxldHRlKCkpIHtcbiAgICAgICAgICAgIGlmIChjb2xvciA+PSAxNikgeyBzZ3JTZXEucHVzaCg0OCwgNSwgY29sb3IpOyB9XG4gICAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goY29sb3IgJiA4ID8gMTAwICsgKGNvbG9yICYgNykgOiA0MCArIChjb2xvciAmIDcpKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goNDkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsYWdzQ2hhbmdlZCkge1xuICAgICAgICAgIGlmIChjZWxsLmlzSW52ZXJzZSgpICE9PSBvbGRDZWxsLmlzSW52ZXJzZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJbnZlcnNlKCkgPyA3IDogMjcpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNCb2xkKCkgIT09IG9sZENlbGwuaXNCb2xkKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0JvbGQoKSA/IDEgOiAyMik7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICE9PSBvbGRDZWxsLmlzVW5kZXJsaW5lKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc1VuZGVybGluZSgpID8gNCA6IDI0KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSAhPT0gb2xkQ2VsbC5pc092ZXJsaW5lKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc092ZXJsaW5lKCkgPyA1MyA6IDU1KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSAhPT0gb2xkQ2VsbC5pc0JsaW5rKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0JsaW5rKCkgPyA1IDogMjUpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNJbnZpc2libGUoKSAhPT0gb2xkQ2VsbC5pc0ludmlzaWJsZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJbnZpc2libGUoKSA/IDggOiAyOCk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0l0YWxpYygpICE9PSBvbGRDZWxsLmlzSXRhbGljKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0l0YWxpYygpID8gMyA6IDIzKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzRGltKCkgIT09IG9sZENlbGwuaXNEaW0oKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzRGltKCkgPyAyIDogMjIpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkgIT09IG9sZENlbGwuaXNTdHJpa2V0aHJvdWdoKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc1N0cmlrZXRocm91Z2goKSA/IDkgOiAyOSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZ3JTZXE7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25leHRDZWxsKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYSB3aWR0aCAwIGNlbGwgZG9uJ3QgbmVlZCB0byBiZSBjb3VudCBiZWNhdXNlIGl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhZnRlciBhIENKSyBjaGFyYWN0ZXI7XG4gICAgY29uc3QgaXNQbGFjZUhvbGRlckNlbGwgPSBjZWxsLmdldFdpZHRoKCkgPT09IDA7XG5cbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc2dyU2VxID0gdGhpcy5fZGlmZlN0eWxlKGNlbGwsIHRoaXMuX2N1cnNvclN0eWxlKTtcblxuICAgIC8vIHRoZSBlbXB0eSBjZWxsIHN0eWxlIGlzIG9ubHkgYXNzdW1lZCB0byBiZSBjaGFuZ2VkIHdoZW4gYmFja2dyb3VuZCBjaGFuZ2VkLCBiZWNhdXNlXG4gICAgLy8gZm9yZWdyb3VuZCBpcyBhbHdheXMgMC5cbiAgICBjb25zdCBzdHlsZUNoYW5nZWQgPSBpc0VtcHR5Q2VsbCA/ICFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCBjZWxsKSA6IHNnclNlcS5sZW5ndGggPiAwO1xuXG4gICAgLyoqXG4gICAgICogIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgICovXG4gICAgaWYgKHN0eWxlQ2hhbmdlZCkge1xuICAgICAgLy8gYmVmb3JlIHVwZGF0ZSB0aGUgc3R5bGUsIHdlIG5lZWQgdG8gZmlsbCBlbXB0eSBjZWxsIGJhY2tcbiAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAvLyB1c2UgY2xlYXIgcmlnaHQgdG8gc2V0IGJhY2tncm91bmQuXG4gICAgICAgIGlmICghZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgdGhpcy5fYmFja2dyb3VuZENlbGwpKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIG1vdmUgcmlnaHQgdG8gbW92ZSBjdXJzb3IuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93O1xuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2wgPSB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gY29sO1xuXG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7c2dyU2VxLmpvaW4oJzsnKX1tYDtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBsYXN0IGN1cnNvciBzdHlsZVxuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdyk7XG4gICAgICBpZiAobGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxpbmUuZ2V0Q2VsbChjb2wsIHRoaXMuX2N1cnNvclN0eWxlKTtcbiAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGVSb3cgPSByb3c7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlQ29sID0gY29sO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgICovXG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9udWxsQ2VsbENvdW50ICs9IGNlbGwuZ2V0V2lkdGgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwKSB7XG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IGFzc3VtZSB3ZSBoYXZlIHNhbWUgc3R5bGUgd2l0aCBwcmV2aW91cyBvbmUgaGVyZVxuICAgICAgICAvLyBiZWNhdXNlIHN0eWxlIGNoYW5nZSBpcyBoYW5kbGVkIGJ5IHByZXZpb3VzIHN0YWdlXG4gICAgICAgIC8vIHVzZSBtb3ZlIHJpZ2h0IHdoZW4gYmFja2dyb3VuZCBpcyBlbXB0eSwgdXNlIGNsZWFyIHJpZ2h0IHdoZW4gdGhlcmUgaXMgYmFja2dyb3VuZC5cbiAgICAgICAgaWYgKGVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX251bGxDZWxsQ291bnQgPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGNlbGwuZ2V0Q2hhcnMoKTtcblxuICAgICAgLy8gdXBkYXRlIGN1cnNvclxuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93O1xuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2wgPSB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gY29sICsgY2VsbC5nZXRXaWR0aCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBsZXQgcm93RW5kID0gdGhpcy5fYWxsUm93cy5sZW5ndGg7XG5cbiAgICAvLyB0aGUgZml4dXAgaXMgb25seSByZXF1aXJlZCBmb3IgZGF0YSB3aXRob3V0IHNjcm9sbGJhY2tcbiAgICAvLyBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHBsYWNlZCBhdCBsYXN0IGxpbmUgb3RoZXJ3aXNlXG4gICAgaWYgKHRoaXMuX2J1ZmZlci5sZW5ndGggLSB0aGlzLl9maXJzdFJvdyA8PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICByb3dFbmQgPSB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyArIDEgLSB0aGlzLl9maXJzdFJvdztcbiAgICAgIHRoaXMuX2xhc3RDdXJzb3JDb2wgPSB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbDtcbiAgICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdztcbiAgICB9XG5cbiAgICBsZXQgY29udGVudCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dFbmQ7IGkrKykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9hbGxSb3dzW2ldO1xuICAgICAgaWYgKGkgKyAxIDwgcm93RW5kKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gdGhpcy5fYWxsUm93U2VwYXJhdG9yc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIHRoZSBjdXJzb3JcbiAgICBpZiAoIWV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKSB7XG4gICAgICBjb25zdCByZWFsQ3Vyc29yUm93ID0gdGhpcy5fYnVmZmVyLmJhc2VZICsgdGhpcy5fYnVmZmVyLmN1cnNvclk7XG4gICAgICBjb25zdCByZWFsQ3Vyc29yQ29sID0gdGhpcy5fYnVmZmVyLmN1cnNvclg7XG5cbiAgICAgIGNvbnN0IGN1cnNvck1vdmVkID0gKHJlYWxDdXJzb3JSb3cgIT09IHRoaXMuX2xhc3RDdXJzb3JSb3cgfHwgcmVhbEN1cnNvckNvbCAhPT0gdGhpcy5fbGFzdEN1cnNvckNvbCk7XG5cbiAgICAgIGNvbnN0IG1vdmVSaWdodCA9IChvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtvZmZzZXR9Q2A7XG4gICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHstb2Zmc2V0fURgO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgbW92ZURvd24gPSAob2Zmc2V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7b2Zmc2V0fUJgO1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7LW9mZnNldH1BYDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGN1cnNvck1vdmVkKSB7XG4gICAgICAgIG1vdmVEb3duKHJlYWxDdXJzb3JSb3cgLSB0aGlzLl9sYXN0Q3Vyc29yUm93KTtcbiAgICAgICAgbW92ZVJpZ2h0KHJlYWxDdXJzb3JDb2wgLSB0aGlzLl9sYXN0Q3Vyc29yQ29sKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRoZSBjdXJzb3IncyBjdXJyZW50IHN0eWxlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2NzdcbiAgICAvLyBIQUNLOiBJbnRlcm5hbCBBUEkgYWNjZXNzIHNpbmNlIGl0J3MgYXdrd2FyZCB0byBleHBvc2UgdGhpcyBpbiB0aGUgQVBJIGFuZCBzZXJpYWxpemUgd2lsbFxuICAgIC8vIGxpa2VseSBiZSB0aGUgb25seSBjb25zdW1lclxuICAgIGNvbnN0IGN1ckF0dHJEYXRhOiBJQXR0cmlidXRlRGF0YSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9pbnB1dEhhbmRsZXIuX2N1ckF0dHJEYXRhO1xuICAgIGNvbnN0IHNnclNlcSA9IHRoaXMuX2RpZmZTdHlsZShjdXJBdHRyRGF0YSwgdGhpcy5fY3Vyc29yU3R5bGUpO1xuICAgIGlmIChzZ3JTZXEubGVuZ3RoID4gMCkge1xuICAgICAgY29udGVudCArPSBgXFx1MDAxYlske3NnclNlcS5qb2luKCc7Jyl9bWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6ZUFkZG9uIGltcGxlbWVudHMgSVRlcm1pbmFsQWRkb24gLCBJU2VyaWFsaXplQXBpIHtcbiAgcHJpdmF0ZSBfdGVybWluYWw6IFRlcm1pbmFsIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBhY3RpdmF0ZSh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHtcbiAgICB0aGlzLl90ZXJtaW5hbCA9IHRlcm1pbmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRlcm1pbmFsOiBUZXJtaW5hbCwgYnVmZmVyOiBJQnVmZmVyLCBzY3JvbGxiYWNrPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXhSb3dzID0gYnVmZmVyLmxlbmd0aDtcbiAgICBjb25zdCBjb3JyZWN0Um93cyA9IChzY3JvbGxiYWNrID09PSB1bmRlZmluZWQpID8gbWF4Um93cyA6IGNvbnN0cmFpbihzY3JvbGxiYWNrICsgdGVybWluYWwucm93cywgMCwgbWF4Um93cyk7XG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UodGVybWluYWwsIGJ1ZmZlciwge1xuICAgICAgc3RhcnQ6IG1heFJvd3MgLSBjb3JyZWN0Um93cyxcbiAgICAgIGVuZDogbWF4Um93cyAtIDFcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRlcm1pbmFsOiBUZXJtaW5hbCwgYnVmZmVyOiBJQnVmZmVyLCByYW5nZTogSVNlcmlhbGl6ZVJhbmdlLCBleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBTdHJpbmdTZXJpYWxpemVIYW5kbGVyKGJ1ZmZlciwgdGVybWluYWwpO1xuICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICBzdGFydDogeyB4OiAwLCAgICAgICAgICAgICB5OiB0eXBlb2YgcmFuZ2Uuc3RhcnQgPT09ICdudW1iZXInID8gcmFuZ2Uuc3RhcnQgOiByYW5nZS5zdGFydC5saW5lIH0sXG4gICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiB0eXBlb2YgcmFuZ2UuZW5kICAgPT09ICdudW1iZXInID8gcmFuZ2UuZW5kICAgOiByYW5nZS5lbmQubGluZSAgIH1cbiAgICB9LCBleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVCdWZmZXJBc0hUTUwodGVybWluYWw6IFRlcm1pbmFsLCBvcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmU7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBIVE1MU2VyaWFsaXplSGFuZGxlcihidWZmZXIsIHRlcm1pbmFsLCBvcHRpb25zKTtcbiAgICBjb25zdCBvbmx5U2VsZWN0aW9uID0gb3B0aW9ucy5vbmx5U2VsZWN0aW9uID8/IGZhbHNlO1xuICAgIGNvbnN0IHJhbmdlID0gb3B0aW9ucy5yYW5nZTtcbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0OiB7IHg6IHJhbmdlLnN0YXJ0Q29sLCAgICAgICAgICAgICB5OiB0eXBlb2YgcmFuZ2Uuc3RhcnRMaW5lID09PSAnbnVtYmVyJyA/IHJhbmdlLnN0YXJ0TGluZSA6IHJhbmdlLnN0YXJ0TGluZSB9LFxuICAgICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiB0eXBlb2YgcmFuZ2UuZW5kTGluZSAgID09PSAnbnVtYmVyJyA/IHJhbmdlLmVuZExpbmUgICA6IHJhbmdlLmVuZExpbmUgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFvbmx5U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBtYXhSb3dzID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNjcm9sbGJhY2sgPSBvcHRpb25zLnNjcm9sbGJhY2s7XG4gICAgICBjb25zdCBjb3JyZWN0Um93cyA9IChzY3JvbGxiYWNrID09PSB1bmRlZmluZWQpID8gbWF4Um93cyA6IGNvbnN0cmFpbihzY3JvbGxiYWNrICsgdGVybWluYWwucm93cywgMCwgbWF4Um93cyk7XG4gICAgICByZXR1cm4gaGFuZGxlci5zZXJpYWxpemUoe1xuICAgICAgICBzdGFydDogeyB4OiAwLCAgICAgICAgICAgICB5OiBtYXhSb3dzIC0gY29ycmVjdFJvd3MgfSxcbiAgICAgICAgZW5kOiAgIHsgeDogdGVybWluYWwuY29scywgeTogbWF4Um93cyAtIDEgICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX3Rlcm1pbmFsPy5nZXRTZWxlY3Rpb25Qb3NpdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKHtcbiAgICAgICAgc3RhcnQ6IHsgeDogc2VsZWN0aW9uLnN0YXJ0LngsIHk6IHNlbGVjdGlvbi5zdGFydC55IH0sXG4gICAgICAgIGVuZDogICB7IHg6IHNlbGVjdGlvbi5lbmQueCwgICB5OiBzZWxlY3Rpb24uZW5kLnkgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVNb2Rlcyh0ZXJtaW5hbDogVGVybWluYWwpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgY29uc3QgbW9kZXMgPSB0ZXJtaW5hbC5tb2RlcztcblxuICAgIC8vIERlZmF1bHQ6IGZhbHNlXG4gICAgaWYgKG1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5c01vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8xaCc7XG4gICAgaWYgKG1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzY2aCc7XG4gICAgaWYgKG1vZGVzLmJyYWNrZXRlZFBhc3RlTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzIwMDRoJztcbiAgICBpZiAobW9kZXMuaW5zZXJ0TW9kZSkgY29udGVudCArPSAnXFx4MWJbNGgnO1xuICAgIGlmIChtb2Rlcy5vcmlnaW5Nb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NmgnO1xuICAgIGlmIChtb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZE1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz80NWgnO1xuICAgIGlmIChtb2Rlcy5zZW5kRm9jdXNNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MTAwNGgnO1xuICAgIC8vIHN5bmNocm9uaXplZE91dHB1dE1vZGUgZG9lc24ndCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQgYXMgaXQncyBhIHRlbXBvcmFyeSBtb2RlXG5cbiAgICAvLyBEZWZhdWx0OiB0cnVlXG4gICAgaWYgKG1vZGVzLndyYXBhcm91bmRNb2RlID09PSBmYWxzZSkgY29udGVudCArPSAnXFx4MWJbPzdsJztcblxuICAgIC8vIERlZmF1bHQ6ICdub25lJ1xuICAgIGlmIChtb2Rlcy5tb3VzZVRyYWNraW5nTW9kZSAhPT0gJ25vbmUnKSB7XG4gICAgICBzd2l0Y2ggKG1vZGVzLm1vdXNlVHJhY2tpbmdNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3gxMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz85aCc7IGJyZWFrO1xuICAgICAgICBjYXNlICd2dDIwMCc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAwaCc7IGJyZWFrO1xuICAgICAgICBjYXNlICdkcmFnJzogY29udGVudCArPSAnXFx4MWJbPzEwMDJoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FueSc6IGNvbnRlbnQgKz0gJ1xceDFiWz8xMDAzaCc7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZShvcHRpb25zPzogSVNlcmlhbGl6ZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEFkZCBjb21iaW5lZERhdGEgc3VwcG9ydFxuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgYnVmZmVyXG4gICAgbGV0IGNvbnRlbnQgPSBvcHRpb25zPy5yYW5nZVxuICAgICAgPyB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIubm9ybWFsLCBvcHRpb25zLnJhbmdlLCB0cnVlKVxuICAgICAgOiB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5ub3JtYWwsIG9wdGlvbnM/LnNjcm9sbGJhY2spO1xuXG4gICAgLy8gQWx0ZXJuYXRlIGJ1ZmZlclxuICAgIGlmICghb3B0aW9ucz8uZXhjbHVkZUFsdEJ1ZmZlcikge1xuICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudHlwZSA9PT0gJ2FsdGVybmF0ZScpIHtcbiAgICAgICAgY29uc3QgYWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50ID0gdGhpcy5fc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRoaXMuX3Rlcm1pbmFsLCB0aGlzLl90ZXJtaW5hbC5idWZmZXIuYWx0ZXJuYXRlLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWz8xMDQ5aFxcdTAwMWJbSCR7YWx0ZXJuYXRpdmVTY3JlZW5Db250ZW50fWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9kZXNcbiAgICBpZiAoIW9wdGlvbnM/LmV4Y2x1ZGVNb2Rlcykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9zZXJpYWxpemVNb2Rlcyh0aGlzLl90ZXJtaW5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplQXNIVE1MKG9wdGlvbnM/OiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBhZGRvbiB1bnRpbCBpdCBoYXMgYmVlbiBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplQnVmZmVyQXNIVE1MKHRoaXMuX3Rlcm1pbmFsLCBvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIVE1MU2VyaWFsaXplSGFuZGxlciBleHRlbmRzIEJhc2VTZXJpYWxpemVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFJvdzogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfaHRtbENvbnRlbnQgPSAnJztcblxuICBwcml2YXRlIF9hbnNpQ29sb3JzOiBSZWFkb25seTxJQ29sb3JbXT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVmZmVyOiBJQnVmZmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcblxuICAgIC8vIEZvciB4dGVybSBoZWFkbGVzczogZmFsbGJhY2sgdG8gYW5zaSBjb2xvcnNcbiAgICBpZiAoKF90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl90aGVtZVNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX2Fuc2lDb2xvcnMgPSAoX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3RoZW1lU2VydmljZS5jb2xvcnMuYW5zaTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9hbnNpQ29sb3JzID0gREVGQVVMVF9BTlNJX0NPTE9SUztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYWRTdGFydCh0YXJnZXQ6IHN0cmluZywgdGFyZ2V0TGVuZ3RoOiBudW1iZXIsIHBhZFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggPj4gMDtcbiAgICBwYWRTdHJpbmcgPSBwYWRTdHJpbmcgPz8gJyAnO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHRhcmdldExlbmd0aCAtPSB0YXJnZXQubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRMZW5ndGggPiBwYWRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBwYWRTdHJpbmcgKz0gcGFkU3RyaW5nLnJlcGVhdCh0YXJnZXRMZW5ndGggLyBwYWRTdHJpbmcubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZFN0cmluZy5zbGljZSgwLCB0YXJnZXRMZW5ndGgpICsgdGFyZ2V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9iZWZvcmVTZXJpYWxpemUocm93czogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8aHRtbD48Ym9keT48IS0tU3RhcnRGcmFnbWVudC0tPjxwcmU+JztcblxuICAgIGxldCBmb3JlZ3JvdW5kID0gJyMwMDAwMDAnO1xuICAgIGxldCBiYWNrZ3JvdW5kID0gJyNmZmZmZmYnO1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmluY2x1ZGVHbG9iYWxCYWNrZ3JvdW5kID8/IGZhbHNlKSB7XG4gICAgICBmb3JlZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uZm9yZWdyb3VuZCA/PyAnI2ZmZmZmZic7XG4gICAgICBiYWNrZ3JvdW5kID0gdGhpcy5fdGVybWluYWwub3B0aW9ucy50aGVtZT8uYmFja2dyb3VuZCA/PyAnIzAwMDAwMCc7XG4gICAgfVxuXG4gICAgY29uc3QgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyA9IFtdO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnY29sb3I6ICcgKyBmb3JlZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2JhY2tncm91bmQtY29sb3I6ICcgKyBiYWNrZ3JvdW5kICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtZmFtaWx5OiAnICsgdGhpcy5fdGVybWluYWwub3B0aW9ucy5mb250RmFtaWx5ICsgJzsnKTtcbiAgICBnbG9iYWxTdHlsZURlZmluaXRpb25zLnB1c2goJ2ZvbnQtc2l6ZTogJyArIHRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuZm9udFNpemUgKyAncHg7Jyk7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxkaXYgc3R5bGU9XFwnJyArIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMuam9pbignICcpICsgJ1xcJz4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9kaXY+JztcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPC9wcmU+PCEtLUVuZEZyYWdtZW50LS0+PC9ib2R5PjwvaHRtbD4nO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9yb3dFbmQocm93OiBudW1iZXIsIGlzTGFzdFJvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8ZGl2PjxzcGFuPicgKyB0aGlzLl9jdXJyZW50Um93ICsgJzwvc3Bhbj48L2Rpdj4nO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhleENvbG9yKGNlbGw6IElCdWZmZXJDZWxsLCBpc0ZnOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvciA9IGlzRmcgPyBjZWxsLmdldEZnQ29sb3IoKSA6IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUkdCKCkgOiBjZWxsLmlzQmdSR0IoKSkge1xuICAgICAgY29uc3QgcmdiID0gW1xuICAgICAgICAoY29sb3IgPj4gMTYpICYgMjU1LFxuICAgICAgICAoY29sb3IgPj4gIDgpICYgMjU1LFxuICAgICAgICAoY29sb3IgICAgICApICYgMjU1XG4gICAgICBdO1xuICAgICAgcmV0dXJuICcjJyArIHJnYi5tYXAoeCA9PiB0aGlzLl9wYWRTdGFydCh4LnRvU3RyaW5nKDE2KSwgMiwgJzAnKSkuam9pbignJyk7XG4gICAgfVxuICAgIGlmIChpc0ZnID8gY2VsbC5pc0ZnUGFsZXR0ZSgpIDogY2VsbC5pc0JnUGFsZXR0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5zaUNvbG9yc1tjb2xvcl0uY3NzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlmZlN0eWxlKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250ZW50OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGNvbnN0IGZnSGV4Q29sb3IgPSB0aGlzLl9nZXRIZXhDb2xvcihjZWxsLCB0cnVlKTtcbiAgICAgIGlmIChmZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnY29sb3I6ICcgKyBmZ0hleENvbG9yICsgJzsnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmdIZXhDb2xvciA9IHRoaXMuX2dldEhleENvbG9yKGNlbGwsIGZhbHNlKTtcbiAgICAgIGlmIChiZ0hleENvbG9yKSB7XG4gICAgICAgIGNvbnRlbnQucHVzaCgnYmFja2dyb3VuZC1jb2xvcjogJyArIGJnSGV4Q29sb3IgKyAnOycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0ludmVyc2UoKSkgeyBjb250ZW50LnB1c2goJ2NvbG9yOiAjMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQkZCRkJGOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc0JvbGQoKSkgeyBjb250ZW50LnB1c2goJ2ZvbnQtd2VpZ2h0OiBib2xkOycpOyB9XG4gICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICYmIGNlbGwuaXNPdmVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSB1bmRlcmxpbmU7Jyk7IH1cbiAgICAgIGVsc2UgaWYgKGNlbGwuaXNVbmRlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOycpOyB9XG4gICAgICBlbHNlIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSkgeyBjb250ZW50LnB1c2goJ3RleHQtZGVjb3JhdGlvbjogYmxpbms7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkpIHsgY29udGVudC5wdXNoKCd2aXNpYmlsaXR5OiBoaWRkZW47Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzSXRhbGljKCkpIHsgY29udGVudC5wdXNoKCdmb250LXN0eWxlOiBpdGFsaWM7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzRGltKCkpIHsgY29udGVudC5wdXNoKCdvcGFjaXR5OiAwLjU7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzU3RyaWtldGhyb3VnaCgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Jyk7IH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfbmV4dENlbGwoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBhIHdpZHRoIDAgY2VsbCBkb24ndCBuZWVkIHRvIGJlIGNvdW50IGJlY2F1c2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFmdGVyIGEgQ0pLIGNoYXJhY3RlcjtcbiAgICBjb25zdCBpc1BsYWNlSG9sZGVyQ2VsbCA9IGNlbGwuZ2V0V2lkdGgoKSA9PT0gMDtcbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc3R5bGVEZWZpbml0aW9ucyA9IHRoaXMuX2RpZmZTdHlsZShjZWxsLCBvbGRDZWxsKTtcblxuICAgIC8vIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgaWYgKHN0eWxlRGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gc3R5bGVEZWZpbml0aW9ucy5sZW5ndGggPT09IDAgP1xuICAgICAgICAnPC9zcGFuPjxzcGFuPicgOlxuICAgICAgICAnPC9zcGFuPjxzcGFuIHN0eWxlPVxcJycgKyBzdHlsZURlZmluaXRpb25zLmpvaW4oJyAnKSArICdcXCc+JztcbiAgICB9XG5cbiAgICAvLyBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9ICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBlc2NhcGVIVE1MQ2hhcihjZWxsLmdldENoYXJzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWxDb250ZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxJQUFJQSxFQUFLLEVBQ0xDLEVBQUssRUFDTEMsRUFBSyxFQUNMQyxFQUFLLEVBVUYsSUFBVUMsTUFBVixDQUNFLFNBQVNDLEVBQU1DLEVBQVdDLEVBQVdDLEVBQVdDLEVBQW9CLENBQ3pFLE9BQUlBLElBQU0sT0FDRCxJQUFJQyxFQUFZSixDQUFDLENBQUMsR0FBR0ksRUFBWUgsQ0FBQyxDQUFDLEdBQUdHLEVB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ZXMiOlsiJHIiLCIkZyIsIiRiIiwiJGEiLCJjaGFubmVscyIsInRvQ3NzIiwiciIsImciLCJiIiwiYSIsInRvUGFkZGVkSGV4IiwidG9SZ2JhIiwidG9Db2xvciIsImNvbG9yIiwiYmxlbmQiLCJiZyIsImZnIiwiJGEiLCJmZ1IiLCJmZ0ciLCJmZ0IiLCJiZ1IiLCJiZ0ciLCJiZ0IiLCIkciIsIiRnIiwiJGIiLCJjc3MiLCJyZ2JhIiwiaXNPcGFxdWUiLCJlbnN1cmVDb250cmFzdFJhdGlvIiwicmF0aW8iLCJyZXN1bHQiLCJvcGFxdWUiLCJyZ2JhQ29sb3IiLCJvcGFjaXR5IiwibXVsdGlwbHlPcGFjaXR5IiwiZmFjdG9yIiwidG9Db2xvclJHQiIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJjYW52YXMiLCJjdHgiLCJyZ2JhTWF0Y2giLCJyZ2IiLCJyZWxhdGl2ZUx1bWluYW5jZSIsInJlbGF0aXZlTHVtaW5hbmNlMiIsInJzIiwiZ3MiLCJicyIsInJyIiwicmciLCJyYiIsImJnUmdiYSIsImZnUmdiYSIsImJnTCIsImZnTCIsImNvbnRyYXN0UmF0aW8iLCJyZXN1bHRBIiwicmVkdWNlTHVtaW5hbmNlIiwicmVzdWx0QVJhdGlvIiwicmVzdWx0QiIsImluY3JlYXNlTHVtaW5hbmNlIiwicmVzdWx0QlJhdGlvIiwiY3IiLCJ0b0NoYW5uZWxzIiwidmFsdWUiLCJjIiwicyIsImwxIiwibDIiLCJERUZBVUxUX0FOU0lfQ09MT1JTIiwiY29sb3JzIiwiY3NzIiwidiIsImkiLCJnIiwiYiIsImNoYW5uZWxzIiwiYyIsImNvbnN0cmFpbiIsInZhbHVlIiwibG93IiwiaGlnaCIsImVzY2FwZUhUTUxDaGFyIiwiYyIsIkJhc2VTZXJpYWxpemVIYW5kbGVyIiwiX2J1ZmZlciIsInJhbmdlIiwiZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24iLCJjZWxsMSIsImNlbGwyIiwib2xkQ2VsbCIsInN0YXJ0Um93IiwiZW5kUm93Iiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJyb3ciLCJsaW5lIiwic3RhcnRMaW5lQ29sdW1uIiwiZW5kTGluZUNvbHVtbiIsImNvbCIsImNlbGwiLCJpc0xhc3RSb3ciLCJyb3dzIiwiZXF1YWxGZyIsImVxdWFsQmciLCJlcXVhbEZsYWdzIiwiU3RyaW5nU2VyaWFsaXplSGFuZGxlciIsImJ1ZmZlciIsIl90ZXJtaW5hbCIsInN0YXJ0IiwiZW5kIiwicm93U2VwYXJhdG9yIiwiY3VycmVudExpbmUiLCJuZXh0TGluZSIsInRoaXNSb3dMYXN0Q2hhciIsInRoaXNSb3dMYXN0U2Vjb25kQ2hhciIsIm5leHRSb3dGaXJzdENoYXIiLCJpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCIsImlzVmFsaWQiLCJzZ3JTZXEiLCJmZ0NoYW5nZWQiLCJiZ0NoYW5nZWQiLCJmbGFnc0NoYW5nZWQiLCJjb2xvciIsImlzRW1wdHlDZWxsIiwicm93RW5kIiwiY29udGVudCIsInJlYWxDdXJzb3JSb3ciLCJyZWFsQ3Vyc29yQ29sIiwiY3Vyc29yTW92ZWQiLCJtb3ZlUmlnaHQiLCJvZmZzZXQiLCJjdXJBdHRyRGF0YSIsIlNlcmlhbGl6ZUFkZG9uIiwidGVybWluYWwiLCJzY3JvbGxiYWNrIiwibWF4Um93cyIsImNvcnJlY3RSb3dzIiwib3B0aW9ucyIsImhhbmRsZXIiLCJIVE1MU2VyaWFsaXplSGFuZGxlciIsIm9ubHlTZWxlY3Rpb24iLCJzZWxlY3Rpb24iLCJtb2RlcyIsImFsdGVybmF0aXZlU2NyZWVuQ29udGVudCIsIl9vcHRpb25zIiwiREVGQVVMVF9BTlNJX0NPTE9SUyIsInRhcmdldCIsInRhcmdldExlbmd0aCIsInBhZFN0cmluZyIsImZvcmVncm91bmQiLCJiYWNrZ3JvdW5kIiwiZ2xvYmFsU3R5bGVEZWZpbml0aW9ucyIsImlzRmciLCJ4IiwiZmdIZXhDb2xvciIsImJnSGV4Q29sb3IiLCJzdHlsZURlZmluaXRpb25zIl19
@@ -0,0 +1,176 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [
4
+ "file:///Users/dmail/Documents/dev/jsenv/core/node_modules/src/common/Color.ts",
5
+ "file:///Users/dmail/Documents/dev/jsenv/core/node_modules/src/browser/Types.ts",
6
+ "file:///Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/src/SerializeAddon.ts"
7
+ ],
8
+ "sourcesContent": [
9
+ "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1]);\n $g = parseInt(rgbaMatch[2]);\n $b = parseInt(rgbaMatch[3]);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n",
10
+ "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IDisposable, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from 'common/Color';\nimport type { Event } from 'vs/base/common/event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit<ITerminalApi, 'buffer' | 'parser' | 'unicode' | 'modes' | 'writeln' | 'loadAddon'>;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required<ITerminalOptions>;\n\n onBlur: Event<void>;\n onFocus: Event<void>;\n onA11yChar: Event<string>;\n onA11yTab: Event<number>;\n onWillOpen: Event<HTMLElement>;\n\n cancel(ev: MouseEvent | WheelEvent | KeyboardEvent | InputEvent, force?: boolean): boolean | void;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly<Omit<IColorSet, 'ansi'>> & { ansi: Readonly<Pick<IColorSet, 'ansi'>['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: Event<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: Event<ILinkifierEvent>;\n onHideLinkUnderline: Event<ILinkifierEvent>;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n",
11
+ "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IAttributeData, IColor } from 'common/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&amp;';\n case '<': return '&lt;';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array<string>();\n private _allRowSeparators: string[] = new Array<string>();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array<string>(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, whe must pad it back, or the the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simply the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simply the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}C`;\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}D`;\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); }\n if (cell.isUnderline() !== oldCell.isUnderline()) { sgrSeq.push(cell.isUnderline() ? 4 : 24); }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); }\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n // the empty cell style is only assumed to be changed when background changed, because\n // foreground is always 0.\n const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n this._currentRow += cell.getChars();\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon , ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial<IHTMLSerializeOptions>): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n }\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial<IHTMLSerializeOptions>): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options || {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly<IColor[]>;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial<IHTMLSerializeOptions>\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n private _padStart(target: string, targetLength: number, padString: string): string {\n targetLength = targetLength >> 0;\n padString = padString ?? ' ';\n if (target.length > targetLength) {\n return target;\n }\n\n targetLength -= target.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + target;\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '<html><body><!--StartFragment--><pre>';\n\n let foreground = '#000000';\n let background = '#ffffff';\n if (this._options.includeGlobalBackground ?? false) {\n foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n background = this._terminal.options.theme?.background ?? '#000000';\n }\n\n const globalStyleDefinitions = [];\n globalStyleDefinitions.push('color: ' + foreground + ';');\n globalStyleDefinitions.push('background-color: ' + background + ';');\n globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n this._htmlContent += '<div style=\\'' + globalStyleDefinitions.join(' ') + '\\'>';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '</div>';\n this._htmlContent += '</pre><!--EndFragment--></body></html>';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '<div><span>' + this._currentRow + '</span></div>';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => this._padStart(x.toString(16), 2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n if (cell.isUnderline() && cell.isOverline()) { content.push('text-decoration: overline underline;'); }\n else if (cell.isUnderline()) { content.push('text-decoration: underline;'); }\n else if (cell.isOverline()) { content.push('text-decoration: overline;'); }\n if (cell.isBlink()) { content.push('text-decoration: blink;'); }\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n if (cell.isStrikethrough()) { content.push('text-decoration: line-through;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '</span><span>' :\n '</span><span style=\\'' + styleDefinitions.join(' ') + '\\'>';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"
12
+ ],
13
+ "mappings": "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",
14
+ "names": [
15
+ "$r",
16
+ "$g",
17
+ "$b",
18
+ "$a",
19
+ "channels",
20
+ "toCss",
21
+ "r",
22
+ "g",
23
+ "b",
24
+ "a",
25
+ "toPaddedHex",
26
+ "toRgba",
27
+ "toColor",
28
+ "color",
29
+ "blend",
30
+ "bg",
31
+ "fg",
32
+ "$a",
33
+ "fgR",
34
+ "fgG",
35
+ "fgB",
36
+ "bgR",
37
+ "bgG",
38
+ "bgB",
39
+ "$r",
40
+ "$g",
41
+ "$b",
42
+ "css",
43
+ "rgba",
44
+ "isOpaque",
45
+ "ensureContrastRatio",
46
+ "ratio",
47
+ "result",
48
+ "opaque",
49
+ "rgbaColor",
50
+ "opacity",
51
+ "multiplyOpacity",
52
+ "factor",
53
+ "toColorRGB",
54
+ "$ctx",
55
+ "$litmusColor",
56
+ "canvas",
57
+ "ctx",
58
+ "rgbaMatch",
59
+ "rgb",
60
+ "relativeLuminance",
61
+ "relativeLuminance2",
62
+ "rs",
63
+ "gs",
64
+ "bs",
65
+ "rr",
66
+ "rg",
67
+ "rb",
68
+ "bgRgba",
69
+ "fgRgba",
70
+ "bgL",
71
+ "fgL",
72
+ "contrastRatio",
73
+ "resultA",
74
+ "reduceLuminance",
75
+ "resultARatio",
76
+ "resultB",
77
+ "increaseLuminance",
78
+ "resultBRatio",
79
+ "cr",
80
+ "toChannels",
81
+ "value",
82
+ "c",
83
+ "s",
84
+ "l1",
85
+ "l2",
86
+ "DEFAULT_ANSI_COLORS",
87
+ "colors",
88
+ "css",
89
+ "v",
90
+ "i",
91
+ "g",
92
+ "b",
93
+ "channels",
94
+ "c",
95
+ "constrain",
96
+ "value",
97
+ "low",
98
+ "high",
99
+ "escapeHTMLChar",
100
+ "c",
101
+ "BaseSerializeHandler",
102
+ "_buffer",
103
+ "range",
104
+ "excludeFinalCursorPosition",
105
+ "cell1",
106
+ "cell2",
107
+ "oldCell",
108
+ "startRow",
109
+ "endRow",
110
+ "startColumn",
111
+ "endColumn",
112
+ "row",
113
+ "line",
114
+ "startLineColumn",
115
+ "endLineColumn",
116
+ "col",
117
+ "cell",
118
+ "isLastRow",
119
+ "rows",
120
+ "equalFg",
121
+ "equalBg",
122
+ "equalFlags",
123
+ "StringSerializeHandler",
124
+ "buffer",
125
+ "_terminal",
126
+ "start",
127
+ "end",
128
+ "rowSeparator",
129
+ "currentLine",
130
+ "nextLine",
131
+ "thisRowLastChar",
132
+ "thisRowLastSecondChar",
133
+ "nextRowFirstChar",
134
+ "isNextRowFirstCharDoubleWidth",
135
+ "isValid",
136
+ "sgrSeq",
137
+ "fgChanged",
138
+ "bgChanged",
139
+ "flagsChanged",
140
+ "color",
141
+ "isEmptyCell",
142
+ "rowEnd",
143
+ "content",
144
+ "realCursorRow",
145
+ "realCursorCol",
146
+ "cursorMoved",
147
+ "moveRight",
148
+ "offset",
149
+ "curAttrData",
150
+ "SerializeAddon",
151
+ "terminal",
152
+ "scrollback",
153
+ "maxRows",
154
+ "correctRows",
155
+ "options",
156
+ "handler",
157
+ "HTMLSerializeHandler",
158
+ "onlySelection",
159
+ "selection",
160
+ "modes",
161
+ "alternativeScreenContent",
162
+ "_options",
163
+ "DEFAULT_ANSI_COLORS",
164
+ "target",
165
+ "targetLength",
166
+ "padString",
167
+ "foreground",
168
+ "background",
169
+ "globalStyleDefinitions",
170
+ "isFg",
171
+ "x",
172
+ "fgHexColor",
173
+ "bgHexColor",
174
+ "styleDefinitions"
175
+ ]
176
+ }