diff --git a/main.css b/main.css index 01b63c5..1f05ebb 100644 --- a/main.css +++ b/main.css @@ -1,2 +1,2 @@ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}html{color:#000;font-family:sans-serif;font-size:16px}#wrapper{align-items:center;flex-direction:column;margin:2rem}#boards,#wrapper{display:flex;gap:2rem}#boards{flex-direction:row;flex-wrap:wrap;justify-content:center;width:100%}.board{display:grid;grid-template-columns:repeat(10,1fr);grid-template-rows:repeat(10,1fr);height:100%;max-width:480px;width:100%}.board,.cell{aspect-ratio:1/1;border:.0625rem solid #000;box-sizing:border-box}.cell{min-height:100%;min-width:100%;position:relative}.empty,.reserved,.taken{background-color:#bfbfbf}.taken{background-color:#1e90ff}.hit{background-color:red}.miss,.reserved{background-color:#fff}.hit:before,.miss:before{align-items:center;display:flex;font-size:1.5rem;height:100%;justify-content:center;overflow:hidden}.hit:before{content:"x"}.miss:before{content:"•"}#buttons{display:grid;gap:1rem;grid-template-columns:repeat(3,1fr);max-width:480px;width:100%}.btn{background-color:#fff;border:.0625rem solid #000;padding:1rem}.btn.selected{background-color:#90ee90}.btn:hover{cursor:pointer}#secondBoard:hover .empty,#secondBoard:hover .reserved,#secondBoard:hover .taken{cursor:crosshair}#secondBoard:hover .hit,#secondBoard:hover .miss{cursor:default}.wait,.wait #secondBoard:hover .empty,.wait #secondBoard:hover .hit,.wait #secondBoard:hover .miss,.wait #secondBoard:hover .reserved,.wait #secondBoard:hover .taken{cursor:wait}.ship{background-color:#1e90ff;border:.0625rem solid #000;box-sizing:border-box;left:-.0625rem;position:absolute;top:-.0625rem;z-index:1}.draggable:hover{cursor:move;filter:brightness(125%)}.highlight{background-color:grey} -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5jc3MiLCJtYXBwaW5ncyI6IkFBQUEsMkVBQTJFLENBVTNFLEtBQ0UsZ0JBQWlCLENBQ2pCLDZCQUNGLENBU0EsS0FDRSxRQUNGLENBTUEsS0FDRSxhQUNGLENBT0EsR0FDRSxhQUFjLENBQ2QsY0FDRixDQVVBLEdBQ0Usc0JBQXVCLENBQ3ZCLFFBQVMsQ0FDVCxnQkFDRixDQU9BLElBQ0UsK0JBQWlDLENBQ2pDLGFBQ0YsQ0FTQSxFQUNFLDRCQUNGLENBT0EsWUFDRSxrQkFBbUIsQ0FDbkIseUJBQTBCLENBQzFCLGdDQUNGLENBTUEsU0FFRSxrQkFDRixDQU9BLGNBR0UsK0JBQWlDLENBQ2pDLGFBQ0YsQ0FNQSxNQUNFLGFBQ0YsQ0FPQSxRQUVFLGFBQWMsQ0FDZCxhQUFjLENBQ2QsaUJBQWtCLENBQ2xCLHVCQUNGLENBRUEsSUFDRSxhQUNGLENBRUEsSUFDRSxTQUNGLENBU0EsSUFDRSxpQkFDRixDQVVBLHNDQUtFLG1CQUFvQixDQUNwQixjQUFlLENBQ2YsZ0JBQWlCLENBQ2pCLFFBQ0YsQ0FPQSxhQUVFLGdCQUNGLENBT0EsY0FFRSxtQkFDRixDQU1BLGdEQUlFLHlCQUNGLENBTUEsd0hBSUUsaUJBQWtCLENBQ2xCLFNBQ0YsQ0FNQSw0R0FJRSw2QkFDRixDQU1BLFNBQ0UsMEJBQ0YsQ0FTQSxPQUNFLHFCQUFzQixDQUN0QixhQUFjLENBQ2QsYUFBYyxDQUNkLGNBQWUsQ0FDZixTQUFVLENBQ1Ysa0JBQ0YsQ0FNQSxTQUNFLHVCQUNGLENBTUEsU0FDRSxhQUNGLENBT0EsNkJBRUUscUJBQXNCLENBQ3RCLFNBQ0YsQ0FNQSxrRkFFRSxXQUNGLENBT0EsY0FDRSw0QkFBNkIsQ0FDN0IsbUJBQ0YsQ0FNQSx5Q0FDRSx1QkFDRixDQU9BLDZCQUNFLHlCQUEwQixDQUMxQixZQUNGLENBU0EsUUFDRSxhQUNGLENBTUEsUUFDRSxpQkFDRixDQWlCQSxrQkFDRSxZQUNGLENDNVZBLEtBRUMsVUFBWSxDQURaLHNCQUF1QixDQUV2QixjQUNELENBRUEsU0FHQyxrQkFBbUIsQ0FEbkIscUJBQXNCLENBR3RCLFdBQ0QsQ0FFQSxpQkFQQyxZQUFhLENBR2IsUUFXRCxDQVBBLFFBRUMsa0JBQW1CLENBQ25CLGNBQWUsQ0FDZixzQkFBdUIsQ0FDdkIsVUFFRCxDQUVBLE9BUUMsWUFBYSxDQUNiLG9DQUFzQyxDQUN0QyxpQ0FBbUMsQ0FSbkMsV0FBWSxDQUdaLGVBQWdCLENBSmhCLFVBWUQsQ0FFQSxhQVJDLGdCQUFpQixDQUlqQiwwQkFBNkIsQ0FDN0IscUJBVUQsQ0FQQSxNQUVDLGVBQWdCLENBRGhCLGNBQWUsQ0FLZixpQkFDRCxDQUVBLHdCQUdDLHdCQUNELENBRUEsT0FDQyx3QkFDRCxDQUVBLEtBQ0Msb0JBQ0QsQ0FFQSxnQkFFQyxxQkFDRCxDQU1BLHlCQUlDLGtCQUFtQixDQUZuQixZQUFhLENBR2IsZ0JBQWlCLENBQ2pCLFdBQVksQ0FIWixzQkFBdUIsQ0FJdkIsZUFDRCxDQUVBLFlBQ0MsV0FDRCxDQUVBLGFBQ0MsV0FDRCxDQUVBLFNBQ0MsWUFBYSxDQUliLFFBQVMsQ0FIVCxtQ0FBcUMsQ0FDckMsZUFBZ0IsQ0FDaEIsVUFFRCxDQUVBLEtBRUMscUJBQXVCLENBRHZCLDBCQUE2QixDQUU3QixZQUNELENBRUEsY0FDQyx3QkFDRCxDQUVBLFdBQ0MsY0FDRCxDQXFCQSxpRkFHQyxnQkFDRCxDQUVBLGlEQUVDLGNBQ0QsQ0FVQSxzS0FDQyxXQUNELENBRUEsTUFhQyx3QkFBNEIsQ0FUNUIsMEJBQTZCLENBQzdCLHFCQUFzQixDQUh0QixjQUFnQixDQUtoQixpQkFBa0IsQ0FObEIsYUFBZSxDQU9mLFNBTUQsQ0FFQSxpQkFHQyxXQUFZLENBQ1osdUJBQ0QsQ0FFQSxXQUNDLHFCQUNEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL25vZGVfbW9kdWxlcy9ub3JtYWxpemUuY3NzL25vcm1hbGl6ZS5jc3MiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9zdHlsZS9zdHlsZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuXG4vKiBEb2N1bWVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cbiAqL1xuXG5odG1sIHtcbiAgbGluZS1oZWlnaHQ6IDEuMTU7IC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXG59XG5cbi8qIFNlY3Rpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxuICovXG5cbm1haW4ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBmb250IHNpemUgYW5kIG1hcmdpbiBvbiBgaDFgIGVsZW1lbnRzIHdpdGhpbiBgc2VjdGlvbmAgYW5kXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxuICovXG5cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG5cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIDEgKi9cbiAgaGVpZ2h0OiAwOyAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlOyAvKiAyICovXG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5wcmUge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7IC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07IC8qIDIgKi9cbn1cblxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgb24gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxuICovXG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7IC8qIDEgKi9cbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IC8qIDIgKi9cbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgd2VpZ2h0IGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cbiAqL1xuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gQ29ycmVjdCB0aGUgb2RkIGBlbWAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbmNvZGUsXG5rYmQsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlOyAvKiAxICovXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLyoqXG4gKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW5cbiAqIGFsbCBicm93c2Vycy5cbiAqL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAuXG4gKi9cblxuaW1nIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xufVxuXG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDaGFuZ2UgdGhlIGZvbnQgc3R5bGVzIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cbiAqL1xuXG5idXR0b24sXG5pbnB1dCxcbm9wdGdyb3VwLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBmb250LWZhbWlseTogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IDEuMTU7IC8qIDEgKi9cbiAgbWFyZ2luOiAwOyAvKiAyICovXG59XG5cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5cbmJ1dHRvbixcbmlucHV0IHsgLyogMSAqL1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEVkZ2UsIEZpcmVmb3gsIGFuZCBJRS5cbiAqIDEuIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRmlyZWZveC5cbiAqL1xuXG5idXR0b24sXG5zZWxlY3QgeyAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKi9cblxuYnV0dG9uLFxuW3R5cGU9XCJidXR0b25cIl0sXG5bdHlwZT1cInJlc2V0XCJdLFxuW3R5cGU9XCJzdWJtaXRcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwiYnV0dG9uXCJdOjotbW96LWZvY3VzLWlubmVyLFxuW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgdGhlIGZvY3VzIHN0eWxlcyB1bnNldCBieSB0aGUgcHJldmlvdXMgcnVsZS5cbiAqL1xuXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBwYWRkaW5nIGluIEZpcmVmb3guXG4gKi9cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwLjM1ZW0gMC43NWVtIDAuNjI1ZW07XG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbmxlZ2VuZCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgZGlzcGxheTogdGFibGU7IC8qIDEgKi9cbiAgbWF4LXdpZHRoOiAxMDAlOyAvKiAxICovXG4gIHBhZGRpbmc6IDA7IC8qIDMgKi9cbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsgLyogMSAqL1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cblxucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSAxMCsuXG4gKi9cblxudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBJRSAxMC5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC5cbiAqL1xuXG5bdHlwZT1cImNoZWNrYm94XCJdLFxuW3R5cGU9XCJyYWRpb1wiXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cbiAgcGFkZGluZzogMDsgLyogMiAqL1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cbiAqL1xuXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblxuW3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cbiAqL1xuXG5bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICogMi4gQ2hhbmdlIGZvbnQgcHJvcGVydGllcyB0byBgaW5oZXJpdGAgaW4gU2FmYXJpLlxuICovXG5cbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLyogMSAqL1xuICBmb250OiBpbmhlcml0OyAvKiAyICovXG59XG5cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gRWRnZSwgSUUgMTArLCBhbmQgRmlyZWZveC5cbiAqL1xuXG5kZXRhaWxzIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cblxuLyogTWlzY1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cblxudGVtcGxhdGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwLlxuICovXG5cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsImh0bWwge1xuXHRmb250LWZhbWlseTogc2Fucy1zZXJpZjtcblx0Y29sb3I6IGJsYWNrO1xuXHRmb250LXNpemU6IDE2cHg7XG59XG5cbiN3cmFwcGVyIHtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiAycmVtO1xuXHRtYXJnaW46IDJyZW07XG59XG5cbiNib2FyZHMge1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHR3aWR0aDogMTAwJTtcblx0Z2FwOiAycmVtO1xufVxuXG4uYm9hcmQge1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXG5cdG1heC13aWR0aDogNDgwcHg7XG5cdG1heC13aWR0aDogNDgwcHg7XG5cblx0YXNwZWN0LXJhdGlvOiAxLzE7XG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDEwLCAxZnIpO1xuXHRncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgxMCwgMWZyKTtcblx0Ym9yZGVyOiBzb2xpZCAwLjA2MjVyZW0gYmxhY2s7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5jZWxsIHtcblx0bWluLXdpZHRoOiAxMDAlO1xuXHRtaW4taGVpZ2h0OiAxMDAlO1xuXHRhc3BlY3QtcmF0aW86IDEvMTtcblx0Ym9yZGVyOiBzb2xpZCAwLjA2MjVyZW0gYmxhY2s7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmVtcHR5LFxuLnJlc2VydmVkLFxuLnRha2VuIHtcblx0YmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCA3NSUpO1xufVxuXG4udGFrZW4ge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBkb2RnZXJibHVlO1xufVxuXG4uaGl0IHtcblx0YmFja2dyb3VuZC1jb2xvcjogcmVkO1xufVxuXG4ubWlzcyxcbi5yZXNlcnZlZCB7XG5cdGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4vKiAubWlzcyB7XG5cdGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufSAqL1xuXG4uaGl0OmJlZm9yZSxcbi5taXNzOmJlZm9yZSB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRmb250LXNpemU6IDEuNXJlbTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGl0OmJlZm9yZSB7XG5cdGNvbnRlbnQ6ICd4Jztcbn1cblxuLm1pc3M6YmVmb3JlIHtcblx0Y29udGVudDogJ+KAoic7XG59XG5cbiNidXR0b25zIHtcblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTtcblx0bWF4LXdpZHRoOiA0ODBweDtcblx0d2lkdGg6IDEwMCU7XG5cdGdhcDogMXJlbTtcbn1cblxuLmJ0biB7XG5cdGJvcmRlcjogc29saWQgMC4wNjI1cmVtIGJsYWNrO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcblx0cGFkZGluZzogMXJlbTtcbn1cblxuLmJ0bi5zZWxlY3RlZCB7XG5cdGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW47XG59XG5cbi5idG46aG92ZXIge1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIC5ib2FyZE91dGxpbmUge1xuXHRhbmltYXRpb246IGZseUluc2lkZSA1cyBpbmZpbml0ZSBlYXNlLWluO1xuXHRhbmltYXRpb24tZGVsYXk6IDVzO1xufVxuXG5Aa2V5ZnJhbWVzIGZseUluc2lkZSB7XG5cdDAlIHtcblx0XHRvdXRsaW5lOiAxcmVtIHNvbGlkIHRyYW5zcGFyZW50O1xuXHR9XG5cblx0ODUlIHtcblx0XHRvdXRsaW5lOiAxcmVtIHNvbGlkIHRyYW5zcGFyZW50O1xuXHR9XG5cblx0MTAwJSB7XG5cdFx0b3V0bGluZTogMHJlbSBzb2xpZCBibGFjaztcblx0fVxufSAqL1xuXG4jc2Vjb25kQm9hcmQ6aG92ZXIgLmVtcHR5LFxuI3NlY29uZEJvYXJkOmhvdmVyIC5yZXNlcnZlZCxcbiNzZWNvbmRCb2FyZDpob3ZlciAudGFrZW4ge1xuXHRjdXJzb3I6IGNyb3NzaGFpcjtcbn1cblxuI3NlY29uZEJvYXJkOmhvdmVyIC5oaXQsXG4jc2Vjb25kQm9hcmQ6aG92ZXIgLm1pc3Mge1xuXHRjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi53YWl0ICNzZWNvbmRCb2FyZDpob3ZlciAuZW1wdHksXG4ud2FpdCAjc2Vjb25kQm9hcmQ6aG92ZXIgLnJlc2VydmVkLFxuLndhaXQgI3NlY29uZEJvYXJkOmhvdmVyIC50YWtlbixcbi53YWl0ICNzZWNvbmRCb2FyZDpob3ZlciAuaGl0LFxuLndhaXQgI3NlY29uZEJvYXJkOmhvdmVyIC5taXNzIHtcblx0Y3Vyc29yOiB3YWl0O1xufVxuXG4ud2FpdCB7XG5cdGN1cnNvcjogd2FpdDtcbn1cblxuLnNoaXAge1xuXHR0b3A6IC0wLjA2MjVyZW07XG5cdGxlZnQ6IC0wLjA2MjVyZW07XG5cblx0Ym9yZGVyOiBzb2xpZCAwLjA2MjVyZW0gYmxhY2s7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR6LWluZGV4OiAxO1xuXG5cdC8qIGJhY2tncm91bmQtY29sb3I6IG9yYW5nZTsgKi9cblx0Lyogb3BhY2l0eTogMC4yNTsgKi9cblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiBkb2RnZXJibHVlO1xufVxuXG4uZHJhZ2dhYmxlOmhvdmVyIHtcblx0LyogYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyAqL1xuXG5cdGN1cnNvcjogbW92ZTtcblx0ZmlsdGVyOiBicmlnaHRuZXNzKDEyNSUpO1xufVxuXG4uaGlnaGxpZ2h0IHtcblx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5jc3MiLCJtYXBwaW5ncyI6IkFBQUEsMkVBQTJFLENBVTNFLEtBQ0UsZ0JBQWlCLENBQ2pCLDZCQUNGLENBU0EsS0FDRSxRQUNGLENBTUEsS0FDRSxhQUNGLENBT0EsR0FDRSxhQUFjLENBQ2QsY0FDRixDQVVBLEdBQ0Usc0JBQXVCLENBQ3ZCLFFBQVMsQ0FDVCxnQkFDRixDQU9BLElBQ0UsK0JBQWlDLENBQ2pDLGFBQ0YsQ0FTQSxFQUNFLDRCQUNGLENBT0EsWUFDRSxrQkFBbUIsQ0FDbkIseUJBQTBCLENBQzFCLGdDQUNGLENBTUEsU0FFRSxrQkFDRixDQU9BLGNBR0UsK0JBQWlDLENBQ2pDLGFBQ0YsQ0FNQSxNQUNFLGFBQ0YsQ0FPQSxRQUVFLGFBQWMsQ0FDZCxhQUFjLENBQ2QsaUJBQWtCLENBQ2xCLHVCQUNGLENBRUEsSUFDRSxhQUNGLENBRUEsSUFDRSxTQUNGLENBU0EsSUFDRSxpQkFDRixDQVVBLHNDQUtFLG1CQUFvQixDQUNwQixjQUFlLENBQ2YsZ0JBQWlCLENBQ2pCLFFBQ0YsQ0FPQSxhQUVFLGdCQUNGLENBT0EsY0FFRSxtQkFDRixDQU1BLGdEQUlFLHlCQUNGLENBTUEsd0hBSUUsaUJBQWtCLENBQ2xCLFNBQ0YsQ0FNQSw0R0FJRSw2QkFDRixDQU1BLFNBQ0UsMEJBQ0YsQ0FTQSxPQUNFLHFCQUFzQixDQUN0QixhQUFjLENBQ2QsYUFBYyxDQUNkLGNBQWUsQ0FDZixTQUFVLENBQ1Ysa0JBQ0YsQ0FNQSxTQUNFLHVCQUNGLENBTUEsU0FDRSxhQUNGLENBT0EsNkJBRUUscUJBQXNCLENBQ3RCLFNBQ0YsQ0FNQSxrRkFFRSxXQUNGLENBT0EsY0FDRSw0QkFBNkIsQ0FDN0IsbUJBQ0YsQ0FNQSx5Q0FDRSx1QkFDRixDQU9BLDZCQUNFLHlCQUEwQixDQUMxQixZQUNGLENBU0EsUUFDRSxhQUNGLENBTUEsUUFDRSxpQkFDRixDQWlCQSxrQkFDRSxZQUNGLENDNVZBLEtBRUMsVUFBWSxDQURaLHNCQUF1QixDQUV2QixjQUNELENBRUEsU0FHQyxrQkFBbUIsQ0FEbkIscUJBQXNCLENBR3RCLFdBQ0QsQ0FFQSxpQkFQQyxZQUFhLENBR2IsUUFXRCxDQVBBLFFBRUMsa0JBQW1CLENBQ25CLGNBQWUsQ0FDZixzQkFBdUIsQ0FDdkIsVUFFRCxDQUVBLE9BUUMsWUFBYSxDQUNiLG9DQUFzQyxDQUN0QyxpQ0FBbUMsQ0FSbkMsV0FBWSxDQUdaLGVBQWdCLENBSmhCLFVBWUQsQ0FFQSxhQVJDLGdCQUFpQixDQUlqQiwwQkFBNkIsQ0FDN0IscUJBVUQsQ0FQQSxNQUVDLGVBQWdCLENBRGhCLGNBQWUsQ0FLZixpQkFDRCxDQUVBLHdCQUdDLHdCQUNELENBRUEsT0FDQyx3QkFDRCxDQUVBLEtBQ0Msb0JBQ0QsQ0FFQSxnQkFFQyxxQkFDRCxDQUVBLHlCQUlDLGtCQUFtQixDQUZuQixZQUFhLENBR2IsZ0JBQWlCLENBQ2pCLFdBQVksQ0FIWixzQkFBdUIsQ0FJdkIsZUFDRCxDQUVBLFlBQ0MsV0FDRCxDQUVBLGFBQ0MsV0FDRCxDQUVBLFNBQ0MsWUFBYSxDQUliLFFBQVMsQ0FIVCxtQ0FBcUMsQ0FDckMsZUFBZ0IsQ0FDaEIsVUFFRCxDQUVBLEtBRUMscUJBQXVCLENBRHZCLDBCQUE2QixDQUU3QixZQUNELENBRUEsY0FDQyx3QkFDRCxDQUVBLFdBQ0MsY0FDRCxDQXFCQSxpRkFHQyxnQkFDRCxDQUVBLGlEQUVDLGNBQ0QsQ0FVQSxzS0FDQyxXQUNELENBRUEsTUFhQyx3QkFBNEIsQ0FUNUIsMEJBQTZCLENBQzdCLHFCQUFzQixDQUh0QixjQUFnQixDQUtoQixpQkFBa0IsQ0FObEIsYUFBZSxDQU9mLFNBTUQsQ0FFQSxpQkFHQyxXQUFZLENBQ1osdUJBQ0QsQ0FFQSxXQUNDLHFCQUNEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL25vZGVfbW9kdWxlcy9ub3JtYWxpemUuY3NzL25vcm1hbGl6ZS5jc3MiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9zdHlsZS9zdHlsZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuXG4vKiBEb2N1bWVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cbiAqL1xuXG5odG1sIHtcbiAgbGluZS1oZWlnaHQ6IDEuMTU7IC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXG59XG5cbi8qIFNlY3Rpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxuICovXG5cbm1haW4ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBmb250IHNpemUgYW5kIG1hcmdpbiBvbiBgaDFgIGVsZW1lbnRzIHdpdGhpbiBgc2VjdGlvbmAgYW5kXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxuICovXG5cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG5cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIDEgKi9cbiAgaGVpZ2h0OiAwOyAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlOyAvKiAyICovXG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5wcmUge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7IC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07IC8qIDIgKi9cbn1cblxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgb24gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxuICovXG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7IC8qIDEgKi9cbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IC8qIDIgKi9cbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgd2VpZ2h0IGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cbiAqL1xuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gQ29ycmVjdCB0aGUgb2RkIGBlbWAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbmNvZGUsXG5rYmQsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlOyAvKiAxICovXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLyoqXG4gKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW5cbiAqIGFsbCBicm93c2Vycy5cbiAqL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAuXG4gKi9cblxuaW1nIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xufVxuXG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDaGFuZ2UgdGhlIGZvbnQgc3R5bGVzIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cbiAqL1xuXG5idXR0b24sXG5pbnB1dCxcbm9wdGdyb3VwLFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBmb250LWZhbWlseTogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IDEuMTU7IC8qIDEgKi9cbiAgbWFyZ2luOiAwOyAvKiAyICovXG59XG5cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5cbmJ1dHRvbixcbmlucHV0IHsgLyogMSAqL1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEVkZ2UsIEZpcmVmb3gsIGFuZCBJRS5cbiAqIDEuIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRmlyZWZveC5cbiAqL1xuXG5idXR0b24sXG5zZWxlY3QgeyAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKi9cblxuYnV0dG9uLFxuW3R5cGU9XCJidXR0b25cIl0sXG5bdHlwZT1cInJlc2V0XCJdLFxuW3R5cGU9XCJzdWJtaXRcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwiYnV0dG9uXCJdOjotbW96LWZvY3VzLWlubmVyLFxuW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgdGhlIGZvY3VzIHN0eWxlcyB1bnNldCBieSB0aGUgcHJldmlvdXMgcnVsZS5cbiAqL1xuXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBwYWRkaW5nIGluIEZpcmVmb3guXG4gKi9cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwLjM1ZW0gMC43NWVtIDAuNjI1ZW07XG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbmxlZ2VuZCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgZGlzcGxheTogdGFibGU7IC8qIDEgKi9cbiAgbWF4LXdpZHRoOiAxMDAlOyAvKiAxICovXG4gIHBhZGRpbmc6IDA7IC8qIDMgKi9cbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsgLyogMSAqL1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cblxucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSAxMCsuXG4gKi9cblxudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBJRSAxMC5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC5cbiAqL1xuXG5bdHlwZT1cImNoZWNrYm94XCJdLFxuW3R5cGU9XCJyYWRpb1wiXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cbiAgcGFkZGluZzogMDsgLyogMiAqL1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cbiAqL1xuXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblxuW3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cbiAqL1xuXG5bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICogMi4gQ2hhbmdlIGZvbnQgcHJvcGVydGllcyB0byBgaW5oZXJpdGAgaW4gU2FmYXJpLlxuICovXG5cbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLyogMSAqL1xuICBmb250OiBpbmhlcml0OyAvKiAyICovXG59XG5cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gRWRnZSwgSUUgMTArLCBhbmQgRmlyZWZveC5cbiAqL1xuXG5kZXRhaWxzIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cblxuLyogTWlzY1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cblxudGVtcGxhdGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwLlxuICovXG5cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsImh0bWwge1xuXHRmb250LWZhbWlseTogc2Fucy1zZXJpZjtcblx0Y29sb3I6IGJsYWNrO1xuXHRmb250LXNpemU6IDE2cHg7XG59XG5cbiN3cmFwcGVyIHtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiAycmVtO1xuXHRtYXJnaW46IDJyZW07XG59XG5cbiNib2FyZHMge1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogcm93O1xuXHRmbGV4LXdyYXA6IHdyYXA7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHR3aWR0aDogMTAwJTtcblx0Z2FwOiAycmVtO1xufVxuXG4uYm9hcmQge1xuXHR3aWR0aDogMTAwJTtcblx0aGVpZ2h0OiAxMDAlO1xuXG5cdG1heC13aWR0aDogNDgwcHg7XG5cdG1heC13aWR0aDogNDgwcHg7XG5cblx0YXNwZWN0LXJhdGlvOiAxLzE7XG5cdGRpc3BsYXk6IGdyaWQ7XG5cdGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDEwLCAxZnIpO1xuXHRncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgxMCwgMWZyKTtcblx0Ym9yZGVyOiBzb2xpZCAwLjA2MjVyZW0gYmxhY2s7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5jZWxsIHtcblx0bWluLXdpZHRoOiAxMDAlO1xuXHRtaW4taGVpZ2h0OiAxMDAlO1xuXHRhc3BlY3QtcmF0aW86IDEvMTtcblx0Ym9yZGVyOiBzb2xpZCAwLjA2MjVyZW0gYmxhY2s7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmVtcHR5LFxuLnJlc2VydmVkLFxuLnRha2VuIHtcblx0YmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCA3NSUpO1xufVxuXG4udGFrZW4ge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiBkb2RnZXJibHVlO1xufVxuXG4uaGl0IHtcblx0YmFja2dyb3VuZC1jb2xvcjogcmVkO1xufVxuXG4ubWlzcyxcbi5yZXNlcnZlZCB7XG5cdGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4uaGl0OmJlZm9yZSxcbi5taXNzOmJlZm9yZSB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRmb250LXNpemU6IDEuNXJlbTtcblx0aGVpZ2h0OiAxMDAlO1xuXHRvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGl0OmJlZm9yZSB7XG5cdGNvbnRlbnQ6ICd4Jztcbn1cblxuLm1pc3M6YmVmb3JlIHtcblx0Y29udGVudDogJ+KAoic7XG59XG5cbiNidXR0b25zIHtcblx0ZGlzcGxheTogZ3JpZDtcblx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTtcblx0bWF4LXdpZHRoOiA0ODBweDtcblx0d2lkdGg6IDEwMCU7XG5cdGdhcDogMXJlbTtcbn1cblxuLmJ0biB7XG5cdGJvcmRlcjogc29saWQgMC4wNjI1cmVtIGJsYWNrO1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcblx0cGFkZGluZzogMXJlbTtcbn1cblxuLmJ0bi5zZWxlY3RlZCB7XG5cdGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW47XG59XG5cbi5idG46aG92ZXIge1xuXHRjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIC5ib2FyZE91dGxpbmUge1xuXHRhbmltYXRpb246IGZseUluc2lkZSA1cyBpbmZpbml0ZSBlYXNlLWluO1xuXHRhbmltYXRpb24tZGVsYXk6IDVzO1xufVxuXG5Aa2V5ZnJhbWVzIGZseUluc2lkZSB7XG5cdDAlIHtcblx0XHRvdXRsaW5lOiAxcmVtIHNvbGlkIHRyYW5zcGFyZW50O1xuXHR9XG5cblx0ODUlIHtcblx0XHRvdXRsaW5lOiAxcmVtIHNvbGlkIHRyYW5zcGFyZW50O1xuXHR9XG5cblx0MTAwJSB7XG5cdFx0b3V0bGluZTogMHJlbSBzb2xpZCBibGFjaztcblx0fVxufSAqL1xuXG4jc2Vjb25kQm9hcmQ6aG92ZXIgLmVtcHR5LFxuI3NlY29uZEJvYXJkOmhvdmVyIC5yZXNlcnZlZCxcbiNzZWNvbmRCb2FyZDpob3ZlciAudGFrZW4ge1xuXHRjdXJzb3I6IGNyb3NzaGFpcjtcbn1cblxuI3NlY29uZEJvYXJkOmhvdmVyIC5oaXQsXG4jc2Vjb25kQm9hcmQ6aG92ZXIgLm1pc3Mge1xuXHRjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi53YWl0ICNzZWNvbmRCb2FyZDpob3ZlciAuZW1wdHksXG4ud2FpdCAjc2Vjb25kQm9hcmQ6aG92ZXIgLnJlc2VydmVkLFxuLndhaXQgI3NlY29uZEJvYXJkOmhvdmVyIC50YWtlbixcbi53YWl0ICNzZWNvbmRCb2FyZDpob3ZlciAuaGl0LFxuLndhaXQgI3NlY29uZEJvYXJkOmhvdmVyIC5taXNzIHtcblx0Y3Vyc29yOiB3YWl0O1xufVxuXG4ud2FpdCB7XG5cdGN1cnNvcjogd2FpdDtcbn1cblxuLnNoaXAge1xuXHR0b3A6IC0wLjA2MjVyZW07XG5cdGxlZnQ6IC0wLjA2MjVyZW07XG5cblx0Ym9yZGVyOiBzb2xpZCAwLjA2MjVyZW0gYmxhY2s7XG5cdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR6LWluZGV4OiAxO1xuXG5cdC8qIGJhY2tncm91bmQtY29sb3I6IG9yYW5nZTsgKi9cblx0Lyogb3BhY2l0eTogMC4yNTsgKi9cblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiBkb2RnZXJibHVlO1xufVxuXG4uZHJhZ2dhYmxlOmhvdmVyIHtcblx0LyogYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyAqL1xuXG5cdGN1cnNvcjogbW92ZTtcblx0ZmlsdGVyOiBicmlnaHRuZXNzKDEyNSUpO1xufVxuXG4uaGlnaGxpZ2h0IHtcblx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file diff --git a/main.js b/main.js index 353bb06..b0c276e 100644 --- a/main.js +++ b/main.js @@ -1,2 +1,2 @@ -(()=>{"use strict";const t=()=>{const t=["A","B","C","D","E","F","G","H","I","J"],e=["1","2","3","4","5","6","7","8","9","10"],o=[],r=[],a=(r,a)=>{const s=t.indexOf(r),l=e.indexOf(a);return-1===s||-1===l?null:o[l][s]},s=(r,a,s,l)=>{const i=t.indexOf(r),n=e.indexOf(a);return-1===i||-1===n?null:(o[n][i].status=s,l&&(o[n][i].takenBy=l),o[n][i])};return(()=>{for(let r=0;r<10;r+=1){o[r]=[];for(let a=0;a<10;a+=1)o[r][a]={col:t[a],row:e[r],status:"empty",takenBy:null}}})(),{clearBoard:()=>{for(let t=0;t<10;t+=1)for(let e=0;e<10;e+=1)o[t][e].status="empty",o[t][e].takenBy=void 0;r.length=0},getCell:a,setCell:s,removeShip:(t,e)=>{e.array.flat().forEach((o=>{let a;"taken"===o.status&&o.takenBy.name===t.name&&(o.status="empty",o.takenBy=null),r.forEach((t=>{null===t.takenBy&&r.splice(r.indexOf(t),1)})),e===n.humanGameboard?a="firstBoard":e===n.computerGameboard?a="secondBoard":e===n.tempBoard&&(a="tempBoard");document.querySelectorAll(`#${a} .cell`).forEach((e=>{e.classList.contains("taken")&&e.getAttribute("data-shipName")===t.name.toLowerCase()&&(e.classList.remove("taken"),e.classList.add("empty"),e.removeAttribute("data-shipName"))}))}))},placeShip:(o,l,i,n)=>{o.isVertical="horizontal"!==n;const c="horizontal"===n,d=c?t:e,u=d.indexOf(c?l:i);let h=[];if(u<0||u+o.size>d.length)return!1;for(let t=0;t{const o=a(t,e);return"taken"===o.status?(o.takenBy.hit(),s(t,e,"hit"),o.status):"empty"===o.status||"reserved"===o.status?(s(t,e,"miss"),o.status):null},receiveAround:(t,e)=>{const o=a(t,e);return"empty"===o.status?(s(t,e,"reserved"),o.status):null},reserveSpace:(t,e,o)=>{const r=t.getCell(e,o);if(r&&r.takenBy){t.array.flat().filter((t=>t.takenBy&&t.takenBy.name===r.takenBy.name)).forEach((e=>{[{col:0,row:-1},{col:0,row:1},{col:-1,row:0},{col:1,row:0},{col:-1,row:-1},{col:-1,row:1},{col:1,row:-1},{col:1,row:1}].forEach((o=>{const r=String.fromCharCode(e.col.charCodeAt(0)+o.col),a=(Number(e.row)+o.row).toString();t.getCell(r,a)&&t.receiveAround(r,a)}))}))}},hitButNotSunk:t=>t.array.flat().some((t=>"hit"===t.status&&!1===t.takenBy.isSunk())),sinkShip:(t,e,o)=>{const r=t.getCell(e,o);if(r&&r.takenBy&&r.takenBy.isSunk()){t.array.flat().filter((t=>t.takenBy&&t.takenBy.name===r.takenBy.name)).forEach((e=>{[{col:0,row:-1},{col:0,row:1},{col:-1,row:0},{col:1,row:0},{col:-1,row:-1},{col:-1,row:1},{col:1,row:-1},{col:1,row:1}].forEach((o=>{const r=String.fromCharCode(e.col.charCodeAt(0)+o.col),a=(Number(e.row)+o.row).toString();t.getCell(r,a)&&t.receiveAttack(r,a)}))}))}},allSunk:t=>{let e=t.array.flat().filter((t=>t.takenBy));return!!(e.length>0&&e.every((t=>t.takenBy.isSunk())))},array:o,canBePlaced:(o,r,s,l)=>{const i="horizontal"===l,n=i?t:e,c=n.indexOf(i?r:s);if(c<0||c+o>n.length)return!1;for(let t=0;t{let e;return"Carrier"===t&&(e=5),"Battleship"===t&&(e=4),"Destroyer"===t&&(e=3),"Submarine"===t&&(e=3),"PatrolBoat"===t&&(e=2),{name:t,size:e,hitCount:0,isVertical:!1,rotate(){this.isVertical=!this.isVertical},hit(){this.hitCount+=1},isSunk(){return this.hitCount===e}}},o=()=>{const t=["A","B","C","D","E","F","G","H","I","J"];let e=null,o=null;let r=1,a=!0,s=!0;const l=(t,e,c,d)=>{if(console.log("start finishingAttack prevHit",d),console.log("start finishingAttack lastHit",{col:e,row:c}),d.row===c)if(a){r=1,console.log("goRight");let s=String.fromCharCode(e.charCodeAt(0)+r);for(;t.getCell(s,c)&&"hit"===t.getCell(s,c).status;)r+=1,s=String.fromCharCode(e.charCodeAt(0)+r);t.getCell(s,c)&&"hit"!==t.getCell(s,c).status&&"miss"!==t.getCell(s,c).status?(t.receiveAttack(s,c),"hit"===t.getCell(s,c).status&&(i(o),n({col:s,row:c})),console.log("prevHit",d),console.log("lastHit",o),console.log("range",r),console.log("---------------"),r+=1):(r=1,a=!1,l(t,s,c,d))}else{r=1,console.log("goLeft");let s=String.fromCharCode(e.charCodeAt(0)-r);for(;t.getCell(s,c)&&"hit"===t.getCell(s,c).status;)r+=1,s=String.fromCharCode(e.charCodeAt(0)-r);t.getCell(s,c)&&"hit"!==t.getCell(s,c).status&&"miss"!==t.getCell(s,c).status?(t.receiveAttack(s,c),"hit"===t.getCell(s,c).status&&(i(o),n({col:s,row:c})),console.log("prevHit",d),console.log("lastHit",o),console.log("range",r),console.log("---------------"),r+=1):(r=1,a=!0,l(t,s,c,d))}else if(d.col===e)if(s){r=1,console.log("goDown");let a=(Number(c)+r).toString();for(;t.getCell(e,a)&&"hit"===t.getCell(e,a).status;)r+=1,a=(Number(c)+r).toString();t.getCell(e,a)&&"hit"!==t.getCell(e,a).status&&"miss"!==t.getCell(e,a).status?(t.receiveAttack(e,a),"hit"===t.getCell(e,a).status&&(i(o),n({col:e,row:a})),console.log("prevHit",d),console.log("lastHit",o),console.log("range",r),console.log("---------------"),r+=1):(r=1,s=!1,l(t,e,a,d))}else{r=1,console.log("goUp");let a=(Number(c)-r).toString();for(;t.getCell(e,a)&&"hit"===t.getCell(e,a).status;)r+=1,a=(Number(c)-r).toString();t.getCell(e,a)&&"hit"!==t.getCell(e,a).status&&"miss"!==t.getCell(e,a).status?(t.receiveAttack(e,a),"hit"===t.getCell(e,a).status&&(i(o),n({col:e,row:a})),console.log("prevHit",d),console.log("lastHit",o),console.log("range",r),console.log("---------------"),r+=1):(r=1,s=!0,l(t,e,a,d))}},i=t=>{e=t},n=t=>{o=t};return{attack:(t,e,r)=>{if("hit"!==t.getCell(e,r).status&&"miss"!==t.getCell(e,r).status){let a=t.receiveAttack(e,r);return"hit"===a&&(i(o),n({col:e,row:r})),a}return"already shot"},randomAttack:a=>{let s,l;do{s=t[Math.floor(Math.random()*t.length)],l=Math.ceil(10*Math.random()).toString()}while("hit"===a.getCell(s,l).status||"miss"===a.getCell(s,l).status);if("hit"!==a.getCell(s,l).status&&"miss"!==a.getCell(s,l).status){const t=a.receiveAttack(s,l);return"hit"===a.getCell(s,l).status&&(i(o),n({col:s,row:l}),console.log("---------------"),console.log("randomAttack prevHit",e),console.log("randomAttack lastHit",o),console.log("randomAttack range",r)),{result:t,col:s,row:l}}return{result:"already shot",col:s,row:l}},followupAttack:(t,a,s)=>{const l=[{col:0,row:-1},{col:0,row:1},{col:-1,row:0},{col:1,row:0}].filter((e=>{const o=String.fromCharCode(a.charCodeAt(0)+e.col),r=(Number(s)+e.row).toString(),l=t.getCell(o,r);return!(!l||"miss"===l.status||"hit"===l.status)}));if(l.length>0){const c=l[Math.floor(Math.random()*l.length)],d=String.fromCharCode(a.charCodeAt(0)+c.col),u=(Number(s)+c.row).toString();t.receiveAttack(d,u),r=1,"hit"===t.getCell(d,u).status&&(i(o),n({col:d,row:u}),console.log("---------------"),console.log("followupAttack prevHit",e),console.log("followupAttack lastHit",o),console.log("followupAttack range",r))}else console.log("Nie ma dostępnych kierunków do ataku")},finishingAttack:l,prevHit:e,lastHit:o,getPrevHit:()=>e,getLastHit:()=>o,setPrevHit:i,setLastHit:n}};var r=function(t,e,o,r){return new(o||(o=Promise))((function(a,s){function l(t){try{n(r.next(t))}catch(t){s(t)}}function i(t){try{n(r.throw(t))}catch(t){s(t)}}function n(t){var e;t.done?a(t.value):(e=t.value,e instanceof o?e:new o((function(t){t(e)}))).then(l,i)}n((r=r.apply(t,e||[])).next())}))};const a=(()=>{const t=document.querySelector("#wrapper"),e=document.createElement("div");e.id="boards",t.prepend(e);const o=document.querySelector("#playerVsComputer"),a=document.querySelector("#newGame"),s=document.querySelector("#computerVsComputer"),l=document.querySelector("#rotateShip"),i=document.querySelector("#start"),c=document.querySelector("#randomPlacement"),d=[o,a,s,l,i,c],u=(t,e)=>{t.array.forEach((t=>{t.forEach((t=>{const o=(t=>{const e=document.createElement("div");return e.classList.add("cell"),e.classList.add(t.status),e.setAttribute("data-col",t.col),e.setAttribute("data-row",t.row),t.takenBy&&e.setAttribute("data-shipName",t.takenBy.name.toLowerCase()),e})(t);e.append(o)}))}))},h=t=>{let e;t===n.humanGameboard?e="firstBoard":t===n.computerGameboard?e="secondBoard":t===n.tempBoard&&(e="tempBoard");const o=document.querySelector(`#${e}`);o.innerHTML="",u(t,o)},g=t=>{if(!t.target.classList.contains("hit")&&!t.target.classList.contains("miss")){return{col:t.target.getAttribute("data-col"),row:t.target.getAttribute("data-row")}}},m=(t,e)=>{e.classList.remove("selected"),t.classList.contains("selected")||(t.classList.add("selected"),t===o&&r(void 0,void 0,void 0,(function*(){f(!0),d.forEach((t=>t.disabled=!0)),o.textContent="Starting...",yield new Promise((t=>setTimeout(t,1e3))),o.textContent="Player vs Computer",d.forEach((t=>t.disabled=!1)),f(!1)})),t===s&&r(void 0,void 0,void 0,(function*(){f(!0),d.forEach((t=>t.disabled=!0)),s.textContent="Starting...",yield new Promise((t=>setTimeout(t,1e3))),s.textContent="Computer vs Computer",d.forEach((t=>t.disabled=!1)),f(!1)})),n.restart())},f=t=>{document.documentElement.classList.toggle("wait",t)},p=(t,e)=>{e.forEach((e=>{const o=document.createElement("div"),r=e.takenBy.name.toLowerCase(),a=e.takenBy.size,s=e.takenBy.isVertical;o.classList.add("ship",r),o.setAttribute("data-size",`${a}`),o.setAttribute("data-name",`${r}`),o.setAttribute("draggable","true"),o.classList.add("draggable");const l=()=>{s?s&&(o.style.width=n/16+"rem",o.style.height=a*(n/16)+"rem"):(o.style.width=a*(n/16)+"rem",o.style.height=n/16+"rem")};let i,n=document.querySelector(".board .cell").getBoundingClientRect().width;l(),window.addEventListener("resize",(function(){n=document.querySelector(".board .cell").getBoundingClientRect().width,l()})),"first"===t?i="firstBoard":"temp"===t&&(i="tempBoard");document.querySelector(`#${i} .cell[data-col="${e.col}"][data-row="${e.row}"]`).appendChild(o)}))},v=(t,e,o)=>{let r,a,s,l,i=0,c=0,d=[];const u={carrier:o[0],battleship:o[1],destroyer:o[2],submarine:o[3],patrolboat:o[4]};document.querySelectorAll(".draggable").forEach((t=>{t.addEventListener("dragstart",y),t.addEventListener("dragend",L)}));const g=document.querySelector("#firstBoard"),m=document.querySelector("#tempBoard"),f=g.querySelectorAll(".cell"),w=m.querySelectorAll(".cell");let B=null;function y(o){setTimeout((()=>{const n=o.target;n.style.visibility="hidden",this.classList.add("dragging"),r=n.getAttribute("data-name"),a=Number(n.getAttribute("data-size")),i=o.offsetX,c=o.offsetY,s=u[r],l=s.isVertical?"vertical":"horizontal","firstBoard"===n.closest(".board").id&&t.removeShip(s,t),"tempBoard"===n.closest(".board").id&&e.removeShip(s,e)}),0)}function C(t){return function(e){const o=e.target;if("firstBoard"===o.closest(".board").id){e.preventDefault();let o=t-(s.isVertical?10*Math.floor(c/this.offsetHeight):Math.floor(i/this.offsetWidth));const r=[];for(let t=0;t{t.classList.add("highlight")})),B||(B=A(d,a)))}if("tempBoard"===o.closest(".board").id){e.preventDefault();let o=t-(s.isVertical?10*Math.floor(c/this.offsetHeight):Math.floor(i/this.offsetWidth));const r=[];for(let t=0;t{t.classList.add("highlight")})),B||(B=A(d,a)))}}}function S(){d.forEach((t=>{t.classList.remove("highlight")})),d=[]}function k(o){d.forEach((t=>{t.classList.remove("highlight")}));const r=A(d,a),i=o.target;"firstBoard"===i.closest(".board").id&&(t.canBePlaced(s.size,r[0].dataset.col,r[0].dataset.row,l)?t.placeShip(s,r[0].dataset.col,r[0].dataset.row,l):t.placeShip(s,B[0].dataset.col,B[0].dataset.row,l)),"tempBoard"===i.closest(".board").id&&(e.canBePlaced(s.size,r[0].dataset.col,r[0].dataset.row,l)?e.placeShip(s,r[0].dataset.col,r[0].dataset.row,l):e.placeShip(s,B[0].dataset.col,B[0].dataset.row,l)),h(t),h(e),p("first",t.shipsPlaced),p("temp",e.shipsPlaced),v(t,e,n.humanShips),B=null}function L(o){const r=o.target;r.style.visibility="visible",this.classList.remove("dragging"),0===d.length&&("firstBoard"===r.closest(".board").id&&B&&t.canBePlaced(s.size,B[0].dataset.col,B[0].dataset.row,l)&&(t.placeShip(s,B[0].dataset.col,B[0].dataset.row,l),h(t),h(e),p("first",t.shipsPlaced),p("temp",e.shipsPlaced),v(t,e,n.humanShips)),"tempBoard"===r.closest(".board").id&&B&&e.canBePlaced(s.size,B[0].dataset.col,B[0].dataset.row,l)&&(e.placeShip(s,B[0].dataset.col,B[0].dataset.row,l),h(t),h(e),p("first",t.shipsPlaced),p("temp",e.shipsPlaced),v(t,e,n.humanShips)))}function b(t){return t.every((t=>t.classList.contains("empty")))&&(t.every((e=>e.dataset.col===t[0].dataset.col))||t.every((e=>e.dataset.row===t[0].dataset.row)))&&t.length===a&&t.every((t=>t.dataset.col>="A"&&t.dataset.col<="J"))&&t.every((t=>Number(t.dataset.row)>=1&&Number(t.dataset.row)<=10))}function A(t,e){return t.slice(Math.min(t.length-e,0))}f.forEach(((t,e)=>{t.addEventListener("dragover",C(e)),t.addEventListener("dragleave",S),t.addEventListener("drop",k)})),w.forEach(((t,e)=>{t.addEventListener("dragover",C(e)),t.addEventListener("dragleave",S),t.addEventListener("drop",k)}))};return o.addEventListener("click",(()=>m(o,s))),s.addEventListener("click",(()=>m(s,o))),a.addEventListener("click",(()=>r(void 0,void 0,void 0,(function*(){f(!0),d.forEach((t=>t.disabled=!0)),a.textContent="Restarting...",yield n.newGame(),a.textContent="New Game",d.forEach((t=>t.disabled=!1)),f(!1)})))),l.addEventListener("click",(()=>n.rotateShip())),i.addEventListener("click",(()=>n.start())),c.addEventListener("click",(()=>{n.tempBoard.clearBoard(),h(n.tempBoard),n.randomizeShipsPlacement("first",n.humanGameboard),v(n.humanGameboard,n.tempBoard,n.humanShips)})),{renderBoard:t=>{const o=document.createElement("div");o.classList.add("board"),t===n.humanGameboard?o.id="firstBoard":t===n.computerGameboard?o.id="secondBoard":t===n.tempBoard&&(o.id="tempBoard"),u(t,o),e.append(o)},refreshBoard:h,handleUserInput:()=>r(void 0,void 0,void 0,(function*(){const t=document.querySelectorAll("#secondBoard .cell");let e;do{e=yield new Promise((e=>{t.forEach((t=>{t.classList.contains("hit")||t.classList.contains("miss")||t.addEventListener("click",(t=>{e(g(t))}),{once:!0})}))}))}while(!e);return{col:e.col.toString(),row:e.row.toString()}})),pVcBtn:o,cVcBtn:s,waiting:f,setBoardPointer:t=>{const e=document.querySelector("#secondBoard");"player"===t?e.classList.add("boardOutline"):"computer"===t&&e.classList.remove("boardOutline")},removeBoardPointer:()=>{document.querySelector("#secondBoard").classList.remove("boardOutline")},createShipOverlay:p,dragAndDrop:v}})(),s=a;var l=function(t,e,o,r){return new(o||(o=Promise))((function(a,s){function l(t){try{n(r.next(t))}catch(t){s(t)}}function i(t){try{n(r.throw(t))}catch(t){s(t)}}function n(t){var e;t.done?a(t.value):(e=t.value,e instanceof o?e:new o((function(t){t(e)}))).then(l,i)}n((r=r.apply(t,e||[])).next())}))};const i=(()=>{const r=t(),a=t(),n=t(),c=o(),d=o();let u=!0,h=e("Carrier"),g=e("Battleship"),m=e("Destroyer"),f=e("Submarine"),p=e("PatrolBoat");const v=[h,g,m,f,p],w=()=>(a.allSunk(a)||!!r.allSunk(r))&&(s.removeBoardPointer(),!0),B=t=>{let e;if(t===r?e=d:t===a&&(e=c),t.hitButNotSunk(t)){if(null!==e.getPrevHit()&&null!==e.getLastHit()&&t.getCell(e.getLastHit().col,e.getLastHit().row).takenBy.hitCount>=2&&t.getCell(e.getLastHit().col,e.getLastHit().row).takenBy.hitCount<=4){if(e.finishingAttack(t,e.getLastHit().col,e.getLastHit().row,e.getPrevHit()),t.sinkShip(t,e.getLastHit().col,e.getLastHit().row),w())return}else if(1===t.getCell(e.getLastHit().col,e.getLastHit().row).takenBy.hitCount&&(e.followupAttack(t,e.getLastHit().col,e.getLastHit().row),t.sinkShip(t,e.getLastHit().col,e.getLastHit().row),w()))return}else{const{col:o,row:r}=e.randomAttack(t);if("hit"===t.getCell(o,r).status&&(e.setPrevHit(e.getLastHit()),e.setLastHit({col:o,row:r})),"hit"===t.getCell(o,r).status&&t.getCell(o,r).takenBy.isSunk()&&(t.sinkShip(t,o,r),e.setPrevHit(null),e.setLastHit(null),w()))return}},y=(t,o)=>{o.clearBoard(),(t=>{let o;t===r?(h=e("Carrier"),g=e("Battleship"),m=e("Destroyer"),f=e("Submarine"),p=e("PatrolBoat"),o=[h,g,m,f,p]):t===a&&(o=[e("Carrier"),e("Battleship"),e("Destroyer"),e("Submarine"),e("PatrolBoat")]);i.humanShips.length=0;const s=["A","B","C","D","E","F","G","H","I","J"],l=()=>s[Math.floor(Math.random()*s.length)],n=()=>Math.ceil(10*Math.random()).toString(),c=()=>Math.random()>.5?"horizontal":"vertical";o.forEach((e=>{let o=l(),r=n(),a=c(),s=t.canBePlaced(e.size,o,r,a);for(;!s;)o=l(),r=n(),a=c(),s=t.canBePlaced(e.size,o,r,a);s&&t.placeShip(e,o,r,a),i.humanShips.push(e)}))})(o),s.refreshBoard(o),"first"===t&&s.createShipOverlay("first",o.shipsPlaced)},C=()=>{s.cVcBtn.classList.contains("selected")&&(y("first",r),y("second",a),u=!1,l(void 0,void 0,void 0,(function*(){s.removeBoardPointer();let t=!0;for(;!w()&&!u;){if(s.waiting(!0),t){if(yield new Promise((t=>setTimeout(t,1e3))),!s.cVcBtn.classList.contains("selected")||u)break;B(r),s.refreshBoard(r),t=!1}if(w()||u)break;if(!t){if(yield new Promise((t=>setTimeout(t,1e3))),!s.cVcBtn.classList.contains("selected")||u)break;B(a),s.refreshBoard(a),t=!0}}u=!1,s.waiting(!1)})))},S=()=>{u=!0,c.setPrevHit(null),c.setLastHit(null),d.setPrevHit(null),d.setLastHit(null),r.clearBoard(),a.clearBoard(),s.refreshBoard(r),s.refreshBoard(a),C()};return{init:()=>{s.renderBoard(r),s.renderBoard(n),n.placeShip(h,"A","1","horizontal"),n.placeShip(g,"A","3","horizontal"),n.placeShip(m,"A","5","horizontal"),n.placeShip(f,"A","7","horizontal"),n.placeShip(p,"A","9","vertical"),s.refreshBoard(n),s.createShipOverlay("temp",n.shipsPlaced),s.dragAndDrop(r,n,v),C()},humanGameboard:r,computerGameboard:a,tempBoard:n,restart:S,newGame:()=>l(void 0,void 0,void 0,(function*(){u=!0,yield new Promise((t=>setTimeout(t,1e3))),u=!1,S()})),rotateShip:()=>{console.log("rotate")},start:()=>{y("second",a),u=!1,l(void 0,void 0,void 0,(function*(){let t=!0;for(;!w()&&!u;){if(t){s.setBoardPointer("player"),s.waiting(!1);const{col:e,row:o}=yield s.handleUserInput();c.attack(a,e,o),a.sinkShip(a,e,o),s.refreshBoard(a),t=!1}if(w()||u)break;if(!t){if(s.setBoardPointer("computer"),s.waiting(!0),yield new Promise((t=>setTimeout(t,1e3))),!s.pVcBtn.classList.contains("selected")||u)break;B(r),s.refreshBoard(r),t=!0}}u=!1,s.waiting(!1)}))},randomizeShipsPlacement:y,humanShips:v}})(),n=i;n.init()})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0osQ0FDQVosR0FBWSxFQUNaLEVBQUduRixTQUFRLEVBQ2YsR0F1RjBCLEVBc0N3RXNFLDBCQUF5QkwsYUFDOUgsRUF4T2tCLEdBeU9uQixJQ25QQSxFQUFXK0IsTSIsInNvdXJjZXMiOlsid2VicGFjazovL2JhdHRsZXNoaXAvLi9zcmMvbW9kdWxlcy9nYW1lYm9hcmQudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9tb2R1bGVzL3NoaXAudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9tb2R1bGVzL3BsYXllci50cyIsIndlYnBhY2s6Ly9iYXR0bGVzaGlwLy4vc3JjL21vZHVsZXMvdWkudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9tb2R1bGVzL2NvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29udHJvbGxlciBmcm9tICcuL2NvbnRyb2xsZXInO1xuY29uc3QgZ2FtZWJvYXJkRmFjdG9yeSA9ICgpID0+IHtcbiAgICBjb25zdCBjb2xzID0gWydBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJ107XG4gICAgY29uc3Qgcm93cyA9IFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnXTtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGNvbnN0IHNoaXBzUGxhY2VkID0gW107XG4gICAgY29uc3QgZ2VuZXJhdGVBcnJheSA9ICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJheVtpXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxMDsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV1bal0gPSB7IGNvbDogY29sc1tqXSwgcm93OiByb3dzW2ldLCBzdGF0dXM6ICdlbXB0eScsIHRha2VuQnk6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgY2xlYXJCb2FyZCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSArPSAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDEwOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXVtqXS5zdGF0dXMgPSAnZW1wdHknO1xuICAgICAgICAgICAgICAgIGFycmF5W2ldW2pdLnRha2VuQnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2hpcHNQbGFjZWQubGVuZ3RoID0gMDtcbiAgICB9O1xuICAgIGNvbnN0IGdldENlbGwgPSAoY29sLCByb3cpID0+IHtcbiAgICAgICAgY29uc3QgY29sSW5kZXggPSBjb2xzLmluZGV4T2YoY29sKTtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICAgICAgaWYgKGNvbEluZGV4ID09PSAtMSB8fCByb3dJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVtyb3dJbmRleF1bY29sSW5kZXhdO1xuICAgIH07XG4gICAgY29uc3Qgc2V0Q2VsbCA9IChjb2wsIHJvdywgbmV3U3RhdHVzLCBuZXdUYWtlbkJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ID0gY29scy5pbmRleE9mKGNvbCk7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gcm93cy5pbmRleE9mKHJvdyk7XG4gICAgICAgIGlmIChjb2xJbmRleCA9PT0gLTEgfHwgcm93SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBhcnJheVtyb3dJbmRleF1bY29sSW5kZXhdLnN0YXR1cyA9IG5ld1N0YXR1cztcbiAgICAgICAgaWYgKG5ld1Rha2VuQnkpIHtcbiAgICAgICAgICAgIGFycmF5W3Jvd0luZGV4XVtjb2xJbmRleF0udGFrZW5CeSA9IG5ld1Rha2VuQnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5W3Jvd0luZGV4XVtjb2xJbmRleF07XG4gICAgfTtcbiAgICBjb25zdCByZW1vdmVTaGlwID0gKHNoaXAsIGdhbWVib2FyZCkgPT4ge1xuICAgICAgICBjb25zdCBnYW1lYm9hcmRDZWxscyA9IGdhbWVib2FyZC5hcnJheS5mbGF0KCk7XG4gICAgICAgIGdhbWVib2FyZENlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgIGlmIChjZWxsLnN0YXR1cyA9PT0gJ3Rha2VuJyAmJiBjZWxsLnRha2VuQnkubmFtZSA9PT0gc2hpcC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgY2VsbC5zdGF0dXMgPSAnZW1wdHknO1xuICAgICAgICAgICAgICAgIGNlbGwudGFrZW5CeSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGlwc1BsYWNlZC5mb3JFYWNoKChzaGlwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNoaXAudGFrZW5CeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzaGlwc1BsYWNlZC5zcGxpY2Uoc2hpcHNQbGFjZWQuaW5kZXhPZihzaGlwKSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYm9hcmRJZDtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmQgPT09IGNvbnRyb2xsZXIuaHVtYW5HYW1lYm9hcmQpIHtcbiAgICAgICAgICAgICAgICBib2FyZElkID0gJ2ZpcnN0Qm9hcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLmNvbXB1dGVyR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICAgICAgYm9hcmRJZCA9ICdzZWNvbmRCb2FyZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnYW1lYm9hcmQgPT09IGNvbnRyb2xsZXIudGVtcEJvYXJkKSB7XG4gICAgICAgICAgICAgICAgYm9hcmRJZCA9ICd0ZW1wQm9hcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjJHtib2FyZElkfSAuY2VsbGApO1xuICAgICAgICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjZWxsLmNsYXNzTGlzdC5jb250YWlucygndGFrZW4nKSAmJiBjZWxsLmdldEF0dHJpYnV0ZSgnZGF0YS1zaGlwTmFtZScpID09PSBzaGlwLm5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ3Rha2VuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnZW1wdHknKTtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2hpcE5hbWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBwbGFjZVNoaXAgPSAoc2hpcCwgY29sLCByb3csIG9yaWVudGF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgICBzaGlwLmlzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNoaXAuaXNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICAgICAgY29uc3QgY2VsbHMgPSBpc0hvcml6b250YWwgPyBjb2xzIDogcm93cztcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBjZWxscy5pbmRleE9mKGlzSG9yaXpvbnRhbCA/IGNvbCA6IHJvdyk7XG4gICAgICAgIGxldCBzaGlwQ2VsbHMgPSBbXTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCArIHNoaXAuc2l6ZSA+IGNlbGxzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hpcC5zaXplOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb2wgPSBpc0hvcml6b250YWwgPyBjZWxsc1tzdGFydCArIGldIDogY29sO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvdyA9IGlzSG9yaXpvbnRhbCA/IHJvdyA6IGNlbGxzW3N0YXJ0ICsgaV07XG4gICAgICAgICAgICBpZiAoZ2V0Q2VsbChjdXJyZW50Q29sLCBjdXJyZW50Um93KS5zdGF0dXMgIT09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDZWxsKGN1cnJlbnRDb2wsIGN1cnJlbnRSb3csICd0YWtlbicsIHNoaXApO1xuICAgICAgICAgICAgc2hpcENlbGxzLnB1c2goZ2V0Q2VsbChjdXJyZW50Q29sLCBjdXJyZW50Um93KSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hpcHNQbGFjZWQucHVzaChzaGlwQ2VsbHNbMF0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IGNhbkJlUGxhY2VkID0gKHNpemUsIGNvbCwgcm93LCBvcmllbnRhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICBjb25zdCBjZWxscyA9IGlzSG9yaXpvbnRhbCA/IGNvbHMgOiByb3dzO1xuICAgICAgICBjb25zdCBzdGFydCA9IGNlbGxzLmluZGV4T2YoaXNIb3Jpem9udGFsID8gY29sIDogcm93KTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCArIHNpemUgPiBjZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbCA9IGlzSG9yaXpvbnRhbCA/IGNlbGxzW3N0YXJ0ICsgaV0gOiBjb2w7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gaXNIb3Jpem9udGFsID8gcm93IDogY2VsbHNbc3RhcnQgKyBpXTtcbiAgICAgICAgICAgIGlmIChnZXRDZWxsKGN1cnJlbnRDb2wsIGN1cnJlbnRSb3cpLnN0YXR1cyAhPT0gJ2VtcHR5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IHJlY2VpdmVBdHRhY2sgPSAoY29sLCByb3cpID0+IHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGdldENlbGwoY29sLCByb3cpO1xuICAgICAgICBpZiAoY2VsbC5zdGF0dXMgPT09ICd0YWtlbicpIHtcbiAgICAgICAgICAgIGNlbGwudGFrZW5CeS5oaXQoKTtcbiAgICAgICAgICAgIHNldENlbGwoY29sLCByb3csICdoaXQnKTtcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VsbC5zdGF0dXMgPT09ICdlbXB0eScgfHwgY2VsbC5zdGF0dXMgPT09ICdyZXNlcnZlZCcpIHtcbiAgICAgICAgICAgIHNldENlbGwoY29sLCByb3csICdtaXNzJyk7XG4gICAgICAgICAgICByZXR1cm4gY2VsbC5zdGF0dXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBjb25zdCByZWNlaXZlQXJvdW5kID0gKGNvbCwgcm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSBnZXRDZWxsKGNvbCwgcm93KTtcbiAgICAgICAgaWYgKGNlbGwuc3RhdHVzID09PSAnZW1wdHknKSB7XG4gICAgICAgICAgICBzZXRDZWxsKGNvbCwgcm93LCAncmVzZXJ2ZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIGNvbnN0IHJlc2VydmVTcGFjZSA9IChnYW1lYm9hcmQsIGNvbCwgcm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSBnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIHJvdyk7XG4gICAgICAgIGlmIChjZWxsICYmIGNlbGwudGFrZW5CeSkge1xuICAgICAgICAgICAgY29uc3Qgc2hpcENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKS5maWx0ZXIoKGMpID0+IGMudGFrZW5CeSAmJiBjLnRha2VuQnkubmFtZSA9PT0gY2VsbC50YWtlbkJ5Lm5hbWUpO1xuICAgICAgICAgICAgc2hpcENlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAtMSB9LFxuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBjb2w6IC0xLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDEgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMuZm9yRWFjaCgoZGlyZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2VsbC5jb2wuY2hhckNvZGVBdCgwKSArIGRpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3cgPSAoTnVtYmVyKGNlbGwucm93KSArIGRpcmVjdGlvbi5yb3cpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1JvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXJvdW5kKG5ld0NvbCwgbmV3Um93KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHNpbmtTaGlwID0gKGdhbWVib2FyZCwgY29sLCByb3cpID0+IHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KTtcbiAgICAgICAgaWYgKGNlbGwgJiYgY2VsbC50YWtlbkJ5ICYmIGNlbGwudGFrZW5CeS5pc1N1bmsoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2hpcENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKS5maWx0ZXIoKGMpID0+IGMudGFrZW5CeSAmJiBjLnRha2VuQnkubmFtZSA9PT0gY2VsbC50YWtlbkJ5Lm5hbWUpO1xuICAgICAgICAgICAgc2hpcENlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAtMSB9LFxuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBjb2w6IC0xLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDEgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMuZm9yRWFjaCgoZGlyZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2VsbC5jb2wuY2hhckNvZGVBdCgwKSArIGRpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3cgPSAoTnVtYmVyKGNlbGwucm93KSArIGRpcmVjdGlvbi5yb3cpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1JvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKG5ld0NvbCwgbmV3Um93KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGhpdEJ1dE5vdFN1bmsgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhbWVib2FyZENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKTtcbiAgICAgICAgcmV0dXJuIGdhbWVib2FyZENlbGxzLnNvbWUoKGNlbGwpID0+IHtcbiAgICAgICAgICAgIGlmIChjZWxsLnN0YXR1cyA9PT0gJ2hpdCcgJiYgY2VsbC50YWtlbkJ5LmlzU3VuaygpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGFsbFN1bmsgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhbWVib2FyZENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKTtcbiAgICAgICAgbGV0IHRha2VuQnlDZWxscyA9IGdhbWVib2FyZENlbGxzLmZpbHRlcigoY2VsbCkgPT4gY2VsbC50YWtlbkJ5KTtcbiAgICAgICAgaWYgKHRha2VuQnlDZWxscy5sZW5ndGggPiAwICYmIHRha2VuQnlDZWxscy5ldmVyeSgoY2VsbCkgPT4gY2VsbC50YWtlbkJ5LmlzU3VuaygpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGdlbmVyYXRlQXJyYXkoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjbGVhckJvYXJkLFxuICAgICAgICBnZXRDZWxsLFxuICAgICAgICBzZXRDZWxsLFxuICAgICAgICByZW1vdmVTaGlwLFxuICAgICAgICBwbGFjZVNoaXAsXG4gICAgICAgIHJlY2VpdmVBdHRhY2ssXG4gICAgICAgIHJlY2VpdmVBcm91bmQsXG4gICAgICAgIHJlc2VydmVTcGFjZSxcbiAgICAgICAgaGl0QnV0Tm90U3VuayxcbiAgICAgICAgc2lua1NoaXAsXG4gICAgICAgIGFsbFN1bmssXG4gICAgICAgIGFycmF5LFxuICAgICAgICBjYW5CZVBsYWNlZCxcbiAgICAgICAgc2hpcHNQbGFjZWQsXG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnYW1lYm9hcmRGYWN0b3J5O1xuIiwiY29uc3Qgc2hpcEZhY3RvcnkgPSAobmFtZSkgPT4ge1xuICAgIGxldCBzaXplO1xuICAgIGlmIChuYW1lID09PSAnQ2FycmllcicpIHtcbiAgICAgICAgc2l6ZSA9IDU7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnQmF0dGxlc2hpcCcpIHtcbiAgICAgICAgc2l6ZSA9IDQ7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnRGVzdHJveWVyJykge1xuICAgICAgICBzaXplID0gMztcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdTdWJtYXJpbmUnKSB7XG4gICAgICAgIHNpemUgPSAzO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ1BhdHJvbEJvYXQnKSB7XG4gICAgICAgIHNpemUgPSAyO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplLFxuICAgICAgICBoaXRDb3VudDogMCxcbiAgICAgICAgaXNWZXJ0aWNhbDogZmFsc2UsXG4gICAgICAgIHJvdGF0ZSgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWZXJ0aWNhbCA9ICF0aGlzLmlzVmVydGljYWw7XG4gICAgICAgIH0sXG4gICAgICAgIGhpdCgpIHtcbiAgICAgICAgICAgIHRoaXMuaGl0Q291bnQgKz0gMTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNTdW5rKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGl0Q291bnQgPT09IHNpemU7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBzaGlwRmFjdG9yeTtcbiIsImNvbnN0IHBsYXllckZhY3RvcnkgPSAoKSA9PiB7XG4gICAgY29uc3QgY29scyA9IFsnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSiddO1xuICAgIGxldCBwcmV2SGl0ID0gbnVsbDtcbiAgICBsZXQgbGFzdEhpdCA9IG51bGw7XG4gICAgY29uc3QgYXR0YWNrID0gKGdhbWVib2FyZCwgY29sLCByb3cpID0+IHtcbiAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS5zdGF0dXMgIT09ICdoaXQnICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS5zdGF0dXMgIT09ICdtaXNzJykge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKGNvbCwgcm93KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdoaXQnKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJldkhpdChsYXN0SGl0KTtcbiAgICAgICAgICAgICAgICBzZXRMYXN0SGl0KHsgY29sOiBjb2wsIHJvdzogcm93IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2FscmVhZHkgc2hvdCc7XG4gICAgfTtcbiAgICBjb25zdCByYW5kb21BdHRhY2sgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGxldCByYW5kb21Db2w7XG4gICAgICAgIGxldCByYW5kb21Sb3c7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHJhbmRvbUNvbCA9IGNvbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29scy5sZW5ndGgpXTtcbiAgICAgICAgICAgIHJhbmRvbVJvdyA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gd2hpbGUgKGdhbWVib2FyZC5nZXRDZWxsKHJhbmRvbUNvbCwgcmFuZG9tUm93KS5zdGF0dXMgPT09ICdoaXQnIHx8IGdhbWVib2FyZC5nZXRDZWxsKHJhbmRvbUNvbCwgcmFuZG9tUm93KS5zdGF0dXMgPT09ICdtaXNzJyk7XG4gICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChyYW5kb21Db2wsIHJhbmRvbVJvdykuc3RhdHVzICE9PSAnaGl0JyAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChyYW5kb21Db2wsIHJhbmRvbVJvdykuc3RhdHVzICE9PSAnbWlzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKHJhbmRvbUNvbCwgcmFuZG9tUm93KTtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChyYW5kb21Db2wsIHJhbmRvbVJvdykuc3RhdHVzID09PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgc2V0TGFzdEhpdCh7IGNvbDogcmFuZG9tQ29sLCByb3c6IHJhbmRvbVJvdyB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmRvbUF0dGFjayBwcmV2SGl0JywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmRvbUF0dGFjayBsYXN0SGl0JywgbGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmRvbUF0dGFjayByYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdCwgY29sOiByYW5kb21Db2wsIHJvdzogcmFuZG9tUm93IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiAnYWxyZWFkeSBzaG90JywgY29sOiByYW5kb21Db2wsIHJvdzogcmFuZG9tUm93IH07XG4gICAgfTtcbiAgICBjb25zdCBmb2xsb3d1cEF0dGFjayA9IChnYW1lYm9hcmQsIGNvbCwgcm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGNvbDogMCwgcm93OiAtMSB9LFxuICAgICAgICAgICAgeyBjb2w6IDAsIHJvdzogMSB9LFxuICAgICAgICAgICAgeyBjb2w6IC0xLCByb3c6IDAgfSxcbiAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgdmFsaWREaXJlY3Rpb25zID0gZGlyZWN0aW9ucy5maWx0ZXIoKGRpcmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSArIGRpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gKE51bWJlcihyb3cpICsgZGlyZWN0aW9uLnJvdykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1Jvdyk7XG4gICAgICAgICAgICBpZiAoY2VsbCAmJiBjZWxsLnN0YXR1cyAhPT0gJ21pc3MnICYmIGNlbGwuc3RhdHVzICE9PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbGlkRGlyZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByYW5kb21EaXJlY3Rpb24gPSB2YWxpZERpcmVjdGlvbnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdmFsaWREaXJlY3Rpb25zLmxlbmd0aCldO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSArIHJhbmRvbURpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gKE51bWJlcihyb3cpICsgcmFuZG9tRGlyZWN0aW9uLnJvdykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKG5ld0NvbCwgbmV3Um93KTtcbiAgICAgICAgICAgIHJhbmdlID0gMTtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1Jvdykuc3RhdHVzID09PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgc2V0TGFzdEhpdCh7IGNvbDogbmV3Q29sLCByb3c6IG5ld1JvdyB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZvbGxvd3VwQXR0YWNrIHByZXZIaXQnLCBwcmV2SGl0KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZm9sbG93dXBBdHRhY2sgbGFzdEhpdCcsIGxhc3RIaXQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmb2xsb3d1cEF0dGFjayByYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdOaWUgbWEgZG9zdMSZcG55Y2gga2llcnVua8OzdyBkbyBhdGFrdScpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgcmFuZ2UgPSAxO1xuICAgIGxldCBnb1JpZ2h0ID0gdHJ1ZTtcbiAgICBsZXQgZ29Eb3duID0gdHJ1ZTtcbiAgICBjb25zdCBmaW5pc2hpbmdBdHRhY2sgPSAoZ2FtZWJvYXJkLCBjb2wsIHJvdywgcHJldkhpdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnc3RhcnQgZmluaXNoaW5nQXR0YWNrIHByZXZIaXQnLCBwcmV2SGl0KTtcbiAgICAgICAgY29uc29sZS5sb2coJ3N0YXJ0IGZpbmlzaGluZ0F0dGFjayBsYXN0SGl0JywgeyBjb2wsIHJvdyB9KTtcbiAgICAgICAgaWYgKHByZXZIaXQucm93ID09PSByb3cpIHtcbiAgICAgICAgICAgIC8vIGhvcml6b250YWwgc2hpcCBjYXNlXG4gICAgICAgICAgICBpZiAoZ29SaWdodCkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gMTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ29SaWdodCcpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb2wgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbC5jaGFyQ29kZUF0KDApICsgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSArIHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKG5ld0NvbCwgcm93KSAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnaGl0JyAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnbWlzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnJlY2VpdmVBdHRhY2sobmV3Q29sLCByb3cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRMYXN0SGl0KHsgY29sOiBuZXdDb2wsIHJvdzogcm93IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmV2SGl0JywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsYXN0SGl0JywgbGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICBnb1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGluZ0F0dGFjayhnYW1lYm9hcmQsIG5ld0NvbCwgcm93LCBwcmV2SGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IDE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dvTGVmdCcpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb2wgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbC5jaGFyQ29kZUF0KDApIC0gcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSAtIHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKG5ld0NvbCwgcm93KSAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnaGl0JyAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnbWlzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnJlY2VpdmVBdHRhY2sobmV3Q29sLCByb3cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRMYXN0SGl0KHsgY29sOiBuZXdDb2wsIHJvdzogcm93IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmV2SGl0JywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsYXN0SGl0JywgbGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICBnb1JpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoaW5nQXR0YWNrKGdhbWVib2FyZCwgbmV3Q29sLCByb3csIHByZXZIaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcmV2SGl0LmNvbCA9PT0gY29sKSB7XG4gICAgICAgICAgICAvLyB2ZXJ0aWNhbCBzaGlwIGNhc2VcbiAgICAgICAgICAgIGlmIChnb0Rvd24pIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IDE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dvRG93bicpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdSb3cgPSAoTnVtYmVyKHJvdykgKyByYW5nZSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgPT09ICdoaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIG5ld1JvdyA9IChOdW1iZXIocm93KSArIHJhbmdlKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgIT09ICdoaXQnICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgIT09ICdtaXNzJykge1xuICAgICAgICAgICAgICAgICAgICBnYW1lYm9hcmQucmVjZWl2ZUF0dGFjayhjb2wsIG5ld1Jvdyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIG5ld1Jvdykuc3RhdHVzID09PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJldkhpdChsYXN0SGl0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldExhc3RIaXQoeyBjb2w6IGNvbCwgcm93OiBuZXdSb3cgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZXZIaXQnLCBwcmV2SGl0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xhc3RIaXQnLCBsYXN0SGl0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmdlJywgcmFuZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGdvRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmaW5pc2hpbmdBdHRhY2soZ2FtZWJvYXJkLCBjb2wsIG5ld1JvdywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSAxO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnb1VwJyk7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1JvdyA9IChOdW1iZXIocm93KSAtIHJhbmdlKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIG5ld1JvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Um93ID0gKE51bWJlcihyb3cpIC0gcmFuZ2UpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIG5ld1JvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpLnN0YXR1cyAhPT0gJ2hpdCcgJiYgZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpLnN0YXR1cyAhPT0gJ21pc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKGNvbCwgbmV3Um93KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgPT09ICdoaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmV2SGl0KGxhc3RIaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGFzdEhpdCh7IGNvbDogY29sLCByb3c6IG5ld1JvdyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJldkhpdCcsIHByZXZIaXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGFzdEhpdCcsIGxhc3RIaXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmFuZ2UnLCByYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZ29Eb3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoaW5nQXR0YWNrKGdhbWVib2FyZCwgY29sLCBuZXdSb3csIHByZXZIaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZ2V0UHJldkhpdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXZIaXQ7XG4gICAgfTtcbiAgICBjb25zdCBnZXRMYXN0SGl0ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbGFzdEhpdDtcbiAgICB9O1xuICAgIGNvbnN0IHNldFByZXZIaXQgPSAobmV3UHJldkhpdCkgPT4ge1xuICAgICAgICBwcmV2SGl0ID0gbmV3UHJldkhpdDtcbiAgICB9O1xuICAgIGNvbnN0IHNldExhc3RIaXQgPSAobmV3TGFzdEhpdCkgPT4ge1xuICAgICAgICBsYXN0SGl0ID0gbmV3TGFzdEhpdDtcbiAgICB9O1xuICAgIHJldHVybiB7IGF0dGFjaywgcmFuZG9tQXR0YWNrLCBmb2xsb3d1cEF0dGFjaywgZmluaXNoaW5nQXR0YWNrLCBwcmV2SGl0LCBsYXN0SGl0LCBnZXRQcmV2SGl0LCBnZXRMYXN0SGl0LCBzZXRQcmV2SGl0LCBzZXRMYXN0SGl0IH07XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxheWVyRmFjdG9yeTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IGNvbnRyb2xsZXIgZnJvbSAnLi9jb250cm9sbGVyJztcbmNvbnN0IHVpID0gKCgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3dyYXBwZXInKTtcbiAgICBjb25zdCBib2FyZHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBib2FyZHMuaWQgPSAnYm9hcmRzJztcbiAgICB3cmFwcGVyLnByZXBlbmQoYm9hcmRzKTtcbiAgICBjb25zdCBwVmNCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheWVyVnNDb21wdXRlcicpO1xuICAgIGNvbnN0IG5ld0dhbWVCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbmV3R2FtZScpO1xuICAgIGNvbnN0IGNWY0J0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb21wdXRlclZzQ29tcHV0ZXInKTtcbiAgICBjb25zdCByb3RhdGVCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm90YXRlU2hpcCcpO1xuICAgIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXJ0Jyk7XG4gICAgY29uc3QgcmFuZG9tQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JhbmRvbVBsYWNlbWVudCcpO1xuICAgIGNvbnN0IGFsbEJ0bnMgPSBbcFZjQnRuLCBuZXdHYW1lQnRuLCBjVmNCdG4sIHJvdGF0ZUJ0biwgc3RhcnRCdG4sIHJhbmRvbUJ0bl07XG4gICAgY29uc3QgY3JlYXRlQ2VsbCA9IChjZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZWxsJyk7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjZWxsLnN0YXR1cyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWNvbCcsIGNlbGwuY29sKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcm93JywgY2VsbC5yb3cpO1xuICAgICAgICBpZiAoY2VsbC50YWtlbkJ5KSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1zaGlwTmFtZScsIGNlbGwudGFrZW5CeS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH07XG4gICAgY29uc3QgcmVuZGVyQ2VsbHMgPSAoZ2FtZWJvYXJkLCBib2FyZCkgPT4ge1xuICAgICAgICBnYW1lYm9hcmQuYXJyYXkuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICByb3cuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IGNyZWF0ZUNlbGwoY29sKTtcbiAgICAgICAgICAgICAgICBib2FyZC5hcHBlbmQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCByZW5kZXJCb2FyZCA9IChnYW1lYm9hcmQpID0+IHtcbiAgICAgICAgY29uc3QgYm9hcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgYm9hcmQuY2xhc3NMaXN0LmFkZCgnYm9hcmQnKTtcbiAgICAgICAgaWYgKGdhbWVib2FyZCA9PT0gY29udHJvbGxlci5odW1hbkdhbWVib2FyZCkge1xuICAgICAgICAgICAgYm9hcmQuaWQgPSAnZmlyc3RCb2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLmNvbXB1dGVyR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBib2FyZC5pZCA9ICdzZWNvbmRCb2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLnRlbXBCb2FyZCkge1xuICAgICAgICAgICAgYm9hcmQuaWQgPSAndGVtcEJvYXJkJztcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJDZWxscyhnYW1lYm9hcmQsIGJvYXJkKTtcbiAgICAgICAgYm9hcmRzLmFwcGVuZChib2FyZCk7XG4gICAgfTtcbiAgICBjb25zdCByZWZyZXNoQm9hcmQgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGxldCBib2FyZElkO1xuICAgICAgICBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLmh1bWFuR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBib2FyZElkID0gJ2ZpcnN0Qm9hcmQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdhbWVib2FyZCA9PT0gY29udHJvbGxlci5jb21wdXRlckdhbWVib2FyZCkge1xuICAgICAgICAgICAgYm9hcmRJZCA9ICdzZWNvbmRCb2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLnRlbXBCb2FyZCkge1xuICAgICAgICAgICAgYm9hcmRJZCA9ICd0ZW1wQm9hcmQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJvYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7Ym9hcmRJZH1gKTtcbiAgICAgICAgYm9hcmQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHJlbmRlckNlbGxzKGdhbWVib2FyZCwgYm9hcmQpO1xuICAgIH07XG4gICAgY29uc3QgZ2V0VXNlcklucHV0ID0gKGUpID0+IHtcbiAgICAgICAgaWYgKCFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpdCcpICYmICFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21pc3MnKSkge1xuICAgICAgICAgICAgY29uc3QgY29sID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbCcpO1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdycpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29sLCByb3cgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlVXNlcklucHV0ID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3NlY29uZEJvYXJkIC5jZWxsJyk7XG4gICAgICAgIGxldCB1c2VySW5wdXQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHVzZXJJbnB1dCA9IHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaXQnKSAmJiAhY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ21pc3MnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRVc2VySW5wdXQoZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSB3aGlsZSAoIXVzZXJJbnB1dCk7XG4gICAgICAgIGNvbnN0IGNvbCA9IHVzZXJJbnB1dC5jb2wudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gdXNlcklucHV0LnJvdy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4geyBjb2wsIHJvdyB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGhhbmRsZVB2QyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB3YWl0aW5nKHRydWUpO1xuICAgICAgICBhbGxCdG5zLmZvckVhY2goKGJ0bikgPT4gKGJ0bi5kaXNhYmxlZCA9IHRydWUpKTtcbiAgICAgICAgcFZjQnRuLnRleHRDb250ZW50ID0gJ1N0YXJ0aW5nLi4uJztcbiAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgICBwVmNCdG4udGV4dENvbnRlbnQgPSAnUGxheWVyIHZzIENvbXB1dGVyJztcbiAgICAgICAgYWxsQnRucy5mb3JFYWNoKChidG4pID0+IChidG4uZGlzYWJsZWQgPSBmYWxzZSkpO1xuICAgICAgICB3YWl0aW5nKGZhbHNlKTtcbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVOZXdHYW1lID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHdhaXRpbmcodHJ1ZSk7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gdHJ1ZSkpO1xuICAgICAgICBuZXdHYW1lQnRuLnRleHRDb250ZW50ID0gJ1Jlc3RhcnRpbmcuLi4nO1xuICAgICAgICB5aWVsZCBjb250cm9sbGVyLm5ld0dhbWUoKTtcbiAgICAgICAgbmV3R2FtZUJ0bi50ZXh0Q29udGVudCA9ICdOZXcgR2FtZSc7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gZmFsc2UpKTtcbiAgICAgICAgd2FpdGluZyhmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3QgaGFuZGxlQ3ZDID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHdhaXRpbmcodHJ1ZSk7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gdHJ1ZSkpO1xuICAgICAgICBjVmNCdG4udGV4dENvbnRlbnQgPSAnU3RhcnRpbmcuLi4nO1xuICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgIGNWY0J0bi50ZXh0Q29udGVudCA9ICdDb21wdXRlciB2cyBDb21wdXRlcic7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gZmFsc2UpKTtcbiAgICAgICAgd2FpdGluZyhmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3QgaGFuZGxlR2FtZU1vZGUgPSAoc2VsZWN0ZWRFbGVtZW50LCBkZXNlbGVjdGVkRWxlbWVudCkgPT4ge1xuICAgICAgICBkZXNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBpZiAoIXNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCA9PT0gcFZjQnRuKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlUHZDKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ID09PSBjVmNCdG4pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVDdkMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdGFydCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB3YWl0aW5nID0gKGJvb2wpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3dhaXQnLCBib29sKTtcbiAgICB9O1xuICAgIGNvbnN0IHNldEJvYXJkUG9pbnRlciA9ICh3aGljaCkgPT4ge1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vjb25kQm9hcmQnKTtcbiAgICAgICAgaWYgKHdoaWNoID09PSAncGxheWVyJykge1xuICAgICAgICAgICAgc2Vjb25kLmNsYXNzTGlzdC5hZGQoJ2JvYXJkT3V0bGluZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdoaWNoID09PSAnY29tcHV0ZXInKSB7XG4gICAgICAgICAgICBzZWNvbmQuY2xhc3NMaXN0LnJlbW92ZSgnYm9hcmRPdXRsaW5lJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZUJvYXJkUG9pbnRlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlY29uZEJvYXJkJyk7XG4gICAgICAgIHNlY29uZC5jbGFzc0xpc3QucmVtb3ZlKCdib2FyZE91dGxpbmUnKTtcbiAgICB9O1xuICAgIGNvbnN0IGNyZWF0ZVNoaXBPdmVybGF5ID0gKGdhbWVib2FyZE5hbWUsIHNoaXBzKSA9PiB7XG4gICAgICAgIHNoaXBzLmZvckVhY2goKGZpcnN0Q2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnN0IHNoaXBOYW1lID0gZmlyc3RDZWxsLnRha2VuQnkubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2hpcFNpemUgPSBmaXJzdENlbGwudGFrZW5CeS5zaXplO1xuICAgICAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IGZpcnN0Q2VsbC50YWtlbkJ5LmlzVmVydGljYWw7XG4gICAgICAgICAgICBzaGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaGlwJywgc2hpcE5hbWUpO1xuICAgICAgICAgICAgc2hpcEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXNpemUnLCBgJHtzaGlwU2l6ZX1gKTtcbiAgICAgICAgICAgIHNoaXBFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJywgYCR7c2hpcE5hbWV9YCk7XG4gICAgICAgICAgICBzaGlwRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICAgICAgICBzaGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2FibGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHNldFNoaXBTdHlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hpcEVsZW1lbnQuc3R5bGUud2lkdGggPSBzaGlwU2l6ZSAqIChjZWxsU2l6ZSAvIDE2KSArICdyZW0nO1xuICAgICAgICAgICAgICAgICAgICBzaGlwRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjZWxsU2l6ZSAvIDE2ICsgJ3JlbSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hpcEVsZW1lbnQuc3R5bGUud2lkdGggPSBjZWxsU2l6ZSAvIDE2ICsgJ3JlbSc7XG4gICAgICAgICAgICAgICAgICAgIHNoaXBFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNoaXBTaXplICogKGNlbGxTaXplIC8gMTYpICsgJ3JlbSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBjZWxsU2l6ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ib2FyZCAuY2VsbCcpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgc2V0U2hpcFN0eWxlKCk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNlbGxTaXplID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJvYXJkIC5jZWxsJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgc2V0U2hpcFN0eWxlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBib2FyZDtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmROYW1lID09PSAnZmlyc3QnKSB7XG4gICAgICAgICAgICAgICAgYm9hcmQgPSAnZmlyc3RCb2FyZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnYW1lYm9hcmROYW1lID09PSAndGVtcCcpIHtcbiAgICAgICAgICAgICAgICBib2FyZCA9ICd0ZW1wQm9hcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlyc3RDZWxsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2JvYXJkfSAuY2VsbFtkYXRhLWNvbD1cIiR7Zmlyc3RDZWxsLmNvbH1cIl1bZGF0YS1yb3c9XCIke2ZpcnN0Q2VsbC5yb3d9XCJdYCk7XG4gICAgICAgICAgICBmaXJzdENlbGxFbGVtZW50LmFwcGVuZENoaWxkKHNoaXBFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBkcmFnQW5kRHJvcCA9IChmaXJzdEdhbWVib2FyZCwgdGVtcEdhbWVib2FyZCwgc2hpcHMpID0+IHtcbiAgICAgICAgbGV0IHNoaXBOYW1lO1xuICAgICAgICBsZXQgc2hpcFNpemU7XG4gICAgICAgIGxldCBncmFiUG9pbnRYID0gMDtcbiAgICAgICAgbGV0IGdyYWJQb2ludFkgPSAwO1xuICAgICAgICBsZXQgc2hpcE9iajtcbiAgICAgICAgbGV0IG9yaWVudGF0aW9uO1xuICAgICAgICBsZXQgaGlnaGxpZ2h0ZWRDZWxscyA9IFtdO1xuICAgICAgICBjb25zdCBzaGlwTmFtZVRvT2JqID0ge1xuICAgICAgICAgICAgY2Fycmllcjogc2hpcHNbMF0sXG4gICAgICAgICAgICBiYXR0bGVzaGlwOiBzaGlwc1sxXSxcbiAgICAgICAgICAgIGRlc3Ryb3llcjogc2hpcHNbMl0sXG4gICAgICAgICAgICBzdWJtYXJpbmU6IHNoaXBzWzNdLFxuICAgICAgICAgICAgcGF0cm9sYm9hdDogc2hpcHNbNF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRyYWdnYWJsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhZ2dhYmxlJyk7XG4gICAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgaGFuZGxlRHJhZ0VuZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaXJzdEJvYXJkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaXJzdEJvYXJkJyk7XG4gICAgICAgIGNvbnN0IHRlbXBCb2FyZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGVtcEJvYXJkJyk7XG4gICAgICAgIGNvbnN0IGZpcnN0Qm9hcmRDZWxscyA9IGZpcnN0Qm9hcmRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jZWxsJyk7XG4gICAgICAgIGNvbnN0IHRlbXBCb2FyZENlbGxzID0gdGVtcEJvYXJkRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2VsbCcpO1xuICAgICAgICBsZXQgbGFzdERyYWdnZWQgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVEcmFnU3RhcnQoZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7XG4gICAgICAgICAgICAgICAgc2hpcE5hbWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcbiAgICAgICAgICAgICAgICBzaGlwU2l6ZSA9IE51bWJlcih0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNpemUnKSk7XG4gICAgICAgICAgICAgICAgZ3JhYlBvaW50WCA9IGUub2Zmc2V0WDtcbiAgICAgICAgICAgICAgICBncmFiUG9pbnRZID0gZS5vZmZzZXRZO1xuICAgICAgICAgICAgICAgIHNoaXBPYmogPSBzaGlwTmFtZVRvT2JqW3NoaXBOYW1lXTtcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IHNoaXBPYmouaXNWZXJ0aWNhbCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYm9hcmQnKS5pZCA9PT0gJ2ZpcnN0Qm9hcmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnJlbW92ZVNoaXAoc2hpcE9iaiwgZmlyc3RHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5ib2FyZCcpLmlkID09PSAndGVtcEJvYXJkJykge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wR2FtZWJvYXJkLnJlbW92ZVNoaXAoc2hpcE9iaiwgdGVtcEdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRHJhZ092ZXIoaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmJvYXJkJykuaWQgPT09ICdmaXJzdEJvYXJkJykge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydENlbGwgPSBpbmRleCAtIChzaGlwT2JqLmlzVmVydGljYWwgPyBNYXRoLmZsb29yKGdyYWJQb2ludFkgLyB0aGlzLm9mZnNldEhlaWdodCkgKiAxMCA6IE1hdGguZmxvb3IoZ3JhYlBvaW50WCAvIHRoaXMub2Zmc2V0V2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9IaWdobGlnaHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGlwU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbEluZGV4ID0gc2hpcE9iai5pc1ZlcnRpY2FsID8gc3RhcnRDZWxsICsgaSAqIDEwIDogc3RhcnRDZWxsICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEJvYXJkQ2VsbHNbY2VsbEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LnB1c2goZmlyc3RCb2FyZENlbGxzW2NlbGxJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkQ2VsbHMucHVzaChmaXJzdEJvYXJkQ2VsbHNbY2VsbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRQbGFjZW1lbnQodG9IaWdobGlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0hpZ2hsaWdodC5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXN0RHJhZ2dlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3REcmFnZ2VkID0gZ2V0TGFzdFNoaXBTaXplRWxlbWVudHMoaGlnaGxpZ2h0ZWRDZWxscywgc2hpcFNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBcdGNvbnNvbGUubG9nKCdzaGlwIGlzIG9uIHRoZSBlZGdlJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYm9hcmQnKS5pZCA9PT0gJ3RlbXBCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDZWxsID0gaW5kZXggLSAoc2hpcE9iai5pc1ZlcnRpY2FsID8gTWF0aC5mbG9vcihncmFiUG9pbnRZIC8gdGhpcy5vZmZzZXRIZWlnaHQpICogMTAgOiBNYXRoLmZsb29yKGdyYWJQb2ludFggLyB0aGlzLm9mZnNldFdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvSGlnaGxpZ2h0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hpcFNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGxJbmRleCA9IHNoaXBPYmouaXNWZXJ0aWNhbCA/IHN0YXJ0Q2VsbCArIGkgKiAxMCA6IHN0YXJ0Q2VsbCArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEJvYXJkQ2VsbHNbY2VsbEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LnB1c2godGVtcEJvYXJkQ2VsbHNbY2VsbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWRDZWxscy5wdXNoKHRlbXBCb2FyZENlbGxzW2NlbGxJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkUGxhY2VtZW50KHRvSGlnaGxpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWdobGlnaHQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdERyYWdnZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RHJhZ2dlZCA9IGdldExhc3RTaGlwU2l6ZUVsZW1lbnRzKGhpZ2hsaWdodGVkQ2VsbHMsIHNoaXBTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gXHRjb25zb2xlLmxvZygnc2hpcCBpcyBvbiB0aGUgZWRnZScpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVEcmFnTGVhdmUoKSB7XG4gICAgICAgICAgICBoaWdobGlnaHRlZENlbGxzLmZvckVhY2goKGhpZ2hsaWdodGVkQ2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkQ2VsbC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZURyb3AoZSkge1xuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRDZWxscy5mb3JFYWNoKChoaWdobGlnaHRlZENlbGwpID0+IHtcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZENlbGwuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBnZXRMYXN0U2hpcFNpemVFbGVtZW50cyhoaWdobGlnaHRlZENlbGxzLCBzaGlwU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmJvYXJkJykuaWQgPT09ICdmaXJzdEJvYXJkJykge1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdEdhbWVib2FyZC5jYW5CZVBsYWNlZChzaGlwT2JqLnNpemUsIGxhc3RbMF0uZGF0YXNldC5jb2wsIGxhc3RbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEdhbWVib2FyZC5wbGFjZVNoaXAoc2hpcE9iaiwgbGFzdFswXS5kYXRhc2V0LmNvbCwgbGFzdFswXS5kYXRhc2V0LnJvdywgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RHYW1lYm9hcmQucGxhY2VTaGlwKHNoaXBPYmosIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQuY29sLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LnJvdywgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmJvYXJkJykuaWQgPT09ICd0ZW1wQm9hcmQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBHYW1lYm9hcmQuY2FuQmVQbGFjZWQoc2hpcE9iai5zaXplLCBsYXN0WzBdLmRhdGFzZXQuY29sLCBsYXN0WzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5wbGFjZVNoaXAoc2hpcE9iaiwgbGFzdFswXS5kYXRhc2V0LmNvbCwgbGFzdFswXS5kYXRhc2V0LnJvdywgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5wbGFjZVNoaXAoc2hpcE9iaiwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5jb2wsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVmcmVzaEJvYXJkKGZpcnN0R2FtZWJvYXJkKTtcbiAgICAgICAgICAgIHJlZnJlc2hCb2FyZCh0ZW1wR2FtZWJvYXJkKTtcbiAgICAgICAgICAgIGNyZWF0ZVNoaXBPdmVybGF5KCdmaXJzdCcsIGZpcnN0R2FtZWJvYXJkLnNoaXBzUGxhY2VkKTtcbiAgICAgICAgICAgIGNyZWF0ZVNoaXBPdmVybGF5KCd0ZW1wJywgdGVtcEdhbWVib2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgICAgICBkcmFnQW5kRHJvcChmaXJzdEdhbWVib2FyZCwgdGVtcEdhbWVib2FyZCwgY29udHJvbGxlci5odW1hblNoaXBzKTtcbiAgICAgICAgICAgIGxhc3REcmFnZ2VkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVEcmFnRW5kKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG4gICAgICAgICAgICBpZiAoaGlnaGxpZ2h0ZWRDZWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5ib2FyZCcpLmlkID09PSAnZmlyc3RCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3REcmFnZ2VkICYmIGZpcnN0R2FtZWJvYXJkLmNhbkJlUGxhY2VkKHNoaXBPYmouc2l6ZSwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5jb2wsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnBsYWNlU2hpcChzaGlwT2JqLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LmNvbCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hCb2FyZChmaXJzdEdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQm9hcmQodGVtcEdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgnZmlyc3QnLCBmaXJzdEdhbWVib2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgndGVtcCcsIHRlbXBHYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ0FuZERyb3AoZmlyc3RHYW1lYm9hcmQsIHRlbXBHYW1lYm9hcmQsIGNvbnRyb2xsZXIuaHVtYW5TaGlwcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYm9hcmQnKS5pZCA9PT0gJ3RlbXBCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3REcmFnZ2VkICYmIHRlbXBHYW1lYm9hcmQuY2FuQmVQbGFjZWQoc2hpcE9iai5zaXplLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LmNvbCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5wbGFjZVNoaXAoc2hpcE9iaiwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5jb2wsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQm9hcmQoZmlyc3RHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEJvYXJkKHRlbXBHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2hpcE92ZXJsYXkoJ2ZpcnN0JywgZmlyc3RHYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2hpcE92ZXJsYXkoJ3RlbXAnLCB0ZW1wR2FtZWJvYXJkLnNoaXBzUGxhY2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdBbmREcm9wKGZpcnN0R2FtZWJvYXJkLCB0ZW1wR2FtZWJvYXJkLCBjb250cm9sbGVyLmh1bWFuU2hpcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVmFsaWRQbGFjZW1lbnQodG9IaWdobGlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiAodG9IaWdobGlnaHQuZXZlcnkoKGNlbGwpID0+IGNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdlbXB0eScpKSAmJlxuICAgICAgICAgICAgICAgICh0b0hpZ2hsaWdodC5ldmVyeSgoY2VsbCkgPT4gY2VsbC5kYXRhc2V0LmNvbCA9PT0gdG9IaWdobGlnaHRbMF0uZGF0YXNldC5jb2wpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LmV2ZXJ5KChjZWxsKSA9PiBjZWxsLmRhdGFzZXQucm93ID09PSB0b0hpZ2hsaWdodFswXS5kYXRhc2V0LnJvdykpICYmXG4gICAgICAgICAgICAgICAgdG9IaWdobGlnaHQubGVuZ3RoID09PSBzaGlwU2l6ZSAmJlxuICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LmV2ZXJ5KChjZWxsKSA9PiBjZWxsLmRhdGFzZXQuY29sID49ICdBJyAmJiBjZWxsLmRhdGFzZXQuY29sIDw9ICdKJykgJiZcbiAgICAgICAgICAgICAgICB0b0hpZ2hsaWdodC5ldmVyeSgoY2VsbCkgPT4gTnVtYmVyKGNlbGwuZGF0YXNldC5yb3cpID49IDEgJiYgTnVtYmVyKGNlbGwuZGF0YXNldC5yb3cpIDw9IDEwKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGFzdFNoaXBTaXplRWxlbWVudHMoaGlnaGxpZ2h0ZWRDZWxscywgc2hpcFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBoaWdobGlnaHRlZENlbGxzLnNsaWNlKE1hdGgubWluKGhpZ2hsaWdodGVkQ2VsbHMubGVuZ3RoIC0gc2hpcFNpemUsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBmaXJzdEJvYXJkQ2VsbHMuZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVEcmFnT3ZlcihpbmRleCkpO1xuICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBoYW5kbGVEcmFnTGVhdmUpO1xuICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZW1wQm9hcmRDZWxscy5mb3JFYWNoKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGhhbmRsZURyYWdPdmVyKGluZGV4KSk7XG4gICAgICAgICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIGhhbmRsZURyYWdMZWF2ZSk7XG4gICAgICAgICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBwVmNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBoYW5kbGVHYW1lTW9kZShwVmNCdG4sIGNWY0J0bikpO1xuICAgIGNWY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGhhbmRsZUdhbWVNb2RlKGNWY0J0biwgcFZjQnRuKSk7XG4gICAgbmV3R2FtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU5ld0dhbWUpO1xuICAgIHJvdGF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbnRyb2xsZXIucm90YXRlU2hpcCgpKTtcbiAgICBzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbnRyb2xsZXIuc3RhcnQoKSk7XG4gICAgcmFuZG9tQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLnRlbXBCb2FyZC5jbGVhckJvYXJkKCk7XG4gICAgICAgIHJlZnJlc2hCb2FyZChjb250cm9sbGVyLnRlbXBCb2FyZCk7XG4gICAgICAgIGNvbnRyb2xsZXIucmFuZG9taXplU2hpcHNQbGFjZW1lbnQoJ2ZpcnN0JywgY29udHJvbGxlci5odW1hbkdhbWVib2FyZCk7XG4gICAgICAgIGRyYWdBbmREcm9wKGNvbnRyb2xsZXIuaHVtYW5HYW1lYm9hcmQsIGNvbnRyb2xsZXIudGVtcEJvYXJkLCBjb250cm9sbGVyLmh1bWFuU2hpcHMpO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlckJvYXJkLFxuICAgICAgICByZWZyZXNoQm9hcmQsXG4gICAgICAgIGhhbmRsZVVzZXJJbnB1dCxcbiAgICAgICAgcFZjQnRuLFxuICAgICAgICBjVmNCdG4sXG4gICAgICAgIHdhaXRpbmcsXG4gICAgICAgIHNldEJvYXJkUG9pbnRlcixcbiAgICAgICAgcmVtb3ZlQm9hcmRQb2ludGVyLFxuICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSxcbiAgICAgICAgZHJhZ0FuZERyb3AsXG4gICAgfTtcbn0pKCk7XG5leHBvcnQgZGVmYXVsdCB1aTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IGdhbWVib2FyZEZhY3RvcnkgZnJvbSAnLi9nYW1lYm9hcmQnO1xuaW1wb3J0IHNoaXBGYWN0b3J5IGZyb20gJy4vc2hpcCc7XG5pbXBvcnQgcGxheWVyRmFjdG9yeSBmcm9tICcuL3BsYXllcic7XG5pbXBvcnQgdWkgZnJvbSAnLi91aSc7XG5jb25zdCBjb250cm9sbGVyID0gKCgpID0+IHtcbiAgICBjb25zdCBodW1hbkdhbWVib2FyZCA9IGdhbWVib2FyZEZhY3RvcnkoKTtcbiAgICBjb25zdCBjb21wdXRlckdhbWVib2FyZCA9IGdhbWVib2FyZEZhY3RvcnkoKTtcbiAgICBjb25zdCB0ZW1wQm9hcmQgPSBnYW1lYm9hcmRGYWN0b3J5KCk7XG4gICAgY29uc3QgaHVtYW4gPSBwbGF5ZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgY29tcHV0ZXIgPSBwbGF5ZXJGYWN0b3J5KCk7XG4gICAgbGV0IGlzU3RvcHBlZCA9IHRydWU7XG4gICAgbGV0IGh1bWFuQ2FycmllciA9IHNoaXBGYWN0b3J5KCdDYXJyaWVyJyk7XG4gICAgbGV0IGh1bWFuQmF0dGxlc2hpcCA9IHNoaXBGYWN0b3J5KCdCYXR0bGVzaGlwJyk7XG4gICAgbGV0IGh1bWFuRGVzdHJveWVyID0gc2hpcEZhY3RvcnkoJ0Rlc3Ryb3llcicpO1xuICAgIGxldCBodW1hblN1Ym1hcmluZSA9IHNoaXBGYWN0b3J5KCdTdWJtYXJpbmUnKTtcbiAgICBsZXQgaHVtYW5QYXRyb2xib2F0ID0gc2hpcEZhY3RvcnkoJ1BhdHJvbEJvYXQnKTtcbiAgICBjb25zdCBodW1hblNoaXBzID0gW2h1bWFuQ2FycmllciwgaHVtYW5CYXR0bGVzaGlwLCBodW1hbkRlc3Ryb3llciwgaHVtYW5TdWJtYXJpbmUsIGh1bWFuUGF0cm9sYm9hdF07XG4gICAgY29uc3QgcG9wdWxhdGVUZW1wQm9hcmQgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBCb2FyZC5wbGFjZVNoaXAoaHVtYW5DYXJyaWVyLCAnQScsICcxJywgJ2hvcml6b250YWwnKTtcbiAgICAgICAgdGVtcEJvYXJkLnBsYWNlU2hpcChodW1hbkJhdHRsZXNoaXAsICdBJywgJzMnLCAnaG9yaXpvbnRhbCcpO1xuICAgICAgICB0ZW1wQm9hcmQucGxhY2VTaGlwKGh1bWFuRGVzdHJveWVyLCAnQScsICc1JywgJ2hvcml6b250YWwnKTtcbiAgICAgICAgdGVtcEJvYXJkLnBsYWNlU2hpcChodW1hblN1Ym1hcmluZSwgJ0EnLCAnNycsICdob3Jpem9udGFsJyk7XG4gICAgICAgIHRlbXBCb2FyZC5wbGFjZVNoaXAoaHVtYW5QYXRyb2xib2F0LCAnQScsICc5JywgJ3ZlcnRpY2FsJyk7XG4gICAgfTtcbiAgICBjb25zdCBpc0dhbWVPdmVyID0gKCkgPT4ge1xuICAgICAgICBpZiAoY29tcHV0ZXJHYW1lYm9hcmQuYWxsU3Vuayhjb21wdXRlckdhbWVib2FyZCkpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdBbGwgY29tcHV0ZXIgc2hpcHMgYXJlIHN1bmsuIEh1bWFuIHBsYXllciB3b24hJyk7XG4gICAgICAgICAgICB1aS5yZW1vdmVCb2FyZFBvaW50ZXIoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChodW1hbkdhbWVib2FyZC5hbGxTdW5rKGh1bWFuR2FtZWJvYXJkKSkge1xuICAgICAgICAgICAgdWkucmVtb3ZlQm9hcmRQb2ludGVyKCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQWxsIGh1bWFuIHNoaXBzIGFyZSBzdW5rLiBDb21wdXRlciBwbGF5ZXIgd29uIScpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgY29uc3QgY29tcHV0ZXJBSSA9IChnYW1lYm9hcmQpID0+IHtcbiAgICAgICAgbGV0IHBsYXllcjtcbiAgICAgICAgaWYgKGdhbWVib2FyZCA9PT0gaHVtYW5HYW1lYm9hcmQpIHtcbiAgICAgICAgICAgIHBsYXllciA9IGNvbXB1dGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdhbWVib2FyZCA9PT0gY29tcHV0ZXJHYW1lYm9hcmQpIHtcbiAgICAgICAgICAgIHBsYXllciA9IGh1bWFuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnYW1lYm9hcmQuaGl0QnV0Tm90U3VuayhnYW1lYm9hcmQpKSB7XG4gICAgICAgICAgICBpZiAocGxheWVyLmdldFByZXZIaXQoKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHBsYXllci5nZXRMYXN0SGl0KCkgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBnYW1lYm9hcmQuZ2V0Q2VsbChwbGF5ZXIuZ2V0TGFzdEhpdCgpLmNvbCwgcGxheWVyLmdldExhc3RIaXQoKS5yb3cpLnRha2VuQnkuaGl0Q291bnQgPj0gMiAmJlxuICAgICAgICAgICAgICAgIGdhbWVib2FyZC5nZXRDZWxsKHBsYXllci5nZXRMYXN0SGl0KCkuY29sLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLnJvdykudGFrZW5CeS5oaXRDb3VudCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0ZJTklTSDogPj0gMiB0cmFmaWVuaWEgdyBzdGF0ZWsnLCBwbGF5ZXIuZ2V0UHJldkhpdCgpKTtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuZmluaXNoaW5nQXR0YWNrKGdhbWVib2FyZCwgcGxheWVyLmdldExhc3RIaXQoKS5jb2wsIHBsYXllci5nZXRMYXN0SGl0KCkucm93LCBwbGF5ZXIuZ2V0UHJldkhpdCgpKTtcbiAgICAgICAgICAgICAgICBnYW1lYm9hcmQuc2lua1NoaXAoZ2FtZWJvYXJkLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLmNvbCwgcGxheWVyLmdldExhc3RIaXQoKS5yb3cpO1xuICAgICAgICAgICAgICAgIGlmIChpc0dhbWVPdmVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGdhbWVib2FyZC5nZXRDZWxsKHBsYXllci5nZXRMYXN0SGl0KCkuY29sLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLnJvdykudGFrZW5CeS5oaXRDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHBsYXllci5mb2xsb3d1cEF0dGFjayhnYW1lYm9hcmQsIHBsYXllci5nZXRMYXN0SGl0KCkuY29sLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLnJvdyk7XG4gICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnNpbmtTaGlwKGdhbWVib2FyZCwgcGxheWVyLmdldExhc3RIaXQoKS5jb2wsIHBsYXllci5nZXRMYXN0SGl0KCkucm93KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNHYW1lT3ZlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbCwgcm93IH0gPSBwbGF5ZXIucmFuZG9tQXR0YWNrKGdhbWVib2FyZCk7XG4gICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwoY29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0UHJldkhpdChwbGF5ZXIuZ2V0TGFzdEhpdCgpKTtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0TGFzdEhpdCh7IGNvbCwgcm93IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS5zdGF0dXMgPT09ICdoaXQnICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS50YWtlbkJ5LmlzU3VuaygpKSB7XG4gICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnNpbmtTaGlwKGdhbWVib2FyZCwgY29sLCByb3cpO1xuICAgICAgICAgICAgICAgIHBsYXllci5zZXRQcmV2SGl0KG51bGwpO1xuICAgICAgICAgICAgICAgIHBsYXllci5zZXRMYXN0SGl0KG51bGwpO1xuICAgICAgICAgICAgICAgIGlmIChpc0dhbWVPdmVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcGxheWVyVnNDb21wdXRlck1vZGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGlzUGxheWVyVHVybiA9IHRydWU7XG4gICAgICAgIHdoaWxlICghaXNHYW1lT3ZlcigpICYmICFpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIGlmIChpc1BsYXllclR1cm4pIHtcbiAgICAgICAgICAgICAgICB1aS5zZXRCb2FyZFBvaW50ZXIoJ3BsYXllcicpO1xuICAgICAgICAgICAgICAgIHVpLndhaXRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29sLCByb3cgfSA9IHlpZWxkIHVpLmhhbmRsZVVzZXJJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGh1bWFuLmF0dGFjayhjb21wdXRlckdhbWVib2FyZCwgY29sLCByb3cpO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVyR2FtZWJvYXJkLnNpbmtTaGlwKGNvbXB1dGVyR2FtZWJvYXJkLCBjb2wsIHJvdyk7XG4gICAgICAgICAgICAgICAgdWkucmVmcmVzaEJvYXJkKGNvbXB1dGVyR2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICBpc1BsYXllclR1cm4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0dhbWVPdmVyKCkgfHwgaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUGxheWVyVHVybikge1xuICAgICAgICAgICAgICAgIHVpLnNldEJvYXJkUG9pbnRlcignY29tcHV0ZXInKTtcbiAgICAgICAgICAgICAgICB1aS53YWl0aW5nKHRydWUpO1xuICAgICAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVpLnBWY0J0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHwgaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlckFJKGh1bWFuR2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICB1aS5yZWZyZXNoQm9hcmQoaHVtYW5HYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIGlzUGxheWVyVHVybiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIHVpLndhaXRpbmcoZmFsc2UpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVyVnNDb21wdXRlck1vZGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdWkucmVtb3ZlQm9hcmRQb2ludGVyKCk7XG4gICAgICAgIGxldCBpc1BsYXllclR1cm4gPSB0cnVlO1xuICAgICAgICB3aGlsZSAoIWlzR2FtZU92ZXIoKSAmJiAhaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB1aS53YWl0aW5nKHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzUGxheWVyVHVybikge1xuICAgICAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVpLmNWY0J0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHwgaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlckFJKGh1bWFuR2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICB1aS5yZWZyZXNoQm9hcmQoaHVtYW5HYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIGlzUGxheWVyVHVybiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzR2FtZU92ZXIoKSB8fCBpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbGF5ZXJUdXJuKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgICAgICAgICAgIGlmICghdWkuY1ZjQnRuLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSB8fCBpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXB1dGVyQUkoY29tcHV0ZXJHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIHVpLnJlZnJlc2hCb2FyZChjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgaXNQbGF5ZXJUdXJuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdWkud2FpdGluZyhmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgcm90YXRlU2hpcCA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JvdGF0ZScpO1xuICAgIH07XG4gICAgY29uc3QgcmFuZG9tUGxhY2VtZW50ID0gKGdhbWVib2FyZCkgPT4ge1xuICAgICAgICBsZXQgYWxsU2hpcHM7XG4gICAgICAgIGlmIChnYW1lYm9hcmQgPT09IGh1bWFuR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBodW1hbkNhcnJpZXIgPSBzaGlwRmFjdG9yeSgnQ2FycmllcicpO1xuICAgICAgICAgICAgaHVtYW5CYXR0bGVzaGlwID0gc2hpcEZhY3RvcnkoJ0JhdHRsZXNoaXAnKTtcbiAgICAgICAgICAgIGh1bWFuRGVzdHJveWVyID0gc2hpcEZhY3RvcnkoJ0Rlc3Ryb3llcicpO1xuICAgICAgICAgICAgaHVtYW5TdWJtYXJpbmUgPSBzaGlwRmFjdG9yeSgnU3VibWFyaW5lJyk7XG4gICAgICAgICAgICBodW1hblBhdHJvbGJvYXQgPSBzaGlwRmFjdG9yeSgnUGF0cm9sQm9hdCcpO1xuICAgICAgICAgICAgYWxsU2hpcHMgPSBbaHVtYW5DYXJyaWVyLCBodW1hbkJhdHRsZXNoaXAsIGh1bWFuRGVzdHJveWVyLCBodW1hblN1Ym1hcmluZSwgaHVtYW5QYXRyb2xib2F0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnYW1lYm9hcmQgPT09IGNvbXB1dGVyR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlckNhcnJpZXIgPSBzaGlwRmFjdG9yeSgnQ2FycmllcicpO1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZXJCYXR0bGVzaGlwID0gc2hpcEZhY3RvcnkoJ0JhdHRsZXNoaXAnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVyRGVzdHJveWVyID0gc2hpcEZhY3RvcnkoJ0Rlc3Ryb3llcicpO1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZXJTdWJtYXJpbmUgPSBzaGlwRmFjdG9yeSgnU3VibWFyaW5lJyk7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlclBhdHJvbGJvYXQgPSBzaGlwRmFjdG9yeSgnUGF0cm9sQm9hdCcpO1xuICAgICAgICAgICAgYWxsU2hpcHMgPSBbY29tcHV0ZXJDYXJyaWVyLCBjb21wdXRlckJhdHRsZXNoaXAsIGNvbXB1dGVyRGVzdHJveWVyLCBjb21wdXRlclN1Ym1hcmluZSwgY29tcHV0ZXJQYXRyb2xib2F0XTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmh1bWFuU2hpcHMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgY29scyA9IFsnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSiddO1xuICAgICAgICBjb25zdCByYW5kb21Db2wgPSAoKSA9PiBjb2xzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNvbHMubGVuZ3RoKV07XG4gICAgICAgIGNvbnN0IHJhbmRvbVJvdyA9ICgpID0+IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHJhbmRvbU9yaWVudGF0aW9uID0gKCkgPT4gKE1hdGgucmFuZG9tKCkgPiAwLjUgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnKTtcbiAgICAgICAgYWxsU2hpcHMuZm9yRWFjaCgoc2hpcCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbCA9IHJhbmRvbUNvbCgpO1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJhbmRvbVJvdygpO1xuICAgICAgICAgICAgbGV0IG9yaWVudGF0aW9uID0gcmFuZG9tT3JpZW50YXRpb24oKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBnYW1lYm9hcmQuY2FuQmVQbGFjZWQoc2hpcC5zaXplLCBjb2wsIHJvdywgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb2wgPSByYW5kb21Db2woKTtcbiAgICAgICAgICAgICAgICByb3cgPSByYW5kb21Sb3coKTtcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IHJhbmRvbU9yaWVudGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2FtZWJvYXJkLmNhbkJlUGxhY2VkKHNoaXAuc2l6ZSwgY29sLCByb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBnYW1lYm9hcmQucGxhY2VTaGlwKHNoaXAsIGNvbCwgcm93LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgLy8gZ2FtZWJvYXJkLnJlc2VydmVTcGFjZShnYW1lYm9hcmQsIGNvbCwgcm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaHVtYW5TaGlwcy5wdXNoKHNoaXApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50ID0gKGdhbWVib2FyZE5hbWUsIGdhbWVib2FyZCkgPT4ge1xuICAgICAgICBnYW1lYm9hcmQuY2xlYXJCb2FyZCgpO1xuICAgICAgICByYW5kb21QbGFjZW1lbnQoZ2FtZWJvYXJkKTtcbiAgICAgICAgdWkucmVmcmVzaEJvYXJkKGdhbWVib2FyZCk7XG4gICAgICAgIGlmIChnYW1lYm9hcmROYW1lID09PSAnZmlyc3QnKSB7XG4gICAgICAgICAgICB1aS5jcmVhdGVTaGlwT3ZlcmxheSgnZmlyc3QnLCBnYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICAgICAgLy8gc2hvdWxkIHdhaXQgaGVyZSBmb3IgaHVtYW5HYW1lYm9hcmQgdG8gYmUgcmVhZHkgYmVmb3JlIHN0YXJ0aW5nLiBBbGwgU2hpcHMgc2hvdWxkIGJlIHBsYWNlZFxuICAgICAgICByYW5kb21pemVTaGlwc1BsYWNlbWVudCgnc2Vjb25kJywgY29tcHV0ZXJHYW1lYm9hcmQpO1xuICAgICAgICBpc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgcGxheWVyVnNDb21wdXRlck1vZGUoKTtcbiAgICB9O1xuICAgIGNvbnN0IHBpY2tHYW1lTW9kZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHVpLmNWY0J0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgIHJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50KCdmaXJzdCcsIGh1bWFuR2FtZWJvYXJkKTtcbiAgICAgICAgICAgIHJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50KCdzZWNvbmQnLCBjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgICAgICBpc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbXB1dGVyVnNDb21wdXRlck1vZGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcmVzdGFydCA9ICgpID0+IHtcbiAgICAgICAgaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaHVtYW4uc2V0UHJldkhpdChudWxsKTtcbiAgICAgICAgaHVtYW4uc2V0TGFzdEhpdChudWxsKTtcbiAgICAgICAgY29tcHV0ZXIuc2V0UHJldkhpdChudWxsKTtcbiAgICAgICAgY29tcHV0ZXIuc2V0TGFzdEhpdChudWxsKTtcbiAgICAgICAgaHVtYW5HYW1lYm9hcmQuY2xlYXJCb2FyZCgpO1xuICAgICAgICBjb21wdXRlckdhbWVib2FyZC5jbGVhckJvYXJkKCk7XG4gICAgICAgIHVpLnJlZnJlc2hCb2FyZChodW1hbkdhbWVib2FyZCk7XG4gICAgICAgIHVpLnJlZnJlc2hCb2FyZChjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgIHBpY2tHYW1lTW9kZSgpO1xuICAgIH07XG4gICAgY29uc3QgbmV3R2FtZSA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgIGlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICByZXN0YXJ0KCk7XG4gICAgfSk7XG4gICAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgdWkucmVuZGVyQm9hcmQoaHVtYW5HYW1lYm9hcmQpO1xuICAgICAgICAvLyB1aS5yZW5kZXJCb2FyZChjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgIHVpLnJlbmRlckJvYXJkKHRlbXBCb2FyZCk7XG4gICAgICAgIHBvcHVsYXRlVGVtcEJvYXJkKCk7XG4gICAgICAgIHVpLnJlZnJlc2hCb2FyZCh0ZW1wQm9hcmQpO1xuICAgICAgICB1aS5jcmVhdGVTaGlwT3ZlcmxheSgndGVtcCcsIHRlbXBCb2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgIHVpLmRyYWdBbmREcm9wKGh1bWFuR2FtZWJvYXJkLCB0ZW1wQm9hcmQsIGh1bWFuU2hpcHMpO1xuICAgICAgICBwaWNrR2FtZU1vZGUoKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGluaXQsIGh1bWFuR2FtZWJvYXJkLCBjb21wdXRlckdhbWVib2FyZCwgdGVtcEJvYXJkLCByZXN0YXJ0LCBuZXdHYW1lLCByb3RhdGVTaGlwLCBzdGFydCwgcmFuZG9taXplU2hpcHNQbGFjZW1lbnQsIGh1bWFuU2hpcHMgfTtcbn0pKCk7XG5leHBvcnQgZGVmYXVsdCBjb250cm9sbGVyO1xuIiwiaW1wb3J0ICdub3JtYWxpemUuY3NzJztcbmltcG9ydCAnLi9zdHlsZS9zdHlsZS5jc3MnO1xuaW1wb3J0IGNvbnRyb2xsZXIgZnJvbSAnLi9tb2R1bGVzL2NvbnRyb2xsZXInO1xuY29udHJvbGxlci5pbml0KCk7XG4iXSwibmFtZXMiOlsiY29scyIsInJvd3MiLCJhcnJheSIsInNoaXBzUGxhY2VkIiwiZ2V0Q2VsbCIsImNvbCIsInJvdyIsImNvbEluZGV4IiwiaW5kZXhPZiIsInJvd0luZGV4Iiwic2V0Q2VsbCIsIm5ld1N0YXR1cyIsIm5ld1Rha2VuQnkiLCJzdGF0dXMiLCJ0YWtlbkJ5IiwiaSIsImoiLCJnZW5lcmF0ZUFycmF5IiwiY2xlYXJCb2FyZCIsInVuZGVmaW5lZCIsImxlbmd0aCIsInJlbW92ZVNoaXAiLCJzaGlwIiwiZ2FtZWJvYXJkIiwiZmxhdCIsImZvckVhY2giLCJjZWxsIiwiYm9hcmRJZCIsIm5hbWUiLCJzcGxpY2UiLCJodW1hbkdhbWVib2FyZCIsImNvbXB1dGVyR2FtZWJvYXJkIiwidGVtcEJvYXJkIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJnZXRBdHRyaWJ1dGUiLCJ0b0xvd2VyQ2FzZSIsInJlbW92ZSIsImFkZCIsInJlbW92ZUF0dHJpYnV0ZSIsInBsYWNlU2hpcCIsIm9yaWVudGF0aW9uIiwiaXNWZXJ0aWNhbCIsImlzSG9yaXpvbnRhbCIsImNlbGxzIiwic3RhcnQiLCJzaGlwQ2VsbHMiLCJzaXplIiwiY3VycmVudENvbCIsImN1cnJlbnRSb3ciLCJwdXNoIiwicmVjZWl2ZUF0dGFjayIsImhpdCIsInJlY2VpdmVBcm91bmQiLCJyZXNlcnZlU3BhY2UiLCJmaWx0ZXIiLCJjIiwiZGlyZWN0aW9uIiwibmV3Q29sIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiY2hhckNvZGVBdCIsIm5ld1JvdyIsIk51bWJlciIsInRvU3RyaW5nIiwiaGl0QnV0Tm90U3VuayIsInNvbWUiLCJpc1N1bmsiLCJzaW5rU2hpcCIsImFsbFN1bmsiLCJ0YWtlbkJ5Q2VsbHMiLCJldmVyeSIsImNhbkJlUGxhY2VkIiwiaGl0Q291bnQiLCJyb3RhdGUiLCJ0aGlzIiwicHJldkhpdCIsImxhc3RIaXQiLCJyYW5nZSIsImdvUmlnaHQiLCJnb0Rvd24iLCJmaW5pc2hpbmdBdHRhY2siLCJjb25zb2xlIiwibG9nIiwic2V0UHJldkhpdCIsInNldExhc3RIaXQiLCJuZXdQcmV2SGl0IiwibmV3TGFzdEhpdCIsImF0dGFjayIsInJlc3VsdCIsInJhbmRvbUF0dGFjayIsInJhbmRvbUNvbCIsInJhbmRvbVJvdyIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImNlaWwiLCJmb2xsb3d1cEF0dGFjayIsInZhbGlkRGlyZWN0aW9ucyIsInJhbmRvbURpcmVjdGlvbiIsImdldFByZXZIaXQiLCJnZXRMYXN0SGl0IiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJ2YWx1ZSIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwiZG9uZSIsInRoZW4iLCJhcHBseSIsInVpIiwid3JhcHBlciIsInF1ZXJ5U2VsZWN0b3IiLCJib2FyZHMiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJwcmVwZW5kIiwicFZjQnRuIiwibmV3R2FtZUJ0biIsImNWY0J0biIsInJvdGF0ZUJ0biIsInN0YXJ0QnRuIiwicmFuZG9tQnRuIiwiYWxsQnRucyIsInJlbmRlckNlbGxzIiwiYm9hcmQiLCJlbGVtZW50Iiwic2V0QXR0cmlidXRlIiwiY3JlYXRlQ2VsbCIsImFwcGVuZCIsInJlZnJlc2hCb2FyZCIsImlubmVySFRNTCIsImdldFVzZXJJbnB1dCIsInRhcmdldCIsImhhbmRsZUdhbWVNb2RlIiwic2VsZWN0ZWRFbGVtZW50IiwiZGVzZWxlY3RlZEVsZW1lbnQiLCJ3YWl0aW5nIiwiYnRuIiwiZGlzYWJsZWQiLCJ0ZXh0Q29udGVudCIsInNldFRpbWVvdXQiLCJyZXN0YXJ0IiwiYm9vbCIsImRvY3VtZW50RWxlbWVudCIsInRvZ2dsZSIsImNyZWF0ZVNoaXBPdmVybGF5IiwiZ2FtZWJvYXJkTmFtZSIsInNoaXBzIiwiZmlyc3RDZWxsIiwic2hpcEVsZW1lbnQiLCJzaGlwTmFtZSIsInNoaXBTaXplIiwic2V0U2hpcFN0eWxlIiwic3R5bGUiLCJ3aWR0aCIsImNlbGxTaXplIiwiaGVpZ2h0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImFwcGVuZENoaWxkIiwiZHJhZ0FuZERyb3AiLCJmaXJzdEdhbWVib2FyZCIsInRlbXBHYW1lYm9hcmQiLCJzaGlwT2JqIiwiZ3JhYlBvaW50WCIsImdyYWJQb2ludFkiLCJoaWdobGlnaHRlZENlbGxzIiwic2hpcE5hbWVUb09iaiIsImNhcnJpZXIiLCJiYXR0bGVzaGlwIiwiZGVzdHJveWVyIiwic3VibWFyaW5lIiwicGF0cm9sYm9hdCIsImRyYWdnYWJsZSIsImhhbmRsZURyYWdTdGFydCIsImhhbmRsZURyYWdFbmQiLCJmaXJzdEJvYXJkRWxlbWVudCIsInRlbXBCb2FyZEVsZW1lbnQiLCJmaXJzdEJvYXJkQ2VsbHMiLCJ0ZW1wQm9hcmRDZWxscyIsImxhc3REcmFnZ2VkIiwidmlzaWJpbGl0eSIsIm9mZnNldFgiLCJvZmZzZXRZIiwiY2xvc2VzdCIsImhhbmRsZURyYWdPdmVyIiwiaW5kZXgiLCJwcmV2ZW50RGVmYXVsdCIsInN0YXJ0Q2VsbCIsIm9mZnNldEhlaWdodCIsIm9mZnNldFdpZHRoIiwidG9IaWdobGlnaHQiLCJjZWxsSW5kZXgiLCJpc1ZhbGlkUGxhY2VtZW50IiwiZ2V0TGFzdFNoaXBTaXplRWxlbWVudHMiLCJoYW5kbGVEcmFnTGVhdmUiLCJoaWdobGlnaHRlZENlbGwiLCJoYW5kbGVEcm9wIiwibGFzdCIsImRhdGFzZXQiLCJodW1hblNoaXBzIiwic2xpY2UiLCJtaW4iLCJuZXdHYW1lIiwicm90YXRlU2hpcCIsInJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50IiwicmVuZGVyQm9hcmQiLCJoYW5kbGVVc2VySW5wdXQiLCJ1c2VySW5wdXQiLCJvbmNlIiwic2V0Qm9hcmRQb2ludGVyIiwid2hpY2giLCJzZWNvbmQiLCJyZW1vdmVCb2FyZFBvaW50ZXIiLCJjb250cm9sbGVyIiwiaHVtYW4iLCJwbGF5ZXIiLCJjb21wdXRlciIsImlzU3RvcHBlZCIsImh1bWFuQ2FycmllciIsImh1bWFuQmF0dGxlc2hpcCIsImh1bWFuRGVzdHJveWVyIiwiaHVtYW5TdWJtYXJpbmUiLCJodW1hblBhdHJvbGJvYXQiLCJpc0dhbWVPdmVyIiwiY29tcHV0ZXJBSSIsImFsbFNoaXBzIiwicmFuZG9tT3JpZW50YXRpb24iLCJyYW5kb21QbGFjZW1lbnQiLCJwaWNrR2FtZU1vZGUiLCJpc1BsYXllclR1cm4iLCJpbml0Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +(()=>{"use strict";const e=()=>{const e=["A","B","C","D","E","F","G","H","I","J"],t=["1","2","3","4","5","6","7","8","9","10"],a=[],o=[],r=(o,r)=>{const s=e.indexOf(o),l=t.indexOf(r);return-1===s||-1===l?null:a[l][s]},s=(o,r,s,l)=>{const i=e.indexOf(o),n=t.indexOf(r);return-1===i||-1===n?null:(a[n][i].status=s,l&&(a[n][i].takenBy=l),a[n][i])};return(()=>{for(let o=0;o<10;o+=1){a[o]=[];for(let r=0;r<10;r+=1)a[o][r]={col:e[r],row:t[o],status:"empty",takenBy:null}}})(),{clearBoard:()=>{for(let e=0;e<10;e+=1)for(let t=0;t<10;t+=1)a[e][t].status="empty",a[e][t].takenBy=void 0;o.length=0},getCell:r,setCell:s,removeShip:(e,t)=>{t.array.flat().forEach((a=>{let r;"taken"===a.status&&a.takenBy.name===e.name&&(a.status="empty",a.takenBy=null),o.forEach((e=>{null===e.takenBy&&o.splice(o.indexOf(e),1)})),t===n.humanGameboard?r="firstBoard":t===n.computerGameboard?r="secondBoard":t===n.tempBoard&&(r="tempBoard");document.querySelectorAll(`#${r} .cell`).forEach((t=>{t.classList.contains("taken")&&t.getAttribute("data-shipName")===e.name.toLowerCase()&&(t.classList.remove("taken"),t.classList.add("empty"),t.removeAttribute("data-shipName"))}))}))},placeShip:(a,l,i,n)=>{a.isVertical="horizontal"!==n;const c="horizontal"===n,d=c?e:t,u=d.indexOf(c?l:i);let h=[];if(u<0||u+a.size>d.length)return!1;for(let e=0;e{const a=r(e,t);return"taken"===a.status?(a.takenBy.hit(),s(e,t,"hit"),a.status):"empty"===a.status||"reserved"===a.status?(s(e,t,"miss"),a.status):null},receiveAround:(e,t)=>{const a=r(e,t);return"empty"===a.status?(s(e,t,"reserved"),a.status):null},reserveSpace:(e,t,a)=>{const o=e.getCell(t,a);if(o&&o.takenBy){e.array.flat().filter((e=>e.takenBy&&e.takenBy.name===o.takenBy.name)).forEach((t=>{[{col:0,row:-1},{col:0,row:1},{col:-1,row:0},{col:1,row:0},{col:-1,row:-1},{col:-1,row:1},{col:1,row:-1},{col:1,row:1}].forEach((a=>{const o=String.fromCharCode(t.col.charCodeAt(0)+a.col),r=(Number(t.row)+a.row).toString();e.getCell(o,r)&&e.receiveAround(o,r)}))}))}},hitButNotSunk:e=>e.array.flat().some((e=>"hit"===e.status&&!1===e.takenBy.isSunk())),sinkShip:(e,t,a)=>{const o=e.getCell(t,a);if(o&&o.takenBy&&o.takenBy.isSunk()){e.array.flat().filter((e=>e.takenBy&&e.takenBy.name===o.takenBy.name)).forEach((t=>{[{col:0,row:-1},{col:0,row:1},{col:-1,row:0},{col:1,row:0},{col:-1,row:-1},{col:-1,row:1},{col:1,row:-1},{col:1,row:1}].forEach((a=>{const o=String.fromCharCode(t.col.charCodeAt(0)+a.col),r=(Number(t.row)+a.row).toString();e.getCell(o,r)&&e.receiveAttack(o,r)}))}))}},allSunk:e=>{let t=e.array.flat().filter((e=>e.takenBy));return!!(t.length>0&&t.every((e=>e.takenBy.isSunk())))},array:a,canBePlaced:(a,o,s,l)=>{const i="horizontal"===l,n=i?e:t,c=n.indexOf(i?o:s);if(c<0||c+a>n.length)return!1;for(let e=0;e{e.array.flat().forEach((e=>{"reserved"===e.status&&s(e.col,e.row,"empty")}))}}},t=e=>{let t;return"Carrier"===e&&(t=5),"Battleship"===e&&(t=4),"Destroyer"===e&&(t=3),"Submarine"===e&&(t=3),"PatrolBoat"===e&&(t=2),{name:e,size:t,hitCount:0,isVertical:!1,rotate(){this.isVertical=!this.isVertical},hit(){this.hitCount+=1},isSunk(){return this.hitCount===t}}},a=()=>{const e=["A","B","C","D","E","F","G","H","I","J"];let t=null,a=null;let o=1,r=!0,s=!0;const l=(e,t,c,d)=>{if(console.log("start finishingAttack prevHit",d),console.log("start finishingAttack lastHit",{col:t,row:c}),d.row===c)if(r){o=1,console.log("goRight");let s=String.fromCharCode(t.charCodeAt(0)+o);for(;e.getCell(s,c)&&"hit"===e.getCell(s,c).status;)o+=1,s=String.fromCharCode(t.charCodeAt(0)+o);e.getCell(s,c)&&"hit"!==e.getCell(s,c).status&&"miss"!==e.getCell(s,c).status?(e.receiveAttack(s,c),"hit"===e.getCell(s,c).status&&(i(a),n({col:s,row:c})),console.log("prevHit",d),console.log("lastHit",a),console.log("range",o),console.log("---------------"),o+=1):(o=1,r=!1,l(e,s,c,d))}else{o=1,console.log("goLeft");let s=String.fromCharCode(t.charCodeAt(0)-o);for(;e.getCell(s,c)&&"hit"===e.getCell(s,c).status;)o+=1,s=String.fromCharCode(t.charCodeAt(0)-o);e.getCell(s,c)&&"hit"!==e.getCell(s,c).status&&"miss"!==e.getCell(s,c).status?(e.receiveAttack(s,c),"hit"===e.getCell(s,c).status&&(i(a),n({col:s,row:c})),console.log("prevHit",d),console.log("lastHit",a),console.log("range",o),console.log("---------------"),o+=1):(o=1,r=!0,l(e,s,c,d))}else if(d.col===t)if(s){o=1,console.log("goDown");let r=(Number(c)+o).toString();for(;e.getCell(t,r)&&"hit"===e.getCell(t,r).status;)o+=1,r=(Number(c)+o).toString();e.getCell(t,r)&&"hit"!==e.getCell(t,r).status&&"miss"!==e.getCell(t,r).status?(e.receiveAttack(t,r),"hit"===e.getCell(t,r).status&&(i(a),n({col:t,row:r})),console.log("prevHit",d),console.log("lastHit",a),console.log("range",o),console.log("---------------"),o+=1):(o=1,s=!1,l(e,t,r,d))}else{o=1,console.log("goUp");let r=(Number(c)-o).toString();for(;e.getCell(t,r)&&"hit"===e.getCell(t,r).status;)o+=1,r=(Number(c)-o).toString();e.getCell(t,r)&&"hit"!==e.getCell(t,r).status&&"miss"!==e.getCell(t,r).status?(e.receiveAttack(t,r),"hit"===e.getCell(t,r).status&&(i(a),n({col:t,row:r})),console.log("prevHit",d),console.log("lastHit",a),console.log("range",o),console.log("---------------"),o+=1):(o=1,s=!0,l(e,t,r,d))}},i=e=>{t=e},n=e=>{a=e};return{attack:(e,t,o)=>{if("hit"!==e.getCell(t,o).status&&"miss"!==e.getCell(t,o).status){let r=e.receiveAttack(t,o);return"hit"===r&&(i(a),n({col:t,row:o})),r}return"already shot"},randomAttack:r=>{let s,l;do{s=e[Math.floor(Math.random()*e.length)],l=Math.ceil(10*Math.random()).toString()}while("hit"===r.getCell(s,l).status||"miss"===r.getCell(s,l).status);if("hit"!==r.getCell(s,l).status&&"miss"!==r.getCell(s,l).status){const e=r.receiveAttack(s,l);return"hit"===r.getCell(s,l).status&&(i(a),n({col:s,row:l}),console.log("---------------"),console.log("randomAttack prevHit",t),console.log("randomAttack lastHit",a),console.log("randomAttack range",o)),{result:e,col:s,row:l}}return{result:"already shot",col:s,row:l}},followupAttack:(e,r,s)=>{const l=[{col:0,row:-1},{col:0,row:1},{col:-1,row:0},{col:1,row:0}].filter((t=>{const a=String.fromCharCode(r.charCodeAt(0)+t.col),o=(Number(s)+t.row).toString(),l=e.getCell(a,o);return!(!l||"miss"===l.status||"hit"===l.status)}));if(l.length>0){const c=l[Math.floor(Math.random()*l.length)],d=String.fromCharCode(r.charCodeAt(0)+c.col),u=(Number(s)+c.row).toString();e.receiveAttack(d,u),o=1,"hit"===e.getCell(d,u).status&&(i(a),n({col:d,row:u}),console.log("---------------"),console.log("followupAttack prevHit",t),console.log("followupAttack lastHit",a),console.log("followupAttack range",o))}else console.log("Nie ma dostępnych kierunków do ataku")},finishingAttack:l,prevHit:t,lastHit:a,getPrevHit:()=>t,getLastHit:()=>a,setPrevHit:i,setLastHit:n}};var o=function(e,t,a,o){return new(a||(a=Promise))((function(r,s){function l(e){try{n(o.next(e))}catch(e){s(e)}}function i(e){try{n(o.throw(e))}catch(e){s(e)}}function n(e){var t;e.done?r(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(l,i)}n((o=o.apply(e,t||[])).next())}))};const r=(()=>{const e=document.querySelector("#wrapper"),t=document.createElement("div");t.id="boards",e.prepend(t);const a=document.querySelector("#playerVsComputer"),r=document.querySelector("#newGame"),s=document.querySelector("#computerVsComputer"),l=document.querySelector("#rotateShip"),i=document.querySelector("#start"),c=document.querySelector("#randomPlacement"),d=[a,r,s,l,i,c],u=(e,t)=>{e.array.forEach((e=>{e.forEach((e=>{const a=(e=>{const t=document.createElement("div");return t.classList.add("cell"),t.classList.add(e.status),t.setAttribute("data-col",e.col),t.setAttribute("data-row",e.row),e.takenBy&&t.setAttribute("data-shipName",e.takenBy.name.toLowerCase()),t})(e);t.append(a)}))}))},h=e=>{let t;e===n.humanGameboard?t="firstBoard":e===n.computerGameboard?t="secondBoard":e===n.tempBoard&&(t="tempBoard");const a=document.querySelector(`#${t}`);a.innerHTML="",u(e,a)},m=e=>{if(!e.target.classList.contains("hit")&&!e.target.classList.contains("miss")){return{col:e.target.getAttribute("data-col"),row:e.target.getAttribute("data-row")}}},g=(e,t)=>{t.classList.remove("selected"),e.classList.contains("selected")||(e.classList.add("selected"),e===a&&o(void 0,void 0,void 0,(function*(){p(!0),d.forEach((e=>e.disabled=!0)),a.textContent="Starting...",yield new Promise((e=>setTimeout(e,1e3))),a.textContent="Player vs Computer",d.forEach((e=>e.disabled=!1)),p(!1)})),e===s&&o(void 0,void 0,void 0,(function*(){p(!0),d.forEach((e=>e.disabled=!0)),s.textContent="Starting...",yield new Promise((e=>setTimeout(e,1e3))),s.textContent="Computer vs Computer",d.forEach((e=>e.disabled=!1)),p(!1)})),n.restart())},p=e=>{document.documentElement.classList.toggle("wait",e)},f=(e,t)=>{t.forEach((t=>{const a=document.createElement("div"),o=t.takenBy.name.toLowerCase(),r=t.takenBy.size,s=t.takenBy.isVertical;a.classList.add("ship",o),a.setAttribute("data-size",`${r}`),a.setAttribute("data-name",`${o}`),a.setAttribute("draggable","true"),a.classList.add("draggable");const l=()=>{s?s&&(a.style.width=n/16+"rem",a.style.height=r*(n/16)+"rem"):(a.style.width=r*(n/16)+"rem",a.style.height=n/16+"rem")};let i,n=document.querySelector(".board .cell").getBoundingClientRect().width;l(),window.addEventListener("resize",(function(){n=document.querySelector(".board .cell").getBoundingClientRect().width,l()})),"first"===e?i="firstBoard":"temp"===e&&(i="tempBoard");document.querySelector(`#${i} .cell[data-col="${t.col}"][data-row="${t.row}"]`).appendChild(a)}))},v=(e,t,a)=>{let o,r,s,l,i=0,c=0,d=[];const u={carrier:a[0],battleship:a[1],destroyer:a[2],submarine:a[3],patrolboat:a[4]};document.querySelectorAll(".draggable").forEach((e=>{e.addEventListener("mousedown",B),e.addEventListener("mouseup",y),e.addEventListener("dragstart",C),e.addEventListener("dragend",A)}));const m=document.querySelector("#firstBoard"),g=document.querySelector("#tempBoard"),p=m.querySelectorAll(".cell"),w=g.querySelectorAll(".cell");let S=null;function B(a){e.removeReservedSpace(e),t.removeReservedSpace(t);const o=a.target.getAttribute("data-name");let r=e.shipsPlaced.filter((e=>o!==e.takenBy.name.toLowerCase())),s=t.shipsPlaced.filter((e=>o!==e.takenBy.name.toLowerCase()));r.forEach((t=>{e.reserveSpace(e,t.col,t.row)})),s.forEach((e=>{t.reserveSpace(t,e.col,e.row)})),h(e),h(t),f("first",e.shipsPlaced),f("temp",t.shipsPlaced),v(e,t,n.humanShips)}function y(){e.shipsPlaced.forEach((t=>{e.reserveSpace(e,t.col,t.row)})),t.shipsPlaced.forEach((e=>{t.reserveSpace(t,e.col,e.row)})),h(e),h(t),f("first",e.shipsPlaced),f("temp",t.shipsPlaced),v(e,t,n.humanShips)}function C(a){setTimeout((()=>{const n=a.target;n.style.visibility="hidden",this.classList.add("dragging"),o=n.getAttribute("data-name"),r=Number(n.getAttribute("data-size")),i=a.offsetX,c=a.offsetY,s=u[o],l=s.isVertical?"vertical":"horizontal","firstBoard"===n.closest(".board").id&&e.removeShip(s,e),"tempBoard"===n.closest(".board").id&&t.removeShip(s,t)}),0)}function k(e){return function(t){const a=t.target;if("firstBoard"===a.closest(".board").id){t.preventDefault();let a=e-(s.isVertical?10*Math.floor(c/this.offsetHeight):Math.floor(i/this.offsetWidth));const o=[];for(let e=0;e{e.classList.add("highlight")})),S||(S=P(d,r)))}if("tempBoard"===a.closest(".board").id){t.preventDefault();let a=e-(s.isVertical?10*Math.floor(c/this.offsetHeight):Math.floor(i/this.offsetWidth));const o=[];for(let e=0;e{e.classList.add("highlight")})),S||(S=P(d,r)))}}}function b(){d.forEach((e=>{e.classList.remove("highlight")})),d=[]}function L(a){d.forEach((e=>{e.classList.remove("highlight")}));const o=P(d,r),i=a.target;"firstBoard"===i.closest(".board").id&&(e.canBePlaced(s.size,o[0].dataset.col,o[0].dataset.row,l)?(e.placeShip(s,o[0].dataset.col,o[0].dataset.row,l),n.humanGameboard.reserveSpace(n.humanGameboard,o[0].dataset.col,o[0].dataset.row)):(e.placeShip(s,S[0].dataset.col,S[0].dataset.row,l),n.humanGameboard.reserveSpace(n.humanGameboard,S[0].dataset.col,S[0].dataset.row))),"tempBoard"===i.closest(".board").id&&(t.canBePlaced(s.size,o[0].dataset.col,o[0].dataset.row,l)?(t.placeShip(s,o[0].dataset.col,o[0].dataset.row,l),n.tempBoard.reserveSpace(n.tempBoard,o[0].dataset.col,o[0].dataset.row)):(t.placeShip(s,S[0].dataset.col,S[0].dataset.row,l),n.tempBoard.reserveSpace(n.tempBoard,S[0].dataset.col,S[0].dataset.row))),e.removeReservedSpace(e),t.removeReservedSpace(t),e.shipsPlaced.forEach((t=>{e.reserveSpace(e,t.col,t.row)})),t.shipsPlaced.forEach((e=>{t.reserveSpace(t,e.col,e.row)})),h(e),h(t),f("first",e.shipsPlaced),f("temp",t.shipsPlaced),v(e,t,n.humanShips),S=null}function A(a){const o=a.target;o.style.visibility="visible",this.classList.remove("dragging"),0===d.length&&("firstBoard"===o.closest(".board").id?S&&e.canBePlaced(s.size,S[0].dataset.col,S[0].dataset.row,l)&&(e.placeShip(s,S[0].dataset.col,S[0].dataset.row,l),e.reserveSpace(e,S[0].dataset.col,S[0].dataset.row),h(e),h(t),f("first",e.shipsPlaced),f("temp",t.shipsPlaced),v(e,t,n.humanShips)):"tempBoard"===o.closest(".board").id&&S&&t.canBePlaced(s.size,S[0].dataset.col,S[0].dataset.row,l)&&(t.placeShip(s,S[0].dataset.col,S[0].dataset.row,l),t.reserveSpace(t,S[0].dataset.col,S[0].dataset.row),h(e),h(t),f("first",e.shipsPlaced),f("temp",t.shipsPlaced),v(e,t,n.humanShips)))}function E(e){return e.every((e=>e.classList.contains("empty")))&&(e.every((t=>t.dataset.col===e[0].dataset.col))||e.every((t=>t.dataset.row===e[0].dataset.row)))&&e.length===r&&e.every((e=>e.dataset.col>="A"&&e.dataset.col<="J"))&&e.every((e=>Number(e.dataset.row)>=1&&Number(e.dataset.row)<=10))}function P(e,t){return e.slice(Math.min(e.length-t,0))}p.forEach(((e,t)=>{e.addEventListener("dragover",k(t)),e.addEventListener("dragleave",b),e.addEventListener("drop",L)})),w.forEach(((e,t)=>{e.addEventListener("dragover",k(t)),e.addEventListener("dragleave",b),e.addEventListener("drop",L)}))};return a.addEventListener("click",(()=>g(a,s))),s.addEventListener("click",(()=>g(s,a))),r.addEventListener("click",(()=>o(void 0,void 0,void 0,(function*(){p(!0),d.forEach((e=>e.disabled=!0)),r.textContent="Restarting...",yield n.newGame(),r.textContent="New Game",d.forEach((e=>e.disabled=!1)),p(!1)})))),l.addEventListener("click",(()=>n.rotateShip())),i.addEventListener("click",(()=>n.start())),c.addEventListener("click",(()=>{n.tempBoard.clearBoard(),h(n.tempBoard),n.randomizeShipsPlacement("first",n.humanGameboard),v(n.humanGameboard,n.tempBoard,n.humanShips)})),{renderBoard:e=>{const a=document.createElement("div");a.classList.add("board"),e===n.humanGameboard?a.id="firstBoard":e===n.computerGameboard?a.id="secondBoard":e===n.tempBoard&&(a.id="tempBoard"),u(e,a),t.append(a)},refreshBoard:h,handleUserInput:()=>o(void 0,void 0,void 0,(function*(){const e=document.querySelectorAll("#secondBoard .cell");let t;do{t=yield new Promise((t=>{e.forEach((e=>{e.classList.contains("hit")||e.classList.contains("miss")||e.addEventListener("click",(e=>{t(m(e))}),{once:!0})}))}))}while(!t);return{col:t.col.toString(),row:t.row.toString()}})),pVcBtn:a,cVcBtn:s,waiting:p,setBoardPointer:e=>{const t=document.querySelector("#secondBoard");"player"===e?t.classList.add("boardOutline"):"computer"===e&&t.classList.remove("boardOutline")},removeBoardPointer:()=>{document.querySelector("#secondBoard").classList.remove("boardOutline")},createShipOverlay:f,dragAndDrop:v}})(),s=r;var l=function(e,t,a,o){return new(a||(a=Promise))((function(r,s){function l(e){try{n(o.next(e))}catch(e){s(e)}}function i(e){try{n(o.throw(e))}catch(e){s(e)}}function n(e){var t;e.done?r(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(l,i)}n((o=o.apply(e,t||[])).next())}))};const i=(()=>{const o=e(),r=e(),n=e(),c=a(),d=a();let u=!0,h=t("Carrier"),m=t("Battleship"),g=t("Destroyer"),p=t("Submarine"),f=t("PatrolBoat");const v=[h,m,g,p,f],w=()=>(r.allSunk(r)||!!o.allSunk(o))&&(s.removeBoardPointer(),!0),S=e=>{let t;if(e===o?t=d:e===r&&(t=c),e.hitButNotSunk(e)){if(null!==t.getPrevHit()&&null!==t.getLastHit()&&e.getCell(t.getLastHit().col,t.getLastHit().row).takenBy.hitCount>=2&&e.getCell(t.getLastHit().col,t.getLastHit().row).takenBy.hitCount<=4){if(t.finishingAttack(e,t.getLastHit().col,t.getLastHit().row,t.getPrevHit()),e.sinkShip(e,t.getLastHit().col,t.getLastHit().row),w())return}else if(1===e.getCell(t.getLastHit().col,t.getLastHit().row).takenBy.hitCount&&(t.followupAttack(e,t.getLastHit().col,t.getLastHit().row),e.sinkShip(e,t.getLastHit().col,t.getLastHit().row),w()))return}else{const{col:a,row:o}=t.randomAttack(e);if("hit"===e.getCell(a,o).status&&(t.setPrevHit(t.getLastHit()),t.setLastHit({col:a,row:o})),"hit"===e.getCell(a,o).status&&e.getCell(a,o).takenBy.isSunk()&&(e.sinkShip(e,a,o),t.setPrevHit(null),t.setLastHit(null),w()))return}},B=(e,a)=>{a.clearBoard(),(e=>{let a;e===o?(h=t("Carrier"),m=t("Battleship"),g=t("Destroyer"),p=t("Submarine"),f=t("PatrolBoat"),a=[h,m,g,p,f]):e===r&&(a=[t("Carrier"),t("Battleship"),t("Destroyer"),t("Submarine"),t("PatrolBoat")]);i.humanShips.length=0;const s=["A","B","C","D","E","F","G","H","I","J"],l=()=>s[Math.floor(Math.random()*s.length)],n=()=>Math.ceil(10*Math.random()).toString(),c=()=>Math.random()>.5?"horizontal":"vertical";a.forEach((t=>{let a=l(),o=n(),r=c(),s=e.canBePlaced(t.size,a,o,r);for(;!s;)a=l(),o=n(),r=c(),s=e.canBePlaced(t.size,a,o,r);s&&(e.placeShip(t,a,o,r),e.reserveSpace(e,a,o)),i.humanShips.push(t)}))})(a),s.refreshBoard(a),"first"===e&&s.createShipOverlay("first",a.shipsPlaced)},y=()=>{s.cVcBtn.classList.contains("selected")&&(B("first",o),B("second",r),u=!1,l(void 0,void 0,void 0,(function*(){s.removeBoardPointer();let e=!0;for(;!w()&&!u;){if(s.waiting(!0),e){if(yield new Promise((e=>setTimeout(e,1e3))),!s.cVcBtn.classList.contains("selected")||u)break;S(o),s.refreshBoard(o),e=!1}if(w()||u)break;if(!e){if(yield new Promise((e=>setTimeout(e,1e3))),!s.cVcBtn.classList.contains("selected")||u)break;S(r),s.refreshBoard(r),e=!0}}u=!1,s.waiting(!1)})))},C=()=>{u=!0,c.setPrevHit(null),c.setLastHit(null),d.setPrevHit(null),d.setLastHit(null),o.clearBoard(),r.clearBoard(),s.refreshBoard(o),s.refreshBoard(r),y()};return{init:()=>{s.renderBoard(o),s.renderBoard(n),n.placeShip(h,"A","1","horizontal"),n.placeShip(m,"A","3","horizontal"),n.placeShip(g,"A","5","horizontal"),n.placeShip(p,"A","7","horizontal"),n.placeShip(f,"A","9","vertical"),n.reserveSpace(n,"A","1"),n.reserveSpace(n,"A","3"),n.reserveSpace(n,"A","5"),n.reserveSpace(n,"A","7"),n.reserveSpace(n,"A","9"),s.refreshBoard(n),s.createShipOverlay("temp",n.shipsPlaced),s.dragAndDrop(o,n,v),y()},humanGameboard:o,computerGameboard:r,tempBoard:n,restart:C,newGame:()=>l(void 0,void 0,void 0,(function*(){u=!0,yield new Promise((e=>setTimeout(e,1e3))),u=!1,C()})),rotateShip:()=>{console.log("rotate")},start:()=>{B("second",r),u=!1,l(void 0,void 0,void 0,(function*(){let e=!0;for(;!w()&&!u;){if(e){s.setBoardPointer("player"),s.waiting(!1);const{col:t,row:a}=yield s.handleUserInput();c.attack(r,t,a),r.sinkShip(r,t,a),s.refreshBoard(r),e=!1}if(w()||u)break;if(!e){if(s.setBoardPointer("computer"),s.waiting(!0),yield new Promise((e=>setTimeout(e,1e3))),!s.pVcBtn.classList.contains("selected")||u)break;S(o),s.refreshBoard(o),e=!0}}u=!1,s.waiting(!1)}))},randomizeShipsPlacement:B,humanShips:v}})(),n=i;n.init()})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQzlDLEVBQUdrQixPQUFPOUYsVUFBVUMsU0FBUyxhQUFleU0sRUFDN0MsTUFFSk8sRUFBV3ROLEdBQ1gsRUFBR2dILGFBQWFoSCxHQUNoQjJOLEdBQWUsQ0FDbkIsQ0FDSixDQUNBWixHQUFZLEVBQ1osRUFBR3hGLFNBQVEsRUFDZixHQXVGMEIsRUFzQ3dFMkUsMEJBQXlCeEIsYUFDOUgsRUE3T2tCLEdBOE9uQixJQ3hQQSxFQUFXa0QsTSIsInNvdXJjZXMiOlsid2VicGFjazovL2JhdHRsZXNoaXAvLi9zcmMvbW9kdWxlcy9nYW1lYm9hcmQudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9tb2R1bGVzL3NoaXAudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9tb2R1bGVzL3BsYXllci50cyIsIndlYnBhY2s6Ly9iYXR0bGVzaGlwLy4vc3JjL21vZHVsZXMvdWkudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9tb2R1bGVzL2NvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vYmF0dGxlc2hpcC8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29udHJvbGxlciBmcm9tICcuL2NvbnRyb2xsZXInO1xuY29uc3QgZ2FtZWJvYXJkRmFjdG9yeSA9ICgpID0+IHtcbiAgICBjb25zdCBjb2xzID0gWydBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJ107XG4gICAgY29uc3Qgcm93cyA9IFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMTAnXTtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGNvbnN0IHNoaXBzUGxhY2VkID0gW107XG4gICAgY29uc3QgZ2VuZXJhdGVBcnJheSA9ICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSArPSAxKSB7XG4gICAgICAgICAgICBhcnJheVtpXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAxMDsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV1bal0gPSB7IGNvbDogY29sc1tqXSwgcm93OiByb3dzW2ldLCBzdGF0dXM6ICdlbXB0eScsIHRha2VuQnk6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgY2xlYXJCb2FyZCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSArPSAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDEwOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXVtqXS5zdGF0dXMgPSAnZW1wdHknO1xuICAgICAgICAgICAgICAgIGFycmF5W2ldW2pdLnRha2VuQnkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2hpcHNQbGFjZWQubGVuZ3RoID0gMDtcbiAgICB9O1xuICAgIGNvbnN0IGdldENlbGwgPSAoY29sLCByb3cpID0+IHtcbiAgICAgICAgY29uc3QgY29sSW5kZXggPSBjb2xzLmluZGV4T2YoY29sKTtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICAgICAgaWYgKGNvbEluZGV4ID09PSAtMSB8fCByb3dJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVtyb3dJbmRleF1bY29sSW5kZXhdO1xuICAgIH07XG4gICAgY29uc3Qgc2V0Q2VsbCA9IChjb2wsIHJvdywgbmV3U3RhdHVzLCBuZXdUYWtlbkJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ID0gY29scy5pbmRleE9mKGNvbCk7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gcm93cy5pbmRleE9mKHJvdyk7XG4gICAgICAgIGlmIChjb2xJbmRleCA9PT0gLTEgfHwgcm93SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBhcnJheVtyb3dJbmRleF1bY29sSW5kZXhdLnN0YXR1cyA9IG5ld1N0YXR1cztcbiAgICAgICAgaWYgKG5ld1Rha2VuQnkpIHtcbiAgICAgICAgICAgIGFycmF5W3Jvd0luZGV4XVtjb2xJbmRleF0udGFrZW5CeSA9IG5ld1Rha2VuQnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5W3Jvd0luZGV4XVtjb2xJbmRleF07XG4gICAgfTtcbiAgICBjb25zdCByZW1vdmVTaGlwID0gKHNoaXAsIGdhbWVib2FyZCkgPT4ge1xuICAgICAgICBjb25zdCBnYW1lYm9hcmRDZWxscyA9IGdhbWVib2FyZC5hcnJheS5mbGF0KCk7XG4gICAgICAgIGdhbWVib2FyZENlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgIGlmIChjZWxsLnN0YXR1cyA9PT0gJ3Rha2VuJyAmJiBjZWxsLnRha2VuQnkubmFtZSA9PT0gc2hpcC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgY2VsbC5zdGF0dXMgPSAnZW1wdHknO1xuICAgICAgICAgICAgICAgIGNlbGwudGFrZW5CeSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGlwc1BsYWNlZC5mb3JFYWNoKChzaGlwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNoaXAudGFrZW5CeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzaGlwc1BsYWNlZC5zcGxpY2Uoc2hpcHNQbGFjZWQuaW5kZXhPZihzaGlwKSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYm9hcmRJZDtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmQgPT09IGNvbnRyb2xsZXIuaHVtYW5HYW1lYm9hcmQpIHtcbiAgICAgICAgICAgICAgICBib2FyZElkID0gJ2ZpcnN0Qm9hcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLmNvbXB1dGVyR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICAgICAgYm9hcmRJZCA9ICdzZWNvbmRCb2FyZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnYW1lYm9hcmQgPT09IGNvbnRyb2xsZXIudGVtcEJvYXJkKSB7XG4gICAgICAgICAgICAgICAgYm9hcmRJZCA9ICd0ZW1wQm9hcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAjJHtib2FyZElkfSAuY2VsbGApO1xuICAgICAgICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjZWxsLmNsYXNzTGlzdC5jb250YWlucygndGFrZW4nKSAmJiBjZWxsLmdldEF0dHJpYnV0ZSgnZGF0YS1zaGlwTmFtZScpID09PSBzaGlwLm5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ3Rha2VuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnZW1wdHknKTtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2hpcE5hbWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBwbGFjZVNoaXAgPSAoc2hpcCwgY29sLCByb3csIG9yaWVudGF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgICBzaGlwLmlzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNoaXAuaXNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICAgICAgY29uc3QgY2VsbHMgPSBpc0hvcml6b250YWwgPyBjb2xzIDogcm93cztcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBjZWxscy5pbmRleE9mKGlzSG9yaXpvbnRhbCA/IGNvbCA6IHJvdyk7XG4gICAgICAgIGxldCBzaGlwQ2VsbHMgPSBbXTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCArIHNoaXAuc2l6ZSA+IGNlbGxzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hpcC5zaXplOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb2wgPSBpc0hvcml6b250YWwgPyBjZWxsc1tzdGFydCArIGldIDogY29sO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvdyA9IGlzSG9yaXpvbnRhbCA/IHJvdyA6IGNlbGxzW3N0YXJ0ICsgaV07XG4gICAgICAgICAgICBpZiAoZ2V0Q2VsbChjdXJyZW50Q29sLCBjdXJyZW50Um93KS5zdGF0dXMgIT09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDZWxsKGN1cnJlbnRDb2wsIGN1cnJlbnRSb3csICd0YWtlbicsIHNoaXApO1xuICAgICAgICAgICAgc2hpcENlbGxzLnB1c2goZ2V0Q2VsbChjdXJyZW50Q29sLCBjdXJyZW50Um93KSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hpcHNQbGFjZWQucHVzaChzaGlwQ2VsbHNbMF0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IGNhbkJlUGxhY2VkID0gKHNpemUsIGNvbCwgcm93LCBvcmllbnRhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgICBjb25zdCBjZWxscyA9IGlzSG9yaXpvbnRhbCA/IGNvbHMgOiByb3dzO1xuICAgICAgICBjb25zdCBzdGFydCA9IGNlbGxzLmluZGV4T2YoaXNIb3Jpem9udGFsID8gY29sIDogcm93KTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCArIHNpemUgPiBjZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbCA9IGlzSG9yaXpvbnRhbCA/IGNlbGxzW3N0YXJ0ICsgaV0gOiBjb2w7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gaXNIb3Jpem9udGFsID8gcm93IDogY2VsbHNbc3RhcnQgKyBpXTtcbiAgICAgICAgICAgIGlmIChnZXRDZWxsKGN1cnJlbnRDb2wsIGN1cnJlbnRSb3cpLnN0YXR1cyAhPT0gJ2VtcHR5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IHJlY2VpdmVBdHRhY2sgPSAoY29sLCByb3cpID0+IHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGdldENlbGwoY29sLCByb3cpO1xuICAgICAgICBpZiAoY2VsbC5zdGF0dXMgPT09ICd0YWtlbicpIHtcbiAgICAgICAgICAgIGNlbGwudGFrZW5CeS5oaXQoKTtcbiAgICAgICAgICAgIHNldENlbGwoY29sLCByb3csICdoaXQnKTtcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2VsbC5zdGF0dXMgPT09ICdlbXB0eScgfHwgY2VsbC5zdGF0dXMgPT09ICdyZXNlcnZlZCcpIHtcbiAgICAgICAgICAgIHNldENlbGwoY29sLCByb3csICdtaXNzJyk7XG4gICAgICAgICAgICByZXR1cm4gY2VsbC5zdGF0dXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBjb25zdCByZWNlaXZlQXJvdW5kID0gKGNvbCwgcm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSBnZXRDZWxsKGNvbCwgcm93KTtcbiAgICAgICAgaWYgKGNlbGwuc3RhdHVzID09PSAnZW1wdHknKSB7XG4gICAgICAgICAgICBzZXRDZWxsKGNvbCwgcm93LCAncmVzZXJ2ZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIGNvbnN0IHJlc2VydmVTcGFjZSA9IChnYW1lYm9hcmQsIGNvbCwgcm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSBnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIHJvdyk7XG4gICAgICAgIGlmIChjZWxsICYmIGNlbGwudGFrZW5CeSkge1xuICAgICAgICAgICAgY29uc3Qgc2hpcENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKS5maWx0ZXIoKGMpID0+IGMudGFrZW5CeSAmJiBjLnRha2VuQnkubmFtZSA9PT0gY2VsbC50YWtlbkJ5Lm5hbWUpO1xuICAgICAgICAgICAgc2hpcENlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAtMSB9LFxuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBjb2w6IC0xLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDEgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMuZm9yRWFjaCgoZGlyZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2VsbC5jb2wuY2hhckNvZGVBdCgwKSArIGRpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3cgPSAoTnVtYmVyKGNlbGwucm93KSArIGRpcmVjdGlvbi5yb3cpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1JvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXJvdW5kKG5ld0NvbCwgbmV3Um93KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZVJlc2VydmVkU3BhY2UgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhbWVib2FyZENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKTtcbiAgICAgICAgZ2FtZWJvYXJkQ2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNlbGwuc3RhdHVzID09PSAncmVzZXJ2ZWQnKSB7XG4gICAgICAgICAgICAgICAgc2V0Q2VsbChjZWxsLmNvbCwgY2VsbC5yb3csICdlbXB0eScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHNpbmtTaGlwID0gKGdhbWVib2FyZCwgY29sLCByb3cpID0+IHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KTtcbiAgICAgICAgaWYgKGNlbGwgJiYgY2VsbC50YWtlbkJ5ICYmIGNlbGwudGFrZW5CeS5pc1N1bmsoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2hpcENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKS5maWx0ZXIoKGMpID0+IGMudGFrZW5CeSAmJiBjLnRha2VuQnkubmFtZSA9PT0gY2VsbC50YWtlbkJ5Lm5hbWUpO1xuICAgICAgICAgICAgc2hpcENlbGxzLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAtMSB9LFxuICAgICAgICAgICAgICAgICAgICB7IGNvbDogMCwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBjb2w6IC0xLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAtMSwgcm93OiAxIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IC0xIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDEgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMuZm9yRWFjaCgoZGlyZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2VsbC5jb2wuY2hhckNvZGVBdCgwKSArIGRpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3cgPSAoTnVtYmVyKGNlbGwucm93KSArIGRpcmVjdGlvbi5yb3cpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1JvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKG5ld0NvbCwgbmV3Um93KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGhpdEJ1dE5vdFN1bmsgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhbWVib2FyZENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKTtcbiAgICAgICAgcmV0dXJuIGdhbWVib2FyZENlbGxzLnNvbWUoKGNlbGwpID0+IHtcbiAgICAgICAgICAgIGlmIChjZWxsLnN0YXR1cyA9PT0gJ2hpdCcgJiYgY2VsbC50YWtlbkJ5LmlzU3VuaygpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGFsbFN1bmsgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhbWVib2FyZENlbGxzID0gZ2FtZWJvYXJkLmFycmF5LmZsYXQoKTtcbiAgICAgICAgbGV0IHRha2VuQnlDZWxscyA9IGdhbWVib2FyZENlbGxzLmZpbHRlcigoY2VsbCkgPT4gY2VsbC50YWtlbkJ5KTtcbiAgICAgICAgaWYgKHRha2VuQnlDZWxscy5sZW5ndGggPiAwICYmIHRha2VuQnlDZWxscy5ldmVyeSgoY2VsbCkgPT4gY2VsbC50YWtlbkJ5LmlzU3VuaygpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGdlbmVyYXRlQXJyYXkoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjbGVhckJvYXJkLFxuICAgICAgICBnZXRDZWxsLFxuICAgICAgICBzZXRDZWxsLFxuICAgICAgICByZW1vdmVTaGlwLFxuICAgICAgICBwbGFjZVNoaXAsXG4gICAgICAgIHJlY2VpdmVBdHRhY2ssXG4gICAgICAgIHJlY2VpdmVBcm91bmQsXG4gICAgICAgIHJlc2VydmVTcGFjZSxcbiAgICAgICAgaGl0QnV0Tm90U3VuayxcbiAgICAgICAgc2lua1NoaXAsXG4gICAgICAgIGFsbFN1bmssXG4gICAgICAgIGFycmF5LFxuICAgICAgICBjYW5CZVBsYWNlZCxcbiAgICAgICAgc2hpcHNQbGFjZWQsXG4gICAgICAgIHJlbW92ZVJlc2VydmVkU3BhY2UsXG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBnYW1lYm9hcmRGYWN0b3J5O1xuIiwiY29uc3Qgc2hpcEZhY3RvcnkgPSAobmFtZSkgPT4ge1xuICAgIGxldCBzaXplO1xuICAgIGlmIChuYW1lID09PSAnQ2FycmllcicpIHtcbiAgICAgICAgc2l6ZSA9IDU7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnQmF0dGxlc2hpcCcpIHtcbiAgICAgICAgc2l6ZSA9IDQ7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnRGVzdHJveWVyJykge1xuICAgICAgICBzaXplID0gMztcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdTdWJtYXJpbmUnKSB7XG4gICAgICAgIHNpemUgPSAzO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ1BhdHJvbEJvYXQnKSB7XG4gICAgICAgIHNpemUgPSAyO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplLFxuICAgICAgICBoaXRDb3VudDogMCxcbiAgICAgICAgaXNWZXJ0aWNhbDogZmFsc2UsXG4gICAgICAgIHJvdGF0ZSgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWZXJ0aWNhbCA9ICF0aGlzLmlzVmVydGljYWw7XG4gICAgICAgIH0sXG4gICAgICAgIGhpdCgpIHtcbiAgICAgICAgICAgIHRoaXMuaGl0Q291bnQgKz0gMTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNTdW5rKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGl0Q291bnQgPT09IHNpemU7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBzaGlwRmFjdG9yeTtcbiIsImNvbnN0IHBsYXllckZhY3RvcnkgPSAoKSA9PiB7XG4gICAgY29uc3QgY29scyA9IFsnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSiddO1xuICAgIGxldCBwcmV2SGl0ID0gbnVsbDtcbiAgICBsZXQgbGFzdEhpdCA9IG51bGw7XG4gICAgY29uc3QgYXR0YWNrID0gKGdhbWVib2FyZCwgY29sLCByb3cpID0+IHtcbiAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS5zdGF0dXMgIT09ICdoaXQnICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS5zdGF0dXMgIT09ICdtaXNzJykge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKGNvbCwgcm93KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdoaXQnKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJldkhpdChsYXN0SGl0KTtcbiAgICAgICAgICAgICAgICBzZXRMYXN0SGl0KHsgY29sOiBjb2wsIHJvdzogcm93IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2FscmVhZHkgc2hvdCc7XG4gICAgfTtcbiAgICBjb25zdCByYW5kb21BdHRhY2sgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGxldCByYW5kb21Db2w7XG4gICAgICAgIGxldCByYW5kb21Sb3c7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHJhbmRvbUNvbCA9IGNvbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29scy5sZW5ndGgpXTtcbiAgICAgICAgICAgIHJhbmRvbVJvdyA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gd2hpbGUgKGdhbWVib2FyZC5nZXRDZWxsKHJhbmRvbUNvbCwgcmFuZG9tUm93KS5zdGF0dXMgPT09ICdoaXQnIHx8IGdhbWVib2FyZC5nZXRDZWxsKHJhbmRvbUNvbCwgcmFuZG9tUm93KS5zdGF0dXMgPT09ICdtaXNzJyk7XG4gICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChyYW5kb21Db2wsIHJhbmRvbVJvdykuc3RhdHVzICE9PSAnaGl0JyAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChyYW5kb21Db2wsIHJhbmRvbVJvdykuc3RhdHVzICE9PSAnbWlzcycpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKHJhbmRvbUNvbCwgcmFuZG9tUm93KTtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChyYW5kb21Db2wsIHJhbmRvbVJvdykuc3RhdHVzID09PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgc2V0TGFzdEhpdCh7IGNvbDogcmFuZG9tQ29sLCByb3c6IHJhbmRvbVJvdyB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmRvbUF0dGFjayBwcmV2SGl0JywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmRvbUF0dGFjayBsYXN0SGl0JywgbGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmRvbUF0dGFjayByYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdCwgY29sOiByYW5kb21Db2wsIHJvdzogcmFuZG9tUm93IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiAnYWxyZWFkeSBzaG90JywgY29sOiByYW5kb21Db2wsIHJvdzogcmFuZG9tUm93IH07XG4gICAgfTtcbiAgICBjb25zdCBmb2xsb3d1cEF0dGFjayA9IChnYW1lYm9hcmQsIGNvbCwgcm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGNvbDogMCwgcm93OiAtMSB9LFxuICAgICAgICAgICAgeyBjb2w6IDAsIHJvdzogMSB9LFxuICAgICAgICAgICAgeyBjb2w6IC0xLCByb3c6IDAgfSxcbiAgICAgICAgICAgIHsgY29sOiAxLCByb3c6IDAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgdmFsaWREaXJlY3Rpb25zID0gZGlyZWN0aW9ucy5maWx0ZXIoKGRpcmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSArIGRpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gKE51bWJlcihyb3cpICsgZGlyZWN0aW9uLnJvdykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1Jvdyk7XG4gICAgICAgICAgICBpZiAoY2VsbCAmJiBjZWxsLnN0YXR1cyAhPT0gJ21pc3MnICYmIGNlbGwuc3RhdHVzICE9PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbGlkRGlyZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByYW5kb21EaXJlY3Rpb24gPSB2YWxpZERpcmVjdGlvbnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdmFsaWREaXJlY3Rpb25zLmxlbmd0aCldO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSArIHJhbmRvbURpcmVjdGlvbi5jb2wpO1xuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gKE51bWJlcihyb3cpICsgcmFuZG9tRGlyZWN0aW9uLnJvdykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKG5ld0NvbCwgbmV3Um93KTtcbiAgICAgICAgICAgIHJhbmdlID0gMTtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIG5ld1Jvdykuc3RhdHVzID09PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgc2V0TGFzdEhpdCh7IGNvbDogbmV3Q29sLCByb3c6IG5ld1JvdyB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZvbGxvd3VwQXR0YWNrIHByZXZIaXQnLCBwcmV2SGl0KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZm9sbG93dXBBdHRhY2sgbGFzdEhpdCcsIGxhc3RIaXQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmb2xsb3d1cEF0dGFjayByYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdOaWUgbWEgZG9zdMSZcG55Y2gga2llcnVua8OzdyBkbyBhdGFrdScpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgcmFuZ2UgPSAxO1xuICAgIGxldCBnb1JpZ2h0ID0gdHJ1ZTtcbiAgICBsZXQgZ29Eb3duID0gdHJ1ZTtcbiAgICBjb25zdCBmaW5pc2hpbmdBdHRhY2sgPSAoZ2FtZWJvYXJkLCBjb2wsIHJvdywgcHJldkhpdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnc3RhcnQgZmluaXNoaW5nQXR0YWNrIHByZXZIaXQnLCBwcmV2SGl0KTtcbiAgICAgICAgY29uc29sZS5sb2coJ3N0YXJ0IGZpbmlzaGluZ0F0dGFjayBsYXN0SGl0JywgeyBjb2wsIHJvdyB9KTtcbiAgICAgICAgaWYgKHByZXZIaXQucm93ID09PSByb3cpIHtcbiAgICAgICAgICAgIC8vIGhvcml6b250YWwgc2hpcCBjYXNlXG4gICAgICAgICAgICBpZiAoZ29SaWdodCkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gMTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ29SaWdodCcpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb2wgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbC5jaGFyQ29kZUF0KDApICsgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSArIHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKG5ld0NvbCwgcm93KSAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnaGl0JyAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnbWlzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnJlY2VpdmVBdHRhY2sobmV3Q29sLCByb3cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRMYXN0SGl0KHsgY29sOiBuZXdDb2wsIHJvdzogcm93IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmV2SGl0JywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsYXN0SGl0JywgbGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICBnb1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGluZ0F0dGFjayhnYW1lYm9hcmQsIG5ld0NvbCwgcm93LCBwcmV2SGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IDE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dvTGVmdCcpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdDb2wgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbC5jaGFyQ29kZUF0KDApIC0gcmFuZ2UpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2wuY2hhckNvZGVBdCgwKSAtIHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKG5ld0NvbCwgcm93KSAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnaGl0JyAmJiBnYW1lYm9hcmQuZ2V0Q2VsbChuZXdDb2wsIHJvdykuc3RhdHVzICE9PSAnbWlzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnJlY2VpdmVBdHRhY2sobmV3Q29sLCByb3cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwobmV3Q29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZIaXQobGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRMYXN0SGl0KHsgY29sOiBuZXdDb2wsIHJvdzogcm93IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmV2SGl0JywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsYXN0SGl0JywgbGFzdEhpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyYW5nZScsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICBnb1JpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoaW5nQXR0YWNrKGdhbWVib2FyZCwgbmV3Q29sLCByb3csIHByZXZIaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcmV2SGl0LmNvbCA9PT0gY29sKSB7XG4gICAgICAgICAgICAvLyB2ZXJ0aWNhbCBzaGlwIGNhc2VcbiAgICAgICAgICAgIGlmIChnb0Rvd24pIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IDE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dvRG93bicpO1xuICAgICAgICAgICAgICAgIGxldCBuZXdSb3cgPSAoTnVtYmVyKHJvdykgKyByYW5nZSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgPT09ICdoaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIG5ld1JvdyA9IChOdW1iZXIocm93KSArIHJhbmdlKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgIT09ICdoaXQnICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgIT09ICdtaXNzJykge1xuICAgICAgICAgICAgICAgICAgICBnYW1lYm9hcmQucmVjZWl2ZUF0dGFjayhjb2wsIG5ld1Jvdyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIG5ld1Jvdykuc3RhdHVzID09PSAnaGl0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJldkhpdChsYXN0SGl0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldExhc3RIaXQoeyBjb2w6IGNvbCwgcm93OiBuZXdSb3cgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZXZIaXQnLCBwcmV2SGl0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xhc3RIaXQnLCBsYXN0SGl0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JhbmdlJywgcmFuZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGdvRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmaW5pc2hpbmdBdHRhY2soZ2FtZWJvYXJkLCBjb2wsIG5ld1JvdywgcHJldkhpdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSAxO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnb1VwJyk7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1JvdyA9IChOdW1iZXIocm93KSAtIHJhbmdlKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIG5ld1JvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Um93ID0gKE51bWJlcihyb3cpIC0gcmFuZ2UpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnYW1lYm9hcmQuZ2V0Q2VsbChjb2wsIG5ld1JvdykgJiYgZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpLnN0YXR1cyAhPT0gJ2hpdCcgJiYgZ2FtZWJvYXJkLmdldENlbGwoY29sLCBuZXdSb3cpLnN0YXR1cyAhPT0gJ21pc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIGdhbWVib2FyZC5yZWNlaXZlQXR0YWNrKGNvbCwgbmV3Um93KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgbmV3Um93KS5zdGF0dXMgPT09ICdoaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmV2SGl0KGxhc3RIaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGFzdEhpdCh7IGNvbDogY29sLCByb3c6IG5ld1JvdyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJldkhpdCcsIHByZXZIaXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGFzdEhpdCcsIGxhc3RIaXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmFuZ2UnLCByYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZ29Eb3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoaW5nQXR0YWNrKGdhbWVib2FyZCwgY29sLCBuZXdSb3csIHByZXZIaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZ2V0UHJldkhpdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXZIaXQ7XG4gICAgfTtcbiAgICBjb25zdCBnZXRMYXN0SGl0ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbGFzdEhpdDtcbiAgICB9O1xuICAgIGNvbnN0IHNldFByZXZIaXQgPSAobmV3UHJldkhpdCkgPT4ge1xuICAgICAgICBwcmV2SGl0ID0gbmV3UHJldkhpdDtcbiAgICB9O1xuICAgIGNvbnN0IHNldExhc3RIaXQgPSAobmV3TGFzdEhpdCkgPT4ge1xuICAgICAgICBsYXN0SGl0ID0gbmV3TGFzdEhpdDtcbiAgICB9O1xuICAgIHJldHVybiB7IGF0dGFjaywgcmFuZG9tQXR0YWNrLCBmb2xsb3d1cEF0dGFjaywgZmluaXNoaW5nQXR0YWNrLCBwcmV2SGl0LCBsYXN0SGl0LCBnZXRQcmV2SGl0LCBnZXRMYXN0SGl0LCBzZXRQcmV2SGl0LCBzZXRMYXN0SGl0IH07XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxheWVyRmFjdG9yeTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IGNvbnRyb2xsZXIgZnJvbSAnLi9jb250cm9sbGVyJztcbmNvbnN0IHVpID0gKCgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3dyYXBwZXInKTtcbiAgICBjb25zdCBib2FyZHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBib2FyZHMuaWQgPSAnYm9hcmRzJztcbiAgICB3cmFwcGVyLnByZXBlbmQoYm9hcmRzKTtcbiAgICBjb25zdCBwVmNCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheWVyVnNDb21wdXRlcicpO1xuICAgIGNvbnN0IG5ld0dhbWVCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbmV3R2FtZScpO1xuICAgIGNvbnN0IGNWY0J0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb21wdXRlclZzQ29tcHV0ZXInKTtcbiAgICBjb25zdCByb3RhdGVCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm90YXRlU2hpcCcpO1xuICAgIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXJ0Jyk7XG4gICAgY29uc3QgcmFuZG9tQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JhbmRvbVBsYWNlbWVudCcpO1xuICAgIGNvbnN0IGFsbEJ0bnMgPSBbcFZjQnRuLCBuZXdHYW1lQnRuLCBjVmNCdG4sIHJvdGF0ZUJ0biwgc3RhcnRCdG4sIHJhbmRvbUJ0bl07XG4gICAgY29uc3QgY3JlYXRlQ2VsbCA9IChjZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZWxsJyk7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjZWxsLnN0YXR1cyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWNvbCcsIGNlbGwuY29sKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcm93JywgY2VsbC5yb3cpO1xuICAgICAgICBpZiAoY2VsbC50YWtlbkJ5KSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1zaGlwTmFtZScsIGNlbGwudGFrZW5CeS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH07XG4gICAgY29uc3QgcmVuZGVyQ2VsbHMgPSAoZ2FtZWJvYXJkLCBib2FyZCkgPT4ge1xuICAgICAgICBnYW1lYm9hcmQuYXJyYXkuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICByb3cuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IGNyZWF0ZUNlbGwoY29sKTtcbiAgICAgICAgICAgICAgICBib2FyZC5hcHBlbmQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCByZW5kZXJCb2FyZCA9IChnYW1lYm9hcmQpID0+IHtcbiAgICAgICAgY29uc3QgYm9hcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgYm9hcmQuY2xhc3NMaXN0LmFkZCgnYm9hcmQnKTtcbiAgICAgICAgaWYgKGdhbWVib2FyZCA9PT0gY29udHJvbGxlci5odW1hbkdhbWVib2FyZCkge1xuICAgICAgICAgICAgYm9hcmQuaWQgPSAnZmlyc3RCb2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLmNvbXB1dGVyR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBib2FyZC5pZCA9ICdzZWNvbmRCb2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLnRlbXBCb2FyZCkge1xuICAgICAgICAgICAgYm9hcmQuaWQgPSAndGVtcEJvYXJkJztcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJDZWxscyhnYW1lYm9hcmQsIGJvYXJkKTtcbiAgICAgICAgYm9hcmRzLmFwcGVuZChib2FyZCk7XG4gICAgfTtcbiAgICBjb25zdCByZWZyZXNoQm9hcmQgPSAoZ2FtZWJvYXJkKSA9PiB7XG4gICAgICAgIGxldCBib2FyZElkO1xuICAgICAgICBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLmh1bWFuR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBib2FyZElkID0gJ2ZpcnN0Qm9hcmQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdhbWVib2FyZCA9PT0gY29udHJvbGxlci5jb21wdXRlckdhbWVib2FyZCkge1xuICAgICAgICAgICAgYm9hcmRJZCA9ICdzZWNvbmRCb2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2FtZWJvYXJkID09PSBjb250cm9sbGVyLnRlbXBCb2FyZCkge1xuICAgICAgICAgICAgYm9hcmRJZCA9ICd0ZW1wQm9hcmQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJvYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7Ym9hcmRJZH1gKTtcbiAgICAgICAgYm9hcmQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHJlbmRlckNlbGxzKGdhbWVib2FyZCwgYm9hcmQpO1xuICAgIH07XG4gICAgY29uc3QgZ2V0VXNlcklucHV0ID0gKGUpID0+IHtcbiAgICAgICAgaWYgKCFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpdCcpICYmICFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21pc3MnKSkge1xuICAgICAgICAgICAgY29uc3QgY29sID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbCcpO1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdycpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29sLCByb3cgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlVXNlcklucHV0ID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3NlY29uZEJvYXJkIC5jZWxsJyk7XG4gICAgICAgIGxldCB1c2VySW5wdXQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHVzZXJJbnB1dCA9IHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaXQnKSAmJiAhY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ21pc3MnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRVc2VySW5wdXQoZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSB3aGlsZSAoIXVzZXJJbnB1dCk7XG4gICAgICAgIGNvbnN0IGNvbCA9IHVzZXJJbnB1dC5jb2wudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gdXNlcklucHV0LnJvdy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4geyBjb2wsIHJvdyB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGhhbmRsZVB2QyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB3YWl0aW5nKHRydWUpO1xuICAgICAgICBhbGxCdG5zLmZvckVhY2goKGJ0bikgPT4gKGJ0bi5kaXNhYmxlZCA9IHRydWUpKTtcbiAgICAgICAgcFZjQnRuLnRleHRDb250ZW50ID0gJ1N0YXJ0aW5nLi4uJztcbiAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgICBwVmNCdG4udGV4dENvbnRlbnQgPSAnUGxheWVyIHZzIENvbXB1dGVyJztcbiAgICAgICAgYWxsQnRucy5mb3JFYWNoKChidG4pID0+IChidG4uZGlzYWJsZWQgPSBmYWxzZSkpO1xuICAgICAgICB3YWl0aW5nKGZhbHNlKTtcbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVOZXdHYW1lID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHdhaXRpbmcodHJ1ZSk7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gdHJ1ZSkpO1xuICAgICAgICBuZXdHYW1lQnRuLnRleHRDb250ZW50ID0gJ1Jlc3RhcnRpbmcuLi4nO1xuICAgICAgICB5aWVsZCBjb250cm9sbGVyLm5ld0dhbWUoKTtcbiAgICAgICAgbmV3R2FtZUJ0bi50ZXh0Q29udGVudCA9ICdOZXcgR2FtZSc7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gZmFsc2UpKTtcbiAgICAgICAgd2FpdGluZyhmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3QgaGFuZGxlQ3ZDID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHdhaXRpbmcodHJ1ZSk7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gdHJ1ZSkpO1xuICAgICAgICBjVmNCdG4udGV4dENvbnRlbnQgPSAnU3RhcnRpbmcuLi4nO1xuICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgIGNWY0J0bi50ZXh0Q29udGVudCA9ICdDb21wdXRlciB2cyBDb21wdXRlcic7XG4gICAgICAgIGFsbEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiAoYnRuLmRpc2FibGVkID0gZmFsc2UpKTtcbiAgICAgICAgd2FpdGluZyhmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3QgaGFuZGxlR2FtZU1vZGUgPSAoc2VsZWN0ZWRFbGVtZW50LCBkZXNlbGVjdGVkRWxlbWVudCkgPT4ge1xuICAgICAgICBkZXNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBpZiAoIXNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCA9PT0gcFZjQnRuKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlUHZDKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ID09PSBjVmNCdG4pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVDdkMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdGFydCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB3YWl0aW5nID0gKGJvb2wpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3dhaXQnLCBib29sKTtcbiAgICB9O1xuICAgIGNvbnN0IHNldEJvYXJkUG9pbnRlciA9ICh3aGljaCkgPT4ge1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2Vjb25kQm9hcmQnKTtcbiAgICAgICAgaWYgKHdoaWNoID09PSAncGxheWVyJykge1xuICAgICAgICAgICAgc2Vjb25kLmNsYXNzTGlzdC5hZGQoJ2JvYXJkT3V0bGluZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdoaWNoID09PSAnY29tcHV0ZXInKSB7XG4gICAgICAgICAgICBzZWNvbmQuY2xhc3NMaXN0LnJlbW92ZSgnYm9hcmRPdXRsaW5lJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZUJvYXJkUG9pbnRlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2Vjb25kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlY29uZEJvYXJkJyk7XG4gICAgICAgIHNlY29uZC5jbGFzc0xpc3QucmVtb3ZlKCdib2FyZE91dGxpbmUnKTtcbiAgICB9O1xuICAgIGNvbnN0IGNyZWF0ZVNoaXBPdmVybGF5ID0gKGdhbWVib2FyZE5hbWUsIHNoaXBzKSA9PiB7XG4gICAgICAgIHNoaXBzLmZvckVhY2goKGZpcnN0Q2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnN0IHNoaXBOYW1lID0gZmlyc3RDZWxsLnRha2VuQnkubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2hpcFNpemUgPSBmaXJzdENlbGwudGFrZW5CeS5zaXplO1xuICAgICAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IGZpcnN0Q2VsbC50YWtlbkJ5LmlzVmVydGljYWw7XG4gICAgICAgICAgICBzaGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaGlwJywgc2hpcE5hbWUpO1xuICAgICAgICAgICAgc2hpcEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXNpemUnLCBgJHtzaGlwU2l6ZX1gKTtcbiAgICAgICAgICAgIHNoaXBFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJywgYCR7c2hpcE5hbWV9YCk7XG4gICAgICAgICAgICBzaGlwRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICAgICAgICBzaGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2FibGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHNldFNoaXBTdHlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hpcEVsZW1lbnQuc3R5bGUud2lkdGggPSBzaGlwU2l6ZSAqIChjZWxsU2l6ZSAvIDE2KSArICdyZW0nO1xuICAgICAgICAgICAgICAgICAgICBzaGlwRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjZWxsU2l6ZSAvIDE2ICsgJ3JlbSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hpcEVsZW1lbnQuc3R5bGUud2lkdGggPSBjZWxsU2l6ZSAvIDE2ICsgJ3JlbSc7XG4gICAgICAgICAgICAgICAgICAgIHNoaXBFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNoaXBTaXplICogKGNlbGxTaXplIC8gMTYpICsgJ3JlbSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBjZWxsU2l6ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ib2FyZCAuY2VsbCcpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgc2V0U2hpcFN0eWxlKCk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNlbGxTaXplID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJvYXJkIC5jZWxsJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICAgICAgc2V0U2hpcFN0eWxlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBib2FyZDtcbiAgICAgICAgICAgIGlmIChnYW1lYm9hcmROYW1lID09PSAnZmlyc3QnKSB7XG4gICAgICAgICAgICAgICAgYm9hcmQgPSAnZmlyc3RCb2FyZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnYW1lYm9hcmROYW1lID09PSAndGVtcCcpIHtcbiAgICAgICAgICAgICAgICBib2FyZCA9ICd0ZW1wQm9hcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlyc3RDZWxsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2JvYXJkfSAuY2VsbFtkYXRhLWNvbD1cIiR7Zmlyc3RDZWxsLmNvbH1cIl1bZGF0YS1yb3c9XCIke2ZpcnN0Q2VsbC5yb3d9XCJdYCk7XG4gICAgICAgICAgICBmaXJzdENlbGxFbGVtZW50LmFwcGVuZENoaWxkKHNoaXBFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBkcmFnQW5kRHJvcCA9IChmaXJzdEdhbWVib2FyZCwgdGVtcEdhbWVib2FyZCwgc2hpcHMpID0+IHtcbiAgICAgICAgbGV0IHNoaXBOYW1lO1xuICAgICAgICBsZXQgc2hpcFNpemU7XG4gICAgICAgIGxldCBncmFiUG9pbnRYID0gMDtcbiAgICAgICAgbGV0IGdyYWJQb2ludFkgPSAwO1xuICAgICAgICBsZXQgc2hpcE9iajtcbiAgICAgICAgbGV0IG9yaWVudGF0aW9uO1xuICAgICAgICBsZXQgaGlnaGxpZ2h0ZWRDZWxscyA9IFtdO1xuICAgICAgICBjb25zdCBzaGlwTmFtZVRvT2JqID0ge1xuICAgICAgICAgICAgY2Fycmllcjogc2hpcHNbMF0sXG4gICAgICAgICAgICBiYXR0bGVzaGlwOiBzaGlwc1sxXSxcbiAgICAgICAgICAgIGRlc3Ryb3llcjogc2hpcHNbMl0sXG4gICAgICAgICAgICBzdWJtYXJpbmU6IHNoaXBzWzNdLFxuICAgICAgICAgICAgcGF0cm9sYm9hdDogc2hpcHNbNF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRyYWdnYWJsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhZ2dhYmxlJyk7XG4gICAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlTW91c2Vkb3duKTtcbiAgICAgICAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2V1cCk7XG4gICAgICAgICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgaGFuZGxlRHJhZ0VuZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaXJzdEJvYXJkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaXJzdEJvYXJkJyk7XG4gICAgICAgIGNvbnN0IHRlbXBCb2FyZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGVtcEJvYXJkJyk7XG4gICAgICAgIGNvbnN0IGZpcnN0Qm9hcmRDZWxscyA9IGZpcnN0Qm9hcmRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jZWxsJyk7XG4gICAgICAgIGNvbnN0IHRlbXBCb2FyZENlbGxzID0gdGVtcEJvYXJkRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2VsbCcpO1xuICAgICAgICBsZXQgbGFzdERyYWdnZWQgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZWRvd24oZSkge1xuICAgICAgICAgICAgZmlyc3RHYW1lYm9hcmQucmVtb3ZlUmVzZXJ2ZWRTcGFjZShmaXJzdEdhbWVib2FyZCk7XG4gICAgICAgICAgICB0ZW1wR2FtZWJvYXJkLnJlbW92ZVJlc2VydmVkU3BhY2UodGVtcEdhbWVib2FyZCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRTaGlwTmFtZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZFNoaXBzUGxhY2VkRmlyc3QgPSBmaXJzdEdhbWVib2FyZC5zaGlwc1BsYWNlZC5maWx0ZXIoKHNoaXApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0U2hpcE5hbWUgIT09IHNoaXAudGFrZW5CeS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkU2hpcHNQbGFjZWRUZW1wID0gdGVtcEdhbWVib2FyZC5zaGlwc1BsYWNlZC5maWx0ZXIoKHNoaXApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0U2hpcE5hbWUgIT09IHNoaXAudGFrZW5CeS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZWRTaGlwc1BsYWNlZEZpcnN0LmZvckVhY2goKHNoaXApID0+IHtcbiAgICAgICAgICAgICAgICBmaXJzdEdhbWVib2FyZC5yZXNlcnZlU3BhY2UoZmlyc3RHYW1lYm9hcmQsIHNoaXAuY29sLCBzaGlwLnJvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZWRTaGlwc1BsYWNlZFRlbXAuZm9yRWFjaCgoc2hpcCkgPT4ge1xuICAgICAgICAgICAgICAgIHRlbXBHYW1lYm9hcmQucmVzZXJ2ZVNwYWNlKHRlbXBHYW1lYm9hcmQsIHNoaXAuY29sLCBzaGlwLnJvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlZnJlc2hCb2FyZChmaXJzdEdhbWVib2FyZCk7XG4gICAgICAgICAgICByZWZyZXNoQm9hcmQodGVtcEdhbWVib2FyZCk7XG4gICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgnZmlyc3QnLCBmaXJzdEdhbWVib2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgndGVtcCcsIHRlbXBHYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICAgICAgZHJhZ0FuZERyb3AoZmlyc3RHYW1lYm9hcmQsIHRlbXBHYW1lYm9hcmQsIGNvbnRyb2xsZXIuaHVtYW5TaGlwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlTW91c2V1cCgpIHtcbiAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnNoaXBzUGxhY2VkLmZvckVhY2goKHNoaXApID0+IHtcbiAgICAgICAgICAgICAgICBmaXJzdEdhbWVib2FyZC5yZXNlcnZlU3BhY2UoZmlyc3RHYW1lYm9hcmQsIHNoaXAuY29sLCBzaGlwLnJvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRlbXBHYW1lYm9hcmQuc2hpcHNQbGFjZWQuZm9yRWFjaCgoc2hpcCkgPT4ge1xuICAgICAgICAgICAgICAgIHRlbXBHYW1lYm9hcmQucmVzZXJ2ZVNwYWNlKHRlbXBHYW1lYm9hcmQsIHNoaXAuY29sLCBzaGlwLnJvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlZnJlc2hCb2FyZChmaXJzdEdhbWVib2FyZCk7XG4gICAgICAgICAgICByZWZyZXNoQm9hcmQodGVtcEdhbWVib2FyZCk7XG4gICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgnZmlyc3QnLCBmaXJzdEdhbWVib2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgndGVtcCcsIHRlbXBHYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICAgICAgZHJhZ0FuZERyb3AoZmlyc3RHYW1lYm9hcmQsIHRlbXBHYW1lYm9hcmQsIGNvbnRyb2xsZXIuaHVtYW5TaGlwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRHJhZ1N0YXJ0KGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO1xuICAgICAgICAgICAgICAgIHNoaXBOYW1lID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG4gICAgICAgICAgICAgICAgc2hpcFNpemUgPSBOdW1iZXIodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplJykpO1xuICAgICAgICAgICAgICAgIGdyYWJQb2ludFggPSBlLm9mZnNldFg7XG4gICAgICAgICAgICAgICAgZ3JhYlBvaW50WSA9IGUub2Zmc2V0WTtcbiAgICAgICAgICAgICAgICBzaGlwT2JqID0gc2hpcE5hbWVUb09ialtzaGlwTmFtZV07XG4gICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBzaGlwT2JqLmlzVmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmJvYXJkJykuaWQgPT09ICdmaXJzdEJvYXJkJykge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEdhbWVib2FyZC5yZW1vdmVTaGlwKHNoaXBPYmosIGZpcnN0R2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYm9hcmQnKS5pZCA9PT0gJ3RlbXBCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5yZW1vdmVTaGlwKHNoaXBPYmosIHRlbXBHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZURyYWdPdmVyKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5ib2FyZCcpLmlkID09PSAnZmlyc3RCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDZWxsID0gaW5kZXggLSAoc2hpcE9iai5pc1ZlcnRpY2FsID8gTWF0aC5mbG9vcihncmFiUG9pbnRZIC8gdGhpcy5vZmZzZXRIZWlnaHQpICogMTAgOiBNYXRoLmZsb29yKGdyYWJQb2ludFggLyB0aGlzLm9mZnNldFdpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvSGlnaGxpZ2h0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hpcFNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGxJbmRleCA9IHNoaXBPYmouaXNWZXJ0aWNhbCA/IHN0YXJ0Q2VsbCArIGkgKiAxMCA6IHN0YXJ0Q2VsbCArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RCb2FyZENlbGxzW2NlbGxJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hpZ2hsaWdodC5wdXNoKGZpcnN0Qm9hcmRDZWxsc1tjZWxsSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRlZENlbGxzLnB1c2goZmlyc3RCb2FyZENlbGxzW2NlbGxJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkUGxhY2VtZW50KHRvSGlnaGxpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWdobGlnaHQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdERyYWdnZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RHJhZ2dlZCA9IGdldExhc3RTaGlwU2l6ZUVsZW1lbnRzKGhpZ2hsaWdodGVkQ2VsbHMsIHNoaXBTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gXHRjb25zb2xlLmxvZygnc2hpcCBpcyBvbiB0aGUgZWRnZScpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmJvYXJkJykuaWQgPT09ICd0ZW1wQm9hcmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0Q2VsbCA9IGluZGV4IC0gKHNoaXBPYmouaXNWZXJ0aWNhbCA/IE1hdGguZmxvb3IoZ3JhYlBvaW50WSAvIHRoaXMub2Zmc2V0SGVpZ2h0KSAqIDEwIDogTWF0aC5mbG9vcihncmFiUG9pbnRYIC8gdGhpcy5vZmZzZXRXaWR0aCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0hpZ2hsaWdodCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNoaXBTaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsSW5kZXggPSBzaGlwT2JqLmlzVmVydGljYWwgPyBzdGFydENlbGwgKyBpICogMTAgOiBzdGFydENlbGwgKyBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBCb2FyZENlbGxzW2NlbGxJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hpZ2hsaWdodC5wdXNoKHRlbXBCb2FyZENlbGxzW2NlbGxJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkQ2VsbHMucHVzaCh0ZW1wQm9hcmRDZWxsc1tjZWxsSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFBsYWNlbWVudCh0b0hpZ2hsaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3REcmFnZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdERyYWdnZWQgPSBnZXRMYXN0U2hpcFNpemVFbGVtZW50cyhoaWdobGlnaHRlZENlbGxzLCBzaGlwU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFx0Y29uc29sZS5sb2coJ3NoaXAgaXMgb24gdGhlIGVkZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRHJhZ0xlYXZlKCkge1xuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRDZWxscy5mb3JFYWNoKChoaWdobGlnaHRlZENlbGwpID0+IHtcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZENlbGwuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGhpZ2hsaWdodGVkQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVEcm9wKGUpIHtcbiAgICAgICAgICAgIGhpZ2hsaWdodGVkQ2VsbHMuZm9yRWFjaCgoaGlnaGxpZ2h0ZWRDZWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWRDZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZ2hsaWdodCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0ID0gZ2V0TGFzdFNoaXBTaXplRWxlbWVudHMoaGlnaGxpZ2h0ZWRDZWxscywgc2hpcFNpemUpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5ib2FyZCcpLmlkID09PSAnZmlyc3RCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RHYW1lYm9hcmQuY2FuQmVQbGFjZWQoc2hpcE9iai5zaXplLCBsYXN0WzBdLmRhdGFzZXQuY29sLCBsYXN0WzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RHYW1lYm9hcmQucGxhY2VTaGlwKHNoaXBPYmosIGxhc3RbMF0uZGF0YXNldC5jb2wsIGxhc3RbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5odW1hbkdhbWVib2FyZC5yZXNlcnZlU3BhY2UoY29udHJvbGxlci5odW1hbkdhbWVib2FyZCwgbGFzdFswXS5kYXRhc2V0LmNvbCwgbGFzdFswXS5kYXRhc2V0LnJvdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEdhbWVib2FyZC5wbGFjZVNoaXAoc2hpcE9iaiwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5jb2wsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaHVtYW5HYW1lYm9hcmQucmVzZXJ2ZVNwYWNlKGNvbnRyb2xsZXIuaHVtYW5HYW1lYm9hcmQsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQuY29sLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LnJvdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuYm9hcmQnKS5pZCA9PT0gJ3RlbXBCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGVtcEdhbWVib2FyZC5jYW5CZVBsYWNlZChzaGlwT2JqLnNpemUsIGxhc3RbMF0uZGF0YXNldC5jb2wsIGxhc3RbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wR2FtZWJvYXJkLnBsYWNlU2hpcChzaGlwT2JqLCBsYXN0WzBdLmRhdGFzZXQuY29sLCBsYXN0WzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIudGVtcEJvYXJkLnJlc2VydmVTcGFjZShjb250cm9sbGVyLnRlbXBCb2FyZCwgbGFzdFswXS5kYXRhc2V0LmNvbCwgbGFzdFswXS5kYXRhc2V0LnJvdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wR2FtZWJvYXJkLnBsYWNlU2hpcChzaGlwT2JqLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LmNvbCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci50ZW1wQm9hcmQucmVzZXJ2ZVNwYWNlKGNvbnRyb2xsZXIudGVtcEJvYXJkLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LmNvbCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5yb3cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnJlbW92ZVJlc2VydmVkU3BhY2UoZmlyc3RHYW1lYm9hcmQpO1xuICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5yZW1vdmVSZXNlcnZlZFNwYWNlKHRlbXBHYW1lYm9hcmQpO1xuICAgICAgICAgICAgZmlyc3RHYW1lYm9hcmQuc2hpcHNQbGFjZWQuZm9yRWFjaCgoc2hpcCkgPT4ge1xuICAgICAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnJlc2VydmVTcGFjZShmaXJzdEdhbWVib2FyZCwgc2hpcC5jb2wsIHNoaXAucm93KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5zaGlwc1BsYWNlZC5mb3JFYWNoKChzaGlwKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVtcEdhbWVib2FyZC5yZXNlcnZlU3BhY2UodGVtcEdhbWVib2FyZCwgc2hpcC5jb2wsIHNoaXAucm93KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVmcmVzaEJvYXJkKGZpcnN0R2FtZWJvYXJkKTtcbiAgICAgICAgICAgIHJlZnJlc2hCb2FyZCh0ZW1wR2FtZWJvYXJkKTtcbiAgICAgICAgICAgIGNyZWF0ZVNoaXBPdmVybGF5KCdmaXJzdCcsIGZpcnN0R2FtZWJvYXJkLnNoaXBzUGxhY2VkKTtcbiAgICAgICAgICAgIGNyZWF0ZVNoaXBPdmVybGF5KCd0ZW1wJywgdGVtcEdhbWVib2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgICAgICBkcmFnQW5kRHJvcChmaXJzdEdhbWVib2FyZCwgdGVtcEdhbWVib2FyZCwgY29udHJvbGxlci5odW1hblNoaXBzKTtcbiAgICAgICAgICAgIGxhc3REcmFnZ2VkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVEcmFnRW5kKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG4gICAgICAgICAgICBpZiAoaGlnaGxpZ2h0ZWRDZWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5ib2FyZCcpLmlkID09PSAnZmlyc3RCb2FyZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3REcmFnZ2VkICYmIGZpcnN0R2FtZWJvYXJkLmNhbkJlUGxhY2VkKHNoaXBPYmouc2l6ZSwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5jb2wsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQucm93LCBvcmllbnRhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnBsYWNlU2hpcChzaGlwT2JqLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LmNvbCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0R2FtZWJvYXJkLnJlc2VydmVTcGFjZShmaXJzdEdhbWVib2FyZCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5jb2wsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQucm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hCb2FyZChmaXJzdEdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQm9hcmQodGVtcEdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgnZmlyc3QnLCBmaXJzdEdhbWVib2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSgndGVtcCcsIHRlbXBHYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ0FuZERyb3AoZmlyc3RHYW1lYm9hcmQsIHRlbXBHYW1lYm9hcmQsIGNvbnRyb2xsZXIuaHVtYW5TaGlwcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5ib2FyZCcpLmlkID09PSAndGVtcEJvYXJkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdERyYWdnZWQgJiYgdGVtcEdhbWVib2FyZC5jYW5CZVBsYWNlZChzaGlwT2JqLnNpemUsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQuY29sLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LnJvdywgb3JpZW50YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wR2FtZWJvYXJkLnBsYWNlU2hpcChzaGlwT2JqLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LmNvbCwgbGFzdERyYWdnZWRbMF0uZGF0YXNldC5yb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBHYW1lYm9hcmQucmVzZXJ2ZVNwYWNlKHRlbXBHYW1lYm9hcmQsIGxhc3REcmFnZ2VkWzBdLmRhdGFzZXQuY29sLCBsYXN0RHJhZ2dlZFswXS5kYXRhc2V0LnJvdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQm9hcmQoZmlyc3RHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEJvYXJkKHRlbXBHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2hpcE92ZXJsYXkoJ2ZpcnN0JywgZmlyc3RHYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2hpcE92ZXJsYXkoJ3RlbXAnLCB0ZW1wR2FtZWJvYXJkLnNoaXBzUGxhY2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdBbmREcm9wKGZpcnN0R2FtZWJvYXJkLCB0ZW1wR2FtZWJvYXJkLCBjb250cm9sbGVyLmh1bWFuU2hpcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVmFsaWRQbGFjZW1lbnQodG9IaWdobGlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiAodG9IaWdobGlnaHQuZXZlcnkoKGNlbGwpID0+IGNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdlbXB0eScpKSAmJlxuICAgICAgICAgICAgICAgICh0b0hpZ2hsaWdodC5ldmVyeSgoY2VsbCkgPT4gY2VsbC5kYXRhc2V0LmNvbCA9PT0gdG9IaWdobGlnaHRbMF0uZGF0YXNldC5jb2wpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LmV2ZXJ5KChjZWxsKSA9PiBjZWxsLmRhdGFzZXQucm93ID09PSB0b0hpZ2hsaWdodFswXS5kYXRhc2V0LnJvdykpICYmXG4gICAgICAgICAgICAgICAgdG9IaWdobGlnaHQubGVuZ3RoID09PSBzaGlwU2l6ZSAmJlxuICAgICAgICAgICAgICAgIHRvSGlnaGxpZ2h0LmV2ZXJ5KChjZWxsKSA9PiBjZWxsLmRhdGFzZXQuY29sID49ICdBJyAmJiBjZWxsLmRhdGFzZXQuY29sIDw9ICdKJykgJiZcbiAgICAgICAgICAgICAgICB0b0hpZ2hsaWdodC5ldmVyeSgoY2VsbCkgPT4gTnVtYmVyKGNlbGwuZGF0YXNldC5yb3cpID49IDEgJiYgTnVtYmVyKGNlbGwuZGF0YXNldC5yb3cpIDw9IDEwKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGFzdFNoaXBTaXplRWxlbWVudHMoaGlnaGxpZ2h0ZWRDZWxscywgc2hpcFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBoaWdobGlnaHRlZENlbGxzLnNsaWNlKE1hdGgubWluKGhpZ2hsaWdodGVkQ2VsbHMubGVuZ3RoIC0gc2hpcFNpemUsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBmaXJzdEJvYXJkQ2VsbHMuZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVEcmFnT3ZlcihpbmRleCkpO1xuICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBoYW5kbGVEcmFnTGVhdmUpO1xuICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZW1wQm9hcmRDZWxscy5mb3JFYWNoKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY2VsbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGhhbmRsZURyYWdPdmVyKGluZGV4KSk7XG4gICAgICAgICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIGhhbmRsZURyYWdMZWF2ZSk7XG4gICAgICAgICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBwVmNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBoYW5kbGVHYW1lTW9kZShwVmNCdG4sIGNWY0J0bikpO1xuICAgIGNWY0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGhhbmRsZUdhbWVNb2RlKGNWY0J0biwgcFZjQnRuKSk7XG4gICAgbmV3R2FtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU5ld0dhbWUpO1xuICAgIHJvdGF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbnRyb2xsZXIucm90YXRlU2hpcCgpKTtcbiAgICBzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGNvbnRyb2xsZXIuc3RhcnQoKSk7XG4gICAgcmFuZG9tQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb250cm9sbGVyLnRlbXBCb2FyZC5jbGVhckJvYXJkKCk7XG4gICAgICAgIHJlZnJlc2hCb2FyZChjb250cm9sbGVyLnRlbXBCb2FyZCk7XG4gICAgICAgIGNvbnRyb2xsZXIucmFuZG9taXplU2hpcHNQbGFjZW1lbnQoJ2ZpcnN0JywgY29udHJvbGxlci5odW1hbkdhbWVib2FyZCk7XG4gICAgICAgIGRyYWdBbmREcm9wKGNvbnRyb2xsZXIuaHVtYW5HYW1lYm9hcmQsIGNvbnRyb2xsZXIudGVtcEJvYXJkLCBjb250cm9sbGVyLmh1bWFuU2hpcHMpO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlbmRlckJvYXJkLFxuICAgICAgICByZWZyZXNoQm9hcmQsXG4gICAgICAgIGhhbmRsZVVzZXJJbnB1dCxcbiAgICAgICAgcFZjQnRuLFxuICAgICAgICBjVmNCdG4sXG4gICAgICAgIHdhaXRpbmcsXG4gICAgICAgIHNldEJvYXJkUG9pbnRlcixcbiAgICAgICAgcmVtb3ZlQm9hcmRQb2ludGVyLFxuICAgICAgICBjcmVhdGVTaGlwT3ZlcmxheSxcbiAgICAgICAgZHJhZ0FuZERyb3AsXG4gICAgfTtcbn0pKCk7XG5leHBvcnQgZGVmYXVsdCB1aTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IGdhbWVib2FyZEZhY3RvcnkgZnJvbSAnLi9nYW1lYm9hcmQnO1xuaW1wb3J0IHNoaXBGYWN0b3J5IGZyb20gJy4vc2hpcCc7XG5pbXBvcnQgcGxheWVyRmFjdG9yeSBmcm9tICcuL3BsYXllcic7XG5pbXBvcnQgdWkgZnJvbSAnLi91aSc7XG5jb25zdCBjb250cm9sbGVyID0gKCgpID0+IHtcbiAgICBjb25zdCBodW1hbkdhbWVib2FyZCA9IGdhbWVib2FyZEZhY3RvcnkoKTtcbiAgICBjb25zdCBjb21wdXRlckdhbWVib2FyZCA9IGdhbWVib2FyZEZhY3RvcnkoKTtcbiAgICBjb25zdCB0ZW1wQm9hcmQgPSBnYW1lYm9hcmRGYWN0b3J5KCk7XG4gICAgY29uc3QgaHVtYW4gPSBwbGF5ZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgY29tcHV0ZXIgPSBwbGF5ZXJGYWN0b3J5KCk7XG4gICAgbGV0IGlzU3RvcHBlZCA9IHRydWU7XG4gICAgbGV0IGh1bWFuQ2FycmllciA9IHNoaXBGYWN0b3J5KCdDYXJyaWVyJyk7XG4gICAgbGV0IGh1bWFuQmF0dGxlc2hpcCA9IHNoaXBGYWN0b3J5KCdCYXR0bGVzaGlwJyk7XG4gICAgbGV0IGh1bWFuRGVzdHJveWVyID0gc2hpcEZhY3RvcnkoJ0Rlc3Ryb3llcicpO1xuICAgIGxldCBodW1hblN1Ym1hcmluZSA9IHNoaXBGYWN0b3J5KCdTdWJtYXJpbmUnKTtcbiAgICBsZXQgaHVtYW5QYXRyb2xib2F0ID0gc2hpcEZhY3RvcnkoJ1BhdHJvbEJvYXQnKTtcbiAgICBjb25zdCBodW1hblNoaXBzID0gW2h1bWFuQ2FycmllciwgaHVtYW5CYXR0bGVzaGlwLCBodW1hbkRlc3Ryb3llciwgaHVtYW5TdWJtYXJpbmUsIGh1bWFuUGF0cm9sYm9hdF07XG4gICAgY29uc3QgcG9wdWxhdGVUZW1wQm9hcmQgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBCb2FyZC5wbGFjZVNoaXAoaHVtYW5DYXJyaWVyLCAnQScsICcxJywgJ2hvcml6b250YWwnKTtcbiAgICAgICAgdGVtcEJvYXJkLnBsYWNlU2hpcChodW1hbkJhdHRsZXNoaXAsICdBJywgJzMnLCAnaG9yaXpvbnRhbCcpO1xuICAgICAgICB0ZW1wQm9hcmQucGxhY2VTaGlwKGh1bWFuRGVzdHJveWVyLCAnQScsICc1JywgJ2hvcml6b250YWwnKTtcbiAgICAgICAgdGVtcEJvYXJkLnBsYWNlU2hpcChodW1hblN1Ym1hcmluZSwgJ0EnLCAnNycsICdob3Jpem9udGFsJyk7XG4gICAgICAgIHRlbXBCb2FyZC5wbGFjZVNoaXAoaHVtYW5QYXRyb2xib2F0LCAnQScsICc5JywgJ3ZlcnRpY2FsJyk7XG4gICAgICAgIHRlbXBCb2FyZC5yZXNlcnZlU3BhY2UodGVtcEJvYXJkLCAnQScsICcxJyk7XG4gICAgICAgIHRlbXBCb2FyZC5yZXNlcnZlU3BhY2UodGVtcEJvYXJkLCAnQScsICczJyk7XG4gICAgICAgIHRlbXBCb2FyZC5yZXNlcnZlU3BhY2UodGVtcEJvYXJkLCAnQScsICc1Jyk7XG4gICAgICAgIHRlbXBCb2FyZC5yZXNlcnZlU3BhY2UodGVtcEJvYXJkLCAnQScsICc3Jyk7XG4gICAgICAgIHRlbXBCb2FyZC5yZXNlcnZlU3BhY2UodGVtcEJvYXJkLCAnQScsICc5Jyk7XG4gICAgfTtcbiAgICBjb25zdCBpc0dhbWVPdmVyID0gKCkgPT4ge1xuICAgICAgICBpZiAoY29tcHV0ZXJHYW1lYm9hcmQuYWxsU3Vuayhjb21wdXRlckdhbWVib2FyZCkpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdBbGwgY29tcHV0ZXIgc2hpcHMgYXJlIHN1bmsuIEh1bWFuIHBsYXllciB3b24hJyk7XG4gICAgICAgICAgICB1aS5yZW1vdmVCb2FyZFBvaW50ZXIoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChodW1hbkdhbWVib2FyZC5hbGxTdW5rKGh1bWFuR2FtZWJvYXJkKSkge1xuICAgICAgICAgICAgdWkucmVtb3ZlQm9hcmRQb2ludGVyKCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQWxsIGh1bWFuIHNoaXBzIGFyZSBzdW5rLiBDb21wdXRlciBwbGF5ZXIgd29uIScpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgY29uc3QgY29tcHV0ZXJBSSA9IChnYW1lYm9hcmQpID0+IHtcbiAgICAgICAgbGV0IHBsYXllcjtcbiAgICAgICAgaWYgKGdhbWVib2FyZCA9PT0gaHVtYW5HYW1lYm9hcmQpIHtcbiAgICAgICAgICAgIHBsYXllciA9IGNvbXB1dGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdhbWVib2FyZCA9PT0gY29tcHV0ZXJHYW1lYm9hcmQpIHtcbiAgICAgICAgICAgIHBsYXllciA9IGh1bWFuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnYW1lYm9hcmQuaGl0QnV0Tm90U3VuayhnYW1lYm9hcmQpKSB7XG4gICAgICAgICAgICBpZiAocGxheWVyLmdldFByZXZIaXQoKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHBsYXllci5nZXRMYXN0SGl0KCkgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBnYW1lYm9hcmQuZ2V0Q2VsbChwbGF5ZXIuZ2V0TGFzdEhpdCgpLmNvbCwgcGxheWVyLmdldExhc3RIaXQoKS5yb3cpLnRha2VuQnkuaGl0Q291bnQgPj0gMiAmJlxuICAgICAgICAgICAgICAgIGdhbWVib2FyZC5nZXRDZWxsKHBsYXllci5nZXRMYXN0SGl0KCkuY29sLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLnJvdykudGFrZW5CeS5oaXRDb3VudCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0ZJTklTSDogPj0gMiB0cmFmaWVuaWEgdyBzdGF0ZWsnLCBwbGF5ZXIuZ2V0UHJldkhpdCgpKTtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuZmluaXNoaW5nQXR0YWNrKGdhbWVib2FyZCwgcGxheWVyLmdldExhc3RIaXQoKS5jb2wsIHBsYXllci5nZXRMYXN0SGl0KCkucm93LCBwbGF5ZXIuZ2V0UHJldkhpdCgpKTtcbiAgICAgICAgICAgICAgICBnYW1lYm9hcmQuc2lua1NoaXAoZ2FtZWJvYXJkLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLmNvbCwgcGxheWVyLmdldExhc3RIaXQoKS5yb3cpO1xuICAgICAgICAgICAgICAgIGlmIChpc0dhbWVPdmVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGdhbWVib2FyZC5nZXRDZWxsKHBsYXllci5nZXRMYXN0SGl0KCkuY29sLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLnJvdykudGFrZW5CeS5oaXRDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHBsYXllci5mb2xsb3d1cEF0dGFjayhnYW1lYm9hcmQsIHBsYXllci5nZXRMYXN0SGl0KCkuY29sLCBwbGF5ZXIuZ2V0TGFzdEhpdCgpLnJvdyk7XG4gICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnNpbmtTaGlwKGdhbWVib2FyZCwgcGxheWVyLmdldExhc3RIaXQoKS5jb2wsIHBsYXllci5nZXRMYXN0SGl0KCkucm93KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNHYW1lT3ZlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbCwgcm93IH0gPSBwbGF5ZXIucmFuZG9tQXR0YWNrKGdhbWVib2FyZCk7XG4gICAgICAgICAgICBpZiAoZ2FtZWJvYXJkLmdldENlbGwoY29sLCByb3cpLnN0YXR1cyA9PT0gJ2hpdCcpIHtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0UHJldkhpdChwbGF5ZXIuZ2V0TGFzdEhpdCgpKTtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0TGFzdEhpdCh7IGNvbCwgcm93IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS5zdGF0dXMgPT09ICdoaXQnICYmIGdhbWVib2FyZC5nZXRDZWxsKGNvbCwgcm93KS50YWtlbkJ5LmlzU3VuaygpKSB7XG4gICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnNpbmtTaGlwKGdhbWVib2FyZCwgY29sLCByb3cpO1xuICAgICAgICAgICAgICAgIHBsYXllci5zZXRQcmV2SGl0KG51bGwpO1xuICAgICAgICAgICAgICAgIHBsYXllci5zZXRMYXN0SGl0KG51bGwpO1xuICAgICAgICAgICAgICAgIGlmIChpc0dhbWVPdmVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcGxheWVyVnNDb21wdXRlck1vZGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGlzUGxheWVyVHVybiA9IHRydWU7XG4gICAgICAgIHdoaWxlICghaXNHYW1lT3ZlcigpICYmICFpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIGlmIChpc1BsYXllclR1cm4pIHtcbiAgICAgICAgICAgICAgICB1aS5zZXRCb2FyZFBvaW50ZXIoJ3BsYXllcicpO1xuICAgICAgICAgICAgICAgIHVpLndhaXRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29sLCByb3cgfSA9IHlpZWxkIHVpLmhhbmRsZVVzZXJJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGh1bWFuLmF0dGFjayhjb21wdXRlckdhbWVib2FyZCwgY29sLCByb3cpO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVyR2FtZWJvYXJkLnNpbmtTaGlwKGNvbXB1dGVyR2FtZWJvYXJkLCBjb2wsIHJvdyk7XG4gICAgICAgICAgICAgICAgdWkucmVmcmVzaEJvYXJkKGNvbXB1dGVyR2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICBpc1BsYXllclR1cm4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0dhbWVPdmVyKCkgfHwgaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUGxheWVyVHVybikge1xuICAgICAgICAgICAgICAgIHVpLnNldEJvYXJkUG9pbnRlcignY29tcHV0ZXInKTtcbiAgICAgICAgICAgICAgICB1aS53YWl0aW5nKHRydWUpO1xuICAgICAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVpLnBWY0J0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHwgaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlckFJKGh1bWFuR2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICB1aS5yZWZyZXNoQm9hcmQoaHVtYW5HYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIGlzUGxheWVyVHVybiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIHVpLndhaXRpbmcoZmFsc2UpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVyVnNDb21wdXRlck1vZGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdWkucmVtb3ZlQm9hcmRQb2ludGVyKCk7XG4gICAgICAgIGxldCBpc1BsYXllclR1cm4gPSB0cnVlO1xuICAgICAgICB3aGlsZSAoIWlzR2FtZU92ZXIoKSAmJiAhaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB1aS53YWl0aW5nKHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzUGxheWVyVHVybikge1xuICAgICAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVpLmNWY0J0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykgfHwgaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlckFJKGh1bWFuR2FtZWJvYXJkKTtcbiAgICAgICAgICAgICAgICB1aS5yZWZyZXNoQm9hcmQoaHVtYW5HYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIGlzUGxheWVyVHVybiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzR2FtZU92ZXIoKSB8fCBpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbGF5ZXJUdXJuKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgICAgICAgICAgIGlmICghdWkuY1ZjQnRuLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSB8fCBpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXB1dGVyQUkoY29tcHV0ZXJHYW1lYm9hcmQpO1xuICAgICAgICAgICAgICAgIHVpLnJlZnJlc2hCb2FyZChjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgICAgICAgICAgaXNQbGF5ZXJUdXJuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdWkud2FpdGluZyhmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgcm90YXRlU2hpcCA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JvdGF0ZScpO1xuICAgIH07XG4gICAgY29uc3QgcmFuZG9tUGxhY2VtZW50ID0gKGdhbWVib2FyZCkgPT4ge1xuICAgICAgICBsZXQgYWxsU2hpcHM7XG4gICAgICAgIGlmIChnYW1lYm9hcmQgPT09IGh1bWFuR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBodW1hbkNhcnJpZXIgPSBzaGlwRmFjdG9yeSgnQ2FycmllcicpO1xuICAgICAgICAgICAgaHVtYW5CYXR0bGVzaGlwID0gc2hpcEZhY3RvcnkoJ0JhdHRsZXNoaXAnKTtcbiAgICAgICAgICAgIGh1bWFuRGVzdHJveWVyID0gc2hpcEZhY3RvcnkoJ0Rlc3Ryb3llcicpO1xuICAgICAgICAgICAgaHVtYW5TdWJtYXJpbmUgPSBzaGlwRmFjdG9yeSgnU3VibWFyaW5lJyk7XG4gICAgICAgICAgICBodW1hblBhdHJvbGJvYXQgPSBzaGlwRmFjdG9yeSgnUGF0cm9sQm9hdCcpO1xuICAgICAgICAgICAgYWxsU2hpcHMgPSBbaHVtYW5DYXJyaWVyLCBodW1hbkJhdHRsZXNoaXAsIGh1bWFuRGVzdHJveWVyLCBodW1hblN1Ym1hcmluZSwgaHVtYW5QYXRyb2xib2F0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnYW1lYm9hcmQgPT09IGNvbXB1dGVyR2FtZWJvYXJkKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlckNhcnJpZXIgPSBzaGlwRmFjdG9yeSgnQ2FycmllcicpO1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZXJCYXR0bGVzaGlwID0gc2hpcEZhY3RvcnkoJ0JhdHRsZXNoaXAnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVyRGVzdHJveWVyID0gc2hpcEZhY3RvcnkoJ0Rlc3Ryb3llcicpO1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZXJTdWJtYXJpbmUgPSBzaGlwRmFjdG9yeSgnU3VibWFyaW5lJyk7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlclBhdHJvbGJvYXQgPSBzaGlwRmFjdG9yeSgnUGF0cm9sQm9hdCcpO1xuICAgICAgICAgICAgYWxsU2hpcHMgPSBbY29tcHV0ZXJDYXJyaWVyLCBjb21wdXRlckJhdHRsZXNoaXAsIGNvbXB1dGVyRGVzdHJveWVyLCBjb21wdXRlclN1Ym1hcmluZSwgY29tcHV0ZXJQYXRyb2xib2F0XTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmh1bWFuU2hpcHMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgY29scyA9IFsnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSiddO1xuICAgICAgICBjb25zdCByYW5kb21Db2wgPSAoKSA9PiBjb2xzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNvbHMubGVuZ3RoKV07XG4gICAgICAgIGNvbnN0IHJhbmRvbVJvdyA9ICgpID0+IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTApLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHJhbmRvbU9yaWVudGF0aW9uID0gKCkgPT4gKE1hdGgucmFuZG9tKCkgPiAwLjUgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnKTtcbiAgICAgICAgYWxsU2hpcHMuZm9yRWFjaCgoc2hpcCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbCA9IHJhbmRvbUNvbCgpO1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJhbmRvbVJvdygpO1xuICAgICAgICAgICAgbGV0IG9yaWVudGF0aW9uID0gcmFuZG9tT3JpZW50YXRpb24oKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBnYW1lYm9hcmQuY2FuQmVQbGFjZWQoc2hpcC5zaXplLCBjb2wsIHJvdywgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgd2hpbGUgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb2wgPSByYW5kb21Db2woKTtcbiAgICAgICAgICAgICAgICByb3cgPSByYW5kb21Sb3coKTtcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IHJhbmRvbU9yaWVudGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2FtZWJvYXJkLmNhbkJlUGxhY2VkKHNoaXAuc2l6ZSwgY29sLCByb3csIG9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBnYW1lYm9hcmQucGxhY2VTaGlwKHNoaXAsIGNvbCwgcm93LCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgZ2FtZWJvYXJkLnJlc2VydmVTcGFjZShnYW1lYm9hcmQsIGNvbCwgcm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaHVtYW5TaGlwcy5wdXNoKHNoaXApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50ID0gKGdhbWVib2FyZE5hbWUsIGdhbWVib2FyZCkgPT4ge1xuICAgICAgICBnYW1lYm9hcmQuY2xlYXJCb2FyZCgpO1xuICAgICAgICByYW5kb21QbGFjZW1lbnQoZ2FtZWJvYXJkKTtcbiAgICAgICAgdWkucmVmcmVzaEJvYXJkKGdhbWVib2FyZCk7XG4gICAgICAgIGlmIChnYW1lYm9hcmROYW1lID09PSAnZmlyc3QnKSB7XG4gICAgICAgICAgICB1aS5jcmVhdGVTaGlwT3ZlcmxheSgnZmlyc3QnLCBnYW1lYm9hcmQuc2hpcHNQbGFjZWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICAgICAgLy8gc2hvdWxkIHdhaXQgaGVyZSBmb3IgaHVtYW5HYW1lYm9hcmQgdG8gYmUgcmVhZHkgYmVmb3JlIHN0YXJ0aW5nLiBBbGwgU2hpcHMgc2hvdWxkIGJlIHBsYWNlZFxuICAgICAgICByYW5kb21pemVTaGlwc1BsYWNlbWVudCgnc2Vjb25kJywgY29tcHV0ZXJHYW1lYm9hcmQpO1xuICAgICAgICBpc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgcGxheWVyVnNDb21wdXRlck1vZGUoKTtcbiAgICB9O1xuICAgIGNvbnN0IHBpY2tHYW1lTW9kZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHVpLmNWY0J0bi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgIHJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50KCdmaXJzdCcsIGh1bWFuR2FtZWJvYXJkKTtcbiAgICAgICAgICAgIHJhbmRvbWl6ZVNoaXBzUGxhY2VtZW50KCdzZWNvbmQnLCBjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgICAgICBpc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbXB1dGVyVnNDb21wdXRlck1vZGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcmVzdGFydCA9ICgpID0+IHtcbiAgICAgICAgaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaHVtYW4uc2V0UHJldkhpdChudWxsKTtcbiAgICAgICAgaHVtYW4uc2V0TGFzdEhpdChudWxsKTtcbiAgICAgICAgY29tcHV0ZXIuc2V0UHJldkhpdChudWxsKTtcbiAgICAgICAgY29tcHV0ZXIuc2V0TGFzdEhpdChudWxsKTtcbiAgICAgICAgaHVtYW5HYW1lYm9hcmQuY2xlYXJCb2FyZCgpO1xuICAgICAgICBjb21wdXRlckdhbWVib2FyZC5jbGVhckJvYXJkKCk7XG4gICAgICAgIHVpLnJlZnJlc2hCb2FyZChodW1hbkdhbWVib2FyZCk7XG4gICAgICAgIHVpLnJlZnJlc2hCb2FyZChjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgIHBpY2tHYW1lTW9kZSgpO1xuICAgIH07XG4gICAgY29uc3QgbmV3R2FtZSA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgIGlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICByZXN0YXJ0KCk7XG4gICAgfSk7XG4gICAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgdWkucmVuZGVyQm9hcmQoaHVtYW5HYW1lYm9hcmQpO1xuICAgICAgICAvLyB1aS5yZW5kZXJCb2FyZChjb21wdXRlckdhbWVib2FyZCk7XG4gICAgICAgIHVpLnJlbmRlckJvYXJkKHRlbXBCb2FyZCk7XG4gICAgICAgIHBvcHVsYXRlVGVtcEJvYXJkKCk7XG4gICAgICAgIHVpLnJlZnJlc2hCb2FyZCh0ZW1wQm9hcmQpO1xuICAgICAgICB1aS5jcmVhdGVTaGlwT3ZlcmxheSgndGVtcCcsIHRlbXBCb2FyZC5zaGlwc1BsYWNlZCk7XG4gICAgICAgIHVpLmRyYWdBbmREcm9wKGh1bWFuR2FtZWJvYXJkLCB0ZW1wQm9hcmQsIGh1bWFuU2hpcHMpO1xuICAgICAgICBwaWNrR2FtZU1vZGUoKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGluaXQsIGh1bWFuR2FtZWJvYXJkLCBjb21wdXRlckdhbWVib2FyZCwgdGVtcEJvYXJkLCByZXN0YXJ0LCBuZXdHYW1lLCByb3RhdGVTaGlwLCBzdGFydCwgcmFuZG9taXplU2hpcHNQbGFjZW1lbnQsIGh1bWFuU2hpcHMgfTtcbn0pKCk7XG5leHBvcnQgZGVmYXVsdCBjb250cm9sbGVyO1xuIiwiaW1wb3J0ICdub3JtYWxpemUuY3NzJztcbmltcG9ydCAnLi9zdHlsZS9zdHlsZS5jc3MnO1xuaW1wb3J0IGNvbnRyb2xsZXIgZnJvbSAnLi9tb2R1bGVzL2NvbnRyb2xsZXInO1xuY29udHJvbGxlci5pbml0KCk7XG4iXSwibmFtZXMiOlsiY29scyIsInJvd3MiLCJhcnJheSIsInNoaXBzUGxhY2VkIiwiZ2V0Q2VsbCIsImNvbCIsInJvdyIsImNvbEluZGV4IiwiaW5kZXhPZiIsInJvd0luZGV4Iiwic2V0Q2VsbCIsIm5ld1N0YXR1cyIsIm5ld1Rha2VuQnkiLCJzdGF0dXMiLCJ0YWtlbkJ5IiwiaSIsImoiLCJnZW5lcmF0ZUFycmF5IiwiY2xlYXJCb2FyZCIsInVuZGVmaW5lZCIsImxlbmd0aCIsInJlbW92ZVNoaXAiLCJzaGlwIiwiZ2FtZWJvYXJkIiwiZmxhdCIsImZvckVhY2giLCJjZWxsIiwiYm9hcmRJZCIsIm5hbWUiLCJzcGxpY2UiLCJodW1hbkdhbWVib2FyZCIsImNvbXB1dGVyR2FtZWJvYXJkIiwidGVtcEJvYXJkIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJnZXRBdHRyaWJ1dGUiLCJ0b0xvd2VyQ2FzZSIsInJlbW92ZSIsImFkZCIsInJlbW92ZUF0dHJpYnV0ZSIsInBsYWNlU2hpcCIsIm9yaWVudGF0aW9uIiwiaXNWZXJ0aWNhbCIsImlzSG9yaXpvbnRhbCIsImNlbGxzIiwic3RhcnQiLCJzaGlwQ2VsbHMiLCJzaXplIiwiY3VycmVudENvbCIsImN1cnJlbnRSb3ciLCJwdXNoIiwicmVjZWl2ZUF0dGFjayIsImhpdCIsInJlY2VpdmVBcm91bmQiLCJyZXNlcnZlU3BhY2UiLCJmaWx0ZXIiLCJjIiwiZGlyZWN0aW9uIiwibmV3Q29sIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiY2hhckNvZGVBdCIsIm5ld1JvdyIsIk51bWJlciIsInRvU3RyaW5nIiwiaGl0QnV0Tm90U3VuayIsInNvbWUiLCJpc1N1bmsiLCJzaW5rU2hpcCIsImFsbFN1bmsiLCJ0YWtlbkJ5Q2VsbHMiLCJldmVyeSIsImNhbkJlUGxhY2VkIiwicmVtb3ZlUmVzZXJ2ZWRTcGFjZSIsImhpdENvdW50Iiwicm90YXRlIiwidGhpcyIsInByZXZIaXQiLCJsYXN0SGl0IiwicmFuZ2UiLCJnb1JpZ2h0IiwiZ29Eb3duIiwiZmluaXNoaW5nQXR0YWNrIiwiY29uc29sZSIsImxvZyIsInNldFByZXZIaXQiLCJzZXRMYXN0SGl0IiwibmV3UHJldkhpdCIsIm5ld0xhc3RIaXQiLCJhdHRhY2siLCJyZXN1bHQiLCJyYW5kb21BdHRhY2siLCJyYW5kb21Db2wiLCJyYW5kb21Sb3ciLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJjZWlsIiwiZm9sbG93dXBBdHRhY2siLCJ2YWxpZERpcmVjdGlvbnMiLCJyYW5kb21EaXJlY3Rpb24iLCJnZXRQcmV2SGl0IiwiZ2V0TGFzdEhpdCIsIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJ1aSIsIndyYXBwZXIiLCJxdWVyeVNlbGVjdG9yIiwiYm9hcmRzIiwiY3JlYXRlRWxlbWVudCIsImlkIiwicHJlcGVuZCIsInBWY0J0biIsIm5ld0dhbWVCdG4iLCJjVmNCdG4iLCJyb3RhdGVCdG4iLCJzdGFydEJ0biIsInJhbmRvbUJ0biIsImFsbEJ0bnMiLCJyZW5kZXJDZWxscyIsImJvYXJkIiwiZWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImNyZWF0ZUNlbGwiLCJhcHBlbmQiLCJyZWZyZXNoQm9hcmQiLCJpbm5lckhUTUwiLCJnZXRVc2VySW5wdXQiLCJ0YXJnZXQiLCJoYW5kbGVHYW1lTW9kZSIsInNlbGVjdGVkRWxlbWVudCIsImRlc2VsZWN0ZWRFbGVtZW50Iiwid2FpdGluZyIsImJ0biIsImRpc2FibGVkIiwidGV4dENvbnRlbnQiLCJzZXRUaW1lb3V0IiwicmVzdGFydCIsImJvb2wiLCJkb2N1bWVudEVsZW1lbnQiLCJ0b2dnbGUiLCJjcmVhdGVTaGlwT3ZlcmxheSIsImdhbWVib2FyZE5hbWUiLCJzaGlwcyIsImZpcnN0Q2VsbCIsInNoaXBFbGVtZW50Iiwic2hpcE5hbWUiLCJzaGlwU2l6ZSIsInNldFNoaXBTdHlsZSIsInN0eWxlIiwid2lkdGgiLCJjZWxsU2l6ZSIsImhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJhcHBlbmRDaGlsZCIsImRyYWdBbmREcm9wIiwiZmlyc3RHYW1lYm9hcmQiLCJ0ZW1wR2FtZWJvYXJkIiwic2hpcE9iaiIsImdyYWJQb2ludFgiLCJncmFiUG9pbnRZIiwiaGlnaGxpZ2h0ZWRDZWxscyIsInNoaXBOYW1lVG9PYmoiLCJjYXJyaWVyIiwiYmF0dGxlc2hpcCIsImRlc3Ryb3llciIsInN1Ym1hcmluZSIsInBhdHJvbGJvYXQiLCJkcmFnZ2FibGUiLCJoYW5kbGVNb3VzZWRvd24iLCJoYW5kbGVNb3VzZXVwIiwiaGFuZGxlRHJhZ1N0YXJ0IiwiaGFuZGxlRHJhZ0VuZCIsImZpcnN0Qm9hcmRFbGVtZW50IiwidGVtcEJvYXJkRWxlbWVudCIsImZpcnN0Qm9hcmRDZWxscyIsInRlbXBCb2FyZENlbGxzIiwibGFzdERyYWdnZWQiLCJ0YXJnZXRTaGlwTmFtZSIsInVwZGF0ZWRTaGlwc1BsYWNlZEZpcnN0IiwidXBkYXRlZFNoaXBzUGxhY2VkVGVtcCIsImh1bWFuU2hpcHMiLCJ2aXNpYmlsaXR5Iiwib2Zmc2V0WCIsIm9mZnNldFkiLCJjbG9zZXN0IiwiaGFuZGxlRHJhZ092ZXIiLCJpbmRleCIsInByZXZlbnREZWZhdWx0Iiwic3RhcnRDZWxsIiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0V2lkdGgiLCJ0b0hpZ2hsaWdodCIsImNlbGxJbmRleCIsImlzVmFsaWRQbGFjZW1lbnQiLCJnZXRMYXN0U2hpcFNpemVFbGVtZW50cyIsImhhbmRsZURyYWdMZWF2ZSIsImhpZ2hsaWdodGVkQ2VsbCIsImhhbmRsZURyb3AiLCJsYXN0IiwiZGF0YXNldCIsInNsaWNlIiwibWluIiwibmV3R2FtZSIsInJvdGF0ZVNoaXAiLCJyYW5kb21pemVTaGlwc1BsYWNlbWVudCIsInJlbmRlckJvYXJkIiwiaGFuZGxlVXNlcklucHV0IiwidXNlcklucHV0Iiwib25jZSIsInNldEJvYXJkUG9pbnRlciIsIndoaWNoIiwic2Vjb25kIiwicmVtb3ZlQm9hcmRQb2ludGVyIiwiY29udHJvbGxlciIsImh1bWFuIiwicGxheWVyIiwiY29tcHV0ZXIiLCJpc1N0b3BwZWQiLCJodW1hbkNhcnJpZXIiLCJodW1hbkJhdHRsZXNoaXAiLCJodW1hbkRlc3Ryb3llciIsImh1bWFuU3VibWFyaW5lIiwiaHVtYW5QYXRyb2xib2F0IiwiaXNHYW1lT3ZlciIsImNvbXB1dGVyQUkiLCJhbGxTaGlwcyIsInJhbmRvbU9yaWVudGF0aW9uIiwicmFuZG9tUGxhY2VtZW50IiwicGlja0dhbWVNb2RlIiwiaXNQbGF5ZXJUdXJuIiwiaW5pdCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file