@jsenv/terminal-recorder 1.5.32 → 1.5.34
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.
- package/dist/client/css/xterm.css +66 -4
- package/dist/client/jsenv_terminal_recorder_node_modules.js +148 -749
- package/dist/client/xterm.html +5 -10
- package/package.json +8 -8
- package/src/.jsenv/chrome@143.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +434 -1
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +28 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +176 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs +101 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs.map +1623 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css +267 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js +133 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1410 -0
- package/src/.jsenv/chrome@145.00/@fs/Users/dmail/Documents/dev/jsenv/core/src/plugins/drop_to_open/client/drop_to_open.js +49 -0
- package/src/.jsenv/chrome@145.00/gif_encoder.js +400 -0
- package/src/.jsenv/chrome@145.00/gif_encoder.js.map +11 -0
- package/src/.jsenv/chrome@145.00/lzw_encoder.js +253 -0
- package/src/.jsenv/chrome@145.00/neuquant.js +498 -0
- package/src/.jsenv/chrome@145.00/terminal_recorder.js +389 -0
- package/src/.jsenv/chrome@145.00/terminal_recorder.js.map +11 -0
- package/src/.jsenv/chrome@145.00/xterm.html +59 -0
- package/src/.jsenv/chrome@145.00/xterm.html@L14C5-L18C14.js +5 -0
- package/src/.jsenv/chrome@145.00/xterm.html@L19C5-L24C14.js +7 -0
- package/src/.jsenv/chrome@145.00/xterm.html@L19C5-L24C14.js.map +11 -0
- package/src/client/terminal_recorder.js +4 -9
|
@@ -0,0 +1,18 @@
|
|
|
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 h=2,_=1,o=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let t=this._terminal._core._renderService.dimensions;if(t.css.cell.width===0||t.css.cell.height===0)return;let s=this._terminal.options.scrollback===0?0:this._terminal.options.overviewRuler?.width||14,r=window.getComputedStyle(this._terminal.element.parentElement),l=parseInt(r.getPropertyValue("height")),a=Math.max(0,parseInt(r.getPropertyValue("width"))),i=window.getComputedStyle(this._terminal.element),n={top:parseInt(i.getPropertyValue("padding-top")),bottom:parseInt(i.getPropertyValue("padding-bottom")),right:parseInt(i.getPropertyValue("padding-right")),left:parseInt(i.getPropertyValue("padding-left"))},m=n.top+n.bottom,d=n.right+n.left,c=l-m,p=a-d-s;return{cols:Math.max(h,Math.floor(p/t.css.cell.width)),rows:Math.max(_,Math.floor(c/t.css.cell.height))}}};export{o as FitAddon};
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24tZml0L2xpYi9hZGRvbi1maXQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMjQgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgQ2hyaXN0b3BoZXIgSmVmZnJleSAoTUlUIExpY2Vuc2UpXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBPcmlnaW5hbGx5IGZvcmtlZCBmcm9tICh3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uKTpcbiAqICAgRmFicmljZSBCZWxsYXJkJ3MgamF2YXNjcmlwdCB2dDEwMCBmb3IganNsaW51eDpcbiAqICAgaHR0cDovL2JlbGxhcmQub3JnL2pzbGludXgvXG4gKiAgIENvcHlyaWdodCAoYykgMjAxMSBGYWJyaWNlIEJlbGxhcmRcbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG52YXIgaD0yLF89MSxvPWNsYXNze2FjdGl2YXRlKGUpe3RoaXMuX3Rlcm1pbmFsPWV9ZGlzcG9zZSgpe31maXQoKXtsZXQgZT10aGlzLnByb3Bvc2VEaW1lbnNpb25zKCk7aWYoIWV8fCF0aGlzLl90ZXJtaW5hbHx8aXNOYU4oZS5jb2xzKXx8aXNOYU4oZS5yb3dzKSlyZXR1cm47bGV0IHQ9dGhpcy5fdGVybWluYWwuX2NvcmU7KHRoaXMuX3Rlcm1pbmFsLnJvd3MhPT1lLnJvd3N8fHRoaXMuX3Rlcm1pbmFsLmNvbHMhPT1lLmNvbHMpJiYodC5fcmVuZGVyU2VydmljZS5jbGVhcigpLHRoaXMuX3Rlcm1pbmFsLnJlc2l6ZShlLmNvbHMsZS5yb3dzKSl9cHJvcG9zZURpbWVuc2lvbnMoKXtpZighdGhpcy5fdGVybWluYWx8fCF0aGlzLl90ZXJtaW5hbC5lbGVtZW50fHwhdGhpcy5fdGVybWluYWwuZWxlbWVudC5wYXJlbnRFbGVtZW50KXJldHVybjtsZXQgdD10aGlzLl90ZXJtaW5hbC5fY29yZS5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zO2lmKHQuY3NzLmNlbGwud2lkdGg9PT0wfHx0LmNzcy5jZWxsLmhlaWdodD09PTApcmV0dXJuO2xldCBzPXRoaXMuX3Rlcm1pbmFsLm9wdGlvbnMuc2Nyb2xsYmFjaz09PTA/MDp0aGlzLl90ZXJtaW5hbC5vcHRpb25zLm92ZXJ2aWV3UnVsZXI/LndpZHRofHwxNCxyPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQucGFyZW50RWxlbWVudCksbD1wYXJzZUludChyLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIikpLGE9TWF0aC5tYXgoMCxwYXJzZUludChyLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiKSkpLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fdGVybWluYWwuZWxlbWVudCksbj17dG9wOnBhcnNlSW50KGkuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpKSxib3R0b206cGFyc2VJbnQoaS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1ib3R0b21cIikpLHJpZ2h0OnBhcnNlSW50KGkuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctcmlnaHRcIikpLGxlZnQ6cGFyc2VJbnQoaS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1sZWZ0XCIpKX0sbT1uLnRvcCtuLmJvdHRvbSxkPW4ucmlnaHQrbi5sZWZ0LGM9bC1tLHA9YS1kLXM7cmV0dXJue2NvbHM6TWF0aC5tYXgoaCxNYXRoLmZsb29yKHAvdC5jc3MuY2VsbC53aWR0aCkpLHJvd3M6TWF0aC5tYXgoXyxNYXRoLmZsb29yKGMvdC5jc3MuY2VsbC5oZWlnaHQpKX19fTtleHBvcnR7byBhcyBGaXRBZGRvbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRvbi1maXQubWpzLm1hcFxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBLElBQU1BLEVBQWUsRUFDZkMsRUFBZSxFQUVSQyxFQUFOLEtBQW1ELENBR2pELFNBQVNDLEVBQTBCLENBQ3hDLEtBQUssVUFBWUEsQ0FDbkIsQ0FFTyxTQUFnQixDQUFDLENBRWpCLEtBQVksQ0FDakIsSUFBTUMsRUFBTyxLQUFLLGtCQUFrQixFQUNwQyxHQUFJLENBQUNBLEdBQVEsQ0FBQyxLQUFLLFdBQWEsTUFBTUEsRUFBSyxJQUFJLEdBQUssTUFBTUEsRUFBSyxJQUFJLEVBQ2pFLE9BSUYsSUFBTUMsRUFBUSxLQUFLLFVBQWtCLE9BR2pDLEtBQUssVUFBVSxPQUFTRCxFQUFLLE1BQVEsS0FBSyxVQUFVLE9BQVNBLEVBQUssUUFDcEVDLEVBQUssZUFBZSxNQUFNLEVBQzFCLEtBQUssVUFBVSxPQUFPRCxFQUFLLEtBQU1BLEVBQUssSUFBSSxFQUU5QyxDQUVPLG1CQUFxRCxDQUsxRCxHQUpJLENBQUMsS0FBSyxXQUlOLENBQUMsS0FBSyxVQUFVLFNBQVcsQ0FBQyxLQUFLLFVBQVUsUUFBUSxjQUNyRCxPQUtGLElBQU1BLEVBRFEsS0FBSyxVQUFrQixNQUNBLGVBQWUsV0FFcEQsR0FBSUEsRUFBSyxJQUFJLEtBQUssUUFBVSxHQUFLQSxFQUFLLElBQUksS0FBSyxTQUFXLEVBQ3hELE9BR0YsSUFBTUUsRUFBa0IsS0FBSyxVQUFVLFFBQVEsYUFBZSxFQUMxRCxFQUNDLEtBQUssVUFBVSxRQUFRLGVBQWUsT0FBUyxHQUU5Q0MsRUFBcUIsT0FBTyxpQkFBaUIsS0FBSyxVQUFVLFFBQVEsYUFBYSxFQUNqRkMsRUFBc0IsU0FBU0QsRUFBbUIsaUJBQWlCLFFBQVEsQ0FBQyxFQUM1RUUsRUFBcUIsS0FBSyxJQUFJLEVBQUcsU0FBU0YsRUFBbUIsaUJBQWlCLE9BQU8sQ0FBQyxDQUFDLEVBQ3ZGRyxFQUFlLE9BQU8saUJBQWlCLEtBQUssVUFBVSxPQUFPLEVBQzdEQyxFQUFpQixDQUNyQixJQUFLLFNBQVNELEVBQWEsaUJBQWlCLGFBQWEsQ0FBQyxFQUMxRCxPQUFRLFNBQVNBLEVBQWEsaUJBQWlCLGdCQUFnQixDQUFDLEVBQ2hFLE1BQU8sU0FBU0EsRUFBYSxpQkFBaUIsZUFBZSxDQUFDLEVBQzlELEtBQU0sU0FBU0EsRUFBYSxpQkFBaUIsY0FBYyxDQUFDLENBQzlELEVBQ01FLEVBQW9CRCxFQUFlLElBQU1BLEVBQWUsT0FDeERFLEVBQW9CRixFQUFlLE1BQVFBLEVBQWUsS0FDMURHLEVBQWtCTixFQUFzQkksRUFDeENHLEVBQWlCTixFQUFxQkksRUFBb0JQLEVBS2hFLE1BSmlCLENBQ2YsS0FBTSxLQUFLLElBQUlOLEVBQWMsS0FBSyxNQUFNZSxFQUFpQlgsRUFBSyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQzdFLEtBQU0sS0FBSyxJQUFJSCxFQUFjLEtBQUssTUFBTWEsRUFBa0JWLEVBQUssSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUNqRixDQUVGLENBQ0YiLCJuYW1lcyI6WyJNSU5JTVVNX0NPTFMiLCJNSU5JTVVNX1JPV1MiLCJGaXRBZGRvbiIsInRlcm1pbmFsIiwiZGltcyIsImNvcmUiLCJzY3JvbGxiYXJXaWR0aCIsInBhcmVudEVsZW1lbnRTdHlsZSIsInBhcmVudEVsZW1lbnRIZWlnaHQiLCJwYXJlbnRFbGVtZW50V2lkdGgiLCJlbGVtZW50U3R5bGUiLCJlbGVtZW50UGFkZGluZyIsImVsZW1lbnRQYWRkaW5nVmVyIiwiZWxlbWVudFBhZGRpbmdIb3IiLCJhdmFpbGFibGVIZWlnaHQiLCJhdmFpbGFibGVXaWR0aCJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": [
|
|
4
|
+
"file:///Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.mjs"
|
|
5
|
+
],
|
|
6
|
+
"sourcesContent": [
|
|
7
|
+
"/**\n * Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar h=2,_=1,o=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let t=this._terminal._core._renderService.dimensions;if(t.css.cell.width===0||t.css.cell.height===0)return;let s=this._terminal.options.scrollback===0?0:this._terminal.options.overviewRuler?.width||14,r=window.getComputedStyle(this._terminal.element.parentElement),l=parseInt(r.getPropertyValue(\"height\")),a=Math.max(0,parseInt(r.getPropertyValue(\"width\"))),i=window.getComputedStyle(this._terminal.element),n={top:parseInt(i.getPropertyValue(\"padding-top\")),bottom:parseInt(i.getPropertyValue(\"padding-bottom\")),right:parseInt(i.getPropertyValue(\"padding-right\")),left:parseInt(i.getPropertyValue(\"padding-left\"))},m=n.top+n.bottom,d=n.right+n.left,c=l-m,p=a-d-s;return{cols:Math.max(h,Math.floor(p/t.css.cell.width)),rows:Math.max(_,Math.floor(c/t.css.cell.height))}}};export{o as FitAddon};\n//# sourceMappingURL=addon-fit.mjs.map\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": ";;;;;;;;;;;;;;;;AAsBA,IAAMA,EAAe,EACfC,EAAe,EAERC,EAAN,KAAmD,CAGjD,SAASC,EAA0B,CACxC,KAAK,UAAYA,CACnB,CAEO,SAAgB,CAAC,CAEjB,KAAY,CACjB,IAAMC,EAAO,KAAK,kBAAkB,EACpC,GAAI,CAACA,GAAQ,CAAC,KAAK,WAAa,MAAMA,EAAK,IAAI,GAAK,MAAMA,EAAK,IAAI,EACjE,OAIF,IAAMC,EAAQ,KAAK,UAAkB,OAGjC,KAAK,UAAU,OAASD,EAAK,MAAQ,KAAK,UAAU,OAASA,EAAK,QACpEC,EAAK,eAAe,MAAM,EAC1B,KAAK,UAAU,OAAOD,EAAK,KAAMA,EAAK,IAAI,EAE9C,CAEO,mBAAqD,CAK1D,GAJI,CAAC,KAAK,WAIN,CAAC,KAAK,UAAU,SAAW,CAAC,KAAK,UAAU,QAAQ,cACrD,OAKF,IAAMA,EADQ,KAAK,UAAkB,MACA,eAAe,WAEpD,GAAIA,EAAK,IAAI,KAAK,QAAU,GAAKA,EAAK,IAAI,KAAK,SAAW,EACxD,OAGF,IAAME,EAAkB,KAAK,UAAU,QAAQ,aAAe,EAC1D,EACC,KAAK,UAAU,QAAQ,eAAe,OAAS,GAE9CC,EAAqB,OAAO,iBAAiB,KAAK,UAAU,QAAQ,aAAa,EACjFC,EAAsB,SAASD,EAAmB,iBAAiB,QAAQ,CAAC,EAC5EE,EAAqB,KAAK,IAAI,EAAG,SAASF,EAAmB,iBAAiB,OAAO,CAAC,CAAC,EACvFG,EAAe,OAAO,iBAAiB,KAAK,UAAU,OAAO,EAC7DC,EAAiB,CACrB,IAAK,SAASD,EAAa,iBAAiB,aAAa,CAAC,EAC1D,OAAQ,SAASA,EAAa,iBAAiB,gBAAgB,CAAC,EAChE,MAAO,SAASA,EAAa,iBAAiB,eAAe,CAAC,EAC9D,KAAM,SAASA,EAAa,iBAAiB,cAAc,CAAC,CAC9D,EACME,EAAoBD,EAAe,IAAMA,EAAe,OACxDE,EAAoBF,EAAe,MAAQA,EAAe,KAC1DG,EAAkBN,EAAsBI,EACxCG,EAAiBN,EAAqBI,EAAoBP,EAKhE,MAJiB,CACf,KAAM,KAAK,IAAIN,EAAc,KAAK,MAAMe,EAAiBX,EAAK,IAAI,KAAK,KAAK,CAAC,EAC7E,KAAM,KAAK,IAAIH,EAAc,KAAK,MAAMa,EAAkBV,EAAK,IAAI,KAAK,MAAM,CAAC,CACjF,CAEF,CACF",
|
|
10
|
+
"names": [
|
|
11
|
+
"MINIMUM_COLS",
|
|
12
|
+
"MINIMUM_ROWS",
|
|
13
|
+
"FitAddon",
|
|
14
|
+
"terminal",
|
|
15
|
+
"dims",
|
|
16
|
+
"core",
|
|
17
|
+
"scrollbarWidth",
|
|
18
|
+
"parentElementStyle",
|
|
19
|
+
"parentElementHeight",
|
|
20
|
+
"parentElementWidth",
|
|
21
|
+
"elementStyle",
|
|
22
|
+
"elementPadding",
|
|
23
|
+
"elementPaddingVer",
|
|
24
|
+
"elementPaddingHor",
|
|
25
|
+
"availableHeight",
|
|
26
|
+
"availableWidth"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -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"&";case"<":return"<"}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
|